mirror of
https://github.com/openhwgroup/cvw.git
synced 2025-06-27 08:50:26 -04:00
77 lines
2.6 KiB
ArmAsm
77 lines
2.6 KiB
ArmAsm
.section .text.init
|
|
.globl rvtest_entry_point
|
|
|
|
rvtest_entry_point:
|
|
|
|
# set up PMP so all of memory is accessible and we don't trap when entering supervisor mode
|
|
# Define region 0 to cover all addresses as RWX
|
|
nop
|
|
csrw pmpcfg0, 0xF # configure PMP0 to TOR RWX
|
|
li t0, 0xFFFFFFFF
|
|
csrw pmpaddr0, t0 # configure PMP0 top of range to 0xFFFFFFFF to allow all 32-bit addresses
|
|
|
|
# switch to supervisor mode
|
|
# Set mstatus.MPP to 01, set MPEC to a trampoline address where supervisor should begin, do mret
|
|
la t0, supervisorstart
|
|
csrw mepc, t0 # set address for supervisor code to starting
|
|
li t0, 1
|
|
slli t1, t0, 11 # 1 in bit 11
|
|
csrs mstatus, t1
|
|
slli t1, t0, 12 # 1 in bit 12
|
|
csrc mstatus, t1 # change mstatus.MPP to 01 (for supervisor mode)
|
|
mret # enter supervisor mode at supervisorstart
|
|
nop
|
|
|
|
supervisorstart:
|
|
la t0, pagetable # get address of root page table
|
|
srli t0, t0, 12 # extract PPN of root page table
|
|
li t1, 1
|
|
slli t1, t1, 31 # 1 in bit 31
|
|
or t0, t0, t1 # satp value to enable SV32 with root page table
|
|
csrw satp, t0 # enable virtual memory
|
|
|
|
# now we are execuiting on virtual page 0x80000, which is also physical page 0x80000
|
|
li t0, 0x90000300
|
|
li t1, 42
|
|
sw t1, 0(t0)
|
|
|
|
|
|
la t0, testcode # address of a routine to run
|
|
lui t1, 0x10000
|
|
add t0, t0, t1 # address of testcode on virtual page 0x90000
|
|
jr t0 # jump to the testcode on Virtual page 0x90000,
|
|
# which still points to same code on physical page 0x80000
|
|
nop # shouldn't be executed
|
|
|
|
testcode:
|
|
li t0, 42 # do something
|
|
|
|
write_tohost:
|
|
la s1, tohost # terminate with write tohost
|
|
li t0, 1 # 1 for success, 3 for failure
|
|
sw t0, 0(s1) # send success code
|
|
sw zero, 4(s1) # not obvious why Sail isn't terminating unless this write is done
|
|
|
|
self_loop:
|
|
j self_loop
|
|
|
|
tohost:
|
|
.word 0
|
|
|
|
.data
|
|
|
|
|
|
.align 16
|
|
# root (L1) Page table situated at 0x80010000
|
|
pagetable:
|
|
.space 2048 # skip over addresses below 0x80000000
|
|
.4byte 0x20004401 # VPN1 = 512 (VA = 0x80000000) points to L0 page table at 80011000
|
|
.space 252 # skip over addresses below 0x90000000
|
|
.4byte 0x20004401 # VPN 576 (VA = 0x90000000) points to L0 page table at 0x80011000
|
|
|
|
.align 12
|
|
# L0 page table situated at 0x80011000
|
|
.4byte 0x200000CF # VPN 0 points to physical kilopage at 0x80000000 with Dirty, Access, XWR, Valid
|
|
|
|
|
|
|