#include #include #include #include #include #include #include #include const struct syscall syscall_table[256] = { [0] = {.call = sys_exit}, [1] = {.call = sys_syslog}, [2] = {.call = sys_getuname}, [3] = {.call = sys_setuname}, [4] = {.call = sys_archctl}, [5] = {.call = sys_reboot}, [6] = {.call = sys_mmap}, [7] = {.call = sys_munmap}, [8] = {.call = sys_mprotect}, [9] = {.call = sys_madvise}, [10] = {.call = sys_sigprocmask}, [11] = {.call = sys_sigsuspend}, [12] = {.call = sys_sigpending}, [13] = {.call = sys_sigaction}, [14] = {.call = sys_sigtimedwait}, [15] = {.call = sys_sigaltstack}, [16] = {.call = sys_sigreturn}, [17] = {.call = sys_sigqueue}, [18] = {.call = sys_execve}, [19] = {.call = sys_fexecve}, [20] = {.context = sys_fork, SYSKIND_CONTEXT}, [21] = {.call = sys_kill}, [22] = {.call = sys_gettid}, [23] = {.call = sys_getpid}, [24] = {.call = sys_getppid}, [25] = {.call = sys_waitid}, [26] = {.call = sys_waitpid}, [27] = {.call = sys_pread}, [28] = {.call = sys_readv}, [29] = {.call = sys_pwrite}, [30] = {.call = sys_writev}, [31] = {.call = sys_seek}, [32] = {.call = sys_ioctl}, [33] = {.call = sys_openat}, [34] = {.call = sys_close}, [35] = {.call = sys_fstat}, [36] = {.call = sys_fstatat}, [37] = {.call = sys_statvfs}, [38] = {.call = sys_fstatvfs}, [39] = {.call = sys_faccessat}, [40] = {.call = sys_fcntl}, [41] = {.call = sys_ftruncate}, [42] = {.call = sys_truncate}, [43] = {.call = sys_fallocate}, [44] = {.call = sys_fadvise}, [45] = {.call = sys_utimensat}, [46] = {.call = sys_mknodat}, [47] = {.call = sys_getcwd}, [48] = {.call = sys_chdir}, [49] = {.call = sys_fchdir}, [50] = {.call = sys_mkdirat}, [51] = {.call = sys_rmdirat}, [52] = {.call = sys_getdents}, [53] = {.call = sys_renameat}, [54] = {.call = sys_fchmod}, [55] = {.call = sys_fchmodat}, [56] = {.call = sys_fchownat}, [57] = {.call = sys_linkat}, [58] = {.call = sys_symlinkat}, [59] = {.call = sys_unlinkat}, [60] = {.call = sys_readlinkat}, [61] = {.call = sys_flock}, [62] = {.call = sys_ppoll}, [63] = {.call = sys_dup}, [64] = {.call = sys_dup3}, [65] = {.call = sys_sync}, [66] = {.call = sys_fsync}, [67] = {.call = sys_fdatasync}, [68] = {.call = sys_getgroups}, [69] = {.call = sys_setgroups}, [70] = {.call = sys_getsid}, [71] = {.call = sys_setsid}, [72] = {.call = sys_setuid}, [73] = {.call = sys_getuid}, [74] = {.call = sys_setgid}, [75] = {.call = sys_getgid}, [76] = {.call = sys_geteuid}, [77] = {.call = sys_seteuid}, [78] = {.call = sys_getegid}, [79] = {.call = sys_setegid}, [80] = {.call = sys_getpgid}, [81] = {.call = sys_setpgid}, [82] = {.call = sys_getresuid}, [83] = {.call = sys_setresuid}, [84] = {.call = sys_getresgid}, [85] = {.call = sys_setresgid}, [86] = {.call = sys_setreuid}, [87] = {.call = sys_setregid}, [88] = {.call = sys_umask}, [89] = {.call = sys_pipe}, [90] = {.call = sys_futex_wait}, [91] = {.call = sys_futex_wake}, [92] = {.call = sys_thread_create}, [93] = {.call = sys_thread_kill}, [94] = {.call = sys_thread_exit}, [95] = {.call = sys_thread_setname}, [96] = {.call = sys_thread_getname}, [97] = {.call = sys_timer_create}, [98] = {.call = sys_timer_set}, [99] = {.call = sys_timer_get}, [100] = {.call = sys_timer_getoverrun}, [101] = {.call = sys_timer_delete}, [102] = {.call = sys_itimer_get}, [103] = {.call = sys_itimer_set}, [104] = {.call = sys_clock_get}, [105] = {.call = sys_clock_getres}, [106] = {.call = sys_clock_set}, [107] = {.call = sys_sleep}, [108] = {.call = sys_yield}, [109] = {.call = sys_chroot}, [110] = {.call = sys_mount}, [111] = {.call = sys_umount}, [112] = {.call = sys_socket}, [113] = {.call = sys_socketpair}, [114] = {.call = sys_shutdown}, [115] = {.call = sys_bind}, [116] = {.call = sys_connect}, [117] = {.call = sys_accept}, [118] = {.call = sys_listen}, [119] = {.call = sys_getpeername}, [120] = {.call = sys_getsockname}, [121] = {.call = sys_getsockopt}, [122] = {.call = sys_setsockopt}, [123] = {.call = sys_sendmsg}, [124] = {.call = sys_recvmsg}, [125] = {.call = sys_getentropy}, [126] = {.call = sys_getrusage}, [127] = {.call = sys_getrlimit}, [128] = {.call = sys_setrlimit}, [129] = {.call = sys_getpriority}, [130] = {.call = sys_setpriority}, [131] = {.call = sys_sched_getparam}, [132] = {.call = sys_sched_setparam}, [133] = {.call = sys_module_insert}, [134] = {.call = sys_module_remove}, [135] = {.call = sys_epoll_create}, [136] = {.call = sys_epoll_ctl}, [137] = {.call = sys_epoll_pwait}, [138] = {.call = sys_timerfd_create}, [139] = {.call = sys_timerfd_gettime}, [140] = {.call = sys_timerfd_settime}, [141] = {.call = sys_signalfd_create}, [142] = {.call = sys_eventfd_create}, [143] = {.call = sys_msync}, [144] = {.call = sys_sysconf}, }; struct syscall_return syscall_dispatch_call( size_t num, uintptr_t a0, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5 ) { // No need to check the table size here. In order to get to this point, // we already have to check if this is a fast syscall. if (syscall_table[num].call == nullptr) { return (struct syscall_return){.errno = ENOSYS}; } return syscall_table[num].call(a0, a1, a2, a3, a4, a5); } void syscall_dispatch(struct arch_context* ctx) { const size_t num = ctx->ARCH_CTX_NUM; if (num >= ARRAY_SIZE(syscall_table) || syscall_table[num].context == nullptr) { ctx->ARCH_CTX_RET0 = ENOSYS; return; } syscall_table[num].context(ctx); }