.option norvc | |
.text | |
.global _start | |
_start: | |
lla t0, trap | |
csrw mtvec, t0 | |
# These are all illegal instructions | |
csrw time, x0 | |
.insn i CUSTOM_0, 0, x0, x0, 0x321 | |
csrw time, x0 | |
.insn i CUSTOM_0, 0, x0, x0, 0x123 | |
csrw cycle, x0 | |
# Success! | |
li a0, 0 | |
j _exit | |
trap: | |
# When an instruction traps, compare it to the insn in memory. | |
csrr t0, mepc | |
csrr t1, mtval | |
lwu t2, 0(t0) | |
bne t1, t2, fail | |
# Skip the insn and continue. | |
addi t0, t0, 4 | |
csrw mepc, t0 | |
mret | |
fail: | |
li a0, 1 | |
# Exit code in a0 | |
_exit: | |
lla a1, semiargs | |
li t0, 0x20026 # ADP_Stopped_ApplicationExit | |
sd t0, 0(a1) | |
sd a0, 8(a1) | |
li a0, 0x20 # TARGET_SYS_EXIT_EXTENDED | |
# Semihosting call sequence | |
.balign 16 | |
slli zero, zero, 0x1f | |
ebreak | |
srai zero, zero, 0x7 | |
j . | |
.data | |
.balign 16 | |
semiargs: | |
.space 16 |