/*
 * Copyright (c) 2003-2005 The Regents of The University of Michigan
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer;
 * redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution;
 * neither the name of the copyright holders nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef __ARCH_SPARC_LINUX_LINUX_HH__
#define __ARCH_SPARC_LINUX_LINUX_HH__

#include <map>

#include "arch/sparc/asi.hh"
#include "arch/sparc/regs/int.hh"
#include "arch/sparc/regs/misc.hh"
#include "cpu/thread_context.hh"
#include "kern/linux/linux.hh"

namespace gem5
{

class SparcLinux : public Linux
{
  public:

    static const ByteOrder byteOrder = ByteOrder::big;

    struct tgt_stat
    {
        uint32_t st_dev;
        char __pad1[4];
        uint64_t st_ino;
        uint32_t st_mode;
        uint16_t st_nlink;
        uint32_t st_uid;
        uint32_t st_gid;
        uint32_t st_rdev;
        char __pad2[4];
        int64_t st_size;
        int64_t st_atimeX;
        int64_t st_mtimeX;
        int64_t st_ctimeX;
        int64_t st_blksize;
        int64_t st_blocks;
        uint64_t __unused4[2];
    };

    struct tgt_stat64
    {
        uint64_t st_dev;
        uint64_t st_ino;
        uint64_t st_nlink;

        uint32_t st_mode;
        uint32_t st_uid;
        uint32_t st_gid;
        uint32_t __pad0;

        uint64_t st_rdev;
        int64_t st_size;
        int64_t st_blksize;
        int64_t st_blocks;

        uint64_t st_atimeX;
        uint64_t st_atime_nsec;
        uint64_t st_mtimeX;
        uint64_t st_mtime_nsec;
        uint64_t st_ctimeX;
        uint64_t st_ctime_nsec;
        int64_t __unused[3];
    };

    // SPARC receives weird subsignals for several of its signals. If you
    // find yourself needing to implement these in detail, look at the
    // Linux source.
    static const int TGT_SIGHUP         = 0x000001;
    static const int TGT_SIGINT         = 0x000002;
    static const int TGT_SIGQUIT        = 0x000003;
    static const int TGT_SIGILL         = 0x000004;
    static const int TGT_SIGTRAP        = 0x000005;
    static const int TGT_SIGABRT        = 0x000006;
    static const int TGT_SIGIOT         = 0x000006;
    static const int TGT_SIGEMT         = 0x000007;
    static const int TGT_SIGFPE         = 0x000008;
    static const int TGT_SIGKILL        = 0x000009;
    static const int TGT_SIGBUS         = 0x00000a;
    static const int TGT_SIGSEGV        = 0x00000b;
    static const int TGT_SIGSYS         = 0x00000c;
    static const int TGT_SIGPIPE        = 0x00000d;
    static const int TGT_SIGALRM        = 0x00000e;
    static const int TGT_SIGTERM        = 0x00000f;
    static const int TGT_SIGURG         = 0x000010;
    static const int TGT_SIGSTOP        = 0x000011;
    static const int TGT_SIGTSTP        = 0x000012;
    static const int TGT_SIGCONT        = 0x000013;
    static const int TGT_SIGCHLD        = 0x000014;
    static const int TGT_SIGTTIN        = 0x000015;
    static const int TGT_SIGTTOU        = 0x000016;
    static const int TGT_SIGIO          = 0x000017;
    static const int TGT_SIGPOLL        = 0x000017;
    static const int TGT_SIGXCPU        = 0x000018;
    static const int TGT_SIGXFSZ        = 0x000019;
    static const int TGT_SIGVTALRM      = 0x00001a;
    static const int TGT_SIGPROF        = 0x00001b;
    static const int TGT_SIGWINCH       = 0x00001c;
    static const int TGT_SIGLOST        = 0x00001d;
    static const int TGT_SIGPWR         = 0x00001d;
    static const int TGT_SIGUSR1        = 0x00001e;
    static const int TGT_SIGUSR2        = 0x00001f;

    static const std::map<int, int> openFlagTable;

    static const int TGT_O_RDONLY       = 0x00000000;   //!< O_RDONLY
    static const int TGT_O_WRONLY       = 0x00000001;   //!< O_WRONLY
    static const int TGT_O_RDWR         = 0x00000002;   //!< O_RDWR
    static const int TGT_O_NONBLOCK     = 0x00004000;   //!< O_NONBLOCK
    static const int TGT_O_APPEND       = 0x00000008;   //!< O_APPEND
    static const int TGT_FASYNC         = 0x00000040;   //!< FASYNC
    static const int TGT_O_CREAT        = 0x00000200;   //!< O_CREAT
    static const int TGT_O_TRUNC        = 0x00000400;   //!< O_TRUNC
    static const int TGT_O_EXCL         = 0x00000800;   //!< O_EXCL
    static const int TGT_O_NOCTTY       = 0x00008000;   //!< O_NOCTTY
    static const int TGT_O_DSYNC        = 0x00002000;   //!< O_DSYNC
    static const int TGT_O_LARGEFILE    = 0x00040000;   //!< O_LARGEFILE
    static const int TGT_O_DIRECT       = 0x00100000;   //!< O_DIRECT
    static const int TGT_O_NOATIME      = 0x00200000;   //!< O_NOATIME
    static const int TGT_O_CLOEXEC      = 0x00400000;   //!< O_CLOEXEC
    static const int TGT_O_SYNC         = 0x00802000;   //!< O_SYNC
    static const int TGT_O_PATH         = 0x01000000;   //!< O_PATH

    static const int TGT_O_DIRECTORY    = 000200000;   //!< O_DIRECTORY
    static const int TGT_O_NOFOLLOW     = 000400000;   //!< O_NOFOLLOW

    static const unsigned TGT_MAP_SHARED        = 0x00001;
    static const unsigned TGT_MAP_PRIVATE       = 0x00002;
    static const unsigned TGT_MAP_ANON          = 0x00020;
    static const unsigned TGT_MAP_DENYWRITE     = 0x00800;
    static const unsigned TGT_MAP_EXECUTABLE    = 0x01000;
    static const unsigned TGT_MAP_FILE          = 0x00000;
    static const unsigned TGT_MAP_GROWSDOWN     = 0x00200;
    static const unsigned TGT_MAP_HUGETLB       = 0x40000;
    static const unsigned TGT_MAP_LOCKED        = 0x00100;
    static const unsigned TGT_MAP_NONBLOCK      = 0x10000;
    static const unsigned TGT_MAP_NORESERVE     = 0x00040;
    static const unsigned TGT_MAP_POPULATE      = 0x08000;
    static const unsigned TGT_MAP_STACK         = 0x20000;
    static const unsigned TGT_MAP_ANONYMOUS     = 0x00020;
    static const unsigned TGT_MAP_FIXED         = 0x00010;
    static const unsigned TGT_MAP_INHERIT       = 0x00080;

    struct tgt_sysinfo
    {
        int64_t  uptime;    /* Seconds since boot */
        uint64_t loads[3];  /* 1, 5, and 15 minute load averages */
        uint64_t totalram;  /* Total usable main memory size */
        uint64_t freeram;   /* Available memory size */
        uint64_t sharedram; /* Amount of shared memory */
        uint64_t bufferram; /* Memory used by buffers */
        uint64_t totalswap; /* Total swap space size */
        uint64_t freeswap;  /* swap space still available */
        uint16_t procs;     /* Number of current processes */
        uint64_t totalhigh; /* Total high memory size */
        uint64_t freehigh;  /* Available high memory size */
        uint64_t mem_unit;  /* Memory unit size in bytes */
    };

    //@{
    /// ioctl() command codes.
    /// These were calculated using the SPARC Linux headers on an x86
    /// machine and thus may not be correct.  It would be good to
    /// verify/update these values on an actual SPARC Linux machine.
    static const unsigned TGT_TCGETA    = 0x40125401;
    static const unsigned TGT_TCSETAW   = 0x80125403;
    static const unsigned TGT_TCGETS    = 0x40385408;
    static const unsigned TGT_FIONREAD  = 0x4004667f;
    static const unsigned TGT_TIOCGETP  = 0x40067408;
    static const unsigned TGT_TIOCSETP  = 0x80067409;
    static const unsigned TGT_TIOCSETN  = 0x8006740a;
    //@}

    static bool
    isTtyReq(unsigned req)
    {
        switch (req) {
          case TGT_TIOCGETP:
          case TGT_TIOCSETP:
          case TGT_TIOCSETN:
          case TGT_TCGETS:
          case TGT_TCGETA:
          case TGT_TCSETAW:
            return true;
          default:
            return false;
        }
    }

    static void
    archClone(uint64_t flags,
              Process *pp, Process *cp,
              ThreadContext *ptc, ThreadContext *ctc,
              uint64_t stack, uint64_t tls)
    {
        ctc->getIsaPtr()->copyRegsFrom(ptc);
        ctc->setIntReg(SparcISA::INTREG_OTHERWIN, 0);
        ctc->setIntReg(SparcISA::INTREG_CANRESTORE, 0);
        ctc->setIntReg(SparcISA::INTREG_CANSAVE, SparcISA::NWindows - 2);
        ctc->setIntReg(SparcISA::INTREG_CLEANWIN, SparcISA::NWindows);
        ctc->setMiscReg(SparcISA::MISCREG_CWP, 0);
        ctc->setIntReg(SparcISA::INTREG_WSTATE, 0);
        ctc->setMiscRegNoEffect(SparcISA::MISCREG_TL, 0);
        ctc->setMiscReg(SparcISA::MISCREG_ASI, SparcISA::ASI_PRIMARY);
        for (int y = 8; y < 32; y++)
            ctc->setIntReg(y, ptc->readIntReg(y));

        if (stack)
            ctc->setIntReg(SparcISA::StackPointerReg, stack);

        // Set these extra values. Since "clone" doesn't return two values,
        // we can set these and they won't be clobbered by the syscall ABI.
        ptc->setIntReg(SparcISA::SyscallPseudoReturnReg, 0);
        ctc->setIntReg(SparcISA::SyscallPseudoReturnReg, 1);
    }
};

class Sparc32Linux : public SparcLinux
{
  public:

    struct tgt_stat64
    {
        uint64_t st_dev;
        uint64_t st_ino;
        uint32_t st_mode;
        uint32_t st_nlink;
        uint32_t st_uid;
        uint32_t st_gid;
        uint64_t st_rdev;
        uint8_t __pad3[8];
        int64_t st_size;
        int32_t st_blksize;
        uint8_t __pad4[8];
        int64_t st_blocks;
        uint64_t st_atimeX;
        uint64_t st_atime_nsec;
        uint64_t st_mtimeX;
        uint64_t st_mtime_nsec;
        uint64_t st_ctimeX;
        uint64_t st_ctime_nsec;
        uint32_t __unused4;
        uint32_t __unused5;
    };

    struct tgt_sysinfo
    {
        int32_t  uptime;    /* Seconds since boot */
        uint32_t loads[3];  /* 1, 5, and 15 minute load averages */
        uint32_t totalram;  /* Total usable main memory size */
        uint32_t freeram;   /* Available memory size */
        uint32_t sharedram; /* Amount of shared memory */
        uint32_t bufferram; /* Memory used by buffers */
        uint32_t totalswap; /* Total swap space size */
        uint32_t freeswap;  /* swap space still available */
        uint16_t procs;     /* Number of current processes */
        uint32_t totalhigh; /* Total high memory size */
        uint32_t freehigh;  /* Available high memory size */
        uint32_t mem_unit;  /* Memory unit size in bytes */
    };

    /// Resource constants for getrlimit() (overide some generics).
    static const unsigned TGT_RLIMIT_NPROC = 7;
    static const unsigned TGT_RLIMIT_NOFILE = 6;
};

} // namespace gem5

#endif
