|
|
|
@@ -1,185 +0,0 @@
|
|
|
|
|
#include <zinnia/compiler.h>
|
|
|
|
|
#include <zinnia/errno.h>
|
|
|
|
|
#include <zinnia/print.h>
|
|
|
|
|
#include <zinnia/sched.h>
|
|
|
|
|
#include <zinnia/syscall.h>
|
|
|
|
|
#include <zinnia/syscall_list.h>
|
|
|
|
|
#include <zinnia/types.h>
|
|
|
|
|
#include <zinnia/utils.h>
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
}
|