aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/dispatch.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-09-15 19:21:14 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-09-15 19:46:07 +0300
commita717296a2036cede5fccfff544513043a984d614 (patch)
tree68f75a23adc298628fb9cab41fd47402a99dd19d /common/uapi/dispatch.c
parent619725a5f2f5272f9cbb547ed95c87312c2765a9 (diff)
downloadkmi-a717296a2036cede5fccfff544513043a984d614.tar.gz
kmi-a717296a2036cede5fccfff544513043a984d614.zip
change syscalls to take 5 params and return 6
+ In total, a syscall is built up of 6 values, with the first being the syscall number. Symmetrically, the first value is now a status and the following five values return "values". This allows us to cram in more info into the ipc_* functions. The performance difference is absolutely minimal, at least from my testing in qemu.
Diffstat (limited to 'common/uapi/dispatch.c')
-rw-r--r--common/uapi/dispatch.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/common/uapi/dispatch.c b/common/uapi/dispatch.c
index fe86df0..f0f6ae0 100644
--- a/common/uapi/dispatch.c
+++ b/common/uapi/dispatch.c
@@ -41,7 +41,6 @@ static const sys_t syscall_table[] = {
[SYS_CREATE] = sys_create,
[SYS_FORK] = sys_fork,
[SYS_EXEC] = sys_exec,
- [SYS_SIGNAL] = sys_signal,
[SYS_SWAP] = sys_swap,
/* conf */
@@ -57,7 +56,7 @@ static const sys_t syscall_table[] = {
*/
SYSCALL_DEFINE0(noop)(){
info("sys_noop\n");
- return (struct sys_ret){ OK, 0 };
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}
/**
@@ -68,35 +67,36 @@ SYSCALL_DEFINE0(noop)(){
*/
SYSCALL_DEFINE1(putch)(sys_arg_t a){
const char c[2] = {a, 0};
+ MAYBE_UNUSED(c);
dbg((const char *)&c);
- return (struct sys_ret){ OK, 0 };
+ return (struct sys_ret){ OK, 0, 0, 0, 0, 0 };
}
struct sys_ret syscall_dispatch(sys_arg_t syscall, sys_arg_t a, sys_arg_t b,
- sys_arg_t c, sys_arg_t d)
+ sys_arg_t c, sys_arg_t d, sys_arg_t e)
{
struct tcb *t = cur_tcb();
size_t sc = syscall;
if (sc >= ARRAY_SIZE(syscall_table)) {
error("Syscall %zu outside allowed range [0 - %zu]\n", sc,
- ARRAY_SIZE(syscall_table));
- return (struct sys_ret){ ERR_INVAL, 0 };
+ ARRAY_SIZE(syscall_table));
+ return (struct sys_ret){ ERR_INVAL, 0, 0, 0, 0, 0 };
}
sys_t call = syscall_table[sc];
if (!call) {
error("Syscall %zu not legitimate value\n", sc);
- return (struct sys_ret){ ERR_INVAL, 0 };
+ return (struct sys_ret){ ERR_INVAL, 0, 0, 0, 0, 0 };
}
- struct sys_ret r = call(a, b, c, d);
+ struct sys_ret r = call(a, b, c, d, e);
if (check_canary(t)) {
bug("Syscall %zu overwrote stack canary\n", syscall);
/** @todo should probably halt, as the system is likely in an
* unstable state. */
- return (struct sys_ret){ ERR_INT, 0 };
+ return (struct sys_ret){ ERR_INT, 0, 0, 0, 0, 0 };
}
return r;