diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-06 20:50:36 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2024-07-06 20:50:36 +0300 |
| commit | 9c0f26d26366ff7def20d5be6aff5e0f93976ad6 (patch) | |
| tree | 3872c5a1018a232e51da3f774ca54ae2e9967427 /arch | |
| parent | e9da1d29939a74e186afc39f2fce8e085764fea0 (diff) | |
| download | kmi-9c0f26d26366ff7def20d5be6aff5e0f93976ad6.tar.gz kmi-9c0f26d26366ff7def20d5be6aff5e0f93976ad6.zip | |
adjust stack handling
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/riscv64/kernel/proc.c | 6 | ||||
| -rw-r--r-- | arch/riscv64/kernel/vmem.c | 7 |
2 files changed, 10 insertions, 3 deletions
diff --git a/arch/riscv64/kernel/proc.c b/arch/riscv64/kernel/proc.c index f1a62c4..a4746b4 100644 --- a/arch/riscv64/kernel/proc.c +++ b/arch/riscv64/kernel/proc.c @@ -28,6 +28,7 @@ void run_init(struct tcb *t, vm_t fdt, vm_t initrd) * 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; bkl_unlock(); __asm__ volatile ("mv sp, %0\n" "mv a0, %1\n" @@ -35,7 +36,7 @@ void run_init(struct tcb *t, vm_t fdt, vm_t initrd) "mv a2, %3\n" "sret\n" : - : "r" (t->thread_stack_top), "r" (t->tid), "r" (fdt), + : "r" (stack_top), "r" (t->tid), "r" (fdt), "r" (initrd) : "memory"); /* we should never reach this */ @@ -66,8 +67,7 @@ void set_thread(struct tcb *t) struct riscv_regs *r = (struct riscv_regs *)(t->regs) - 1; /* insert important values into register slots */ - r->sp = (long)t->thread_stack_top; - r->tp = (long)t->thread_storage; + r->sp = (long)t->thread_stack + t->thread_stack_size; } void set_stack(struct tcb *t, vm_t s) diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c index f717771..00752c1 100644 --- a/arch/riscv64/kernel/vmem.c +++ b/arch/riscv64/kernel/vmem.c @@ -551,11 +551,18 @@ void destroy_rpc_stack(struct tcb *t) } } +void reset_rpc_stack(struct tcb *t) +{ + t->rpc_stack = RPC_STACK_BASE + (BASE_PAGE_SIZE * rpc_pages); + t->arch.rpc_idx = rpc_pages; +} + bool rpc_stack_empty(pm_t addr) { return addr == RPC_STACK_BASE + (BASE_PAGE_SIZE * rpc_pages); } + vm_t rpc_position(struct tcb *t) { /** @todo we assume rpc_idx is updated on every segfault of the rpc stack */ |
