/* Original exception/retry/ECALL teaching program. The first trap repairs a
 * deliberately invalid RAM base and retries LW. The second skips ECALL.
 * No handler instruction executes merely because trap entry was inspected. */
    .option norvc
    .option norelax
    .section .text.start,"ax",@progbits
    .globl _start
    .type _start,@function
_start:
    lui x5, 0x40000
    addi x6, zero, 1
    sw x6, 8(x5)
    addi x20, zero, 128
    csrw mtvec, x20
    lui x7, 0x20000
    addi x12, zero, 16
    sw x12, 0(x7)
    lui x7, 0x50000
fault_load:
    lw x13, 0(x7)
    sw x6, 4(x5)
ecall_site:
    ecall
done:
    jal zero, done
    .size _start, .-_start
    .org 0x80
    .globl trap_handler
    .type trap_handler,@function
trap_handler:
    addi x23, x23, 1
    csrr x20, mcause
    csrr x21, mepc
    csrr x22, mtval
    addi x24, zero, 11
    beq x20, x24, skip_ecall
    lui x7, 0x20000
    mret
skip_ecall:
    addi x21, x21, 4
    csrw mepc, x21
    mret
    .size trap_handler, .-trap_handler
    .section .note.GNU-stack,"",@progbits
