[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 = &current->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