From 5976ad390a15726c3ddfacf8c8b282c8350f9554 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Tue, 29 Oct 2024 21:17:31 +0200 Subject: start moving towards threads always being in rpc --- arch/riscv64/kernel/entry.S | 4 +--- arch/riscv64/kernel/proc.c | 17 ++++++++--------- arch/riscv64/kernel/vmem.c | 11 +---------- 3 files changed, 10 insertions(+), 22 deletions(-) (limited to 'arch/riscv64/kernel') diff --git a/arch/riscv64/kernel/entry.S b/arch/riscv64/kernel/entry.S index abf3cba..0bc999e 100644 --- a/arch/riscv64/kernel/entry.S +++ b/arch/riscv64/kernel/entry.S @@ -107,10 +107,8 @@ handle_exception: csrr a0, CSR_SEPC csrr a1, CSR_STVAL - /* not really a kernel panic but used for now to signify that something - * happened in userspace that we can't deal with */ csrr a2, CSR_SCAUSE - call kernel_panic + call unhandled_panic j _load_context diff --git a/arch/riscv64/kernel/proc.c b/arch/riscv64/kernel/proc.c index d3896c1..f012b20 100644 --- a/arch/riscv64/kernel/proc.c +++ b/arch/riscv64/kernel/proc.c @@ -42,15 +42,14 @@ void run_init(struct tcb *t, vm_t fdt, vm_t initrd) { csr_write(CSR_SSCRATCH, t); csr_write(CSR_SEPC, t->callback); - /* gcc gives a warning 'the value of the stack pointer after an asm - * statement must be the same as it was before the statement', so this - * is technically speaking undefined behavior, I think. - * - * Could be fixed with a separate pure asm run_init, but I guess this - * works for now. - */ - vm_t stack_top = t->thread_stack + t->thread_stack_size; - info("jumping to %lx\n", (long)t->callback); + + /* reference main virtual memory */ + struct tcb *r = get_rproc(t); + clone_uvmem(r->proc.vmem, t->rpc.vmem); + flush_tlb_all(); + + vm_t stack_top = t->rpc_stack - BASE_PAGE_SIZE; + info("jumping to %lx with sp = %lx\n", (long)t->callback, stack_top); bkl_unlock(); riscv_run_init(0, t->tid, SYS_USER_SPAWNED, fdt, initrd, 1, stack_top); diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c index 29ec3d5..cf1391e 100644 --- a/arch/riscv64/kernel/vmem.c +++ b/arch/riscv64/kernel/vmem.c @@ -538,7 +538,7 @@ vm_t setup_kernel_io(struct vmem *b, vm_t paddr) } #endif -void clone_uvmem(struct vmem * restrict r, struct vmem * restrict b) +void clone_uvmem(struct vmem *r, struct vmem *b) { size_t i = 0; for (; i < CSTACK_PAGE; ++i) { @@ -574,20 +574,11 @@ stat_t setup_rpc_stack(struct tcb *t) if (!page) return ERR_OOMEM; - /* map both into rpc and proc spaces so we can write to the - * current stack frame directly. Especially important when - * returning from an rpc. Technically means that we could leak - * memory if map_vpage() for proc.vmem allocates more and more - * pages, but good enough for now. */ if (map_vpage(t->rpc.vmem, page, RPC_STACK_BASE + BASE_PAGE_SIZE * i, flags, BASE_PAGE)) return ERR_OOMEM; - if (map_vpage(t->proc.vmem, page, - RPC_STACK_BASE + BASE_PAGE_SIZE * i, - flags, BASE_PAGE)) - return ERR_OOMEM; } /* we allocated a second order page for rpc stack usage */ -- cgit v1.3