/*
 * Copyright (c) 2005 The Regents of The University of Michigan
 * Copyright (c) 2007 MIPS Technologies, Inc.
 * 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/mips/linux/process.hh"

#include "arch/mips/isa_traits.hh"
#include "arch/mips/linux/linux.hh"
#include "base/loader/object_file.hh"
#include "base/trace.hh"
#include "cpu/thread_context.hh"
#include "debug/SyscallVerbose.hh"
#include "kern/linux/linux.hh"
#include "sim/eventq.hh"
#include "sim/process.hh"
#include "sim/syscall_desc.hh"
#include "sim/syscall_emul.hh"
#include "sim/system.hh"

using namespace std;
using namespace MipsISA;

namespace
{

class MipsLinuxObjectFileLoader : public Process::Loader
{
  public:
    Process *
    load(ProcessParams *params, ::Loader::ObjectFile *obj_file) override
    {
        if (obj_file->getArch() != ::Loader::Mips)
            return nullptr;

        auto opsys = obj_file->getOpSys();

        if (opsys == ::Loader::UnknownOpSys) {
            warn("Unknown operating system; assuming Linux.");
            opsys = ::Loader::Linux;
        }

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

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

MipsLinuxObjectFileLoader loader;

} // anonymous namespace

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

    strcpy(name->sysname, "Linux");
    strcpy(name->nodename,"sim.gem5.org");
    strcpy(name->release, process->release.c_str());
    strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
    strcpy(name->machine, "mips");

    name.copyOut(tc->getVirtProxy());
    return 0;
}

/// Target sys_getsysyinfo() handler.  Even though this call is
/// borrowed from Tru64, the subcases that get used appear to be
/// different in practice from those used by Tru64 processes.
static SyscallReturn
sys_getsysinfoFunc(SyscallDesc *desc, ThreadContext *tc, unsigned op,
                   unsigned bufPtr, unsigned nbytes)
{
    switch (op) {
      case 45:
        {
            // GSI_IEEE_FP_CONTROL
            TypedBufferArg<uint64_t> fpcr(bufPtr);
            // I don't think this exactly matches the HW FPCR
            *fpcr = 0;
            fpcr.copyOut(tc->getVirtProxy());
            return 0;
        }
      default:
        cerr << "sys_getsysinfo: unknown op " << op << endl;
        abort();
        break;
    }

    return 1;
}

/// Target sys_setsysinfo() handler.
static SyscallReturn
sys_setsysinfoFunc(SyscallDesc *desc, ThreadContext *tc, unsigned op,
                   Addr bufPtr, unsigned nbytes)
{
    switch (op) {

      case 14:
        {
            // SSI_IEEE_FP_CONTROL
            TypedBufferArg<uint64_t> fpcr(bufPtr);
            // I don't think this exactly matches the HW FPCR
            fpcr.copyIn(tc->getVirtProxy());
            DPRINTFR(SyscallVerbose, "sys_setsysinfo(SSI_IEEE_FP_CONTROL): "
                   " setting FPCR to 0x%x\n", letoh(*(uint64_t*)fpcr));
            return 0;
        }
      default:
        cerr << "sys_setsysinfo: unknown op " << op << endl;
        abort();
        break;
    }

    return 1;
}

static SyscallReturn
setThreadAreaFunc(SyscallDesc *desc, ThreadContext *tc, Addr addr)
{
    tc->setMiscRegNoEffect(MISCREG_TP_VALUE, addr);
    return 0;
}

SyscallDescTable<MipsProcess::SyscallABI> MipsLinuxProcess::syscallDescs = {
    { 4000, "syscall" },
    { 4001, "exit", exitFunc },
    { 4002, "fork" },
    { 4003, "read", readFunc<MipsLinux> },
    { 4004, "write", writeFunc<MipsLinux> },
    { 4005, "open", openFunc<MipsLinux> },
    { 4006, "close", closeFunc },
    { 4007, "waitpid" },
    { 4008, "creat" },
    { 4009, "link" },
    { 4010, "unlink", unlinkFunc },
    { 4011, "execve" },
    { 4012, "chdir" },
    { 4013, "time" },
    { 4014, "mknod" },
    { 4015, "chmod", chmodFunc<MipsLinux> },
    { 4016, "lchown", chownFunc },
    { 4017, "break", brkFunc },
    { 4018, "unused#18" },
    { 4019, "lseek", lseekFunc },
    { 4020, "getpid", getpidFunc },
    { 4021, "mount" },
    { 4022, "umount" },
    { 4023, "setuid", ignoreFunc },
    { 4024, "getuid", getuidFunc },
    { 4025, "stime" },
    { 4026, "ptrace" },
    { 4027, "alarm" },
    { 4028, "unused#28" },
    { 4029, "pause" },
    { 4030, "utime" },
    { 4031, "stty" },
    { 4032, "gtty" },
    { 4033, "access" },
    { 4034, "nice" },
    { 4035, "ftime" },
    { 4036, "sync" },
    { 4037, "kill" },
    { 4038, "rename" },
    { 4039, "mkdir", mkdirFunc },
    { 4040, "rmdir" },
    { 4041, "dup" },
    { 4042, "pipe", pipePseudoFunc },
    { 4043, "times" },
    { 4044, "prof" },
    { 4045, "brk", brkFunc },
    { 4046, "setgid" },
    { 4047, "getgid", getgidFunc },
    { 4048, "signal", ignoreFunc },
    { 4049, "geteuid", geteuidFunc },
    { 4050, "getegid", getegidFunc },
    { 4051, "acct" },
    { 4052, "umount2" },
    { 4053, "lock" },
    { 4054, "ioctl", ioctlFunc<MipsLinux> },
    { 4055, "fcntl", fcntlFunc },
    { 4056, "mpx" },
    { 4057, "setpgid" },
    { 4058, "ulimit" },
    { 4059, "unused#59" },
    { 4060, "umask", umaskFunc },
    { 4061, "chroot" },
    { 4062, "ustat" },
    { 4063, "dup2" },
    { 4064, "getppid", getpagesizeFunc },
    { 4065, "getpgrp" },
    { 4066, "setsid" },
    { 4067, "sigaction" },
    { 4068, "sgetmask" },
    { 4069, "ssetmask" },
    { 4070, "setreuid" },
    { 4071, "setregid" },
    { 4072, "sigsuspend" },
    { 4073, "sigpending" },
    { 4074, "sethostname", ignoreFunc },
    { 4075, "setrlimit" },
    { 4076, "getrlimit" },
    { 4077, "getrusage", getrusageFunc<MipsLinux> },
    { 4078, "gettimeofday" },
    { 4079, "settimeofday" },
    { 4080, "getgroups" },
    { 4081, "setgroups" },
    { 4082, "reserved#82" },
    { 4083, "symlink" },
    { 4084, "unused#84" },
    { 4085, "readlink", readlinkFunc },
    { 4086, "uselib" },
    { 4087, "swapon", gethostnameFunc },
    { 4088, "reboot" },
    { 4089, "readdir" },
    { 4090, "mmap", mmapFunc<MipsLinux> },
    { 4091, "munmap",munmapFunc },
    { 4092, "truncate", truncateFunc },
    { 4093, "ftruncate", ftruncateFunc },
    { 4094, "fchmod", fchmodFunc<MipsLinux> },
    { 4095, "fchown", fchownFunc },
    { 4096, "getpriority" },
    { 4097, "setpriority" },
    { 4098, "profil" },
    { 4099, "statfs" },
    { 4100, "fstatfs" },
    { 4101, "ioperm" },
    { 4102, "socketcall" },
    { 4103, "syslog" },
    { 4104, "setitimer" },
    { 4105, "getitimer" },
    { 4106, "stat",  statFunc<MipsLinux> },
    { 4107, "lstat" },
    { 4108, "fstat", fstatFunc<MipsLinux> },
    { 4109, "unused#109" },
    { 4110, "iopl" },
    { 4111, "vhangup" },
    { 4112, "idle", ignoreFunc },
    { 4113, "vm86" },
    { 4114, "wait4" },
    { 4115, "swapoff" },
    { 4116, "sysinfo", sysinfoFunc<MipsLinux> },
    { 4117, "ipc" },
    { 4118, "fsync" },
    { 4119, "sigreturn" },
    { 4120, "clone" },
    { 4121, "setdomainname" },
    { 4122, "uname", unameFunc },
    { 4123, "modify_ldt" },
    { 4124, "adjtimex" },
    { 4125, "mprotect", ignoreFunc },
    { 4126, "sigprocmask" },
    { 4127, "create_module" },
    { 4128, "init_module" },
    { 4129, "delete_module" },
    { 4130, "get_kernel_syms" },
    { 4131, "quotactl" },
    { 4132, "getpgid" },
    { 4133, "fchdir" },
    { 4134, "bdflush" },
    { 4135, "sysfs" },
    { 4136, "personality" },
    { 4137, "afs_syscall" },
    { 4138, "setfsuid" },
    { 4139, "setfsgid" },
    { 4140, "llseek" },
    { 4141, "getdents" },
    { 4142, "newselect" },
    { 4143, "flock" },
    { 4144, "msync" },
    { 4145, "readv" },
    { 4146, "writev", writevFunc<MipsLinux> },
    { 4147, "cacheflush" },
    { 4148, "cachectl" },
    { 4149, "sysmips" },
    { 4150, "unused#150" },
    { 4151, "getsid" },
    { 4152, "fdatasync" },
    { 4153, "sysctl", ignoreFunc },
    { 4154, "mlock" },
    { 4155, "munlock" },
    { 4156, "mlockall" },
    { 4157, "munlockall" },
    { 4158, "sched_setparam" },
    { 4159, "sched_getparam" },
    { 4160, "sched_setscheduler" },
    { 4161, "sched_getscheduler" },
    { 4162, "sched_yield" },
    { 4163, "sched_get_prioritymax" },
    { 4164, "sched_get_priority_min" },
    { 4165, "sched_rr_get_interval" },
    { 4166, "nanosleep" },
    { 4167, "mremap", mremapFunc<MipsLinux> },
    { 4168, "accept" },
    { 4169, "bind" },
    { 4170, "connect" },
    { 4171, "getpeername" },
    { 4172, "getsockname" },
    { 4173, "getsockopt" },
    { 4174, "listen" },
    { 4175, "recv" },
    { 4176, "recvmsg" },
    { 4177, "send" },
    { 4178, "sendmsg", ignoreFunc },
    { 4179, "sendto" },
    { 4180, "setsockopt" },
    { 4181, "shutdown" },
    { 4182, "unknown #182" },
    { 4183, "socket", ignoreFunc },
    { 4184, "socketpair" },
    { 4185, "setresuid" },
    { 4186, "getresuid" },
    { 4187, "query_module" },
    { 4188, "poll" },
    { 4189, "nfsservctl" },
    { 4190, "setresgid" },
    { 4191, "getresgid" },
    { 4192, "prctl" },
    { 4193, "rt_sigreturn" },
    { 4194, "rt_sigaction" },
    { 4195, "rt_sigprocmask" },
    { 4196, "rt_sigpending" },
    { 4197, "rt_sigtimedwait" },
    { 4198, "rt_sigqueueinfo", ignoreFunc },
    { 4199, "rt_sigsuspend" },
    { 4200, "pread64" },
    { 4201, "pwrite64" },
    { 4202, "chown" },
    { 4203, "getcwd", getcwdFunc },
    { 4204, "capget" },
    { 4205, "capset" },
    { 4206, "sigalstack" },
    { 4207, "sendfile" },
    { 4208, "getpmsg" },
    { 4209, "putpmsg" },
    { 4210, "mmap2" },
    { 4211, "truncate64" },
    { 4212, "ftruncate64" },
    { 4213, "stat64" },
    { 4214, "lstat64", lstat64Func<MipsLinux> },
    { 4215, "fstat64", fstat64Func<MipsLinux> },
    { 4216, "pivot_root" },
    { 4217, "mincore" },
    { 4218, "madvise" },
    { 4219, "getdents64" },
    { 4220, "fcntl64", fcntl64Func },
    { 4221, "reserved#221" },
    { 4222, "gettid" },
    { 4223, "readahead" },
    { 4224, "setxattr" },
    { 4225, "lsetxattr" },
    { 4226, "fsetxattr" },
    { 4227, "getxattr" },
    { 4228, "lgetxattr" },
    { 4229, "fgetxattr" },
    { 4230, "listxattr" },
    { 4231, "llistxattr" },
    { 4232, "flistxattr" },
    { 4233, "removexattr" },
    { 4234, "lremovexattr" },
    { 4235, "fremovexattr", ignoreFunc },
    { 4236, "tkill" },
    { 4237, "sendfile64" },
    { 4238, "futex" },
    { 4239, "sched_setaffinity" },
    { 4240, "sched_getaffinity" },
    { 4241, "io_setup" },
    { 4242, "io_destroy" },
    { 4243, "io_getevents" },
    { 4244, "io_submit" },
    { 4245, "io_cancel" },
    { 4246, "exit_group", exitFunc },
    { 4247, "lookup_dcookie" },
    { 4248, "epoll_create" },
    { 4249, "epoll_ctl" },
    { 4250, "epoll_wait" },
    { 4251, "remap_file_pages" },
    { 4252, "set_tid_address" },
    { 4253, "restart_syscall" },
    { 4254, "fadvise64" },
    { 4255, "statfs64" },
    { 4256, "fstafs64" },
    { 4257, "timer_create", sys_getsysinfoFunc },
    { 4258, "timer_settime", sys_setsysinfoFunc },
    { 4259, "timer_gettime" },
    { 4260, "timer_getoverrun" },
    { 4261, "timer_delete" },
    { 4262, "clock_settime" },
    { 4263, "clock_gettime" },
    { 4264, "clock_getres" },
    { 4265, "clock_nanosleep" },
    { 4266, "tgkill" },
    { 4267, "utimes" },
    { 4268, "mbind" },
    { 4269, "get_mempolicy" },
    { 4270, "set_mempolicy" },
    { 4271, "mq_open" },
    { 4272, "mq_unlink" },
    { 4273, "mq_timedsend" },
    { 4274, "mq_timedreceive" },
    { 4275, "mq_notify" },
    { 4276, "mq_getsetattr" },
    { 4277, "vserver" },
    { 4278, "waitid" },
    { 4279, "unknown #279" },
    { 4280, "add_key" },
    { 4281, "request_key" },
    { 4282, "keyctl" },
    { 4283, "set_thread_area", setThreadAreaFunc },
    { 4284, "inotify_init" },
    { 4285, "inotify_add_watch" },
    { 4286, "inotify_rm_watch" },
    { 4287, "migrate_pages" },
    { 4288, "openat" },
    { 4289, "mkdirat" },
    { 4290, "mknodat" },
    { 4291, "fchownat" },
    { 4292, "futimesat" },
    { 4293, "fstatat64" },
    { 4294, "unlinkat" },
    { 4295, "renameat" },
    { 4296, "linkat" },
    { 4297, "symlinkat" },
    { 4298, "readlinkat" },
    { 4299, "fchmodat" },
    { 4300, "faccessat" },
    { 4301, "pselect6" },
    { 4302, "ppoll" },
    { 4303, "unshare" },
    { 4304, "splice" },
    { 4305, "sync_file_range" },
    { 4306, "tee" },
    { 4307, "vmsplice" },
    { 4308, "move_pages" },
    { 4309, "set_robust_list" },
    { 4310, "get_robust_list" },
    { 4311, "kexec_load" },
    { 4312, "getcpu" },
    { 4313, "epoll_pwait" },
    { 4314, "ioprio_set" },
    { 4315, "ioprio_get" },
    { 4316, "utimensat" },
    { 4317, "signalfd" },
    { 4318, "timerfd" },
    { 4319, "eventfd" }
};

MipsLinuxProcess::MipsLinuxProcess(ProcessParams * params,
                                   ::Loader::ObjectFile *objFile) :
    MipsProcess(params, objFile)
{}

void
MipsLinuxProcess::syscall(ThreadContext *tc, Fault *fault)
{
    MipsProcess::syscall(tc, fault);
    syscallDescs.get(tc->readIntReg(2))->doSyscall(tc, fault);
}
