aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/dispatch.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/uapi/dispatch.c')
-rw-r--r--common/uapi/dispatch.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/common/uapi/dispatch.c b/common/uapi/dispatch.c
new file mode 100644
index 0000000..3b03c43
--- /dev/null
+++ b/common/uapi/dispatch.c
@@ -0,0 +1,38 @@
+#include <apos/uapi.h>
+
+static const sys_t syscall_table[] = {
+ /* mem */
+ [SYS_REQ_MEM] = sys_req_mem,
+ [SYS_REQ_PMEM] = sys_req_pmem,
+ [SYS_REQ_FIXMEM] = sys_req_fixmem,
+ [SYS_FREE_MEM] = sys_free_mem,
+
+ /* timers */
+ [SYS_REQ_TIMER] = sys_req_timer,
+ [SYS_FREE_TIMER] = sys_free_timer,
+
+ /* ipc */
+ [SYS_IPC_SERVER] = sys_ipc_server,
+ [SYS_IPC_REQ] = sys_ipc_req,
+ [SYS_IPC_RESP] = sys_ipc_resp,
+
+ /* proc */
+ [SYS_FORK] = sys_fork,
+ [SYS_EXEC] = sys_exec,
+ [SYS_SIGNAL] = sys_signal,
+ [SYS_SWITCH] = sys_switch,
+ [SYS_SYNC] = sys_sync,
+
+ /* conf */
+ [SYS_CONF] = sys_conf,
+ [SYS_POWEROFF] = sys_poweroff,
+};
+
+vm_t syscall_dispatch(vm_t syscall, vm_t a, vm_t b, vm_t c, vm_t d)
+{
+ sys_t call = syscall_table[syscall];
+ if (!call)
+ return ERR_INVAL;
+
+ return call(a, b, c, d);
+}