[PATCH v3 06/13] arm64: entry: Add entry and exit functions for debug exceptions

Anshuman Khandual anshuman.khandual at arm.com
Mon Jun 16 01:24:28 PDT 2025



On 09/06/25 11:04 PM, Ada Couprie Diaz wrote:
> Move the `debug_exception_enter()` and `debug_exception_exit()`
> functions from mm/fault.c, as they are needed to split
> the debug exceptions entry paths from the current unified one.
> 
> Make them externally visible in include/asm/exception.h until
> the caller in mm/fault.c is cleaned up.
Makes sense.

> 
> Signed-off-by: Ada Couprie Diaz <ada.coupriediaz at arm.com>
> ---
>  arch/arm64/include/asm/exception.h |  4 ++++
>  arch/arm64/kernel/entry-common.c   | 22 ++++++++++++++++++++++
>  arch/arm64/mm/fault.c              | 22 ----------------------
>  3 files changed, 26 insertions(+), 22 deletions(-)
> 
> diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h
> index d48fc16584cd..e54b5466fd2c 100644
> --- a/arch/arm64/include/asm/exception.h
> +++ b/arch/arm64/include/asm/exception.h
> @@ -80,4 +80,8 @@ void do_serror(struct pt_regs *regs, unsigned long esr);
>  void do_signal(struct pt_regs *regs);
>  
>  void __noreturn panic_bad_stack(struct pt_regs *regs, unsigned long esr, unsigned long far);
> +
> +void debug_exception_enter(struct pt_regs *regs);
> +void debug_exception_exit(struct pt_regs *regs);
> +
>  #endif	/* __ASM_EXCEPTION_H */
> diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
> index 7c1970b341b8..3bdfa5abaf7a 100644
> --- a/arch/arm64/kernel/entry-common.c
> +++ b/arch/arm64/kernel/entry-common.c
> @@ -441,6 +441,28 @@ static __always_inline void fpsimd_syscall_exit(void)
>  	__this_cpu_write(fpsimd_last_state.to_save, FP_STATE_CURRENT);
>  }
>  
> +/*
> + * In debug exception context, we explicitly disable preemption despite
> + * having interrupts disabled.
> + * This serves two purposes: it makes it much less likely that we would
> + * accidentally schedule in exception context and it will force a warning
> + * if we somehow manage to schedule by accident.
> + */
> +void debug_exception_enter(struct pt_regs *regs)
> +{
> +	preempt_disable();
> +
> +	/* This code is a bit fragile.  Test it. */
> +	RCU_LOCKDEP_WARN(!rcu_is_watching(), "exception_enter didn't work");
> +}
> +NOKPROBE_SYMBOL(debug_exception_enter);
> +
> +void debug_exception_exit(struct pt_regs *regs)
> +{
> +	preempt_enable_no_resched();
> +}
> +NOKPROBE_SYMBOL(debug_exception_exit);
> +
>  UNHANDLED(el1t, 64, sync)
>  UNHANDLED(el1t, 64, irq)
>  UNHANDLED(el1t, 64, fiq)
> diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
> index ec0a337891dd..d451d7d834f1 100644
> --- a/arch/arm64/mm/fault.c
> +++ b/arch/arm64/mm/fault.c
> @@ -966,28 +966,6 @@ void __init hook_debug_fault_code(int nr,
>  	debug_fault_info[nr].name	= name;
>  }
>  
> -/*
> - * In debug exception context, we explicitly disable preemption despite
> - * having interrupts disabled.
> - * This serves two purposes: it makes it much less likely that we would
> - * accidentally schedule in exception context and it will force a warning
> - * if we somehow manage to schedule by accident.
> - */
> -static void debug_exception_enter(struct pt_regs *regs)
> -{
> -	preempt_disable();
> -
> -	/* This code is a bit fragile.  Test it. */
> -	RCU_LOCKDEP_WARN(!rcu_is_watching(), "exception_enter didn't work");
> -}
> -NOKPROBE_SYMBOL(debug_exception_enter);
> -
> -static void debug_exception_exit(struct pt_regs *regs)
> -{
> -	preempt_enable_no_resched();
> -}
> -NOKPROBE_SYMBOL(debug_exception_exit);
> -
>  void do_debug_exception(unsigned long addr_if_watchpoint, unsigned long esr,
>  			struct pt_regs *regs)
>  {Reviewed-by: Anshuman Khandual <anshuman.khandual at arm.com>




More information about the linux-arm-kernel mailing list