Fix/add to instant 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 just_before_read_loop:
21 li t2, 16
22 read_loop:
23 lw t1, 0(a0)
24 addi t0, t0, 1
25 addi a0, a0, 4
26 blt t0, t2, read_loop
27
28 la a0, data
29 just_before_write_loop:
30 li t0, 1
31 write_loop:
32 sw t0, 0(a0)
33 addi t0, t0, 1
34 addi a0, a0, 4
35 blt t0, t2, write_loop
36
37 j main_exit
38
39 write_valid:
40 li t0, 0
41 li t2, MCONTROL_DMODE
42 li t3, MCONTROL_TYPE
43 write_valid_loop:
44 csrw CSR_TSELECT, t0
45 csrr t1, CSR_TSELECT
46 bne t0, t1, main_exit
47 addi t0, t0, 1
48 csrr t1, CSR_TDATA1
49 and t4, t1, t3
50 beqz t4, main_error # type is 0
51 and t1, t1, t2
52 bnez t1, write_valid_loop
53 # Found an entry with dmode=0
54 csrw CSR_TDATA1, zero # this should succeed
55
56 write_invalid:
57 li t0, 0
58 li t2, MCONTROL_DMODE
59 li t3, MCONTROL_TYPE
60 write_invalid_loop:
61 csrw CSR_TSELECT, t0
62 csrr t1, CSR_TSELECT
63 bne t0, t1, main_exit
64 addi t0, t0, 1
65 csrr t1, CSR_TDATA1
66 and t4, t1, t3
67 beqz t4, main_error # type is 0
68 and t1, t1, t2
69 beqz t1, write_invalid_loop
70 # Found an entry with dmode=1
71 write_invalid_illegal:
72 csrw CSR_TDATA1, zero # this should fail
73
74
75 main_exit:
76 li a0, 0
77 j _exit
78
79 main_error:
80 li a0, 1
81 j _exit
82
83 .data
84 data: .word 0x40
85 .word 0x41
86 .word 0x42
87 .word 0x43
88 .word 0x44
89 .word 0x45
90 .word 0x46
91 .word 0x47
92 .word 0x48
93 .word 0x49
94 .word 0x4a
95 .word 0x4b
96 .word 0x4c
97 .word 0x4d
98 .word 0x4e
99 .word 0x4f