45 lines
1.6 KiB
C
45 lines
1.6 KiB
C
#include <zinnia/status.h>
|
|
#include <common/compiler.h>
|
|
#include <common/utils.h>
|
|
#include <kernel/print.h>
|
|
#include <kernel/sched.h>
|
|
#include <kernel/syscall_numbers.h>
|
|
#include <kernel/syscalls.h>
|
|
#include <kernel/types.h>
|
|
|
|
static const syscall_fn_t dispatch_table[] = {
|
|
[ZN_SYSCALL_LOG] = syscall_log,
|
|
[ZN_SYSCALL_ARCHCTL] = syscall_archctl,
|
|
[ZN_SYSCALL_PAGE_SIZE] = syscall_page_size,
|
|
[ZN_SYSCALL_TIME] = syscall_time,
|
|
[ZN_SYSCALL_HANDLE_VALIDATE] = syscall_handle_validate,
|
|
[ZN_SYSCALL_HANDLE_DROP] = syscall_handle_drop,
|
|
[ZN_SYSCALL_HANDLE_CLONE] = syscall_handle_clone,
|
|
[ZN_SYSCALL_VAS_CREATE] = syscall_vas_create,
|
|
[ZN_SYSCALL_VMO_CREATE] = syscall_vmo_create,
|
|
[ZN_SYSCALL_VMO_CREATE_PHYS] = syscall_vmo_create_phys,
|
|
[ZN_SYSCALL_VMO_MAP] = syscall_vmo_map,
|
|
[ZN_SYSCALL_CHANNEL_CREATE] = syscall_channel_create,
|
|
[ZN_SYSCALL_CHANNEL_WAIT] = syscall_channel_wait,
|
|
[ZN_SYSCALL_CHANNEL_READ] = syscall_channel_read,
|
|
[ZN_SYSCALL_CHANNEL_WRITE] = syscall_channel_write,
|
|
[ZN_SYSCALL_THREAD_CREATE] = syscall_thread_create,
|
|
[ZN_SYSCALL_THREAD_START] = syscall_thread_start,
|
|
[ZN_SYSCALL_THREAD_EXIT] = syscall_thread_exit,
|
|
[ZN_SYSCALL_RANDOM_GET] = syscall_random_get,
|
|
[ZN_SYSCALL_RANDOM_ENTROPY] = syscall_random_entropy,
|
|
[ZN_SYSCALL_FUTEX_WAIT] = syscall_futex_wait,
|
|
[ZN_SYSCALL_FUTEX_WAKE] = syscall_futex_wake,
|
|
};
|
|
|
|
void syscall_dispatch(struct arch_context* ctx) {
|
|
const size_t num = ctx->num;
|
|
|
|
if (num >= ARRAY_SIZE(dispatch_table)) {
|
|
ctx->ret0 = ZN_ERR_BAD_SYSCALL;
|
|
return;
|
|
}
|
|
|
|
ctx->ret0 = dispatch_table[num](ctx);
|
|
}
|