[PATCH v3 08/13] arm64: debug: refactor reinstall_suspended_bps()
Anshuman Khandual
anshuman.khandual at arm.com
Mon Jun 16 01:49:42 PDT 2025
On 09/06/25 11:04 PM, Ada Couprie Diaz wrote:
> `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 at arm.com>
> ---
> arch/arm64/include/asm/debug-monitors.h | 6 +++---
> arch/arm64/kernel/debug-monitors.c | 2 +-
> arch/arm64/kernel/hw_breakpoint.c | 25 ++++++++++++-------------
> 3 files changed, 16 insertions(+), 17 deletions(-)
>
> diff --git a/arch/arm64/include/asm/debug-monitors.h b/arch/arm64/include/asm/debug-monitors.h
> index caee1d923f9c..586290e95d87 100644
> --- a/arch/arm64/include/asm/debug-monitors.h
> +++ b/arch/arm64/include/asm/debug-monitors.h
> @@ -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
>
> diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c
> index 02ba2c5e40ec..74ffdfeff76f 100644
> --- a/arch/arm64/kernel/debug-monitors.c
> +++ b/arch/arm64/kernel/debug-monitors.c
> @@ -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)
> diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c
> index d7eede5d869c..309ae24d4548 100644
> --- a/arch/arm64/kernel/hw_breakpoint.c
> +++ b/arch/arm64/kernel/hw_breakpoint.c
> @@ -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.
This makes sense.
Reviewed-by: Anshuman Khandual <anshuman.khandual at arm.com>
More information about the linux-arm-kernel
mailing list