diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-10-22 19:16:45 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-10-22 19:16:45 +0300 |
| commit | e2631ad54db87b71943040dcb5a2fc0f4b850716 (patch) | |
| tree | a5088a0296fadc28c22d5119e0bc158763998096 /common/uapi/ipc.c | |
| parent | 6be4e656cbf575dbcba95de4e99183586aa88ffe (diff) | |
| download | kmi-e2631ad54db87b71943040dcb5a2fc0f4b850716.tar.gz kmi-e2631ad54db87b71943040dcb5a2fc0f4b850716.zip | |
start outlining ipc
Diffstat (limited to 'common/uapi/ipc.c')
| -rw-r--r-- | common/uapi/ipc.c | 49 |
1 files changed, 40 insertions, 9 deletions
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 @@ -22,6 +22,44 @@ SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback) } /** + * 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. * * @param pid Process to request RPC to. @@ -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); } /** |
