aboutsummaryrefslogtreecommitdiff
path: root/arch/riscv64/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/riscv64/kernel')
-rw-r--r--arch/riscv64/kernel/proc.c6
-rw-r--r--arch/riscv64/kernel/vmem.c7
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 */