aboutsummaryrefslogtreecommitdiff
path: root/pk/vm.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-04-10 14:58:00 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-04-10 14:58:00 -0700
commite474878db4a406fb0bc7f6051314352f4406fcd2 (patch)
tree3286da6cb52877f8d51f2346f0ec51bbb236f23a /pk/vm.c
parent01fd29cb6ef8202ef6201f6f471dec9cbd1a4145 (diff)
downloadpk-e474878db4a406fb0bc7f6051314352f4406fcd2.zip
pk-e474878db4a406fb0bc7f6051314352f4406fcd2.tar.gz
pk-e474878db4a406fb0bc7f6051314352f4406fcd2.tar.bz2
Fix stack discipline for recursive traps
Diffstat (limited to 'pk/vm.c')
-rw-r--r--pk/vm.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/pk/vm.c b/pk/vm.c
index 64d7956..0719a4b 100644
--- a/pk/vm.c
+++ b/pk/vm.c
@@ -483,17 +483,20 @@ void supervisor_vm_init()
flush_tlb();
}
-void pk_vm_init()
+uintptr_t pk_vm_init()
{
__map_kernel_range(0, 0, current.first_free_paddr, PROT_READ|PROT_WRITE|PROT_EXEC);
__map_kernel_range(first_free_page, first_free_page, free_pages * RISCV_PGSIZE, PROT_READ|PROT_WRITE);
extern char trap_entry;
write_csr(stvec, &trap_entry);
- write_csr(sscratch, __page_alloc() + RISCV_PGSIZE);
+ write_csr(sscratch, 0);
size_t stack_size = RISCV_PGSIZE * CLAMP(mem_size/(RISCV_PGSIZE*32), 1, 256);
current.stack_bottom = __do_mmap(current.mmap_max - stack_size, stack_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, 0, 0);
current.stack_top = current.stack_bottom + stack_size;
kassert(current.stack_bottom != (uintptr_t)-1);
+
+ uintptr_t kernel_stack_top = __page_alloc() + RISCV_PGSIZE;
+ return kernel_stack_top;
}