aboutsummaryrefslogtreecommitdiff
path: root/common/uapi/ipc.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-11-12 16:41:36 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2022-11-12 16:41:36 +0200
commit41ead8de77963bae907375c1bb115dad3315f46b (patch)
tree4b364db137bd3bea69853f15329292af7662897d /common/uapi/ipc.c
parent1d37792fb7a47135f0e7b7fc245e83bb1d8fc496 (diff)
downloadkmi-41ead8de77963bae907375c1bb115dad3315f46b.tar.gz
kmi-41ead8de77963bae907375c1bb115dad3315f46b.zip
initial rpc implementations
Diffstat (limited to 'common/uapi/ipc.c')
-rw-r--r--common/uapi/ipc.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/common/uapi/ipc.c b/common/uapi/ipc.c
index cb53ee3..e45c7dd 100644
--- a/common/uapi/ipc.c
+++ b/common/uapi/ipc.c
@@ -18,7 +18,7 @@
*/
SYSCALL_DEFINE1(ipc_server)(sys_arg_t callback)
{
- cur_tcb()->callback = callback;
+ cur_proc()->callback = callback;
return SYS_RET1(OK);
}
@@ -50,8 +50,12 @@ static struct sys_ret do_ipc(sys_arg_t pid,
if (!r->callback)
return SYS_RET1(ERR_NOINIT);
- /** \todo place data on rpc stack and clone into virtual memory */
+ clone_uvmem(r->proc.vmem, t->rpc.vmem);
+ use_vmem(t->rpc.vmem);
+ save_context(t);
set_return(t, r->callback);
+ /** @todo associate thread with new proc, should be done in tcb.c I
+ * think */
if (!fwd)
t->eid = t->pid;
@@ -105,7 +109,13 @@ SYSCALL_DEFINE4(ipc_resp)(sys_arg_t d0, sys_arg_t d1, sys_arg_t d2,
sys_arg_t d3)
{
struct tcb *t = cur_tcb();
- /* something like return_from_callback(t, r) */
+ load_context(t);
+
+ if (is_rpc(t))
+ use_vmem(t->rpc.vmem);
+ else
+ use_vmem(t->proc.vmem);
+
return SYS_RET6(OK, t->tid, d0, d1, d2, d3);
}