/*
 * 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: Nathan Binkert
 */

#ifndef __KERN_TRU64_TRU64_SYSCALLS_HH__
#define __KERN_TRU64_TRU64_SYSCALLS_HH__

#include "kern/tru64/tru64.hh"

template <class OS>
class SystemCalls;

template <>
class SystemCalls<Tru64>
{
  public:
    enum {
        syscall = 0,
        exit = 1,
        fork = 2,
        read = 3,
        write = 4,
        old_open = 5,
        close = 6,
        wait4 = 7,
        old_creat = 8,
        link = 9,
        unlink = 10,
        execv = 11,
        chdir = 12,
        fchdir = 13,
        mknod = 14,
        chmod = 15,
        chown = 16,
        obreak = 17,
        pre_F64_getfsstat = 18,
        lseek = 19,
        getpid = 20,
        mount = 21,
        unmount = 22,
        setuid = 23,
        getuid = 24,
        exec_with_loader = 25,
        ptrace = 26,
        recvmsg = 27,
        sendmsg = 28,
        recvfrom = 29,
        accept = 30,
        getpeername = 31,
        getsockname = 32,
        access = 33,
        chflags = 34,
        fchflags = 35,
        sync = 36,
        kill = 37,
        old_stat = 38,
        setpgid = 39,
        old_lstat = 40,
        dup = 41,
        pipe = 42,
        set_program_attributes = 43,
        profil = 44,
        open = 45,
        obsolete_osigaction = 46,
        getgid = 47,
        sigprocmask = 48,
        getlogin = 49,
        setlogin = 50,
        acct = 51,
        sigpending = 52,
        classcntl = 53,
        ioctl = 54,
        reboot = 55,
        revoke = 56,
        symlink = 57,
        readlink = 58,
        execve = 59,
        umask = 60,
        chroot = 61,
        old_fstat = 62,
        getpgrp = 63,
        getpagesize = 64,
        mremap = 65,
        vfork = 66,
        pre_F64_stat = 67,
        pre_F64_lstat = 68,
        sbrk = 69,
        sstk = 70,
        mmap = 71,
        ovadvise = 72,
        munmap = 73,
        mprotect = 74,
        madvise = 75,
        old_vhangup = 76,
        kmodcall = 77,
        mincore = 78,
        getgroups = 79,
        setgroups = 80,
        old_getpgrp = 81,
        setpgrp = 82,
        setitimer = 83,
        old_wait = 84,
        table = 85,
        getitimer = 86,
        gethostname = 87,
        sethostname = 88,
        getdtablesize = 89,
        dup2 = 90,
        pre_F64_fstat = 91,
        fcntl = 92,
        select = 93,
        poll = 94,
        fsync = 95,
        setpriority = 96,
        socket = 97,
        connect = 98,
        old_accept = 99,
        getpriority = 100,
        old_send = 101,
        old_recv = 102,
        sigreturn = 103,
        bind = 104,
        setsockopt = 105,
        listen = 106,
        plock = 107,
        old_sigvec = 108,
        old_sigblock = 109,
        old_sigsetmask = 110,
        sigsuspend = 111,
        sigstack = 112,
        old_recvmsg = 113,
        old_sendmsg = 114,
        obsolete_vtrcae = 115,
        gettimeofday = 116,
        getrusage = 117,
        getsockopt = 118,
        numa_syscalls = 119,
        readv = 120,
        writev = 121,
        settimeofday = 122,
        fchown = 123,
        fchmod = 124,
        old_recvfrom = 125,
        setreuid = 126,
        setregid = 127,
        rename = 128,
        truncate = 129,
        ftruncate = 130,
        flock = 131,
        setgid = 132,
        sendto = 133,
        shutdown = 134,
        socketpair = 135,
        mkdir = 136,
        rmdir = 137,
        utimes = 138,
        obsolete_42_sigreturn = 139,
        adjtime = 140,
        old_getpeername = 141,
        gethostid = 142,
        sethostid = 143,
        getrlimit = 144,
        setrlimit = 145,
        old_killpg = 146,
        setsid = 147,
        quotactl = 148,
        oldquota = 149,
        old_getsockname = 150,
        pread = 151,
        pwrite = 152,
        pid_block = 153,
        pid_unblock = 154,
        signal_urti = 155,
        sigaction = 156,
        sigwaitprim = 157,
        nfssvc = 158,
        getdirentries = 159,
        pre_F64_statfs = 160,
        pre_F64_fstatfs = 161,
        async_daemon = 163,
        getfh = 164,
        getdomainname = 165,
        setdomainname = 166,
        exportfs = 169,
        alt_plock = 181,
        getmnt = 184,
        alt_sigpending = 187,
        alt_setsid = 188,
        swapon = 199,
        msgctl = 200,
        msgget = 201,
        msgrcv = 202,
        msgsnd = 203,
        semctl = 204,
        semget = 205,
        semop = 206,
        uname = 207,
        lchown = 208,
        shmat = 209,
        shmctl = 210,
        shmdt = 211,
        shmget = 212,
        mvalid = 213,
        getaddressconf = 214,
        msleep = 215,
        mwakeup = 216,
        msync = 217,
        signal = 218,
        utc_gettime = 219,
        utc_adjtime = 220,
        security = 222,
        kloadcall = 223,
        stat = 224,
        lstat = 225,
        fstat = 226,
        statfs = 227,
        fstatfs = 228,
        getfsstat = 229,
        gettimeofday64 = 230,
        settimeofday64 = 231,
        getpgid = 233,
        getsid = 234,
        sigaltstack = 235,
        waitid = 236,
        priocntlset = 237,
        sigsendset = 238,
        set_speculative = 239,
        msfs_syscall = 240,
        sysinfo = 241,
        uadmin = 242,
        fuser = 243,
        proplist_syscall = 244,
        ntp_adjtime = 245,
        ntp_gettime = 246,
        pathconf = 247,
        fpathconf = 248,
        sync2 = 249,
        uswitch = 250,
        usleep_thread = 251,
        audcntl = 252,
        audgen = 253,
        sysfs = 254,
        subsys_info = 255,
        getsysinfo = 256,
        setsysinfo = 257,
        afs_syscall = 258,
        swapctl = 259,
        memcntl = 260,
        fdatasync = 261,
        oflock = 262,
        _F64_readv = 263,
        _F64_writev = 264,
        cdslxlate = 265,
        sendfile = 266,
        StandardNumber
    };

    enum {
        task_self = 10,
        thread_reply = 11,
        task_notify = 12,
        thread_self = 13,
        msg_send_trap = 20,
        msg_receive_trap = 21,
        msg_rpc_trap = 22,
        nxm_block = 24,
        nxm_unblock = 25,
        nxm_thread_destroy = 29,
        lw_wire = 30,
        lw_unwire = 31,
        nxm_thread_create = 32,
        nxm_task_init = 33,
        nxm_idle = 35,
        nxm_wakeup_idle = 36,
        nxm_set_pthid = 37,
        nxm_thread_kill = 38,
        nxm_thread_block = 39,
        nxm_thread_wakeup = 40,
        init_process = 41,
        nxm_get_binding = 42,
        map_fd = 43,
        nxm_resched = 44,
        nxm_set_cancel = 45,
        nxm_set_binding = 46,
        stack_create = 47,
        nxm_get_state = 48,
        nxm_thread_suspend = 49,
        nxm_thread_resume = 50,
        nxm_signal_check = 51,
        htg_unix_syscall = 52,
        host_self = 55,
        host_priv_self = 56,
        swtch_pri = 59,
        swtch = 60,
        thread_switch = 61,
        semop_fast = 62,
        nxm_pshared_init = 63,
        nxm_pshared_block = 64,
        nxm_pshared_unblock = 65,
        nxm_pshared_destroy = 66,
        nxm_swtch_pri = 67,
        lw_syscall = 68,
        mach_sctimes_0 = 70,
        mach_sctimes_1 = 71,
        mach_sctimes_2 = 72,
        mach_sctimes_3 = 73,
        mach_sctimes_4 = 74,
        mach_sctimes_5 = 75,
        mach_sctimes_6 = 76,
        mach_sctimes_7 = 77,
        mach_sctimes_8 = 78,
        mach_sctimes_9 = 79,
        mach_sctimes_10 = 80,
        mach_sctimes_11 = 81,
        mach_sctimes_port_alloc_dealloc = 82,
        MachNumber
    };

    static const int Number = StandardNumber + MachNumber;

    static const char *name(int num);

    static bool validSyscallNumber(int num) {
        return -MachNumber < num && num < StandardNumber;
    }

    static int convert(int syscall_num) {
        if (!validSyscallNumber(syscall_num))
            return -1;

        return syscall_num < 0 ? StandardNumber - syscall_num : syscall_num;
    }
};

#endif // __KERN_TRU64_TRU64_SYSCALLS_HH__
