]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
arm64: debug: remove debug exception registration infrastructure
authorAda Couprie Diaz <ada.coupriediaz@arm.com>
Mon, 7 Jul 2025 11:41:09 +0000 (12:41 +0100)
committerWill Deacon <will@kernel.org>
Tue, 8 Jul 2025 12:27:42 +0000 (13:27 +0100)
Now that debug exceptions are handled individually and without the need
for dynamic registration, remove the unused registration infrastructure.

This removes the external caller for `debug_exception_enter()` and
`debug_exception_exit()`.
Make them static again and remove them from the header.

Remove `early_brk64()` as it has been made redundant by
(arm64: debug: split brk64 exception entry) and is not used anymore.
Note : in `early_brk64()` `bug_brk_handler()` is called unconditionally
as a fall-through, but now `call_break_hook()` only calls it if the
immediate matches.
This does not change the behaviour in early boot, as if
`bug_brk_handler()` was called on a non-BUG immediate it would return
DBG_HOOK_ERROR anyway, which `call_break_hook()` will do if no immediate
matches.

Remove `trap_init()`, as it would be empty and a weak definition already
exists in `init/main.c`.

Signed-off-by: Ada Couprie Diaz <ada.coupriediaz@arm.com>
Tested-by: Luis Claudio R. Goncalves <lgoncalv@redhat.com>
Reviewed-by: Will Deacon <will@kernel.org>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Link: https://lore.kernel.org/r/20250707114109.35672-14-ada.coupriediaz@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/debug-monitors.h
arch/arm64/include/asm/exception.h
arch/arm64/include/asm/system_misc.h
arch/arm64/kernel/debug-monitors.c
arch/arm64/kernel/entry-common.c
arch/arm64/kernel/traps.c
arch/arm64/mm/fault.c

index 586290e95d874f2b3acdb18f5fa1feba240e211a..4dfc37dd1d969e493f53d81caf8ffcb9bd1b7570 100644 (file)
@@ -94,7 +94,5 @@ static inline bool try_step_suspended_breakpoints(struct pt_regs *regs)
 
 bool try_handle_aarch32_break(struct pt_regs *regs);
 
-void debug_traps_init(void);
-
 #endif /* __ASSEMBLY */
 #endif /* __ASM_DEBUG_MONITORS_H */
index cdce3c7137668be2fe71e7c42254c6e681c5dd60..e3874c4fc399e5126f9cbefc81b641f554d6a1b8 100644 (file)
@@ -59,8 +59,6 @@ void do_el0_bti(struct pt_regs *regs);
 void do_el1_bti(struct pt_regs *regs, unsigned long esr);
 void do_el0_gcs(struct pt_regs *regs, unsigned long esr);
 void do_el1_gcs(struct pt_regs *regs, unsigned long esr);
-void do_debug_exception(unsigned long addr_if_watchpoint, unsigned long esr,
-                       struct pt_regs *regs);
 #ifdef CONFIG_HAVE_HW_BREAKPOINT
 void do_breakpoint(unsigned long esr, struct pt_regs *regs);
 void do_watchpoint(unsigned long addr, unsigned long esr,
@@ -94,8 +92,4 @@ 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 */
index c343442567625d58b3158e6ee95c12ebc1027326..344b1c1a4bbb696bf7884efbfc4a9f0c0882586e 100644 (file)
@@ -25,10 +25,6 @@ void arm64_notify_die(const char *str, struct pt_regs *regs,
                      int signo, int sicode, unsigned long far,
                      unsigned long err);
 
-void hook_debug_fault_code(int nr, int (*fn)(unsigned long, unsigned long,
-                                            struct pt_regs *),
-                          int sig, int code, const char *name);
-
 struct mm_struct;
 extern void __show_regs(struct pt_regs *);
 
index 43a612eaa7d2fc2702e7724f7f4085e9e8c971e4..43f342a01fdff1d3456d8c4a5176c8aad708e7c4 100644 (file)
@@ -316,9 +316,6 @@ bool try_handle_aarch32_break(struct pt_regs *regs)
 }
 NOKPROBE_SYMBOL(try_handle_aarch32_break);
 
-void __init debug_traps_init(void)
-{}
-
 /* Re-enable single step for syscall restarting. */
 void user_rewind_single_step(struct task_struct *task)
 {
index bbf58fcab142759d345d0745cf2d01538879fc82..4b67312a88ad6c35abbc86ee509aba68052f8ff2 100644 (file)
@@ -448,7 +448,7 @@ static __always_inline void fpsimd_syscall_exit(void)
  * 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)
+static void debug_exception_enter(struct pt_regs *regs)
 {
        preempt_disable();
 
@@ -457,7 +457,7 @@ void debug_exception_enter(struct pt_regs *regs)
 }
 NOKPROBE_SYMBOL(debug_exception_enter);
 
-void debug_exception_exit(struct pt_regs *regs)
+static void debug_exception_exit(struct pt_regs *regs)
 {
        preempt_enable_no_resched();
 }
index 654c8ea46ec65b6caf95857184a7af131af20aec..98b11da5a5ade786bf8ea5dcb6ebafc45abd3cb9 100644 (file)
@@ -1100,30 +1100,3 @@ int ubsan_brk_handler(struct pt_regs *regs, unsigned long esr)
        return DBG_HOOK_HANDLED;
 }
 #endif
-
-/*
- * Initial handler for AArch64 BRK exceptions
- * This handler only used until debug_traps_init().
- */
-int __init early_brk64(unsigned long addr, unsigned long esr,
-               struct pt_regs *regs)
-{
-#ifdef CONFIG_CFI_CLANG
-       if (esr_is_cfi_brk(esr))
-               return cfi_brk_handler(regs, esr) != DBG_HOOK_HANDLED;
-#endif
-#ifdef CONFIG_KASAN_SW_TAGS
-       if ((esr_brk_comment(esr) & ~KASAN_BRK_MASK) == KASAN_BRK_IMM)
-               return kasan_brk_handler(regs, esr) != DBG_HOOK_HANDLED;
-#endif
-#ifdef CONFIG_UBSAN_TRAP
-       if (esr_is_ubsan_brk(esr))
-               return ubsan_brk_handler(regs, esr) != DBG_HOOK_HANDLED;
-#endif
-       return bug_brk_handler(regs, esr) != DBG_HOOK_HANDLED;
-}
-
-void __init trap_init(void)
-{
-       debug_traps_init();
-}
index d451d7d834f1a39a89fe94c0a2ad5b686fc29999..bc7f554dea9f275932248d603955d2f1198aff6c 100644 (file)
@@ -53,18 +53,12 @@ struct fault_info {
 };
 
 static const struct fault_info fault_info[];
-static struct fault_info debug_fault_info[];
 
 static inline const struct fault_info *esr_to_fault_info(unsigned long esr)
 {
        return fault_info + (esr & ESR_ELx_FSC);
 }
 
-static inline const struct fault_info *esr_to_debug_fault_info(unsigned long esr)
-{
-       return debug_fault_info + DBG_ESR_EVT(esr);
-}
-
 static void data_abort_decode(unsigned long esr)
 {
        unsigned long iss2 = ESR_ELx_ISS2(esr);
@@ -938,53 +932,6 @@ void do_sp_pc_abort(unsigned long addr, unsigned long esr, struct pt_regs *regs)
 }
 NOKPROBE_SYMBOL(do_sp_pc_abort);
 
-/*
- * __refdata because early_brk64 is __init, but the reference to it is
- * clobbered at arch_initcall time.
- * See traps.c and debug-monitors.c:debug_traps_init().
- */
-static struct fault_info __refdata debug_fault_info[] = {
-       { do_bad,       SIGTRAP,        TRAP_HWBKPT,    "hardware breakpoint"   },
-       { do_bad,       SIGTRAP,        TRAP_HWBKPT,    "hardware single-step"  },
-       { do_bad,       SIGTRAP,        TRAP_HWBKPT,    "hardware watchpoint"   },
-       { do_bad,       SIGKILL,        SI_KERNEL,      "unknown 3"             },
-       { do_bad,       SIGTRAP,        TRAP_BRKPT,     "aarch32 BKPT"          },
-       { do_bad,       SIGKILL,        SI_KERNEL,      "aarch32 vector catch"  },
-       { early_brk64,  SIGTRAP,        TRAP_BRKPT,     "aarch64 BRK"           },
-       { do_bad,       SIGKILL,        SI_KERNEL,      "unknown 7"             },
-};
-
-void __init hook_debug_fault_code(int nr,
-                                 int (*fn)(unsigned long, unsigned long, struct pt_regs *),
-                                 int sig, int code, const char *name)
-{
-       BUG_ON(nr < 0 || nr >= ARRAY_SIZE(debug_fault_info));
-
-       debug_fault_info[nr].fn         = fn;
-       debug_fault_info[nr].sig        = sig;
-       debug_fault_info[nr].code       = code;
-       debug_fault_info[nr].name       = name;
-}
-
-void do_debug_exception(unsigned long addr_if_watchpoint, unsigned long esr,
-                       struct pt_regs *regs)
-{
-       const struct fault_info *inf = esr_to_debug_fault_info(esr);
-       unsigned long pc = instruction_pointer(regs);
-
-       debug_exception_enter(regs);
-
-       if (user_mode(regs) && !is_ttbr0_addr(pc))
-               arm64_apply_bp_hardening();
-
-       if (inf->fn(addr_if_watchpoint, esr, regs)) {
-               arm64_notify_die(inf->name, regs, inf->sig, inf->code, pc, esr);
-       }
-
-       debug_exception_exit(regs);
-}
-NOKPROBE_SYMBOL(do_debug_exception);
-
 /*
  * Used during anonymous page fault handling.
  */