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 13RVTEST_RV64M 14RVTEST_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 391: 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 472: 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 672: 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 1152: 116 TEST_PASSFAIL 117 118 .align 2 119 .global mtvec_handler 120mtvec_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 134RVTEST_CODE_END 135 136 .data 137RVTEST_DATA_BEGIN 138 139 TEST_DATA 140 141data1: .word 0 142data2: .word 0 143 144RVTEST_DATA_END 145