/*
 * 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.
 */

#include "arch/sparc/solaris/process.hh"

#include "arch/sparc/isa_traits.hh"
#include "arch/sparc/registers.hh"
#include "base/loader/object_file.hh"
#include "base/trace.hh"
#include "cpu/thread_context.hh"
#include "kern/solaris/solaris.hh"
#include "sim/process.hh"
#include "sim/syscall_desc.hh"
#include "sim/syscall_emul.hh"

using namespace std;
using namespace SparcISA;

namespace
{

class SparcSolarisObjectFileLoader : public Process::Loader
{
  public:
    Process *
    load(ProcessParams *params, ::Loader::ObjectFile *obj_file) override
    {
        auto arch = obj_file->getArch();
        auto opsys = obj_file->getOpSys();

        if (arch != ::Loader::SPARC64 && arch != ::Loader::SPARC32)
            return nullptr;

        if (opsys != ::Loader::Solaris)
            return nullptr;

        return new SparcSolarisProcess(params, obj_file);
    }
};

SparcSolarisObjectFileLoader loader;

} // anonymous namespace


/// Target uname() handler.
static SyscallReturn
unameFunc(SyscallDesc *desc, ThreadContext *tc, Addr utsname)
{
    auto process = tc->getProcessPtr();
    TypedBufferArg<Solaris::utsname> name(utsname);

    strcpy(name->sysname, "SunOS");
    strcpy(name->nodename, "m5.eecs.umich.edu");
    strcpy(name->release, process->release.c_str());
    strcpy(name->version, "Generic_118558-21");
    strcpy(name->machine, "sun4u");

    name.copyOut(tc->getVirtProxy());

    return 0;
}


SyscallDescTable<Sparc64Process::SyscallABI>
    SparcSolarisProcess::syscallDescs = {
    { 0, "syscall" },
    { 1, "exit", exitFunc },
    { 2, "fork" },
    { 3, "read", readFunc<SparcSolaris> },
    { 4, "write", writeFunc<SparcSolaris> },
    { 5, "open", openFunc<SparcSolaris> },
    { 6, "close", closeFunc },
    { 7, "wait" },
    { 8, "creat" },
    { 9, "link" },
    { 10, "unlink", unlinkFunc },
    { 11, "exec" },
    { 12, "chdir" },
    { 13, "time" },
    { 14, "mknod" },
    { 15, "chmod", chmodFunc<Solaris> },
    { 16, "chown", chownFunc },
    { 17, "brk", brkFunc },
    { 18, "stat" },
    { 19, "lseek", lseekFunc },
    { 20, "getpid", getpidFunc },
    { 21, "mount" },
    { 22, "umount" },
    { 23, "setuid", ignoreFunc },
    { 24, "getuid", getuidFunc },
    { 25, "stime" },
    { 26, "pcsample" },
    { 27, "alarm" },
    { 28, "fstat", fstatFunc<SparcSolaris> },
    { 29, "pause" },
    { 30, "utime" },
    { 31, "stty" },
    { 32, "gtty" },
    { 33, "access" },
    { 34, "nice" },
    { 35, "statfs" },
    { 36, "sync" },
    { 37, "kill" },
    { 38, "fstatfs" },
    { 39, "pgrpsys" },
    { 40, "xenix" },
    { 41, "dup" },
    { 42, "pipe", pipePseudoFunc },
    { 43, "times" },
    { 44, "profil" },
    { 45, "plock" },
    { 46, "setgid" },
    { 47, "getgid", getgidFunc },
    { 48, "signal" },
    { 49, "msgsys" },
    { 50, "syssun" },
    { 51, "acct" },
    { 52, "shmsys" },
    { 53, "semsys" },
    { 54, "ioctl" },
    { 55, "uadmin" },
    { 56, "RESERVED" },
    { 57, "utssys" },
    { 58, "fdsync" },
    { 59, "execve" },
    { 60, "umask", umaskFunc },
    { 61, "chroot" },
    { 62, "fcntl" },
    { 63, "ulimit" },
    { 64, "reserved_64" },
    { 65, "reserved_65" },
    { 66, "reserved_66" },
    { 67, "reserved_67" },
    { 68, "reserved_68" },
    { 69, "reserved_69" },
    { 70, "tasksys" },
    { 71, "acctctl" },
    { 72, "reserved_72" },
    { 73, "getpagesizes" },
    { 74, "rctlsys" },
    { 75, "issetugid" },
    { 76, "fsat" },
    { 77, "lwp_park" },
    { 78, "sendfilev" },
    { 79, "rmdir" },
    { 80, "mkdir" },
    { 81, "getdents" },
    { 82, "reserved_82" },
    { 83, "reserved_83" },
    { 84, "sysfs" },
    { 85, "getmsg" },
    { 86, "putmsg" },
    { 87, "poll" },
    { 88, "lstat" },
    { 89, "symlink" },
    { 90, "readlink", readlinkFunc },
    { 91, "setgroups" },
    { 92, "getgroups" },
    { 93, "fchmod" },
    { 94, "fchown" },
    { 95, "sigprocmask" },
    { 96, "sigsuspend" },
    { 97, "sigaltstack" },
    { 98, "sigaction" },
    { 99, "sigpending" },
    { 100, "context" },
    { 101, "evsys" },
    { 102, "evtrapret" },
    { 103, "statvfs" },
    { 104, "fstatvfs" },
    { 105, "getloadavg" },
    { 106, "nfssys" },
    { 107, "waitsys" },
    { 108, "sigsendsys" },
    { 109, "hrtsys" },
    { 110, "acancel" },
    { 111, "async" },
    { 112, "priocntlsys" },
    { 113, "pathconf" },
    { 114, "mincore" },
    { 115, "mmap", mmapFunc<SparcSolaris> },
    { 116, "mprotect" },
    { 117, "munmap", munmapFunc },
    { 118, "fpathconf" },
    { 119, "vfork" },
    { 120, "fchdir" },
    { 121, "readv" },
    { 122, "writev" },
    { 123, "xstat" },
    { 124, "lxstat" },
    { 125, "fxstat" },
    { 126, "xmknod" },
    { 127, "clocal" },
    { 128, "setrlimit" },
    { 129, "getrlimit" },
    { 130, "lchown" },
    { 131, "memcntl" },
    { 132, "getpmsg" },
    { 133, "putpmsg" },
    { 134, "rename" },
    { 135, "uname", unameFunc },
    { 136, "setegid" },
    { 137, "sysconfig" },
    { 138, "adjtime" },
    { 139, "systeminfo" },
    { 140, "reserved_140" },
    { 141, "seteuid" },
    { 142, "vtrace" },
    { 143, "fork1" },
    { 144, "sigtimedwait" },
    { 145, "lwp_info" },
    { 146, "yield" },
    { 147, "lwp_sema_wait" },
    { 148, "lwp_sema_post" },
    { 149, "lwp_sema_trywait" },
    { 150, "lwp_detach" },
    { 151, "corectl" },
    { 152, "modctl" },
    { 153, "fchroot" },
    { 154, "utimes" },
    { 155, "vhangup" },
    { 156, "gettimeofday" },
    { 157, "getitimer" },
    { 158, "setitimer" },
    { 159, "lwp_create" },
    { 160, "lwp_exit" },
    { 161, "lwp_suspend" },
    { 162, "lwp_continue" },
    { 163, "lwp_kill" },
    { 164, "lwp_self" },
    { 165, "lwp_setprivate" },
    { 166, "lwp_getprivate" },
    { 167, "lwp_wait" },
    { 168, "lwp_mutex_wakeup" },
    { 169, "lwp_mutex_lock" },
    { 170, "lwp_cond_wait" },
    { 171, "lwp_cond_signal" },
    { 172, "lwp_cond_broadcast" },
    { 173, "pread" },
    { 174, "pwrite" },
    { 175, "llseek" },
    { 176, "inst_sync" },
    { 177, "srmlimitsys" },
    { 178, "kaio" },
    { 179, "cpc" },
    { 180, "lgrpsys_meminfosys" },
    { 181, "rusagesys" },
    { 182, "reserved_182" },
    { 183, "reserved_183" },
    { 184, "tsolsys" },
    { 185, "acl" },
    { 186, "auditsys" },
    { 187, "processor_bind" },
    { 188, "processor_info" },
    { 189, "p_online" },
    { 190, "sigqueue" },
    { 191, "clock_gettime" },
    { 192, "clock_settime" },
    { 193, "clock_getres" },
    { 194, "timer_create" },
    { 195, "timer_delete" },
    { 196, "timer_settime" },
    { 197, "timer_gettime" },
    { 198, "timer_getoverrun" },
    { 199, "nanosleep" },
    { 200, "facl" },
    { 201, "door" },
    { 202, "setreuid" },
    { 203, "setregid" },
    { 204, "install_utrap" },
    { 205, "signotify" },
    { 206, "schedctl" },
    { 207, "pset" },
    { 208, "sparc_utrap_install" },
    { 209, "resolvepath" },
    { 210, "signotifywait" },
    { 211, "lwp_sigredirect" },
    { 212, "lwp_alarm" },
    { 213, "getdents64" },
    { 214, "mmap64" },
    { 215, "stat64" },
    { 216, "lstat64" },
    { 217, "fstat64" },
    { 218, "statvfs64" },
    { 219, "fstatvfs64" },
    { 220, "setrlimit64" },
    { 221, "getrlimit64" },
    { 222, "pread64" },
    { 223, "pwrite64" },
    { 224, "creat64" },
    { 225, "open64" },
    { 226, "rpcsys" },
    { 227, "reserved_227" },
    { 228, "reserved_228" },
    { 229, "reserved_229" },
    { 230, "so_socket" },
    { 231, "so_socketpair" },
    { 232, "bind" },
    { 233, "listen" },
    { 234, "accept" },
    { 235, "connect" },
    { 236, "shutdown" },
    { 237, "recv" },
    { 238, "recvfrom" },
    { 239, "recvmsg" },
    { 240, "send" },
    { 241, "sendmsg" },
    { 242, "sendto" },
    { 243, "getpeername" },
    { 244, "getsockname" },
    { 245, "getsockopt" },
    { 246, "setsockopt" },
    { 247, "sockconfig" },
    { 248, "ntp_gettime" },
    { 249, "ntp_adjtime" },
    { 250, "lwp_mutex_unlock" },
    { 251, "lwp_mutex_trylock" },
    { 252, "lwp_mutex_init" },
    { 253, "cladm" },
    { 254, "lwp_sigtimedwait" },
    { 255, "umount2" }
};

SparcSolarisProcess::SparcSolarisProcess(ProcessParams *params,
                                         ::Loader::ObjectFile *objFile) :
    Sparc64Process(params, objFile)
{}

void
SparcSolarisProcess::syscall(ThreadContext *tc, Fault *fault)
{
    Sparc64Process::syscall(tc, fault);
    syscallDescs.get(tc->readIntReg(1))->doSyscall(tc, fault);
}
