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

29 lines
No EOL
937 B
ArmAsm

.section .text.init
.globl rvtest_entry_point
rvtest_entry_point:
# set up trap trap_handler
la t0, trap_handler # address of trap trap_handler
csrw mtvec, t0 # mtvec = pointer to trap handler
la t0, trapstack # address of trap stack
csrw mscratch, t0 # mscratch = pointer to trap stack
lw t0, 1(zero) # cause access or misaligned load fault to invoke trap handler
self_loop:
j self_loop
trap_handler:
csrrw tp, mscratch, tp # swap tp and mscratch to put a trap stack pointer in tp
sw t0, 0(tp) # save t0 on trap stack
csrr t0, mepc # read mepc
addi t0, t0, 4 # mepc + 4
csrw mepc, t0 # mepc = mpec + 4 (return to next instruction)
lw t0, 0(tp) # restore t0 from trap stack
csrrw tp, mscratch, tp # restore tp and trap stack pointer
mret
trapstack:
.word 0 # room to save a register