/ test / asm / smode_interrupt.asm
smode_interrupt.asm
 1  _start:
 2      # Configure PMP: allow all access for S-mode
 3      li x1, 0x1F
 4      csrw pmpcfg0, x1
 5      li x1, -1
 6      csrw pmpaddr0, x1
 7  
 8      li x31, 0xde
 9  
10      la x1, machine_trap
11      csrw mtvec, x1
12  
13      la x1, supervisor_trap
14      csrw stvec, x1
15  
16      li x1, 1 << 17 # delegate custom level interrupt to supervisor mode
17      csrw mideleg, x1
18  
19      li x1, 1 << 17
20      csrw sie, x1
21  
22      # Set MPP to supervisor and transfer via MRET.
23      li x1, 0b11 << 11
24      csrc mstatus, x1
25      li x1, 0b01 << 11
26      csrs mstatus, x1
27  
28      la x1, s_mode_main
29      csrw mepc, x1
30      mret
31  
32  s_mode_main:
33      csrr x2, 0x8ff # custom testbench CSR - current privilege mode
34      li x3, 1
35      bne x2, x3, fail
36  
37      li x3, 1
38      csrsi sstatus, 0x2 # set sstatus.SIE
39  
40  wait_for_interrupt:
41      beq x7, x3, after_interrupt
42      j wait_for_interrupt
43  
44  after_interrupt:
45      csrr x10, sstatus
46      andi x11, x10, 0x2
47      beqz x11, fail
48  
49      li x5, 1
50      j pass
51  
52  supervisor_trap:
53      addi x7, x7, 1
54  
55      csrr x8, scause
56      li x9, 0x80000011
57      bne x8, x9, fail
58  
59      # During trap handling: SIE must be cleared and SPIE should be set.
60      csrr x10, sstatus
61      andi x11, x10, 0x2
62      bnez x11, fail
63  
64      andi x12, x10, 0x20
65      beqz x12, fail
66  
67      sret
68  
69  machine_trap:
70      # M-mode trap handler must not fire in this test (interrupt is delegated)
71      li x31, 0xae
72  
73  fail:
74      j fail
75  
76  pass:
77      j pass