aboutsummaryrefslogtreecommitdiff
path: root/common/uapi
diff options
context:
space:
mode:
Diffstat (limited to 'common/uapi')
-rw-r--r--common/uapi/conf.c10
-rw-r--r--common/uapi/dispatch.c38
-rw-r--r--common/uapi/ipc.c11
-rw-r--r--common/uapi/mem.c17
-rw-r--r--common/uapi/proc.c21
-rw-r--r--common/uapi/timers.c13
6 files changed, 67 insertions, 43 deletions
diff --git a/common/uapi/conf.c b/common/uapi/conf.c
index 7acb540..3002fc2 100644
--- a/common/uapi/conf.c
+++ b/common/uapi/conf.c
@@ -5,23 +5,17 @@
size_t __proc_stack_size = SZ_2M;
size_t __call_stack_size = SZ_2M;
-vm_t sys_conf(vm_t param, vm_t val, vm_t u0, vm_t u1)
+SYSCALL_DEFINE2(conf)(vm_t param, vm_t val)
{
- UNUSED(u0);
- UNUSED(u1);
UNUSED(param);
UNUSED(val);
-
/* no parameters supported atm */
return OK;
}
-vm_t sys_poweroff(vm_t type, vm_t u0, vm_t u1, vm_t u2)
+SYSCALL_DEFINE1(poweroff)(vm_t type)
{
- UNUSED(u0);
- UNUSED(u1);
- UNUSED(u2);
switch (type) {
case SHUTDOWN:
case COLD_REBOOT:
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);
+}
diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c
index a3b29f8..3244100 100644
--- a/common/uapi/ipc.c
+++ b/common/uapi/ipc.c
@@ -1,11 +1,8 @@
#include <apos/uapi.h>
#include <apos/tcb.h>
-vm_t sys_ipc_server(vm_t callback, vm_t u0, vm_t u1, vm_t u2)
+SYSCALL_DEFINE1(ipc_server)(vm_t callback)
{
- UNUSED(u0);
- UNUSED(u1);
- UNUSED(u2);
struct tcb *r = cur_tcb();
if (r->callback) /* server can't be reinitialized */
return 1;
@@ -14,17 +11,15 @@ vm_t sys_ipc_server(vm_t callback, vm_t u0, vm_t u1, vm_t u2)
return 0;
}
-vm_t sys_ipc_req(vm_t pid, vm_t d0, vm_t d1, vm_t d2)
+SYSCALL_DEFINE4(ipc_req)(vm_t pid, vm_t d0, vm_t d1, vm_t d2)
{
struct tcb *t = get_tcb(pid);
/* something like jump_to_callback(t, d0, d1, d2) */
return 0;
}
-vm_t sys_ipc_resp(vm_t pid, vm_t ret, vm_t u0, vm_t u1)
+SYSCALL_DEFINE2(ipc_resp)(vm_t pid, vm_t ret)
{
- UNUSED(u0);
- UNUSED(u1);
struct tcb *r = get_tcb(pid);
/* something like return_from_callback(t, r) */
return 0; /* oh yeah probably unreachable? */
diff --git a/common/uapi/mem.c b/common/uapi/mem.c
index f54131f..d4893b3 100644
--- a/common/uapi/mem.c
+++ b/common/uapi/mem.c
@@ -3,27 +3,21 @@
#include <apos/vmem.h>
#include <apos/dmem.h>
-vm_t sys_req_mem(vm_t size, vm_t flags, vm_t u0, vm_t u1)
+SYSCALL_DEFINE2(req_mem)(vm_t size, vm_t flags)
{
- UNUSED(u0);
- UNUSED(u1);
/* proc_tcb should give the tcb of the TID currently running */
struct tcb *r = cur_tcb();
return alloc_uvmem(r, size, flags);
}
-vm_t sys_req_fixmem(vm_t start, vm_t size, vm_t flags, vm_t u0)
+SYSCALL_DEFINE3(req_fixmem)(vm_t start, vm_t size, vm_t flags)
{
- UNUSED(u0);
struct tcb *r = cur_tcb();
return alloc_fixed_uvmem(r, start, size, flags);
}
-vm_t sys_free_mem(vm_t start, vm_t u0, vm_t u1, vm_t u2)
+SYSCALL_DEFINE1(free_mem)(vm_t start)
{
- UNUSED(u0);
- UNUSED(u1);
- UNUSED(u2);
struct tcb *r = cur_tcb();
if (start > __pre_top && start < __post_base)
free_uvmem(r, start);
@@ -33,9 +27,8 @@ vm_t sys_free_mem(vm_t start, vm_t u0, vm_t u1, vm_t u2)
return 0;
}
-vm_t sys_req_pmem(vm_t paddr, vm_t size, vm_t flags, vm_t u0)
+SYSCALL_DEFINE3(req_pmem)(vm_t paddr, vm_t size, vm_t flags)
{
- UNUSED(u0);
/* this will require some pondering, but essentially this syscall should
* only be used for device access, so any addresses requested should be
* outside the RAM area, and I'll probably have to implement some method
@@ -45,7 +38,7 @@ vm_t sys_req_pmem(vm_t paddr, vm_t size, vm_t flags, vm_t u0)
return alloc_devmem(r, paddr, size, flags);
}
-vm_t sys_req_sharedmem(vm_t pid, vm_t start, vm_t size, vm_t flags)
+SYSCALL_DEFINE4(req_sharedmem)(vm_t pid, vm_t start, vm_t size, vm_t flags)
{
/* take memory in PID's vaddr and map it somewhere in our own memory
* region.
diff --git a/common/uapi/proc.c b/common/uapi/proc.c
index e4673b5..7c0a69d 100644
--- a/common/uapi/proc.c
+++ b/common/uapi/proc.c
@@ -10,42 +10,33 @@
* would have to periodically ask the kernel about all threads it is aware of
* via sys_sync. Dunno.
*/
-vm_t sys_fork(vm_t pid, vm_t u0, vm_t u1, vm_t u2)
+SYSCALL_DEFINE1(fork)(vm_t pid)
{
- UNUSED(u0);
- UNUSED(u1);
- UNUSED(u2);
+ /* fork might not actually even need pid...? */
/* TODO: create new thread in the same process family */
return 0;
}
-vm_t sys_exec(vm_t pid, vm_t bin, vm_t argc, vm_t argv)
+SYSCALL_DEFINE4(exec)(vm_t pid, vm_t bin, vm_t argc, vm_t argv)
{
/* TODO: execute new process */
return 0;
}
-vm_t sys_signal(vm_t pid, vm_t signal, vm_t u0, vm_t u1)
+SYSCALL_DEFINE2(signal)(vm_t pid, vm_t signal)
{
- UNUSED(u0);
- UNUSED(u1);
/* TODO: signals? */
return 0;
}
-vm_t sys_switch(vm_t pid, vm_t u0, vm_t u1, vm_t u2)
+SYSCALL_DEFINE1(switch)(vm_t pid)
{
- UNUSED(u0);
- UNUSED(u1);
- UNUSED(u2);
/* TODO: switch to process */
return 0;
}
-vm_t sys_sync(vm_t buf, vm_t size, vm_t u0, vm_t u1)
+SYSCALL_DEFINE2(sync)(vm_t buf, vm_t size)
{
- UNUSED(u0);
- UNUSED(u1);
/* check that only the process manager can use this syscall, otherwise
* just dump process info into the buffer (I guess, not sure if this
* will be quite required */
diff --git a/common/uapi/timers.c b/common/uapi/timers.c
new file mode 100644
index 0000000..1dfc8bf
--- /dev/null
+++ b/common/uapi/timers.c
@@ -0,0 +1,13 @@
+#include <apos/uapi.h>
+
+SYSCALL_DEFINE1(req_timer)(vm_t ticks)
+{
+ /* TODO */
+ return 0;
+}
+
+SYSCALL_DEFINE1(free_timer)(vm_t cid)
+{
+ /* TODO */
+ return 0;
+}