From a717296a2036cede5fccfff544513043a984d614 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Thu, 15 Sep 2022 19:21:14 +0300 Subject: 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. --- common/uapi/ipc.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'common/uapi/ipc.c') diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c index 4cdec0c..ecfced5 100644 --- a/common/uapi/ipc.c +++ b/common/uapi/ipc.c @@ -13,17 +13,12 @@ * IPC server notification syscall handler. * * @param callback Address of server callback. - * @return \ref ERR_EXT and \c 0 if process already is a server, - * \ref OK and \c 0 otherwise. + * @return \ref OK and \c 0. */ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback) { - struct tcb *r = cur_tcb(); - if (r->callback) /* server can't be reinitialized */ - return (struct sys_ret){ ERR_EXT, 0 }; - - r->callback = callback; - return (struct sys_ret){ OK, 0 }; + cur_tcb()->callback = callback; + return (struct sys_ret){ OK, 0, 0, 0, 0, 0 }; } /** @@ -32,29 +27,37 @@ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback) * @param pid Process to request RPC to. * @param d0 IPC argument 0. * @param d1 IPC argument 1. + * @param d2 IPC argument 2. + * @param d3 IPC argument 3. * @return \c d0 and \c d1. */ -SYSCALL_DEFINE3(ipc_req)(sys_arg_t pid, sys_arg_t d0, sys_arg_t d1) +SYSCALL_DEFINE5(ipc_req)(sys_arg_t pid, + sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3) { + struct tcb *t = cur_tcb(); struct tcb *r = get_tcb(pid); /** \todo something like jump_to_callback(t) */ /* remember difference between ipc_req and ipc_fwd! */ - return (struct sys_ret){ d0, d1 }; + return (struct sys_ret){ OK, t->tid, d0, d1, d2, d3 }; } /** * IPC forwarding syscall handler. * - * @param pid Process to rquest RPC to. + * @param pid Process to request RPC to. * @param d0 IPC argument 0. * @param d1 IPC argument 1. - * @return \c d0 and \c d1. + * @param d2 IPC argument 2. + * @param d3 IPC argument 3. + * @return \p d0 and \p d1. */ -SYSCALL_DEFINE3(ipc_fwd)(sys_arg_t pid, sys_arg_t d0, sys_arg_t d1) +SYSCALL_DEFINE5(ipc_fwd)(sys_arg_t pid, + sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, sys_arg_t d3) { - struct tcb *t = get_tcb(pid); + struct tcb *t = cur_tcb(); + struct tcb *r = get_tcb(pid); /* ditto */ - return (struct sys_ret){ d0, d1 }; + return (struct sys_ret){ OK, t->tid, d0, d1, d2, d3 }; } /** @@ -62,11 +65,14 @@ SYSCALL_DEFINE3(ipc_fwd)(sys_arg_t pid, sys_arg_t d0, sys_arg_t d1) * * @param d0 IPC return value 0. * @param d1 IPC return value 1. + * @param d2 IPC return value 2. + * @param d3 IPC return value 3. * @return \c d0 and \c d1. */ -SYSCALL_DEFINE2(ipc_resp)(sys_arg_t d0, sys_arg_t d1) +SYSCALL_DEFINE4(ipc_resp)(sys_arg_t d0, sys_arg_t d1, sys_arg_t d2, + sys_arg_t d3) { - struct tcb *r = cur_tcb(); + struct tcb *t = cur_tcb(); /* something like return_from_callback(t, r) */ - return (struct sys_ret){ d0, d1 }; + return (struct sys_ret){ OK, t->tid, d0, d1, d2, d3 }; } -- cgit v1.3