diff options
author | Evgeniy Naydanov <evgeniy.naydanov@syntacore.com> | 2024-05-23 19:05:30 +0300 |
---|---|---|
committer | Evgeniy Naydanov <evgeniy.naydanov@syntacore.com> | 2024-05-23 19:36:40 +0300 |
commit | 4193bb2998d86e3c46ac957e5186aaaa42be0ff2 (patch) | |
tree | 7c44b16592a764db0f64c1bd5c77f92ec23c1138 | |
parent | 408e461da11e0b298c4b69e587729532787212f5 (diff) | |
download | riscv-tests-4193bb2998d86e3c46ac957e5186aaaa42be0ff2.zip riscv-tests-4193bb2998d86e3c46ac957e5186aaaa42be0ff2.tar.gz riscv-tests-4193bb2998d86e3c46ac957e5186aaaa42be0ff2.tar.bz2 |
debug: fix HwbpManual test
HwbpManual test was broken:
* Value read back from `tselect` was compared with `tdata1` value.
https://github.com/riscv-software-src/riscv-tests/blob/408e461da11e0b298c4b69e587729532787212f5/debug/gdbserver.py#L701-L703
This resulted in the test being reported as not supported, after all the
triggers were checked.
* `tdata1.type` field was not set to `mcontrol`.
* `tselect` value used to be changed by `handle_reset` and not restored.
https://github.com/riscv-software-src/riscv-tests/blob/408e461da11e0b298c4b69e587729532787212f5/debug/programs/entry.S#L79-L84
* Manual breakpoint used to be left behind.
Signed-off-by: Evgeniy Naydanov <evgeniy.naydanov@syntacore.com>
-rwxr-xr-x | debug/gdbserver.py | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/debug/gdbserver.py b/debug/gdbserver.py index 2cc6c8e..ba30b9b 100755 --- a/debug/gdbserver.py +++ b/debug/gdbserver.py @@ -687,6 +687,8 @@ class HwbpManual(DebugTest): self.gdb.command("delete") #self.gdb.hbreak("rot13") tdata1 = MCONTROL_DMODE(self.hart.xlen) + tdata1 = set_field(tdata1, MCONTROL_TYPE(self.hart.xlen), + MCONTROL_TYPE_MATCH) tdata1 = set_field(tdata1, MCONTROL_ACTION, MCONTROL_ACTION_DEBUG_MODE) tdata1 = set_field(tdata1, MCONTROL_MATCH, MCONTROL_MATCH_EQUAL) tdata1 |= MCONTROL_M | MCONTROL_S | MCONTROL_U | MCONTROL_EXECUTE @@ -697,20 +699,30 @@ class HwbpManual(DebugTest): value = self.gdb.p("$tselect") if value != tselect: raise TestNotApplicable + # Need to disable the trigger before writing tdata2 + self.gdb.p("$tdata1=0") + # Need to write a valid value to tdata2 before writing tdata1 + self.gdb.p("$tdata2=&rot13") self.gdb.p(f"$tdata1=0x{tdata1:x}") - value = self.gdb.p("$tselect") + value = self.gdb.p("$tdata1") if value == tdata1: break + if value & MCONTROL_TYPE(self.hart.xlen) == MCONTROL_TYPE_NONE: + raise TestNotApplicable self.gdb.p("$tdata1=0") tselect += 1 - self.gdb.p("$tdata2=&rot13") # The breakpoint should be hit exactly 2 times. for _ in range(2): output = self.gdb.c(ops=2) - self.gdb.p("$pc") + assertEqual(self.gdb.p("$pc"), self.gdb.p("&rot13")) assertRegex(output, r"[bB]reakpoint") assertIn("rot13 ", output) + + # Hardware breakpoint are removed by the binary in handle_reset. + # This changes tselect. Therefore GDB needs to restore it. + self.gdb.p(f"$tselect={tselect}") + self.gdb.p("$tdata2=&crc32a") self.gdb.c() before = self.gdb.p("$pc") @@ -719,6 +731,10 @@ class HwbpManual(DebugTest): after = self.gdb.p("$pc") assertNotEqual(before, after) + # Remove the manual HW breakpoint. + assertEqual(tselect, self.gdb.p("$tselect")) + self.gdb.p("$tdata1=0") + self.gdb.b("_exit") self.exit() |