diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-27 16:05:59 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2015-03-27 16:05:59 -0700 |
commit | 433e0094a68116503a24a3759b3b0347431ec632 (patch) | |
tree | 55d825414609b11d354149ccf3bd07cdfa8a2205 /v | |
parent | fe2bd085aaef12c043672b2bb07fc1daab9ce598 (diff) | |
download | env-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.h | 2 | ||||
-rw-r--r-- | v/vm.c | 6 |
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 @@ -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); |