/*
 * 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/flag_tables.hh"
#include "kern/linux/linux.hh"

namespace gem5
{

class SparcLinux : public Linux, public OpenFlagTable<SparcLinux>
{
  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 constexpr int TGT_O_RDONLY    = 0x00000000;  //!< O_RDONLY
    static constexpr int TGT_O_WRONLY    = 0x00000001;  //!< O_WRONLY
    static constexpr int TGT_O_RDWR      = 0x00000002;  //!< O_RDWR
    static constexpr int TGT_O_NONBLOCK  = 0x00004000;  //!< O_NONBLOCK
    static constexpr int TGT_O_APPEND    = 0x00000008;  //!< O_APPEND
    static constexpr int TGT_FASYNC      = 0x00000040;  //!< FASYNC
    static constexpr int TGT_O_CREAT     = 0x00000200;  //!< O_CREAT
    static constexpr int TGT_O_TRUNC     = 0x00000400;  //!< O_TRUNC
    static constexpr int TGT_O_EXCL      = 0x00000800;  //!< O_EXCL
    static constexpr int TGT_O_NOCTTY    = 0x00008000;  //!< O_NOCTTY
    static constexpr int TGT_O_DSYNC     = 0x00002000;  //!< O_DSYNC
    static constexpr int TGT_O_LARGEFILE = 0x00040000;  //!< O_LARGEFILE
    static constexpr int TGT_O_DIRECT    = 0x00100000;  //!< O_DIRECT
    static constexpr int TGT_O_NOATIME   = 0x00200000;  //!< O_NOATIME
    static constexpr int TGT_O_CLOEXEC   = 0x00400000;  //!< O_CLOEXEC
    static constexpr int TGT_O_SYNC      = 0x00802000;  //!< O_SYNC
    static constexpr int TGT_O_PATH      = 0x01000000;  //!< O_PATH

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

    static constexpr unsigned TGT_MAP_SHARED        = 0x00001;
    static constexpr unsigned TGT_MAP_PRIVATE       = 0x00002;
    static constexpr unsigned TGT_MAP_ANON          = 0x00020;
    static constexpr unsigned TGT_MAP_DENYWRITE     = 0x00800;
    static constexpr unsigned TGT_MAP_EXECUTABLE    = 0x01000;
    static constexpr unsigned TGT_MAP_FILE          = 0x00000;
    static constexpr unsigned TGT_MAP_GROWSDOWN     = 0x00200;
    static constexpr unsigned TGT_MAP_HUGETLB       = 0x40000;
    static constexpr unsigned TGT_MAP_LOCKED        = 0x00100;
    static constexpr unsigned TGT_MAP_NONBLOCK      = 0x10000;
    static constexpr unsigned TGT_MAP_NORESERVE     = 0x00040;
    static constexpr unsigned TGT_MAP_POPULATE      = 0x08000;
    static constexpr unsigned TGT_MAP_STACK         = 0x20000;
    static constexpr unsigned TGT_MAP_ANONYMOUS     = 0x00020;
    static constexpr unsigned TGT_MAP_FIXED         = 0x00010;
    static constexpr 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
