/*
 * Copyright (c) 2007 The Hewlett-Packard Development Company
 * All rights reserved.
 *
 * The license below extends only to copyright in the software and shall
 * not be construed as granting a license to any other intellectual
 * property including but not limited to intellectual property relating
 * to a hardware implementation of the functionality of the software
 * licensed hereunder.  You may use the software subject to the license
 * terms below provided that you ensure that this notice is replicated
 * unmodified and in its entirety in all distributions of the software,
 * modified or unmodified, in source code or in binary form.
 *
 * 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: Gabe Black
 */

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

#include <sys/syscall.h>

#include "arch/x86/isa_traits.hh"
#include "arch/x86/linux/linux.hh"
#include "arch/x86/registers.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"

using namespace std;
using namespace X86ISA;

namespace
{

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

        if (arch != ObjectFile::X86_64 && arch != ObjectFile::I386)
            return nullptr;

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

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

        if (arch == ObjectFile::X86_64)
            return new X86_64LinuxProcess(params, obj_file);
        else
            return new I386LinuxProcess(params, obj_file);
    }
};

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

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

    return 0;
}

static SyscallReturn
archPrctlFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
    enum ArchPrctlCodes
    {
        SetFS = 0x1002,
        GetFS = 0x1003,
        SetGS = 0x1001,
        GetGS = 0x1004
    };

    // First argument is the code, second is the address
    int index = 0;
    auto process = tc->getProcessPtr();
    int code = process->getSyscallArg(tc, index);
    uint64_t addr = process->getSyscallArg(tc, index);
    uint64_t fsBase, gsBase;
    PortProxy &p = tc->getVirtProxy();
    switch(code)
    {
      // Each of these valid options should actually check addr.
      case SetFS:
        tc->setMiscRegNoEffect(MISCREG_FS_BASE, addr);
        tc->setMiscRegNoEffect(MISCREG_FS_EFF_BASE, addr);
        return 0;
      case GetFS:
        fsBase = tc->readMiscRegNoEffect(MISCREG_FS_BASE);
        p.write(addr, fsBase);
        return 0;
      case SetGS:
        tc->setMiscRegNoEffect(MISCREG_GS_BASE, addr);
        tc->setMiscRegNoEffect(MISCREG_GS_EFF_BASE, addr);
        return 0;
      case GetGS:
        gsBase = tc->readMiscRegNoEffect(MISCREG_GS_BASE);
        p.write(addr, gsBase);
        return 0;
      default:
        return -EINVAL;
    }
}

BitUnion32(UserDescFlags)
    Bitfield<0> seg_32bit;
    Bitfield<2, 1> contents;
    Bitfield<3> read_exec_only;
    Bitfield<4> limit_in_pages;
    Bitfield<5> seg_not_present;
    Bitfield<6> useable;
EndBitUnion(UserDescFlags)

struct UserDesc32 {
    uint32_t entry_number;
    uint32_t base_addr;
    uint32_t limit;
    uint32_t flags;
};

struct UserDesc64 {
    uint32_t entry_number;
    uint32_t __padding1;
    uint64_t base_addr;
    uint32_t limit;
    uint32_t flags;
};

static SyscallReturn
setThreadArea32Func(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
    const int minTLSEntry = 6;
    const int numTLSEntries = 3;
    const int maxTLSEntry = minTLSEntry + numTLSEntries - 1;

    auto process = tc->getProcessPtr();

    X86Process *x86p = dynamic_cast<X86Process *>(process);
    assert(x86p);

    assert((maxTLSEntry + 1) * sizeof(uint64_t) <= x86p->gdtSize());

    int argIndex = 0;
    TypedBufferArg<UserDesc32> userDesc(process->getSyscallArg(tc, argIndex));
    TypedBufferArg<uint64_t>
        gdt(x86p->gdtStart() + minTLSEntry * sizeof(uint64_t),
            numTLSEntries * sizeof(uint64_t));

    if (!userDesc.copyIn(tc->getVirtProxy()))
        return -EFAULT;

    if (!gdt.copyIn(tc->getVirtProxy()))
        panic("Failed to copy in GDT for %s.\n", desc->name());

    if (userDesc->entry_number == (uint32_t)(-1)) {
        // Find a free TLS entry.
        for (int i = 0; i < numTLSEntries; i++) {
            if (gdt[i] == 0) {
                userDesc->entry_number = i + minTLSEntry;
                break;
            }
        }
        // We failed to find one.
        if (userDesc->entry_number == (uint32_t)(-1))
            return -ESRCH;
    }

    int index = userDesc->entry_number;

    if (index < minTLSEntry || index > maxTLSEntry)
        return -EINVAL;

    index -= minTLSEntry;

    // Build the entry we're going to add.
    SegDescriptor segDesc = 0;
    UserDescFlags flags = userDesc->flags;

    segDesc.limitLow = bits(userDesc->limit, 15, 0);
    segDesc.baseLow = bits(userDesc->base_addr, 23, 0);
    segDesc.type.a = 1;
    if (!flags.read_exec_only)
        segDesc.type.w = 1;
    if (bits((uint8_t)flags.contents, 0))
        segDesc.type.e = 1;
    if (bits((uint8_t)flags.contents, 1))
        segDesc.type.codeOrData = 1;
    segDesc.s = 1;
    segDesc.dpl = 3;
    if (!flags.seg_not_present)
        segDesc.p = 1;
    segDesc.limitHigh = bits(userDesc->limit, 19, 16);
    if (flags.useable)
        segDesc.avl = 1;
    segDesc.l = 0;
    if (flags.seg_32bit)
        segDesc.d = 1;
    if (flags.limit_in_pages)
        segDesc.g = 1;
    segDesc.baseHigh = bits(userDesc->base_addr, 31, 24);

    gdt[index] = (uint64_t)segDesc;

    if (!userDesc.copyOut(tc->getVirtProxy()))
        return -EFAULT;
    if (!gdt.copyOut(tc->getVirtProxy()))
        panic("Failed to copy out GDT for %s.\n", desc->name());

    return 0;
}

static SyscallDesc syscallDescs64[] = {
    /*   0 */ { "read", readFunc<X86Linux64> },
    /*   1 */ { "write", writeFunc<X86Linux64> },
    /*   2 */ { "open", openFunc<X86Linux64> },
    /*   3 */ { "close", closeFunc },
    /*   4 */ { "stat", stat64Func<X86Linux64> },
    /*   5 */ { "fstat", fstat64Func<X86Linux64> },
    /*   6 */ { "lstat", lstat64Func<X86Linux64> },
    /*   7 */ { "poll", pollFunc<X86Linux64> },
    /*   8 */ { "lseek", lseekFunc },
    /*   9 */ { "mmap", mmapFunc<X86Linux64> },
    /*  10 */ { "mprotect", ignoreFunc },
    /*  11 */ { "munmap", munmapFunc },
    /*  12 */ { "brk", brkFunc },
    /*  13 */ { "rt_sigaction", ignoreWarnOnceFunc },
    /*  14 */ { "rt_sigprocmask", ignoreWarnOnceFunc },
    /*  15 */ { "rt_sigreturn" },
    /*  16 */ { "ioctl", ioctlFunc<X86Linux64> },
    /*  17 */ { "pread64" },
    /*  18 */ { "pwrite64", pwrite64Func<X86Linux64> },
    /*  19 */ { "readv", readvFunc<X86Linux64> },
    /*  20 */ { "writev", writevFunc<X86Linux64> },
    /*  21 */ { "access", ignoreFunc },
    /*  22 */ { "pipe", pipeFunc },
    /*  23 */ { "select", selectFunc<X86Linux64> },
    /*  24 */ { "sched_yield", ignoreFunc },
    /*  25 */ { "mremap", mremapFunc<X86Linux64> },
    /*  26 */ { "msync" },
    /*  27 */ { "mincore" },
    /*  28 */ { "madvise", ignoreFunc },
    /*  29 */ { "shmget" },
    /*  30 */ { "shmat" },
    /*  31 */ { "shmctl" },
    /*  32 */ { "dup", dupFunc },
    /*  33 */ { "dup2", dup2Func },
    /*  34 */ { "pause" },
    /*  35 */ { "nanosleep", ignoreWarnOnceFunc },
    /*  36 */ { "getitimer" },
    /*  37 */ { "alarm" },
    /*  38 */ { "setitimer" },
    /*  39 */ { "getpid", getpidFunc },
    /*  40 */ { "sendfile" },
    /*  41 */ { "socket", socketFunc<X86Linux64> },
    /*  42 */ { "connect", connectFunc },
    /*  43 */ { "accept", acceptFunc<X86Linux64> },
    /*  44 */ { "sendto", sendtoFunc },
    /*  45 */ { "recvfrom", recvfromFunc },
    /*  46 */ { "sendmsg", sendmsgFunc },
    /*  47 */ { "recvmsg", recvmsgFunc },
    /*  48 */ { "shutdown", shutdownFunc },
    /*  49 */ { "bind", bindFunc },
    /*  50 */ { "listen", listenFunc },
    /*  51 */ { "getsockname", getsocknameFunc },
    /*  52 */ { "getpeername", getpeernameFunc },
    /*  53 */ { "socketpair", socketpairFunc<X86Linux64> },
    /*  54 */ { "setsockopt", setsockoptFunc },
    /*  55 */ { "getsockopt", getsockoptFunc },
    /*  56 */ { "clone", cloneFunc<X86Linux64> },
    /*  57 */ { "fork" },
    /*  58 */ { "vfork" },
    /*  59 */ { "execve", execveFunc<X86Linux64> },
    /*  60 */ { "exit", exitFunc },
    /*  61 */ { "wait4", wait4Func<X86Linux64> },
    /*  62 */ { "kill" },
    /*  63 */ { "uname", unameFunc },
    /*  64 */ { "semget" },
    /*  65 */ { "semop" },
    /*  66 */ { "semctl" },
    /*  67 */ { "shmdt" },
    /*  68 */ { "msgget" },
    /*  69 */ { "msgsnd" },
    /*  70 */ { "msgrcv" },
    /*  71 */ { "msgctl" },
    /*  72 */ { "fcntl", fcntlFunc },
    /*  73 */ { "flock" },
    /*  74 */ { "fsync" },
    /*  75 */ { "fdatasync" },
    /*  76 */ { "truncate", truncateFunc },
    /*  77 */ { "ftruncate", ftruncateFunc },
#if defined(SYS_getdents)
    /*  78 */ { "getdents", getdentsFunc },
#else
    /*  78 */ { "getdents" },
#endif
    /*  79 */ { "getcwd", getcwdFunc },
    /*  80 */ { "chdir", chdirFunc },
    /*  81 */ { "fchdir" },
    /*  82 */ { "rename", renameFunc },
    /*  83 */ { "mkdir", mkdirFunc },
    /*  84 */ { "rmdir", rmdirFunc },
    /*  85 */ { "creat" },
    /*  86 */ { "link", linkFunc },
    /*  87 */ { "unlink", unlinkFunc },
    /*  88 */ { "symlink", symlinkFunc },
    /*  89 */ { "readlink", readlinkFunc },
    /*  90 */ { "chmod" },
    /*  91 */ { "fchmod" },
    /*  92 */ { "chown" },
    /*  93 */ { "fchown" },
    /*  94 */ { "lchown" },
    /*  95 */ { "umask", umaskFunc },
    /*  96 */ { "gettimeofday", gettimeofdayFunc<X86Linux64> },
    /*  97 */ { "getrlimit", getrlimitFunc<X86Linux64> },
    /*  98 */ { "getrusage", getrusageFunc<X86Linux64> },
    /*  99 */ { "sysinfo", sysinfoFunc<X86Linux64> },
    /* 100 */ { "times", timesFunc<X86Linux64> },
    /* 101 */ { "ptrace" },
    /* 102 */ { "getuid", getuidFunc },
    /* 103 */ { "syslog" },
    /* 104 */ { "getgid", getgidFunc },
    /* 105 */ { "setuid" },
    /* 106 */ { "setgid" },
    /* 107 */ { "geteuid", geteuidFunc },
    /* 108 */ { "getegid", getegidFunc },
    /* 109 */ { "setpgid", setpgidFunc },
    /* 110 */ { "getppid", getppidFunc },
    /* 111 */ { "getpgrp", getpgrpFunc },
    /* 112 */ { "setsid" },
    /* 113 */ { "setreuid" },
    /* 114 */ { "setregid" },
    /* 115 */ { "getgroups" },
    /* 116 */ { "setgroups" },
    /* 117 */ { "setresuid", ignoreFunc },
    /* 118 */ { "getresuid" },
    /* 119 */ { "setresgid" },
    /* 120 */ { "getresgid" },
    /* 121 */ { "getpgid" },
    /* 122 */ { "setfsuid" },
    /* 123 */ { "setfsgid" },
    /* 124 */ { "getsid" },
    /* 125 */ { "capget" },
    /* 126 */ { "capset" },
    /* 127 */ { "rt_sigpending" },
    /* 128 */ { "rt_sigtimedwait" },
    /* 129 */ { "rt_sigqueueinfo" },
    /* 130 */ { "rt_sigsuspend" },
    /* 131 */ { "sigaltstack" },
    /* 132 */ { "utime" },
    /* 133 */ { "mknod", mknodFunc },
    /* 134 */ { "uselib" },
    /* 135 */ { "personality" },
    /* 136 */ { "ustat" },
    /* 137 */ { "statfs", statfsFunc<X86Linux64> },
    /* 138 */ { "fstatfs", fstatfsFunc<X86Linux64> },
    /* 139 */ { "sysfs" },
    /* 140 */ { "getpriority" },
    /* 141 */ { "setpriority", ignoreFunc },
    /* 142 */ { "sched_setparam" },
    /* 143 */ { "sched_getparam" },
    /* 144 */ { "sched_setscheduler" },
    /* 145 */ { "sched_getscheduler" },
    /* 146 */ { "sched_get_priority_max" },
    /* 147 */ { "sched_get_priority_min" },
    /* 148 */ { "sched_rr_get_interval" },
    /* 149 */ { "mlock" },
    /* 150 */ { "munlock" },
    /* 151 */ { "mlockall" },
    /* 152 */ { "munlockall" },
    /* 153 */ { "vhangup" },
    /* 154 */ { "modify_ldt" },
    /* 155 */ { "pivot_root" },
    /* 156 */ { "_sysctl" },
    /* 157 */ { "prctl" },
    /* 158 */ { "arch_prctl", archPrctlFunc },
    /* 159 */ { "adjtimex" },
    /* 160 */ { "setrlimit", ignoreFunc },
    /* 161 */ { "chroot" },
    /* 162 */ { "sync" },
    /* 163 */ { "acct" },
    /* 164 */ { "settimeofday" },
    /* 165 */ { "mount" },
    /* 166 */ { "umount2" },
    /* 167 */ { "swapon" },
    /* 168 */ { "swapoff" },
    /* 169 */ { "reboot" },
    /* 170 */ { "sethostname" },
    /* 171 */ { "setdomainname" },
    /* 172 */ { "iopl" },
    /* 173 */ { "ioperm" },
    /* 174 */ { "create_module" },
    /* 175 */ { "init_module" },
    /* 176 */ { "delete_module" },
    /* 177 */ { "get_kernel_syms" },
    /* 178 */ { "query_module" },
    /* 179 */ { "quotactl" },
    /* 180 */ { "nfsservctl" },
    /* 181 */ { "getpmsg" },
    /* 182 */ { "putpmsg" },
    /* 183 */ { "afs_syscall" },
    /* 184 */ { "tuxcall" },
    /* 185 */ { "security" },
    /* 186 */ { "gettid", gettidFunc },
    /* 187 */ { "readahead" },
    /* 188 */ { "setxattr" },
    /* 189 */ { "lsetxattr" },
    /* 190 */ { "fsetxattr" },
    /* 191 */ { "getxattr" },
    /* 192 */ { "lgetxattr" },
    /* 193 */ { "fgetxattr" },
    /* 194 */ { "listxattr" },
    /* 195 */ { "llistxattr" },
    /* 196 */ { "flistxattr" },
    /* 197 */ { "removexattr" },
    /* 198 */ { "lremovexattr" },
    /* 199 */ { "fremovexattr" },
    /* 200 */ { "tkill" },
    /* 201 */ { "time", timeFunc<X86Linux64> },
    /* 202 */ { "futex", futexFunc<X86Linux64> },
    /* 203 */ { "sched_setaffinity" },
    /* 204 */ { "sched_getaffinity", ignoreFunc },
    /* 205 */ { "set_thread_area" },
    /* 206 */ { "io_setup" },
    /* 207 */ { "io_destroy" },
    /* 208 */ { "io_getevents" },
    /* 209 */ { "io_submit" },
    /* 210 */ { "io_cancel" },
    /* 211 */ { "get_thread_area" },
    /* 212 */ { "lookup_dcookie" },
    /* 213 */ { "epoll_create" },
    /* 214 */ { "epoll_ctl_old" },
    /* 215 */ { "epoll_wait_old" },
    /* 216 */ { "remap_file_pages" },
    /* 217 */ { "getdents64" },
    /* 218 */ { "set_tid_address", setTidAddressFunc },
    /* 219 */ { "restart_syscall" },
    /* 220 */ { "semtimedop" },
    /* 221 */ { "fadvise64", ignoreFunc },
    /* 222 */ { "timer_create" },
    /* 223 */ { "timer_settime" },
    /* 224 */ { "timer_gettime" },
    /* 225 */ { "timer_getoverrun" },
    /* 226 */ { "timer_delete" },
    /* 227 */ { "clock_settime" },
    /* 228 */ { "clock_gettime", clock_gettimeFunc<X86Linux64> },
    /* 229 */ { "clock_getres", clock_getresFunc<X86Linux64> },
    /* 230 */ { "clock_nanosleep" },
    /* 231 */ { "exit_group", exitGroupFunc },
    /* 232 */ { "epoll_wait" },
    /* 233 */ { "epoll_ctl" },
    /* 234 */ { "tgkill", tgkillFunc<X86Linux64> },
    /* 235 */ { "utimes" },
    /* 236 */ { "vserver" },
    /* 237 */ { "mbind" },
    /* 238 */ { "set_mempolicy" },
    /* 239 */ { "get_mempolicy", ignoreFunc },
    /* 240 */ { "mq_open" },
    /* 241 */ { "mq_unlink" },
    /* 242 */ { "mq_timedsend" },
    /* 243 */ { "mq_timedreceive" },
    /* 244 */ { "mq_notify" },
    /* 245 */ { "mq_getsetattr" },
    /* 246 */ { "kexec_load" },
    /* 247 */ { "waitid" },
    /* 248 */ { "add_key" },
    /* 249 */ { "request_key" },
    /* 250 */ { "keyctl" },
    /* 251 */ { "ioprio_set" },
    /* 252 */ { "ioprio_get" },
    /* 253 */ { "inotify_init" },
    /* 254 */ { "inotify_add_watch" },
    /* 255 */ { "inotify_rm_watch" },
    /* 256 */ { "migrate_pages" },
    /* 257 */ { "openat", openatFunc<X86Linux64> },
    /* 258 */ { "mkdirat" },
    /* 259 */ { "mknodat" },
    /* 260 */ { "fchownat" },
    /* 261 */ { "futimesat" },
    /* 262 */ { "newfstatat" },
    /* 263 */ { "unlinkat" },
    /* 264 */ { "renameat" },
    /* 265 */ { "linkat" },
    /* 266 */ { "symlinkat" },
    /* 267 */ { "readlinkat", readlinkFunc },
    /* 268 */ { "fchmodat" },
    /* 269 */ { "faccessat" },
    /* 270 */ { "pselect6" },
    /* 271 */ { "ppoll" },
    /* 272 */ { "unshare" },
    /* 273 */ { "set_robust_list", ignoreFunc },
    /* 274 */ { "get_robust_list" },
    /* 275 */ { "splice" },
    /* 276 */ { "tee" },
    /* 277 */ { "sync_file_range" },
    /* 278 */ { "vmsplice" },
    /* 279 */ { "move_pages" },
    /* 280 */ { "utimensat" },
    /* 281 */ { "epoll_pwait" },
    /* 282 */ { "signalfd" },
    /* 283 */ { "timerfd_create" },
    /* 284 */ { "eventfd", eventfdFunc<X86Linux64> },
    /* 285 */ { "fallocate", fallocateFunc },
    /* 286 */ { "timerfd_settime" },
    /* 287 */ { "timerfd_gettime" },
    /* 288 */ { "accept4" },
    /* 289 */ { "signalfd4" },
    /* 290 */ { "eventfd2", eventfdFunc<X86Linux64> },
    /* 291 */ { "epoll_create1" },
    /* 292 */ { "dup3" },
    /* 293 */ { "pipe2", pipe2Func },
    /* 294 */ { "inotify_init1" },
    /* 295 */ { "preadv" },
    /* 296 */ { "pwritev" },
    /* 297 */ { "rt_tgsigqueueinfo" },
    /* 298 */ { "perf_event_open" },
    /* 299 */ { "recvmmsg" },
    /* 300 */ { "fanotify_init" },
    /* 301 */ { "fanotify_mark" },
    /* 302 */ { "prlimit64", prlimitFunc<X86Linux64> },
    /* 303 */ { "name_to_handle_at" },
    /* 304 */ { "open_by_handle_at" },
    /* 305 */ { "clock_adjtime" },
    /* 306 */ { "syncfs" },
    /* 307 */ { "sendmmsg" },
    /* 308 */ { "setns" },
    /* 309 */ { "getcpu" },
    /* 310 */ { "proess_vm_readv" },
    /* 311 */ { "proess_vm_writev" },
    /* 312 */ { "kcmp" },
    /* 313 */ { "finit_module" },
};

X86_64LinuxProcess::X86_64LinuxProcess(ProcessParams * params,
                                       ObjectFile *objFile)
    : X86_64Process(params, objFile, syscallDescs64,
                    sizeof(syscallDescs64) / sizeof(SyscallDesc))
{}

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

void
X86_64LinuxProcess::clone(ThreadContext *old_tc, ThreadContext *new_tc,
                          Process *process, RegVal flags)
{
    X86_64Process::clone(old_tc, new_tc, (X86_64Process*)process, flags);
}

static SyscallDesc syscallDescs32[] = {
    /*   0 */ { "restart_syscall" },
    /*   1 */ { "exit", exitFunc },
    /*   2 */ { "fork" },
    /*   3 */ { "read", readFunc<X86Linux32> },
    /*   4 */ { "write", writeFunc<X86Linux32> },
    /*   5 */ { "open", openFunc<X86Linux32> },
    /*   6 */ { "close", closeFunc },
    /*   7 */ { "waitpid" },
    /*   8 */ { "creat" },
    /*   9 */ { "link" },
    /*  10 */ { "unlink" },
    /*  11 */ { "execve", execveFunc<X86Linux32> },
    /*  12 */ { "chdir", chdirFunc },
    /*  13 */ { "time", timeFunc<X86Linux32> },
    /*  14 */ { "mknod", mknodFunc },
    /*  15 */ { "chmod" },
    /*  16 */ { "lchown" },
    /*  17 */ { "break" },
    /*  18 */ { "oldstat" },
    /*  19 */ { "lseek" },
    /*  20 */ { "getpid", getpidFunc },
    /*  21 */ { "mount" },
    /*  22 */ { "umount" },
    /*  23 */ { "setuid" },
    /*  24 */ { "getuid", getuidFunc },
    /*  25 */ { "stime" },
    /*  26 */ { "ptrace" },
    /*  27 */ { "alarm" },
    /*  28 */ { "oldfstat" },
    /*  29 */ { "pause" },
    /*  30 */ { "utime" },
    /*  31 */ { "stty" },
    /*  32 */ { "gtty" },
    /*  33 */ { "access", ignoreFunc },
    /*  34 */ { "nice" },
    /*  35 */ { "ftime" },
    /*  36 */ { "sync" },
    /*  37 */ { "kill" },
    /*  38 */ { "rename" },
    /*  39 */ { "mkdir", mkdirFunc },
    /*  40 */ { "rmdir", mkdirFunc },
    /*  41 */ { "dup", dupFunc },
    /*  42 */ { "pipe", pipeFunc },
    /*  43 */ { "times", timesFunc<X86Linux32> },
    /*  44 */ { "prof" },
    /*  45 */ { "brk", brkFunc },
    /*  46 */ { "setgid" },
    /*  47 */ { "getgid", getgidFunc },
    /*  48 */ { "signal" },
    /*  49 */ { "geteuid", geteuidFunc },
    /*  50 */ { "getegid", getegidFunc },
    /*  51 */ { "acct" },
    /*  52 */ { "umount2" },
    /*  53 */ { "lock" },
    /*  54 */ { "ioctl", ioctlFunc<X86Linux32> },
    /*  55 */ { "fcntl", fcntlFunc },
    /*  56 */ { "mpx" },
    /*  57 */ { "setpgid", setpgidFunc },
    /*  58 */ { "ulimit" },
    /*  59 */ { "oldolduname" },
    /*  60 */ { "umask", umaskFunc },
    /*  61 */ { "chroot" },
    /*  62 */ { "ustat" },
    /*  63 */ { "dup2", dup2Func },
    /*  64 */ { "getppid" },
    /*  65 */ { "getpgrp" },
    /*  66 */ { "setsid" },
    /*  67 */ { "sigaction" },
    /*  68 */ { "sgetmask" },
    /*  69 */ { "ssetmask" },
    /*  70 */ { "setreuid" },
    /*  71 */ { "setregid" },
    /*  72 */ { "sigsuspend" },
    /*  73 */ { "sigpending" },
    /*  74 */ { "sethostname" },
    /*  75 */ { "setrlimit", ignoreFunc },
    /*  76 */ { "getrlimit", getrlimitFunc<X86Linux32> },
    /*  77 */ { "getrusage", getrusageFunc<X86Linux32> },
    /*  78 */ { "gettimeofday" },
    /*  79 */ { "settimeofday" },
    /*  80 */ { "getgroups" },
    /*  81 */ { "setgroups" },
    /*  82 */ { "select", selectFunc<X86Linux32> },
    /*  83 */ { "symlink" },
    /*  84 */ { "oldlstat" },
    /*  85 */ { "readlink", readlinkFunc },
    /*  86 */ { "uselib" },
    /*  87 */ { "swapon" },
    /*  88 */ { "reboot" },
    /*  89 */ { "readdir" },
    /*  90 */ { "mmap" },
    /*  91 */ { "munmap", munmapFunc },
    /*  92 */ { "truncate", truncateFunc },
    /*  93 */ { "ftruncate", ftruncateFunc },
    /*  94 */ { "fchmod" },
    /*  95 */ { "fchown" },
    /*  96 */ { "getpriority" },
    /*  97 */ { "setpriority", ignoreFunc },
    /*  98 */ { "profil" },
    /*  99 */ { "statfs", ignoreFunc },
    /* 100 */ { "fstatfs" },
    /* 101 */ { "ioperm" },
    /* 102 */ { "socketcall" },
    /* 103 */ { "syslog" },
    /* 104 */ { "setitimer" },
    /* 105 */ { "getitimer" },
    /* 106 */ { "stat" },
    /* 107 */ { "lstat" },
    /* 108 */ { "fstat" },
    /* 109 */ { "olduname" },
    /* 110 */ { "iopl" },
    /* 111 */ { "vhangup" },
    /* 112 */ { "idle" },
    /* 113 */ { "vm86old" },
    /* 114 */ { "wait4", wait4Func<X86Linux32> },
    /* 115 */ { "swapoff" },
    /* 116 */ { "sysinfo", sysinfoFunc<X86Linux32> },
    /* 117 */ { "ipc" },
    /* 118 */ { "fsync" },
    /* 119 */ { "sigreturn" },
    /* 120 */ { "clone", cloneFunc<X86Linux32> },
    /* 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 },
#if defined(SYS_getdents)
    /* 141 */ { "getdents", getdentsFunc },
#else
    /* 141 */ { "getdents" },
#endif
    /* 142 */ { "_newselect" },
    /* 143 */ { "flock" },
    /* 144 */ { "msync" },
    /* 145 */ { "readv", readvFunc<X86Linux32> },
    /* 146 */ { "writev", writevFunc<X86Linux32> },
    /* 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", ignoreFunc },
    /* 159 */ { "sched_get_priority_max" },
    /* 160 */ { "sched_get_priority_min" },
    /* 161 */ { "sched_rr_get_interval" },
    /* 162 */ { "nanosleep", ignoreFunc },
    /* 163 */ { "mremap" },
    /* 164 */ { "setresuid", ignoreFunc },
    /* 165 */ { "getresuid" },
    /* 166 */ { "vm86" },
    /* 167 */ { "query_module" },
    /* 168 */ { "poll", pollFunc<X86Linux32> },
    /* 169 */ { "nfsservctl" },
    /* 170 */ { "setresgid" },
    /* 171 */ { "getresgid" },
    /* 172 */ { "prctl" },
    /* 173 */ { "rt_sigreturn" },
    /* 174 */ { "rt_sigaction", ignoreFunc },
    /* 175 */ { "rt_sigprocmask", ignoreFunc },
    /* 176 */ { "rt_sigpending" },
    /* 177 */ { "rt_sigtimedwait" },
    /* 178 */ { "rt_sigqueueinfo" },
    /* 179 */ { "rt_sigsuspend" },
    /* 180 */ { "pread64" },
    /* 181 */ { "pwrite64" },
    /* 182 */ { "chown" },
    /* 183 */ { "getcwd", getcwdFunc },
    /* 184 */ { "capget" },
    /* 185 */ { "capset" },
    /* 186 */ { "sigaltstack" },
    /* 187 */ { "sendfile" },
    /* 188 */ { "getpmsg" },
    /* 189 */ { "putpmsg" },
    /* 190 */ { "vfork" },
    /* 191 */ { "ugetrlimit", ignoreFunc },
    /* 192 */ { "mmap2", mmap2Func<X86Linux32> },
    /* 193 */ { "truncate64", truncate64Func },
    /* 194 */ { "ftruncate64", ftruncate64Func },
    /* 195 */ { "stat64", stat64Func<X86Linux32> },
    /* 196 */ { "lstat64" },
    /* 197 */ { "fstat64", fstat64Func<X86Linux32> },
    /* 198 */ { "lchown32" },
    /* 199 */ { "getuid32", getuidFunc },
    /* 200 */ { "getgid32", getgidFunc },
    /* 201 */ { "geteuid32", geteuidFunc },
    /* 202 */ { "getegid32", getegidFunc },
    /* 203 */ { "setreuid32" },
    /* 204 */ { "setregid32" },
    /* 205 */ { "getgroups32" },
    /* 206 */ { "setgroups32" },
    /* 207 */ { "fchown32" },
    /* 208 */ { "setresuid32" },
    /* 209 */ { "getresuid32" },
    /* 210 */ { "setresgid32" },
    /* 211 */ { "getresgid32" },
    /* 212 */ { "chown32" },
    /* 213 */ { "setuid32" },
    /* 214 */ { "setgid32" },
    /* 215 */ { "setfsuid32" },
    /* 216 */ { "setfsgid32" },
    /* 217 */ { "pivot_root" },
    /* 218 */ { "mincore" },
    /* 219 */ { "madvise", ignoreFunc },
    /* 220 */ { "madvise1" },
    /* 221 */ { "getdents64" },
    /* 222 */ { "fcntl64" },
    /* 223 */ { "unused" },
    /* 224 */ { "gettid", gettidFunc },
    /* 225 */ { "readahead" },
    /* 226 */ { "setxattr" },
    /* 227 */ { "lsetxattr" },
    /* 228 */ { "fsetxattr" },
    /* 229 */ { "getxattr" },
    /* 230 */ { "lgetxattr" },
    /* 231 */ { "fgetxattr" },
    /* 232 */ { "listxattr" },
    /* 233 */ { "llistxattr" },
    /* 234 */ { "flistxattr" },
    /* 235 */ { "removexattr" },
    /* 236 */ { "lremovexattr" },
    /* 237 */ { "fremovexattr" },
    /* 238 */ { "tkill" },
    /* 239 */ { "sendfile64" },
    /* 240 */ { "futex" },
    /* 241 */ { "sched_setaffinity" },
    /* 242 */ { "sched_getaffinity", ignoreFunc },
    /* 243 */ { "set_thread_area", setThreadArea32Func },
    /* 244 */ { "get_thread_area" },
    /* 245 */ { "io_setup" },
    /* 246 */ { "io_destroy" },
    /* 247 */ { "io_getevents" },
    /* 248 */ { "io_submit" },
    /* 249 */ { "io_cancel" },
    /* 250 */ { "fadvise64" },
    /* 251 */ { "unused" },
    /* 252 */ { "exit_group", exitFunc },
    /* 253 */ { "lookup_dcookie" },
    /* 254 */ { "epoll_create" },
    /* 255 */ { "epoll_ctl" },
    /* 256 */ { "epoll_wait" },
    /* 257 */ { "remap_file_pages" },
    /* 258 */ { "set_tid_address", setTidAddressFunc },
    /* 259 */ { "timer_create" },
    /* 260 */ { "timer_settime" },
    /* 261 */ { "timer_gettime" },
    /* 262 */ { "timer_getoverrun" },
    /* 263 */ { "timer_delete" },
    /* 264 */ { "clock_settime" },
    /* 265 */ { "clock_gettime", clock_gettimeFunc<X86Linux32> },
    /* 266 */ { "clock_getres" },
    /* 267 */ { "clock_nanosleep" },
    /* 268 */ { "statfs64" },
    /* 269 */ { "fstatfs64" },
    /* 270 */ { "tgkill", tgkillFunc<X86Linux32> },
    /* 271 */ { "utimes" },
    /* 272 */ { "fadvise64_64" },
    /* 273 */ { "vserver" },
    /* 274 */ { "mbind" },
    /* 275 */ { "get_mempolicy", ignoreFunc },
    /* 276 */ { "set_mempolicy" },
    /* 277 */ { "mq_open" },
    /* 278 */ { "mq_unlink" },
    /* 279 */ { "mq_timedsend" },
    /* 280 */ { "mq_timedreceive" },
    /* 281 */ { "mq_notify" },
    /* 282 */ { "mq_getsetattr" },
    /* 283 */ { "kexec_load" },
    /* 284 */ { "waitid" },
    /* 285 */ { "sys_setaltroot" },
    /* 286 */ { "add_key" },
    /* 287 */ { "request_key" },
    /* 288 */ { "keyctl" },
    /* 289 */ { "ioprio_set" },
    /* 290 */ { "ioprio_get" },
    /* 291 */ { "inotify_init" },
    /* 292 */ { "inotify_add_watch" },
    /* 293 */ { "inotify_rm_watch" },
    /* 294 */ { "migrate_pages" },
    /* 295 */ { "openat", openatFunc<X86Linux32> },
    /* 296 */ { "mkdirat" },
    /* 297 */ { "mknodat" },
    /* 298 */ { "fchownat" },
    /* 299 */ { "futimesat" },
    /* 300 */ { "fstatat64" },
    /* 301 */ { "unlinkat" },
    /* 302 */ { "renameat" },
    /* 303 */ { "linkat" },
    /* 304 */ { "symlinkat" },
    /* 305 */ { "readlinkat", readlinkFunc },
    /* 306 */ { "fchmodat" },
    /* 307 */ { "faccessat" },
    /* 308 */ { "pselect6" },
    /* 309 */ { "ppoll" },
    /* 310 */ { "unshare" },
    /* 311 */ { "set_robust_list", ignoreFunc },
    /* 312 */ { "get_robust_list", ignoreFunc },
    /* 313 */ { "splice" },
    /* 314 */ { "sync_file_range" },
    /* 315 */ { "tee" },
    /* 316 */ { "vmsplice" },
    /* 317 */ { "move_pages" },
    /* 318 */ { "getcpu" },
    /* 319 */ { "epoll_pwait" },
    /* 320 */ { "utimensat" },
    /* 321 */ { "signalfd" },
    /* 322 */ { "timerfd" },
    /* 323 */ { "eventfd", eventfdFunc<X86Linux32> }
};

I386LinuxProcess::I386LinuxProcess(ProcessParams * params, ObjectFile *objFile)
    : I386Process(params, objFile, syscallDescs32,
                  sizeof(syscallDescs32) / sizeof(SyscallDesc))
{}

void
I386LinuxProcess::syscall(ThreadContext *tc, Fault *fault)
{
    PCState pc = tc->pcState();
    Addr eip = pc.pc();
    if (eip >= vsyscallPage.base &&
            eip < vsyscallPage.base + vsyscallPage.size) {
        pc.npc(vsyscallPage.base + vsyscallPage.vsysexitOffset);
        tc->pcState(pc);
    }
    doSyscall(tc->readIntReg(INTREG_RAX), tc, fault);
}

void
I386LinuxProcess::clone(ThreadContext *old_tc, ThreadContext *new_tc,
                        Process *process, RegVal flags)
{
    I386Process::clone(old_tc, new_tc, (I386Process*)process, flags);
}
