summaryrefslogtreecommitdiff
path: root/v
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-03-27 16:05:59 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-03-27 16:05:59 -0700
commit433e0094a68116503a24a3759b3b0347431ec632 (patch)
tree55d825414609b11d354149ccf3bd07cdfa8a2205 /v
parentfe2bd085aaef12c043672b2bb07fc1daab9ce598 (diff)
downloadenv-433e0094a68116503a24a3759b3b0347431ec632.zip
env-433e0094a68116503a24a3759b3b0347431ec632.tar.gz
env-433e0094a68116503a24a3759b3b0347431ec632.tar.bz2
New virtual memory implementation (Sv39)
Diffstat (limited to 'v')
-rw-r--r--v/riscv_test.h2
-rw-r--r--v/vm.c6
2 files changed, 4 insertions, 4 deletions
diff --git a/v/riscv_test.h b/v/riscv_test.h
index e076794..c690a32 100644
--- a/v/riscv_test.h
+++ b/v/riscv_test.h
@@ -78,7 +78,7 @@ userstart: \
#define MAX_TEST_PAGES 63 // this must be the period of the LFSR below
#define LFSR_NEXT(x) (((((x)^((x)>>1)) & 1) << 5) | ((x) >> 1))
-#define PGSHIFT 13
+#define PGSHIFT 12
#define PGSIZE (1 << PGSHIFT)
#define SIZEOF_TRAPFRAME_T 20776
diff --git a/v/vm.c b/v/vm.c
index 67920e5..22664db 100644
--- a/v/vm.c
+++ b/v/vm.c
@@ -95,7 +95,7 @@ void handle_fault(unsigned long addr)
if (freelist_head == freelist_tail)
freelist_tail = 0;
- l3pt[addr/PGSIZE] = node->addr | PTE_UW | PTE_UR | PTE_UX | PTE_SW | PTE_SR | PTE_SX | PTE_V;
+ l3pt[addr/PGSIZE] = (node->addr >> PGSHIFT << PTE_PPN_SHIFT) | PTE_TYPE | PTE_PERM;
asm volatile ("sfence.vm");
assert(user_mapping[addr/PGSIZE].addr == 0);
@@ -213,8 +213,8 @@ void vm_boot(long test_addr, long seed)
assert(SIZEOF_TRAPFRAME_T == sizeof(trapframe_t));
- l1pt[0] = (pte_t)l2pt | PTE_V | PTE_T;
- l2pt[0] = (pte_t)l3pt | PTE_V | PTE_T;
+ l1pt[0] = ((pte_t)l2pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_TYPE_TABLE;
+ l2pt[0] = ((pte_t)l3pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_TYPE_TABLE;
write_csr(sptbr, l1pt);
set_csr(mstatus, MSTATUS_IE1 | MSTATUS_FS | MSTATUS_XS | MSTATUS_MPRV);
clear_csr(mstatus, MSTATUS_VM | MSTATUS_UA | MSTATUS_PRV1);