Add some immediate trigger tests.
[riscv-tests.git] / debug / programs / trigger.S
1 #include "../../env/encoding.h"
2
3 #undef MCONTROL_TYPE
4 #undef MCONTROL_DMODE
5 #ifdef __riscv64
6 # define MCONTROL_TYPE (0xf<<(64-4))
7 # define MCONTROL_DMODE (1<<(64-5))
8 #else
9 # define MCONTROL_TYPE (0xf<<(32-4))
10 # define MCONTROL_DMODE (1<<(32-5))
11 #endif
12
13 .global main
14
15 .section .text
16 main:
17
18 la a0, data
19 li t0, 0
20 li t2, 16
21 read_loop:
22 lw t1, 0(a0)
23 addi a0, a0, 4
24 addi t0, t0, 1
25 blt t0, t2, read_loop
26
27 la a0, data
28 li t0, 1
29 write_loop:
30 sw t0, 0(a0)
31 addi t0, t0, 1
32 addi a0, a0, 4
33 blt t0, t2, write_loop
34
35 j main_exit
36
37 write_valid:
38 li t0, 0
39 li t2, MCONTROL_DMODE
40 li t3, MCONTROL_TYPE
41 write_valid_loop:
42 csrw CSR_TSELECT, t0
43 csrr t1, CSR_TSELECT
44 bne t0, t1, main_exit
45 addi t0, t0, 1
46 csrr t1, CSR_TDATA1
47 and t4, t1, t3
48 beqz t4, main_error # type is 0
49 and t1, t1, t2
50 bnez t1, write_valid_loop
51 # Found an entry with dmode=0
52 csrw CSR_TDATA1, zero # this should succeed
53
54 write_invalid:
55 li t0, 0
56 li t2, MCONTROL_DMODE
57 li t3, MCONTROL_TYPE
58 write_invalid_loop:
59 csrw CSR_TSELECT, t0
60 csrr t1, CSR_TSELECT
61 bne t0, t1, main_exit
62 addi t0, t0, 1
63 csrr t1, CSR_TDATA1
64 and t4, t1, t3
65 beqz t4, main_error # type is 0
66 and t1, t1, t2
67 beqz t1, write_invalid_loop
68 # Found an entry with dmode=1
69 write_invalid_illegal:
70 csrw CSR_TDATA1, zero # this should fail
71
72
73 main_exit:
74 li a0, 0
75 j _exit
76
77 main_error:
78 li a0, 1
79 j _exit
80
81 .data
82 data: .word 0x40
83 .word 0x41
84 .word 0x42
85 .word 0x43
86 .word 0x44
87 .word 0x45
88 .word 0x46
89 .word 0x47
90 .word 0x48
91 .word 0x49
92 .word 0x4a
93 .word 0x4b
94 .word 0x4c
95 .word 0x4d
96 .word 0x4e
97 .word 0x4f