diff options
Diffstat (limited to 'common/uapi/ipc.c')
| -rw-r--r-- | common/uapi/ipc.c | 42 |
1 files changed, 24 insertions, 18 deletions
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 }; } |
