arm64: Always set the debug control and value regs

When listing watchpoints we read the raw registers. To ensure we print
an accurate list always set the watchpoint and breakpoint registers.

Sponsored by:	Arm Ltd

Reviewed by:	jhb
Sponsored by:	Arm Ltd
Differential Revision:	https://reviews.freebsd.org/D44351

(cherry picked from commit 2e2c983d52)
This commit is contained in:
Andrew Turner 2024-03-12 16:34:41 +00:00
parent 64b0acf87c
commit c3d86d27c3

View file

@ -496,23 +496,24 @@ dbg_register_sync(struct debug_monitor_state *monitor)
if (monitor == NULL)
monitor = &kernel_monitor;
for (i = 0; i < dbg_breakpoint_num; i++) {
dbg_wb_write_reg(DBG_REG_BASE_BCR, i,
monitor->dbg_bcr[i]);
dbg_wb_write_reg(DBG_REG_BASE_BVR, i,
monitor->dbg_bvr[i]);
}
for (i = 0; i < dbg_watchpoint_num; i++) {
dbg_wb_write_reg(DBG_REG_BASE_WCR, i,
monitor->dbg_wcr[i]);
dbg_wb_write_reg(DBG_REG_BASE_WVR, i,
monitor->dbg_wvr[i]);
}
mdscr = READ_SPECIALREG(mdscr_el1);
if ((monitor->dbg_flags & DBGMON_ENABLED) == 0) {
mdscr &= ~(MDSCR_MDE | MDSCR_KDE);
} else {
for (i = 0; i < dbg_breakpoint_num; i++) {
dbg_wb_write_reg(DBG_REG_BASE_BCR, i,
monitor->dbg_bcr[i]);
dbg_wb_write_reg(DBG_REG_BASE_BVR, i,
monitor->dbg_bvr[i]);
}
for (i = 0; i < dbg_watchpoint_num; i++) {
dbg_wb_write_reg(DBG_REG_BASE_WCR, i,
monitor->dbg_wcr[i]);
dbg_wb_write_reg(DBG_REG_BASE_WVR, i,
monitor->dbg_wvr[i]);
}
mdscr |= MDSCR_MDE;
if ((monitor->dbg_flags & DBGMON_KERNEL) == DBGMON_KERNEL)
mdscr |= MDSCR_KDE;