arm64: debug: refactor reinstall_suspended_bps()
`reinstall_suspended_bps()` plays a key part in the stepping process when we have hardware breakpoints and watchpoints enabled. It checks if we need to step one, will re-enable it if it has been handled and will return whether or not we need to proceed with a single-step. However, the current naming and return values make it harder to understand the logic and goal of the function. Rename it `try_step_suspended_breakpoints()` and change the return value to a boolean, aligning it with similar functions used in `do_el0_undef()` like `try_emulate_mrs()`, and making its behaviour more obvious. Signed-off-by: Ada Couprie Diaz <ada.coupriediaz@arm.com> Tested-by: Luis Claudio R. Goncalves <lgoncalv@redhat.com> Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com> Reviewed-by: Will Deacon <will@kernel.org> Acked-by: Mark Rutland <mark.rutland@arm.com> Link: https://lore.kernel.org/r/20250707114109.35672-9-ada.coupriediaz@arm.com Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
committed by
Will Deacon
parent
43e2ae77fc
commit
80691d3552
@@ -84,11 +84,11 @@ void kernel_rewind_single_step(struct pt_regs *regs);
|
||||
void kernel_fastforward_single_step(struct pt_regs *regs);
|
||||
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
int reinstall_suspended_bps(struct pt_regs *regs);
|
||||
bool try_step_suspended_breakpoints(struct pt_regs *regs);
|
||||
#else
|
||||
static inline int reinstall_suspended_bps(struct pt_regs *regs)
|
||||
static inline bool try_step_suspended_breakpoints(struct pt_regs *regs)
|
||||
{
|
||||
return -ENODEV;
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -195,7 +195,7 @@ static int single_step_handler(unsigned long unused, unsigned long esr,
|
||||
* If we are stepping a pending breakpoint, call the hw_breakpoint
|
||||
* handler first.
|
||||
*/
|
||||
if (!reinstall_suspended_bps(regs))
|
||||
if (try_step_suspended_breakpoints(regs))
|
||||
return 0;
|
||||
|
||||
if (call_step_hook(regs, esr) == DBG_HOOK_HANDLED)
|
||||
|
||||
@@ -847,36 +847,35 @@ NOKPROBE_SYMBOL(watchpoint_handler);
|
||||
/*
|
||||
* Handle single-step exception.
|
||||
*/
|
||||
int reinstall_suspended_bps(struct pt_regs *regs)
|
||||
bool try_step_suspended_breakpoints(struct pt_regs *regs)
|
||||
{
|
||||
struct debug_info *debug_info = ¤t->thread.debug;
|
||||
int handled_exception = 0, *kernel_step;
|
||||
|
||||
kernel_step = this_cpu_ptr(&stepping_kernel_bp);
|
||||
int *kernel_step = this_cpu_ptr(&stepping_kernel_bp);
|
||||
bool handled_exception = false;
|
||||
|
||||
/*
|
||||
* Called from single-step exception handler.
|
||||
* Return 0 if execution can resume, 1 if a SIGTRAP should be
|
||||
* reported.
|
||||
* Return true if we stepped a breakpoint and can resume execution,
|
||||
* false if we need to handle a single-step.
|
||||
*/
|
||||
if (user_mode(regs)) {
|
||||
if (debug_info->bps_disabled) {
|
||||
debug_info->bps_disabled = 0;
|
||||
toggle_bp_registers(AARCH64_DBG_REG_BCR, DBG_ACTIVE_EL0, 1);
|
||||
handled_exception = 1;
|
||||
handled_exception = true;
|
||||
}
|
||||
|
||||
if (debug_info->wps_disabled) {
|
||||
debug_info->wps_disabled = 0;
|
||||
toggle_bp_registers(AARCH64_DBG_REG_WCR, DBG_ACTIVE_EL0, 1);
|
||||
handled_exception = 1;
|
||||
handled_exception = true;
|
||||
}
|
||||
|
||||
if (handled_exception) {
|
||||
if (debug_info->suspended_step) {
|
||||
debug_info->suspended_step = 0;
|
||||
/* Allow exception handling to fall-through. */
|
||||
handled_exception = 0;
|
||||
handled_exception = false;
|
||||
} else {
|
||||
user_disable_single_step(current);
|
||||
}
|
||||
@@ -890,17 +889,17 @@ int reinstall_suspended_bps(struct pt_regs *regs)
|
||||
|
||||
if (*kernel_step != ARM_KERNEL_STEP_SUSPEND) {
|
||||
kernel_disable_single_step();
|
||||
handled_exception = 1;
|
||||
handled_exception = true;
|
||||
} else {
|
||||
handled_exception = 0;
|
||||
handled_exception = false;
|
||||
}
|
||||
|
||||
*kernel_step = ARM_KERNEL_STEP_NONE;
|
||||
}
|
||||
|
||||
return !handled_exception;
|
||||
return handled_exception;
|
||||
}
|
||||
NOKPROBE_SYMBOL(reinstall_suspended_bps);
|
||||
NOKPROBE_SYMBOL(try_step_suspended_breakpoints);
|
||||
|
||||
/*
|
||||
* Context-switcher for restoring suspended breakpoints.
|
||||
|
||||
Reference in New Issue
Block a user