aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64/kernel/vmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/riscv64/kernel/vmem.c')
-rw-r--r--arch/riscv64/kernel/vmem.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c
index cf1391e..5a44f53 100644
--- a/arch/riscv64/kernel/vmem.c
+++ b/arch/riscv64/kernel/vmem.c
@@ -563,6 +563,23 @@ size_t max_rpc_size()
return SZ_512K;
}
+void copy_rpc_stack(struct tcb *t, struct tcb *c)
+{
+ /* this is of terrible, copying 2MiB for every fork, not
+ * great. TODO: use the direct pointer to the rpc stack element? */
+ for (size_t i = 0; i < rpc_pages; ++i) {
+ pm_t p1, p2;
+ stat_t ok1 = stat_vpage(t->rpc.vmem, RPC_STACK_BASE + BASE_PAGE_SIZE * i,
+ &p1, NULL, NULL);
+
+ stat_t ok2 = stat_vpage(c->rpc.vmem, RPC_STACK_BASE + BASE_PAGE_SIZE * i,
+ &p2, NULL, NULL);
+
+ assert(ok1 == OK && ok2 == OK);
+ memcpy((void *)p2, (void *)p1, BASE_PAGE_SIZE);
+ }
+}
+
stat_t setup_rpc_stack(struct tcb *t)
{
/* by default rpc stack is marked inaccessible to generate segfaults on