From e2631ad54db87b71943040dcb5a2fc0f4b850716 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 22 Oct 2022 19:16:45 +0300 Subject: start outlining ipc --- common/uapi/ipc.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 9 deletions(-) (limited to 'common/uapi') diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c index dba33b0..01d65ed 100644 --- a/common/uapi/ipc.c +++ b/common/uapi/ipc.c @@ -21,6 +21,44 @@ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback) return SYS_RET1(OK); } +/** + * Actual IPC syscall handler. + * + * @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. + * @param fwd Whether to forward. + * @return + */ +static struct sys_ret do_ipc(sys_arg_t pid, + sys_arg_t d0, + sys_arg_t d1, + sys_arg_t d2, + sys_arg_t d3, + bool fwd) +{ + struct tcb *t = cur_tcb(); + struct tcb *r = get_tcb(pid); + if (!r) + return SYS_RET1(ERR_INVAL); + + r = get_rproc(r); + + if (!r->callback) + return SYS_RET1(ERR_INIT); + + /** \todo place data on rpc stack and clone into virtual memory */ + set_return(t, r->callback); + + if (!fwd) + t->eid = t->pid; + + t->pid = r->rid; + + return SYS_RET6(OK, t->eid, d0, d1, d2, d3); +} /** * IPC request syscall handler. * @@ -34,11 +72,7 @@ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback) 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 SYS_RET6(OK, t->tid, d0, d1, d2, d3); + return do_ipc(pid, d0, d1, d2, d3, false); } /** @@ -54,10 +88,7 @@ SYSCALL_DEFINE5(ipc_req)(sys_arg_t pid, 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 = cur_tcb(); - struct tcb *r = get_tcb(pid); - /* ditto */ - return SYS_RET6(OK, t->tid, d0, d1, d2, d3); + return do_ipc(pid, d0, d1, d2, d3, true); } /** -- cgit v1.3