summaryrefslogtreecommitdiff
path: root/v
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2016-02-28 23:15:22 -0800
committerAndrew Waterman <waterman@cs.berkeley.edu>2016-02-28 23:15:22 -0800
commita6dae9f422fc86a6459d26b71672e1cb55a4fc22 (patch)
tree2afd58db6fc19964ac9fd534fc3f265fa778f1de /v
parent566e47ecd223d4a84fd0b349f525f74f3657dfc7 (diff)
downloadenv-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.S30
-rw-r--r--v/vm.c16
2 files changed, 21 insertions, 25 deletions
diff --git a/v/entry.S b/v/entry.S
index ea05e73..f503764 100644
--- a/v/entry.S
+++ b/v/entry.S
@@ -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)
diff --git a/v/vm.c b/v/vm.c
index 7b5ba6c..561578e 100644
--- a/v/vm.c
+++ b/v/vm.c
@@ -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]);