/*
 * Copyright (c) 2003-2005 The Regents of The University of Michigan
 * Copyright (c) 2007-2008 The Florida State University
 * Copyright (c) 2009 The University of Edinburgh
 * 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.
 *
 * Authors: Korey Sewell
 *          Stephen Hines
 *          Timothy M. Jones
 */

#include "arch/power/linux/process.hh"

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

using namespace std;
using namespace PowerISA;

namespace
{

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

        auto opsys = obj_file->getOpSys();

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

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

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

PowerLinuxObjectFileLoader loader;

} // anonymous namespace

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

    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, "power");

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

SyscallDesc PowerLinuxProcess::syscallDescs[] = {
    /*  0 */ { "syscall" },
    /*  1 */ { "exit", exitFunc },
    /*  2 */ { "fork" },
    /*  3 */ { "read", readFunc<PowerLinux> },
    /*  4 */ { "write", writeFunc<PowerLinux> },
    /*  5 */ { "open", openFunc<PowerLinux> },
    /*  6 */ { "close", closeFunc },
    /*  7 */ { "waitpid" }, //???
    /*  8 */ { "creat" },
    /*  9 */ { "link" },
    /* 10 */ { "unlink", unlinkFunc },
    /* 11 */ { "execve" },
    /* 12 */ { "chdir" },
    /* 13 */ { "time", timeFunc<PowerLinux> },
    /* 14 */ { "mknod" },
    /* 15 */ { "chmod", chmodFunc<PowerLinux> },
    /* 16 */ { "lchown", chownFunc },
    /* 17 */ { "break", brkFunc }, //???
    /* 18 */ { "unused#18" }, //???
    /* 19 */ { "lseek", lseekFunc },
    /* 20 */ { "getpid", getpidFunc },
    /* 21 */ { "mount" },
    /* 22 */ { "umount" },
    /* 23 */ { "setuid", setuidFunc },
    /* 24 */ { "getuid", getuidFunc },
    /* 25 */ { "stime" },
    /* 26 */ { "ptrace" },
    /* 27 */ { "alarm" },
    /* 28 */ { "unused#28" },
    /* 29 */ { "pause" },
    /* 30 */ { "utime" },
    /* 31 */ { "stty" },
    /* 32 */ { "gtty" },
    /* 33 */ { "access" },
    /* 34 */ { "nice" },
    /* 35 */ { "ftime" },
    /* 36 */ { "sync" },
    /* 37 */ { "kill", ignoreFunc },
    /* 38 */ { "rename", renameFunc },
    /* 39 */ { "mkdir" },
    /* 40 */ { "rmdir" },
    /* 41 */ { "dup", dupFunc },
    /* 42 */ { "pipe" },
    /* 43 */ { "times", timesFunc<PowerLinux> },
    /* 44 */ { "prof" },
    /* 45 */ { "brk", brkFunc },
    /* 46 */ { "setgid" },
    /* 47 */ { "getgid", getgidFunc },
    /* 48 */ { "signal", ignoreFunc },
    /* 49 */ { "geteuid", geteuidFunc },
    /* 50 */ { "getegid", getegidFunc },
    /* 51 */ { "acct" },
    /* 52 */ { "umount2" },
    /* 53 */ { "lock" },
    /* 54 */ { "ioctl", ioctlFunc<PowerLinux> },
    /* 55 */ { "fcntl", fcntlFunc },
    /* 56 */ { "mpx" },
    /* 57 */ { "setpgid" },
    /* 58 */ { "ulimit" },
    /* 59 */ { "unused#59" },
    /* 60 */ { "umask", umaskFunc },
    /* 61 */ { "chroot" },
    /* 62 */ { "ustat" },
    /* 63 */ { "dup2" },
    /* 64 */ { "getppid", getpagesizeFunc },
    /* 65 */ { "getpgrp" },
    /* 66 */ { "setsid" },
    /* 67 */ { "sigaction" },
    /* 68 */ { "sgetmask" },
    /* 69 */ { "ssetmask" },
    /* 70 */ { "setreuid" },
    /* 71 */ { "setregid" },
    /* 72 */ { "sigsuspend" },
    /* 73 */ { "sigpending" },
    /* 74 */ { "sethostname", ignoreFunc },
    /* 75 */ { "setrlimit", ignoreFunc },
    /* 76 */ { "getrlimit" },
    /* 77 */ { "getrusage", ignoreFunc },
    /* 78 */ { "gettimeofday" },
    /* 79 */ { "settimeofday" },
    /* 80 */ { "getgroups" },
    /* 81 */ { "setgroups" },
    /* 82 */ { "reserved#82" },
    /* 83 */ { "symlink" },
    /* 84 */ { "unused#84" },
    /* 85 */ { "readlink" },
    /* 86 */ { "uselib" },
    /* 87 */ { "swapon", gethostnameFunc },
    /* 88 */ { "reboot" },
    /* 89 */ { "readdir" },
    /* 90 */ { "mmap", mmapFunc<PowerLinux> },
    /* 91 */ { "munmap",munmapFunc },
    /* 92 */ { "truncate", truncateFunc },
    /* 93 */ { "ftruncate", ftruncateFunc },
    /* 94 */ { "fchmod" },
    /* 95 */ { "fchown" },
    /* 96 */ { "getpriority" },
    /* 97 */ { "setpriority" },
    /* 98 */ { "profil" },
    /* 99 */ { "statfs" },
    /* 100 */ { "fstatfs" },
    /* 101 */ { "ioperm" },
    /* 102 */ { "socketcall" },
    /* 103 */ { "syslog" },
    /* 104 */ { "setitimer" },
    /* 105 */ { "getitimer" },
    /* 106 */ { "stat",  statFunc<PowerLinux> },
    /* 107 */ { "lstat" },
    /* 108 */ { "fstat", fstatFunc<PowerLinux> },
    /* 109 */ { "unused#109" },
    /* 110 */ { "iopl" },
    /* 111 */ { "vhangup" },
    /* 112 */ { "idle", ignoreFunc },
    /* 113 */ { "vm86" },
    /* 114 */ { "wait4" },
    /* 115 */ { "swapoff" },
    /* 116 */ { "sysinfo" },
    /* 117 */ { "ipc" },
    /* 118 */ { "fsync" },
    /* 119 */ { "sigreturn" },
    /* 120 */ { "clone" },
    /* 121 */ { "setdomainname" },
    /* 122 */ { "uname", unameFunc },
    /* 123 */ { "modify_ldt" },
    /* 124 */ { "adjtimex" },
    /* 125 */ { "mprotect", ignoreFunc },
    /* 126 */ { "sigprocmask" },
    /* 127 */ { "create_module" },
    /* 128 */ { "init_module" },
    /* 129 */ { "delete_module" },
    /* 130 */ { "get_kernel_syms" },
    /* 131 */ { "quotactl" },
    /* 132 */ { "getpgid" },
    /* 133 */ { "fchdir" },
    /* 134 */ { "bdflush" },
    /* 135 */ { "sysfs" },
    /* 136 */ { "personality" },
    /* 137 */ { "afs_syscall" },
    /* 138 */ { "setfsuid" },
    /* 139 */ { "setfsgid" },
    /* 140 */ { "llseek", _llseekFunc },
    /* 141 */ { "getdents" },
    /* 142 */ { "newselect" },
    /* 143 */ { "flock" },
    /* 144 */ { "msync" },
    /* 145 */ { "readv" },
    /* 146 */ { "writev", writevFunc<PowerLinux> },
    /* 147 */ { "getsid" },
    /* 148 */ { "fdatasync" },
    /* 149 */ { "sysctl" },
    /* 150 */ { "mlock" },
    /* 151 */ { "munlock" },
    /* 152 */ { "mlockall" },
    /* 153 */ { "munlockall" },
    /* 154 */ { "sched_setparam" },
    /* 155 */ { "sched_getparam" },
    /* 156 */ { "sched_setscheduler" },
    /* 157 */ { "sched_getscheduler" },
    /* 158 */ { "sched_yield" },
    /* 159 */ { "sched_get_priority_max" },
    /* 160 */ { "sched_get_priority_min" },
    /* 161 */ { "sched_rr_get_interval" },
    /* 162 */ { "nanosleep" },
    /* 163 */ { "mremap" },
    /* 164 */ { "setresuid" },
    /* 165 */ { "getresuid" },
    /* 166 */ { "vm862" },
    /* 167 */ { "query_module" },
    /* 168 */ { "poll" },
    /* 169 */ { "nfsservctl" },
    /* 170 */ { "setresgid" },
    /* 171 */ { "getresgid" },
    /* 172 */ { "prctl" },
    /* 173 */ { "rt_sigaction", ignoreFunc },
    /* 174 */ { "rt_sigprocmask" },
    /* 175 */ { "unknown#175" },
    /* 176 */ { "rt_sigpending" },
    /* 177 */ { "rt_sigtimedwait" },
    /* 178 */ { "rt_sigqueueinfo", ignoreFunc },
    /* 179 */ { "rt_sigsuspend" },
    /* 180 */ { "pread64" },
    /* 181 */ { "pwrite64" },
    /* 182 */ { "chown" },
    /* 183 */ { "getcwd" },
    /* 184 */ { "capget" },
    /* 185 */ { "capset" },
    /* 186 */ { "sigaltstack" },
    /* 187 */ { "sendfile" },
    /* 188 */ { "getpmsg" },
    /* 189 */ { "putpmsg" },
    /* 190 */ { "ugetrlimit", ignoreFunc },
    /* 191 */ { "getrlimit" },
    /* 192 */ { "mmap2", mmapFunc<PowerLinux> },
    /* 193 */ { "truncate64" },
    /* 194 */ { "ftruncate64", ftruncate64Func },
    /* 195 */ { "stat64", stat64Func<PowerLinux> },
    /* 196 */ { "lstat64", lstat64Func<PowerLinux> },
    /* 197 */ { "fstat64", fstat64Func<PowerLinux> },
    /* 198 */ { "lchown" },
    /* 199 */ { "getuid", getuidFunc },
    /* 200 */ { "getgid", getgidFunc },
    /* 201 */ { "geteuid", geteuidFunc },
    /* 202 */ { "getegid", getegidFunc },
    /* 203 */ { "setreuid" },
    /* 204 */ { "fcntl64", fcntl64Func },
    /* 205 */ { "getgroups" },
    /* 206 */ { "setgroups" },
    /* 207 */ { "fchown" },
    /* 208 */ { "setresuid" },
    /* 209 */ { "getresuid" },
    /* 210 */ { "setresgid" },
    /* 211 */ { "getresgid" },
    /* 212 */ { "chown" },
    /* 213 */ { "setuid" },
    /* 214 */ { "setgid" },
    /* 215 */ { "setfsuid" },
    /* 216 */ { "setfsgid" },
    /* 217 */ { "getdents64" },
    /* 218 */ { "pivot_root" },
    /* 219 */ { "mincore" },
    /* 220 */ { "madvise" },
    /* 221 */ { "unknown#221" },
    /* 222 */ { "tux" },
    /* 223 */ { "unknown#223" },
    /* 224 */ { "gettid" },
    /* 225 */ { "readahead" },
    /* 226 */ { "setxattr" },
    /* 227 */ { "lsetxattr" },
    /* 228 */ { "fsetxattr" },
    /* 229 */ { "getxattr" },
    /* 230 */ { "lgetxattr" },
    /* 231 */ { "fgetxattr" },
    /* 232 */ { "listxattr" },
    /* 233 */ { "llistxattr" },
    /* 234 */ { "exit_group", exitGroupFunc },
    /* 235 */ { "removexattr" },
    /* 236 */ { "lremovexattr" },
    /* 237 */ { "fremovexattr" },
    /* 238 */ { "tkill" },
    /* 239 */ { "sendfile64" },
    /* 240 */ { "futex" },
    /* 241 */ { "sched_setaffinity" },
    /* 242 */ { "sched_getaffinity" },
    /* 243 */ { "io_setup" },
    /* 244 */ { "io_destory" },
    /* 245 */ { "io_getevents" },
    /* 246 */ { "io_submit" },
    /* 247 */ { "io_cancel" },
    /* 248 */ { "unknown#248" },
    /* 249 */ { "lookup_dcookie" },
    /* 250 */ { "epoll_create" },
    /* 251 */ { "epoll_ctl" },
    /* 252 */ { "epoll_wait" },
    /* 253 */ { "remap_file_pages" },
    /* 254 */ { "set_thread_area" },
    /* 255 */ { "get_thread_area" },
    /* 256 */ { "set_tid_address" },
    /* 257 */ { "timer_create" },
    /* 258 */ { "timer_settime" },
    /* 259 */ { "timer_gettime" },
    /* 260 */ { "timer_getoverrun" },
    /* 261 */ { "timer_delete" },
    /* 262 */ { "clock_settime" },
    /* 263 */ { "clock_gettime" },
    /* 264 */ { "clock_getres" },
    /* 265 */ { "clock_nanosleep" },
    /* 266 */ { "statfs64" },
    /* 267 */ { "fstatfs64" },
    /* 268 */ { "tgkill" },
    /* 269 */ { "utimes" },
    /* 270 */ { "arm_fadvise64_64" },
    /* 271 */ { "pciconfig_iobase" },
    /* 272 */ { "pciconfig_read" },
    /* 273 */ { "pciconfig_write" },
    /* 274 */ { "mq_open" },
    /* 275 */ { "mq_unlink" },
    /* 276 */ { "mq_timedsend" },
    /* 277 */ { "mq_timedreceive" },
    /* 278 */ { "mq_notify" },
    /* 279 */ { "mq_getsetattr" },
    /* 280 */ { "waitid" },
    /* 281 */ { "socket" },
    /* 282 */ { "bind" },
    /* 283 */ { "connect" },
    /* 284 */ { "listen" },
    /* 285 */ { "accept" },
    /* 286 */ { "getsockname" },
    /* 287 */ { "getpeername" },
    /* 288 */ { "socketpair" },
    /* 289 */ { "send" },
    /* 290 */ { "sendto" },
    /* 291 */ { "recv" },
    /* 292 */ { "recvfrom" },
    /* 293 */ { "shutdown" },
    /* 294 */ { "setsockopt" },
    /* 295 */ { "getsockopt" },
    /* 296 */ { "sendmsg" },
    /* 297 */ { "rcvmsg" },
    /* 298 */ { "semop" },
    /* 299 */ { "semget" },
    /* 300 */ { "semctl" },
    /* 301 */ { "msgsend" },
    /* 302 */ { "msgrcv" },
    /* 303 */ { "msgget" },
    /* 304 */ { "msgctl" },
    /* 305 */ { "shmat" },
    /* 306 */ { "shmdt" },
    /* 307 */ { "shmget" },
    /* 308 */ { "shmctl" },
    /* 309 */ { "add_key" },
    /* 310 */ { "request_key" },
    /* 311 */ { "keyctl" },
    /* 312 */ { "semtimedop" },
    /* 313 */ { "vserver" },
    /* 314 */ { "ioprio_set" },
    /* 315 */ { "ioprio_get" },
    /* 316 */ { "inotify_init" },
    /* 317 */ { "inotify_add_watch" },
    /* 318 */ { "inotify_rm_watch" },
    /* 319 */ { "mbind" },
    /* 320 */ { "get_mempolicy" },
    /* 321 */ { "set_mempolicy" },
    /* 322 */ { "openat" },
    /* 323 */ { "mkdirat" },
    /* 324 */ { "mknodat" },
    /* 325 */ { "fchownat" },
    /* 326 */ { "futimesat" },
    /* 327 */ { "fstatat64" },
    /* 328 */ { "unlinkat" },
    /* 329 */ { "renameat" },
    /* 330 */ { "linkat" },
    /* 331 */ { "symlinkat" },
    /* 332 */ { "readlinkat" },
    /* 333 */ { "fchmodat" },
    /* 334 */ { "faccessat" },
    /* 335 */ { "pselect6" },
    /* 336 */ { "ppoll" },
    /* 337 */ { "unshare" },
    /* 338 */ { "set_robust_list" },
    /* 339 */ { "get_robust_list" },
    /* 340 */ { "splice" },
    /* 341 */ { "arm_sync_file_range" },
    /* 342 */ { "tee" },
    /* 343 */ { "vmsplice" },
    /* 344 */ { "move_pages" },
    /* 345 */ { "getcpu" },
    /* 346 */ { "epoll_pwait" },
};

PowerLinuxProcess::PowerLinuxProcess(ProcessParams * params,
        ObjectFile *objFile)
    : PowerProcess(params, objFile),
      Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc))
{
}

SyscallDesc*
PowerLinuxProcess::getDesc(int callnum)
{
    if (callnum < 0 || callnum > Num_Syscall_Descs)
        return NULL;

    return &syscallDescs[callnum];
}

void
PowerLinuxProcess::initState()
{
    PowerProcess::initState();
}

void
PowerLinuxProcess::syscall(ThreadContext *tc, Fault *fault)
{
    doSyscall(tc->readIntReg(0), tc, fault);
}

RegVal
PowerLinuxProcess::getSyscallArg(ThreadContext *tc, int &i)
{
    // Linux apparently allows more parameter than the ABI says it should.
    // This limit may need to be increased even further.
    assert(i < 6);
    return tc->readIntReg(ArgumentReg0 + i++);
}
