/*
 * Copyright (c) 2004-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: Ali Saidi
 */

#ifndef __KERN_LINUX_LINUX_SYSCALLS_HH__
#define __KERN_LINUX_LINUX_SYSCALLS_HH__

#include "kern/linux/linux.hh"

template <class OS>
class SystemCalls;

template <>
class SystemCalls<Linux>
{
  public:
    enum {
        syscall = 0,
    llseek = 1,
    newselect = 2,
    sysctl = 3,
    access = 4,
    acct = 5,
    adjtimex = 6,
    afs_syscall = 7,
    alarm = 8,
    bdflush = 9,
    _break = 10, /*renamed from break*/
    brk = 11,
    capget = 12,
    capset = 13,
    chdir = 14,
    chmod = 15,
    chown = 16,
    chown32 = 17,
    chroot = 18,
    clock_getres = 19,
    clock_gettime = 20,
    clock_nanosleep = 21,
    clock_settime = 22,
    clone = 23,
    close = 24,
    creat = 25,
    create_module = 26,
    delete_module = 27,
    dup = 28,
    dup2 = 29,
    epoll_create = 30,
    epoll_ctl = 31,
    epoll_wait = 32,
    execve = 33,
    exit = 34,
    exit_group = 35,
    fadvise64 = 36,
    fadvise64_64 = 37,
    fchdir = 38,
    fchmod = 39,
    fchown = 40,
    fchown32 = 41,
    fcntl = 42,
    fcntl64 = 43,
    fdatasync = 44,
    fgetxattr = 45,
    flistxattr = 46,
    flock = 47,
    fork = 48,
    fremovexattr = 49,
    fsetxattr = 50,
    fstat = 51,
    fstat64 = 52,
    fstatfs = 53,
    fstatfs64 = 54,
    fsync = 55,
    ftime = 56,
    ftruncate = 57,
    ftruncate64 = 58,
    futex = 59,
    get_kernel_syms = 60,
    get_thread_area = 61,
    getcwd = 62,
    getdents = 63,
    getdents64 = 64,
    getegid = 65,
    getegid32 = 66,
    geteuid = 67,
    geteuid32 = 68,
    getgid = 69,
    getgid32 = 70,
    getgroups = 71,
    getgroups32 = 72,
    getitimer = 73,
    getpgid = 74,
    getpgrp = 75,
    getpid = 76,
    getpmsg = 77,
    getppid = 78,
    getpriority = 79,
    getresgid = 80,
    getresgid32 = 81,
    getresuid = 82,
    getresuid32 = 83,
    getrlimit = 84,
    getrusage = 85,
    getsid = 86,
    gettid = 87,
    gettimeofday = 88,
    getuid = 89,
    getuid32 = 90,
    getxattr = 91,
    gtty = 92,
    idle = 93,
    init_module = 94,
    io_cancel = 95,
    io_destroy = 96,
    io_getevents = 97,
    io_setup = 98,
    io_submit = 99,
    ioctl = 100,
    ioperm = 101,
    iopl = 102,
    ipc = 103,
    kill = 104,
    lchown = 105,
    lchown32 = 106,
    lgetxattr = 107,
    link = 108,
    listxattr = 109,
    llistxattr = 110,
    lock = 111,
    lookup_dcookie = 112,
    lremovexattr = 113,
    lseek = 114,
    lsetxattr = 115,
    lstat = 116,
    lstat64 = 117,
    madvise = 118,
    madvise1 = 119,
    mincore = 120,
    mkdir = 121,
    mknod = 122,
    mlock = 123,
    mlockall = 124,
    mmap = 125,
    mmap2 = 126,
    modify_ldt = 127,
    mount = 128,
    mprotect = 129,
    mpx = 130,
    mremap = 131,
    msync = 132,
    munlock = 133,
    munlockall = 134,
    munmap = 135,
    nanosleep = 136,
    nfsservctl = 137,
    nice = 138,
    oldfstat = 139,
    oldlstat = 140,
    oldolduname = 141,
    oldstat = 142,
    olduname = 143,
    open = 144,
    pause = 145,
    personality = 146,
    pipe = 147,
    pivot_root = 148,
    poll = 149,
    prctl = 150,
    pread64 = 151,
    prof = 152,
    profil = 153,
    ptrace = 154,
    putpmsg = 155,
    pwrite64 = 156,
    query_module = 157,
    quotactl = 158,
    read = 159,
    readahead = 160,
    readdir = 161,
    readlink = 162,
    readv = 163,
    reboot = 164,
    remap_file_pages = 165,
    removexattr = 166,
    rename = 167,
    restart_syscall = 168,
    rmdir = 169,
    rt_sigaction = 170,
    rt_sigpending = 171,
    rt_sigprocmask = 172,
    rt_sigqueueinfo = 173,
    rt_sigreturn = 174,
    rt_sigsuspend = 175,
    rt_sigtimedwait = 176,
    sched_get_priority_max = 177,
    sched_get_priority_min = 178,
    sched_getaffinity = 179,
    sched_getparam = 180,
    sched_getscheduler = 181,
    sched_rr_get_interval = 182,
    sched_setaffinity = 183,
    sched_setparam = 184,
    sched_setscheduler = 185,
    sched_yield = 186,
    select = 187,
    sendfile = 188,
    sendfile64 = 189,
    set_thread_area = 190,
    set_tid_address = 191,
    setdomainname = 192,
    setfsgid = 193,
    setfsgid32 = 194,
    setfsuid = 195,
    setfsuid32 = 196,
    setgid = 197,
    setgid32 = 198,
    setgroups = 199,
    setgroups32 = 200,
    sethostname = 201,
    setitimer = 202,
    setpgid = 203,
    setpriority = 204,
    setregid = 205,
    setregid32 = 206,
    setresgid = 207,
    setresgid32 = 208,
    setresuid = 209,
    setresuid32 = 210,
    setreuid = 211,
    setreuid32 = 212,
    setrlimit = 213,
    setsid = 214,
    settimeofday = 215,
    setuid = 216,
    setuid32 = 217,
    setxattr = 218,
    sgetmask = 219,
    sigaction = 220,
    sigaltstack = 221,
    signal = 222,
    sigpending = 223,
    sigprocmask = 224,
    sigreturn = 225,
    sigsuspend = 226,
    socketcall = 227,
    ssetmask = 228,
    stat = 229,
    stat64 = 230,
    statfs = 231,
    statfs64 = 232,
    stime = 233,
    stty = 234,
    swapoff = 235,
    swapon = 236,
    symlink = 237,
    sync = 238,
    sysfs = 239,
    sysinfo = 240,
    syslog = 241,
    tgkill = 242,
    time = 243,
    timer_create = 244,
    timer_delete = 245,
    timer_getoverrun = 246,
    timer_gettime = 247,
    timer_settime = 248,
    times = 249,
    tkill = 250,
    truncate = 251,
    truncate64 = 252,
    ugetrlimit = 253,
    ulimit = 254,
    umask = 255,
    umount = 256,
    umount2 = 257,
    uname = 258,
    unlink = 259,
    uselib = 260,
    ustat = 261,
    utime = 262,
    utimes = 263,
    vfork = 264,
    vhangup = 265,
    vm86 = 266,
    vm86old = 267,
    vserver = 268,
    wait4 = 269,
    waitpid = 270,
    write = 271,
    writev = 272,
        Number
    };

    static const char *name(int num);

    static bool validSyscallNumber(int num) {
            return num < Number;
    }

};

#endif // __KERN_LINUX_LINUX_SYSCALLS_HH__
