/*
 * 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.
 *
 * Authors: Steve Reinhardt
 *          Ali Saidi
 */

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

#include "arch/alpha/isa_traits.hh"
#include "arch/alpha/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/process.hh"
#include "sim/syscall_desc.hh"
#include "sim/syscall_emul.hh"

using namespace std;
using namespace AlphaISA;

namespace
{

class AlphaLinuxObjectFileLoader : public Process::Loader
{
  public:
    Process *
    load(ProcessParams *params, ObjectFile *obj_file) override
    {
        if (obj_file->getArch() != ObjectFile::Alpha)
            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 AlphaLinuxProcess(params, obj_file);
    }
};

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

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

/// Target osf_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
osf_getsysinfoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
    int index = 0;
    auto process = tc->getProcessPtr();
    unsigned op = process->getSyscallArg(tc, index);
    Addr bufPtr = process->getSyscallArg(tc, index);
    // unsigned nbytes = process->getSyscallArg(tc, 2);

    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 << "osf_getsysinfo: unknown op " << op << endl;
        abort();
        break;
    }

    return 1;
}

/// Target osf_setsysinfo() handler.
static SyscallReturn
osf_setsysinfoFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
{
    int index = 0;
    auto process = tc->getProcessPtr();
    unsigned op = process->getSyscallArg(tc, index);
    Addr bufPtr = process->getSyscallArg(tc, index);
    // unsigned nbytes = process->getSyscallArg(tc, 2);

    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, "osf_setsysinfo(SSI_IEEE_FP_CONTROL): "
                   " setting FPCR to 0x%x\n", letoh(*(uint64_t*)fpcr));
          return 0;
      }

      default:
        cerr << "osf_setsysinfo: unknown op " << op << endl;
        abort();
        break;
    }

    return 1;
}


SyscallDescABI<DefaultSyscallABI> AlphaLinuxProcess::syscallDescs[] = {
    /*  0 */ { "osf_syscall" },
    /*  1 */ { "exit", exitFunc },
    /*  2 */ { "fork" },
    /*  3 */ { "read", readFunc<AlphaLinux> },
    /*  4 */ { "write", writeFunc<AlphaLinux> },
    /*  5 */ { "osf_old_open" },
    /*  6 */ { "close", closeFunc },
    /*  7 */ { "osf_wait4" },
    /*  8 */ { "osf_old_creat" },
    /*  9 */ { "link" },
    /* 10 */ { "unlink", unlinkFunc },
    /* 11 */ { "osf_execve" },
    /* 12 */ { "chdir" },
    /* 13 */ { "fchdir" },
    /* 14 */ { "mknod" },
    /* 15 */ { "chmod", chmodFunc<AlphaLinux> },
    /* 16 */ { "chown", chownFunc },
    /* 17 */ { "brk", brkFunc },
    /* 18 */ { "osf_getfsstat" },
    /* 19 */ { "lseek", lseekFunc },
    /* 20 */ { "getxpid", getpidPseudoFunc },
    /* 21 */ { "osf_mount" },
    /* 22 */ { "umount" },
    /* 23 */ { "setuid", ignoreFunc },
    /* 24 */ { "getxuid", getuidPseudoFunc },
    /* 25 */ { "exec_with_loader" },
    /* 26 */ { "osf_ptrace" },
    /* 27 */ { "osf_nrecvmsg" },
    /* 28 */ { "osf_nsendmsg" },
    /* 29 */ { "osf_nrecvfrom" },
    /* 30 */ { "osf_naccept" },
    /* 31 */ { "osf_ngetpeername" },
    /* 32 */ { "osf_ngetsockname" },
    /* 33 */ { "access" },
    /* 34 */ { "osf_chflags" },
    /* 35 */ { "osf_fchflags" },
    /* 36 */ { "sync" },
    /* 37 */ { "kill" },
    /* 38 */ { "osf_old_stat" },
    /* 39 */ { "setpgid" },
    /* 40 */ { "osf_old_lstat" },
    /* 41 */ { "dup", dupFunc },
    /* 42 */ { "pipe", pipePseudoFunc },
    /* 43 */ { "osf_set_program_attributes" },
    /* 44 */ { "osf_profil" },
    /* 45 */ { "open", openFunc<AlphaLinux> },
    /* 46 */ { "osf_old_sigaction" },
    /* 47 */ { "getxgid", getgidPseudoFunc },
    /* 48 */ { "osf_sigprocmask", ignoreFunc },
    /* 49 */ { "osf_getlogin" },
    /* 50 */ { "osf_setlogin" },
    /* 51 */ { "acct" },
    /* 52 */ { "sigpending" },
    /* 53 */ { "osf_classcntl" },
    /* 54 */ { "ioctl", ioctlFunc<AlphaLinux> },
    /* 55 */ { "osf_reboot" },
    /* 56 */ { "osf_revoke" },
    /* 57 */ { "symlink" },
    /* 58 */ { "readlink", readlinkFunc },
    /* 59 */ { "execve" },
    /* 60 */ { "umask", umaskFunc },
    /* 61 */ { "chroot" },
    /* 62 */ { "osf_old_fstat" },
    /* 63 */ { "getpgrp" },
    /* 64 */ { "getpagesize", getpagesizeFunc },
    /* 65 */ { "osf_mremap" },
    /* 66 */ { "vfork" },
    /* 67 */ { "stat", statFunc<AlphaLinux> },
    /* 68 */ { "lstat", lstatFunc<AlphaLinux> },
    /* 69 */ { "osf_sbrk" },
    /* 70 */ { "osf_sstk" },
    /* 71 */ { "mmap", mmapFunc<AlphaLinux> },
    /* 72 */ { "osf_old_vadvise" },
    /* 73 */ { "munmap", munmapFunc },
    /* 74 */ { "mprotect", ignoreFunc },
    /* 75 */ { "madvise" },
    /* 76 */ { "vhangup" },
    /* 77 */ { "osf_kmodcall" },
    /* 78 */ { "osf_mincore" },
    /* 79 */ { "getgroups" },
    /* 80 */ { "setgroups" },
    /* 81 */ { "osf_old_getpgrp" },
    /* 82 */ { "setpgrp" },
    /* 83 */ { "osf_setitimer" },
    /* 84 */ { "osf_old_wait" },
    /* 85 */ { "osf_table" },
    /* 86 */ { "osf_getitimer" },
    /* 87 */ { "gethostname", gethostnameFunc },
    /* 88 */ { "sethostname" },
    /* 89 */ { "getdtablesize" },
    /* 90 */ { "dup2" },
    /* 91 */ { "fstat", fstatFunc<AlphaLinux> },
    /* 92 */ { "fcntl", fcntlFunc },
    /* 93 */ { "osf_select" },
    /* 94 */ { "poll" },
    /* 95 */ { "fsync" },
    /* 96 */ { "setpriority" },
    /* 97 */ { "socket" },
    /* 98 */ { "connect" },
    /* 99 */ { "accept" },
    /* 100 */ { "getpriority" },
    /* 101 */ { "send" },
    /* 102 */ { "recv" },
    /* 103 */ { "sigreturn" },
    /* 104 */ { "bind" },
    /* 105 */ { "setsockopt" },
    /* 106 */ { "listen" },
    /* 107 */ { "osf_plock" },
    /* 108 */ { "osf_old_sigvec" },
    /* 109 */ { "osf_old_sigblock" },
    /* 110 */ { "osf_old_sigsetmask" },
    /* 111 */ { "sigsuspend" },
    /* 112 */ { "osf_sigstack", ignoreFunc },
    /* 113 */ { "recvmsg" },
    /* 114 */ { "sendmsg" },
    /* 115 */ { "osf_old_vtrace" },
    /* 116 */ { "osf_gettimeofday" },
    /* 117 */ { "osf_getrusage" },
    /* 118 */ { "getsockopt" },
    /* 119 */ { "numa_syscalls" },
    /* 120 */ { "readv" },
    /* 121 */ { "writev", writevFunc<AlphaLinux> },
    /* 122 */ { "osf_settimeofday" },
    /* 123 */ { "fchown", fchownFunc },
    /* 124 */ { "fchmod", fchmodFunc<AlphaLinux> },
    /* 125 */ { "recvfrom" },
    /* 126 */ { "setreuid" },
    /* 127 */ { "setregid" },
    /* 128 */ { "rename", renameFunc },
    /* 129 */ { "truncate", truncateFunc },
    /* 130 */ { "ftruncate", ftruncateFunc },
    /* 131 */ { "flock" },
    /* 132 */ { "setgid" },
    /* 133 */ { "sendto" },
    /* 134 */ { "shutdown" },
    /* 135 */ { "socketpair" },
    /* 136 */ { "mkdir", mkdirFunc },
    /* 137 */ { "rmdir" },
    /* 138 */ { "osf_utimes" },
    /* 139 */ { "osf_old_sigreturn" },
    /* 140 */ { "osf_adjtime" },
    /* 141 */ { "getpeername" },
    /* 142 */ { "osf_gethostid" },
    /* 143 */ { "osf_sethostid" },
    /* 144 */ { "getrlimit", getrlimitFunc<AlphaLinux> },
    /* 145 */ { "setrlimit", ignoreFunc },
    /* 146 */ { "osf_old_killpg" },
    /* 147 */ { "setsid" },
    /* 148 */ { "quotactl" },
    /* 149 */ { "osf_oldquota" },
    /* 150 */ { "getsockname" },
    /* 151 */ { "osf_pread" },
    /* 152 */ { "osf_pwrite" },
    /* 153 */ { "osf_pid_block" },
    /* 154 */ { "osf_pid_unblock" },
    /* 155 */ { "osf_signal_urti" },
    /* 156 */ { "sigaction", ignoreFunc },
    /* 157 */ { "osf_sigwaitprim" },
    /* 158 */ { "osf_nfssvc" },
    /* 159 */ { "osf_getdirentries" },
    /* 160 */ { "osf_statfs" },
    /* 161 */ { "osf_fstatfs" },
    /* 162 */ { "unknown #162" },
    /* 163 */ { "osf_async_daemon" },
    /* 164 */ { "osf_getfh" },
    /* 165 */ { "osf_getdomainname" },
    /* 166 */ { "setdomainname" },
    /* 167 */ { "unknown #167" },
    /* 168 */ { "unknown #168" },
    /* 169 */ { "osf_exportfs" },
    /* 170 */ { "unknown #170" },
    /* 171 */ { "unknown #171" },
    /* 172 */ { "unknown #172" },
    /* 173 */ { "unknown #173" },
    /* 174 */ { "unknown #174" },
    /* 175 */ { "unknown #175" },
    /* 176 */ { "unknown #176" },
    /* 177 */ { "unknown #177" },
    /* 178 */ { "unknown #178" },
    /* 179 */ { "unknown #179" },
    /* 180 */ { "unknown #180" },
    /* 181 */ { "osf_alt_plock" },
    /* 182 */ { "unknown #182" },
    /* 183 */ { "unknown #183" },
    /* 184 */ { "osf_getmnt" },
    /* 185 */ { "unknown #185" },
    /* 186 */ { "unknown #186" },
    /* 187 */ { "osf_alt_sigpending" },
    /* 188 */ { "osf_alt_setsid" },
    /* 189 */ { "unknown #189" },
    /* 190 */ { "unknown #190" },
    /* 191 */ { "unknown #191" },
    /* 192 */ { "unknown #192" },
    /* 193 */ { "unknown #193" },
    /* 194 */ { "unknown #194" },
    /* 195 */ { "unknown #195" },
    /* 196 */ { "unknown #196" },
    /* 197 */ { "unknown #197" },
    /* 198 */ { "unknown #198" },
    /* 199 */ { "osf_swapon" },
    /* 200 */ { "msgctl" },
    /* 201 */ { "msgget" },
    /* 202 */ { "msgrcv" },
    /* 203 */ { "msgsnd" },
    /* 204 */ { "semctl" },
    /* 205 */ { "semget" },
    /* 206 */ { "semop" },
    /* 207 */ { "osf_utsname" },
    /* 208 */ { "lchown" },
    /* 209 */ { "osf_shmat" },
    /* 210 */ { "shmctl" },
    /* 211 */ { "shmdt" },
    /* 212 */ { "shmget" },
    /* 213 */ { "osf_mvalid" },
    /* 214 */ { "osf_getaddressconf" },
    /* 215 */ { "osf_msleep" },
    /* 216 */ { "osf_mwakeup" },
    /* 217 */ { "msync" },
    /* 218 */ { "osf_signal" },
    /* 219 */ { "osf_utc_gettime" },
    /* 220 */ { "osf_utc_adjtime" },
    /* 221 */ { "unknown #221" },
    /* 222 */ { "osf_security" },
    /* 223 */ { "osf_kloadcall" },
    /* 224 */ { "unknown #224" },
    /* 225 */ { "unknown #225" },
    /* 226 */ { "unknown #226" },
    /* 227 */ { "unknown #227" },
    /* 228 */ { "unknown #228" },
    /* 229 */ { "unknown #229" },
    /* 230 */ { "unknown #230" },
    /* 231 */ { "unknown #231" },
    /* 232 */ { "unknown #232" },
    /* 233 */ { "getpgid" },
    /* 234 */ { "getsid" },
    /* 235 */ { "sigaltstack", ignoreFunc },
    /* 236 */ { "osf_waitid" },
    /* 237 */ { "osf_priocntlset" },
    /* 238 */ { "osf_sigsendset" },
    /* 239 */ { "osf_set_speculative" },
    /* 240 */ { "osf_msfs_syscall" },
    /* 241 */ { "osf_sysinfo" },
    /* 242 */ { "osf_uadmin" },
    /* 243 */ { "osf_fuser" },
    /* 244 */ { "osf_proplist_syscall" },
    /* 245 */ { "osf_ntp_adjtime" },
    /* 246 */ { "osf_ntp_gettime" },
    /* 247 */ { "osf_pathconf" },
    /* 248 */ { "osf_fpathconf" },
    /* 249 */ { "unknown #249" },
    /* 250 */ { "osf_uswitch" },
    /* 251 */ { "osf_usleep_thread" },
    /* 252 */ { "osf_audcntl" },
    /* 253 */ { "osf_audgen" },
    /* 254 */ { "sysfs" },
    /* 255 */ { "osf_subsys_info" },
    /* 256 */ { "osf_getsysinfo", osf_getsysinfoFunc },
    /* 257 */ { "osf_setsysinfo", osf_setsysinfoFunc },
    /* 258 */ { "osf_afs_syscall" },
    /* 259 */ { "osf_swapctl" },
    /* 260 */ { "osf_memcntl" },
    /* 261 */ { "osf_fdatasync" },
    /* 262 */ { "unknown #262" },
    /* 263 */ { "unknown #263" },
    /* 264 */ { "unknown #264" },
    /* 265 */ { "unknown #265" },
    /* 266 */ { "unknown #266" },
    /* 267 */ { "unknown #267" },
    /* 268 */ { "unknown #268" },
    /* 269 */ { "unknown #269" },
    /* 270 */ { "unknown #270" },
    /* 271 */ { "unknown #271" },
    /* 272 */ { "unknown #272" },
    /* 273 */ { "unknown #273" },
    /* 274 */ { "unknown #274" },
    /* 275 */ { "unknown #275" },
    /* 276 */ { "unknown #276" },
    /* 277 */ { "unknown #277" },
    /* 278 */ { "unknown #278" },
    /* 279 */ { "unknown #279" },
    /* 280 */ { "unknown #280" },
    /* 281 */ { "unknown #281" },
    /* 282 */ { "unknown #282" },
    /* 283 */ { "unknown #283" },
    /* 284 */ { "unknown #284" },
    /* 285 */ { "unknown #285" },
    /* 286 */ { "unknown #286" },
    /* 287 */ { "unknown #287" },
    /* 288 */ { "unknown #288" },
    /* 289 */ { "unknown #289" },
    /* 290 */ { "unknown #290" },
    /* 291 */ { "unknown #291" },
    /* 292 */ { "unknown #292" },
    /* 293 */ { "unknown #293" },
    /* 294 */ { "unknown #294" },
    /* 295 */ { "unknown #295" },
    /* 296 */ { "unknown #296" },
    /* 297 */ { "unknown #297" },
    /* 298 */ { "unknown #298" },
    /* 299 */ { "unknown #299" },
/*
 * Linux-specific system calls begin at 300
 */
    /* 300 */ { "bdflush" },
    /* 301 */ { "sethae" },
    /* 302 */ { "mount" },
    /* 303 */ { "old_adjtimex" },
    /* 304 */ { "swapoff" },
    /* 305 */ { "getdents" },
    /* 306 */ { "create_module" },
    /* 307 */ { "init_module" },
    /* 308 */ { "delete_module" },
    /* 309 */ { "get_kernel_syms" },
    /* 310 */ { "syslog" },
    /* 311 */ { "reboot" },
    /* 312 */ { "clone", cloneFunc<AlphaLinux> },
    /* 313 */ { "uselib" },
    /* 314 */ { "mlock" },
    /* 315 */ { "munlock" },
    /* 316 */ { "mlockall" },
    /* 317 */ { "munlockall" },
    /* 318 */ { "sysinfo", sysinfoFunc<AlphaLinux> },
    /* 319 */ { "_sysctl" },
    /* 320 */ { "was sys_idle" },
    /* 321 */ { "oldumount" },
    /* 322 */ { "swapon" },
    /* 323 */ { "times", ignoreFunc },
    /* 324 */ { "personality" },
    /* 325 */ { "setfsuid" },
    /* 326 */ { "setfsgid" },
    /* 327 */ { "ustat" },
    /* 328 */ { "statfs" },
    /* 329 */ { "fstatfs" },
    /* 330 */ { "sched_setparam" },
    /* 331 */ { "sched_getparam" },
    /* 332 */ { "sched_setscheduler" },
    /* 333 */ { "sched_getscheduler" },
    /* 334 */ { "sched_yield" },
    /* 335 */ { "sched_get_priority_max" },
    /* 336 */ { "sched_get_priority_min" },
    /* 337 */ { "sched_rr_get_interval" },
    /* 338 */ { "afs_syscall" },
    /* 339 */ { "uname", unameFunc },
    /* 340 */ { "nanosleep" },
    /* 341 */ { "mremap", mremapFunc<AlphaLinux> },
    /* 342 */ { "nfsservctl" },
    /* 343 */ { "setresuid" },
    /* 344 */ { "getresuid" },
    /* 345 */ { "pciconfig_read" },
    /* 346 */ { "pciconfig_write" },
    /* 347 */ { "query_module" },
    /* 348 */ { "prctl" },
    /* 349 */ { "pread" },
    /* 350 */ { "pwrite" },
    /* 351 */ { "rt_sigreturn" },
    /* 352 */ { "rt_sigaction", ignoreFunc },
    /* 353 */ { "rt_sigprocmask" },
    /* 354 */ { "rt_sigpending" },
    /* 355 */ { "rt_sigtimedwait" },
    /* 356 */ { "rt_sigqueueinfo" },
    /* 357 */ { "rt_sigsuspend" },
    /* 358 */ { "select" },
    /* 359 */ { "gettimeofday", gettimeofdayFunc<AlphaLinux> },
    /* 360 */ { "settimeofday" },
    /* 361 */ { "getitimer" },
    /* 362 */ { "setitimer" },
    /* 363 */ { "utimes", utimesFunc<AlphaLinux> },
    /* 364 */ { "getrusage", getrusageFunc<AlphaLinux> },
    /* 365 */ { "wait4" },
    /* 366 */ { "adjtimex" },
    /* 367 */ { "getcwd", getcwdFunc },
    /* 368 */ { "capget" },
    /* 369 */ { "capset" },
    /* 370 */ { "sendfile" },
    /* 371 */ { "setresgid" },
    /* 372 */ { "getresgid" },
    /* 373 */ { "dipc" },
    /* 374 */ { "pivot_root" },
    /* 375 */ { "mincore" },
    /* 376 */ { "pciconfig_iobase" },
    /* 377 */ { "getdents64" },
    /* 378 */ { "gettid" },
    /* 379 */ { "readahead" },
    /* 380 */ { "security" },
    /* 381 */ { "tkill" },
    /* 382 */ { "setxattr" },
    /* 383 */ { "lsetxattr" },
    /* 384 */ { "fsetxattr" },
    /* 385 */ { "getxattr" },
    /* 386 */ { "lgetxattr" },
    /* 387 */ { "fgetxattr" },
    /* 388 */ { "listxattr" },
    /* 389 */ { "llistxattr" },
    /* 390 */ { "flistxattr" },
    /* 391 */ { "removexattr" },
    /* 392 */ { "lremovexattr" },
    /* 393 */ { "fremovexattr" },
    /* 394 */ { "futex" },
    /* 395 */ { "sched_setaffinity" },
    /* 396 */ { "sched_getaffinity" },
    /* 397 */ { "tuxcall" },
    /* 398 */ { "io_setup" },
    /* 399 */ { "io_destroy" },
    /* 400 */ { "io_getevents" },
    /* 401 */ { "io_submit" },
    /* 402 */ { "io_cancel" },
    /* 403 */ { "unknown #403" },
    /* 404 */ { "unknown #404" },
    /* 405 */ { "exit_group", exitGroupFunc }, // exit all threads...
    /* 406 */ { "lookup_dcookie" },
    /* 407 */ { "sys_epoll_create" },
    /* 408 */ { "sys_epoll_ctl" },
    /* 409 */ { "sys_epoll_wait" },
    /* 410 */ { "remap_file_pages" },
    /* 411 */ { "set_tid_address" },
    /* 412 */ { "restart_syscall" },
    /* 413 */ { "fadvise64" },
    /* 414 */ { "timer_create" },
    /* 415 */ { "timer_settime" },
    /* 416 */ { "timer_gettime" },
    /* 417 */ { "timer_getoverrun" },
    /* 418 */ { "timer_delete" },
    /* 419 */ { "clock_settime" },
    /* 420 */ { "clock_gettime" },
    /* 421 */ { "clock_getres" },
    /* 422 */ { "clock_nanosleep" },
    /* 423 */ { "semtimedop" },
    /* 424 */ { "tgkill" },
    /* 425 */ { "stat64", stat64Func<AlphaLinux> },
    /* 426 */ { "lstat64", lstat64Func<AlphaLinux> },
    /* 427 */ { "fstat64", fstat64Func<AlphaLinux> },
    /* 428 */ { "vserver" },
    /* 429 */ { "mbind" },
    /* 430 */ { "get_mempolicy" },
    /* 431 */ { "set_mempolicy" },
    /* 432 */ { "mq_open" },
    /* 433 */ { "mq_unlink" },
    /* 434 */ { "mq_timedsend" },
    /* 435 */ { "mq_timedreceive" },
    /* 436 */ { "mq_notify" },
    /* 437 */ { "mq_getsetattr" },
    /* 438 */ { "waitid" },
    /* 439 */ { "add_key" },
    /* 440 */ { "request_key" },
    /* 441 */ { "keyctl" }
};

AlphaLinuxProcess::AlphaLinuxProcess(ProcessParams * params,
                                     ObjectFile *objFile)
    : AlphaProcess(params, objFile),
     Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc))
{
    //init_regs->intRegFile[0] = 0;
}



SyscallDesc*
AlphaLinuxProcess::getDesc(int callnum)
{
    if (callnum < 0 || callnum >= Num_Syscall_Descs)
        return NULL;
    return &syscallDescs[callnum];
}

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

