The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=f820b6ed34d5e97835d7f55d63076f07ed5d7ef5
commit f820b6ed34d5e97835d7f55d63076f07ed5d7ef5 Author: Andrew Turner <and...@freebsd.org> AuthorDate: 2025-06-23 10:15:00 +0000 Commit: Andrew Turner <and...@freebsd.org> CommitDate: 2025-06-23 10:18:19 +0000 arm64: Switch to get_user_reg in fill_dbregs This lets us read the register in one go then decode it, rather than searching for the register 3 times. Sponsored by: Arm Ltd Differential Revision: https://reviews.freebsd.org/D50903 --- sys/arm64/arm64/exec_machdep.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/sys/arm64/arm64/exec_machdep.c b/sys/arm64/arm64/exec_machdep.c index 6a536233a62d..751329affd91 100644 --- a/sys/arm64/arm64/exec_machdep.c +++ b/sys/arm64/arm64/exec_machdep.c @@ -191,17 +191,27 @@ int fill_dbregs(struct thread *td, struct dbreg *regs) { struct debug_monitor_state *monitor; + uint64_t dfr0; int i; uint8_t debug_ver, nbkpts, nwtpts; memset(regs, 0, sizeof(*regs)); - extract_user_id_field(ID_AA64DFR0_EL1, ID_AA64DFR0_DebugVer_SHIFT, - &debug_ver); - extract_user_id_field(ID_AA64DFR0_EL1, ID_AA64DFR0_BRPs_SHIFT, - &nbkpts); - extract_user_id_field(ID_AA64DFR0_EL1, ID_AA64DFR0_WRPs_SHIFT, - &nwtpts); + /* + * Read these the Debug Feature Register 0 to get info we need. + * It will be identical on FreeBSD and Linux, so there is no need + * to check which the target is. + */ + if (!get_user_reg(ID_AA64DFR0_EL1, &dfr0, true)) { + debug_ver = ID_AA64DFR0_DebugVer_8; + nbkpts = 0; + nwtpts = 0; + } else { + debug_ver = ID_AA64DFR0_DebugVer_VAL(dfr0) >> + ID_AA64DFR0_DebugVer_SHIFT; + nbkpts = ID_AA64DFR0_BRPs_VAL(dfr0) >> ID_AA64DFR0_BRPs_SHIFT; + nwtpts = ID_AA64DFR0_WRPs_VAL(dfr0) >> ID_AA64DFR0_WRPs_SHIFT; + } /* * The BRPs field contains the number of breakpoints - 1. Armv8-A