aboutsummaryrefslogtreecommitdiff
path: root/pk/vm.c
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-02-09 15:38:07 -0800
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-02-09 21:19:18 -0800
commit5c8645013001ff125f9b28e0f861328e9b9a4d12 (patch)
tree0b04cb002dd38ff87b1d9ead9f45f31717fb1617 /pk/vm.c
parentd2b36b1484059c5792cdf9243f972c83bb96026a (diff)
downloadpk-5c8645013001ff125f9b28e0f861328e9b9a4d12.zip
pk-5c8645013001ff125f9b28e0f861328e9b9a4d12.tar.gz
pk-5c8645013001ff125f9b28e0f861328e9b9a4d12.tar.bz2
work in progress on new supervisor spec
Diffstat (limited to 'pk/vm.c')
-rw-r--r--pk/vm.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/pk/vm.c b/pk/vm.c
index 6378137..290a12c 100644
--- a/pk/vm.c
+++ b/pk/vm.c
@@ -154,7 +154,7 @@ static uintptr_t __vm_alloc(size_t npage)
static void flush_tlb()
{
- write_csr(fatc, 0);
+ asm volatile("sfence.vm");
}
static int __handle_page_fault(uintptr_t vaddr, int prot)
@@ -443,11 +443,14 @@ void vm_init()
__map_kernel_range(0, current.user_min, PROT_READ|PROT_WRITE|PROT_EXEC);
+ int vm_field = sizeof(long) == 4 ? VM_SV32 : VM_SV43;
if (have_vm)
{
- write_csr(ptbr, root_page_table_paddr);
- set_csr(status, SR_VM);
- have_vm = clear_csr(status, SR_VM) & SR_VM;
+#if 0
+ write_csr(sptbr, root_page_table_paddr);
+ set_csr(mstatus, vm_field << __builtin_ctz(MSTATUS_VM));
+#endif
+ have_vm = (clear_csr(mstatus, MSTATUS_VM) & MSTATUS_VM) != VM_MBARE;
}
size_t stack_size = RISCV_PGSIZE * stack_pages;
@@ -458,7 +461,7 @@ void vm_init()
{
__map_kernel_range(first_free_page, free_pages * RISCV_PGSIZE, PROT_READ|PROT_WRITE);
kassert(__do_mmap(stack_bot, stack_size, -1, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) == stack_bot);
- set_csr(status, SR_VM);
+ set_csr(mstatus, vm_field);
}
current.stack_bottom = stack_bot;