diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-02-28 23:15:22 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-02-28 23:15:22 -0800 |
commit | a6dae9f422fc86a6459d26b71672e1cb55a4fc22 (patch) | |
tree | 2afd58db6fc19964ac9fd534fc3f265fa778f1de /v | |
parent | 566e47ecd223d4a84fd0b349f525f74f3657dfc7 (diff) | |
download | env-a6dae9f422fc86a6459d26b71672e1cb55a4fc22.zip env-a6dae9f422fc86a6459d26b71672e1cb55a4fc22.tar.gz env-a6dae9f422fc86a6459d26b71672e1cb55a4fc22.tar.bz2 |
WIP on priv spec v1.9
Diffstat (limited to 'v')
-rw-r--r-- | v/entry.S | 30 | ||||
-rw-r--r-- | v/vm.c | 16 |
2 files changed, 21 insertions, 25 deletions
@@ -13,30 +13,25 @@ #define STACK_TOP (_end + 131072) .section ".text.init","ax",@progbits - .align 6 -entry_from_user: - mrts - .align 6 -entry_from_supervisor: - csrr t0, mcause - addi t0, t0, -CAUSE_SUPERVISOR_ECALL - beqz t0, handle_tohost - j wtf +reset_vector: + j handle_reset - .align 6 -entry_from_hypervisor: + /* NMI vector */ +nmi_vector: j wtf - .align 6 -entry_from_machine: +trap_vector: + # we can safely clobber caller-saved registers here, because we were + # either invoked via do_tohost or we are about to bail out csrr t0, mcause - addi t0, t0, -CAUSE_MACHINE_ECALL - beqz t0, handle_tohost + li t1, CAUSE_SUPERVISOR_ECALL + beq t0, t1, handle_tohost + li t1, CAUSE_MACHINE_ECALL + beq t0, t1, handle_tohost j wtf - .align 6 -power_on_reset: +handle_reset: la sp, STACK_TOP - SIZEOF_TRAPFRAME_T csrw mscratch, sp li a1, 1337 @@ -45,7 +40,6 @@ power_on_reset: .globl pop_tf pop_tf: - csrc sstatus, SSTATUS_IE LOAD t0,33*REGBYTES(a0) csrw sepc,t0 LOAD x1,1*REGBYTES(a0) @@ -182,17 +182,19 @@ void vm_boot(long test_addr, long seed) // map user to lowermost megapage l1pt[0] = ((pte_t)user_l2pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_V | PTE_TYPE_TABLE; user_l2pt[0] = ((pte_t)user_l3pt >> PGSHIFT << PTE_PPN_SHIFT) | PTE_V | PTE_TYPE_TABLE; - write_csr(sptbr, l1pt); + write_csr(sptbr, (uintptr_t)l1pt >> PGSHIFT); // set up supervisor trap handling write_csr(stvec, pa2kva(trap_entry)); write_csr(sscratch, pa2kva(read_csr(mscratch))); - // interrupts on; FPU on; accelerator on - set_csr(mstatus, MSTATUS_IE1 | MSTATUS_FS | MSTATUS_XS); - // virtual memory off; set user mode upon eret - clear_csr(mstatus, MSTATUS_VM | MSTATUS_PRV1); - // virtual memory to Sv39 - set_csr(mstatus, (long)VM_SV39 << __builtin_ctzl(MSTATUS_VM)); + write_csr(medeleg, + (1 << CAUSE_USER_ECALL) | + (1 << CAUSE_FAULT_FETCH) | + (1 << CAUSE_FAULT_LOAD) | + (1 << CAUSE_FAULT_STORE)); + // on ERET, user mode w/interrupts on; FPU on; accelerator on; VM on + write_csr(mstatus, MSTATUS_UIE | MSTATUS_FS | MSTATUS_XS | + (VM_SV39 * (MSTATUS_VM & ~(MSTATUS_VM<<1)))); seed = 1 + (seed % MAX_TEST_PAGES); freelist_head = pa2kva((void*)&freelist_nodes[0]); |