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