cvw/examples/exercises/11p6/11p6.S
2025-05-27 03:14:16 -07:00

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