bump env
[riscv-tests.git] / isa / rv64mi / breakpoint.S
1 # See LICENSE for license details.
2
3 #*****************************************************************************
4 # breakpoint.S
5 #-----------------------------------------------------------------------------
6 #
7 # Test breakpoints, if they are implemented.
8 #
9
10 #include "riscv_test.h"
11 #include "test_macros.h"
12
13 RVTEST_RV64M
14 RVTEST_CODE_BEGIN
15
16 # Set up breakpoint to trap on M-mode fetches.
17 li TESTNUM, 2
18
19 # Skip tselect if hard-wired.
20 csrw tselect, x0
21 csrr a1, tselect
22 bne x0, a1, pass
23
24 # Make sure there's a breakpoint there.
25 csrr a0, tdata1
26 srli a0, a0, __riscv_xlen - 4
27 li a1, 2
28 bne a0, a1, pass
29
30 la a2, 1f
31 csrw tdata2, a2
32 li a0, MCONTROL_M | MCONTROL_EXECUTE
33 csrw tdata1, a0
34 # Skip if breakpoint type is unsupported.
35 csrr a1, tdata1
36 andi a1, a1, 0x7ff
37 bne a0, a1, 2f
38 .align 2
39 1:
40 # Trap handler should skip this instruction.
41 beqz x0, fail
42
43 # Make sure reads don't trap.
44 li TESTNUM, 3
45 lw a0, (a2)
46
47 2:
48 # Set up breakpoint to trap on M-mode reads.
49 li TESTNUM, 4
50 li a0, MCONTROL_M | MCONTROL_LOAD
51 csrw tdata1, a0
52 # Skip if breakpoint type is unsupported.
53 csrr a1, tdata1
54 andi a1, a1, 0x7ff
55 bne a0, a1, 2f
56 la a2, data1
57 csrw tdata2, a2
58
59 # Trap handler should skip this instruction.
60 lw a2, (a2)
61 beqz a2, fail
62
63 # Make sure writes don't trap.
64 li TESTNUM, 5
65 sw x0, (a2)
66
67 2:
68 # Set up breakpoint to trap on M-mode stores.
69 li TESTNUM, 6
70 li a0, MCONTROL_M | MCONTROL_STORE
71 csrw tdata1, a0
72 # Skip if breakpoint type is unsupported.
73 csrr a1, tdata1
74 andi a1, a1, 0x7ff
75 bne a0, a1, 2f
76
77 # Trap handler should skip this instruction.
78 sw a2, (a2)
79
80 # Make sure store didn't succeed.
81 li TESTNUM, 7
82 lw a2, (a2)
83 bnez a2, fail
84
85 # Try to set up a second breakpoint.
86 li a0, 1
87 csrw tselect, a0
88 csrr a1, tselect
89 bne a0, a1, pass
90
91 # Make sure there's a breakpoint there.
92 csrr a0, tdata1
93 srli a0, a0, __riscv_xlen - 4
94 li a1, 2
95 bne a0, a1, pass
96
97 li a0, MCONTROL_M | MCONTROL_LOAD
98 csrw tdata1, a0
99 la a3, data2
100 csrw tdata2, a3
101
102 # Make sure the second breakpoint triggers.
103 li TESTNUM, 8
104 lw a3, (a3)
105 beqz a3, fail
106
107 # Make sure the first breakpoint still triggers.
108 li TESTNUM, 10
109 la a2, data1
110 sw a2, (a2)
111 li TESTNUM, 11
112 lw a2, (a2)
113 bnez a2, fail
114
115 2:
116 TEST_PASSFAIL
117
118 .align 2
119 .global mtvec_handler
120 mtvec_handler:
121 # Only even-numbered tests should trap.
122 andi t0, TESTNUM, 1
123 bnez t0, fail
124
125 li t0, CAUSE_BREAKPOINT
126 csrr t1, mcause
127 bne t0, t1, fail
128
129 csrr t0, mepc
130 addi t0, t0, 4
131 csrw mepc, t0
132 mret
133
134 RVTEST_CODE_END
135
136 .data
137 RVTEST_DATA_BEGIN
138
139 TEST_DATA
140
141 data1: .word 0
142 data2: .word 0
143
144 RVTEST_DATA_END