]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
arm64: refactor aarch32_break_handler()
authorAda Couprie Diaz <ada.coupriediaz@arm.com>
Mon, 7 Jul 2025 11:40:58 +0000 (12:40 +0100)
committerWill Deacon <will@kernel.org>
Tue, 8 Jul 2025 12:27:41 +0000 (13:27 +0100)
`aarch32_break_handler()` is called in `do_el0_undef()` when we
are trying to handle an exception whose Exception Syndrome is unknown.
It checks if the instruction hit might be a 32-bit arm break (be it
A32 or T2), and sends a SIGTRAP to userspace if it is so that it can
be handled.

However, this is badly represented in the naming of the function, and
is not consistent with the other functions called with the same logic
in `do_el0_undef()`.

Rename it `try_handle_aarch32_break()` and change the return value to
a boolean to align with the logic of the other tentative handlers in
`do_el0_undef()`, the previous error code being ignored anyway.

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>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Will Deacon <will@kernel.org>
Link: https://lore.kernel.org/r/20250707114109.35672-3-ada.coupriediaz@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/debug-monitors.h
arch/arm64/kernel/debug-monitors.c
arch/arm64/kernel/traps.c

index 8f6ba31b865828724b331816a1371ed01778f002..e1caf6a8380cfdf3f6125ad39072df7bd86c04d1 100644 (file)
@@ -116,7 +116,7 @@ static inline int reinstall_suspended_bps(struct pt_regs *regs)
 }
 #endif
 
-int aarch32_break_handler(struct pt_regs *regs);
+bool try_handle_aarch32_break(struct pt_regs *regs);
 
 void debug_traps_init(void);
 
index 676fa0231935be5d2883334153200c0cb8dbc053..9e69f2e915e8a2b865ccbcdcc07f3cdfffff25b8 100644 (file)
@@ -334,7 +334,7 @@ static int brk_handler(unsigned long unused, unsigned long esr,
 }
 NOKPROBE_SYMBOL(brk_handler);
 
-int aarch32_break_handler(struct pt_regs *regs)
+bool try_handle_aarch32_break(struct pt_regs *regs)
 {
        u32 arm_instr;
        u16 thumb_instr;
@@ -342,7 +342,7 @@ int aarch32_break_handler(struct pt_regs *regs)
        void __user *pc = (void __user *)instruction_pointer(regs);
 
        if (!compat_user_mode(regs))
-               return -EFAULT;
+               return false;
 
        if (compat_thumb_mode(regs)) {
                /* get 16-bit Thumb instruction */
@@ -366,12 +366,12 @@ int aarch32_break_handler(struct pt_regs *regs)
        }
 
        if (!bp)
-               return -EFAULT;
+               return false;
 
        send_user_sigtrap(TRAP_BRKPT);
-       return 0;
+       return true;
 }
-NOKPROBE_SYMBOL(aarch32_break_handler);
+NOKPROBE_SYMBOL(try_handle_aarch32_break);
 
 void __init debug_traps_init(void)
 {
index 9bfa5c944379d3f196231a3e6b13111c497872bd..685c11b2c553044fea726786d2ca788250908c49 100644 (file)
@@ -454,7 +454,7 @@ void do_el0_undef(struct pt_regs *regs, unsigned long esr)
        u32 insn;
 
        /* check for AArch32 breakpoint instructions */
-       if (!aarch32_break_handler(regs))
+       if (try_handle_aarch32_break(regs))
                return;
 
        if (user_insn_read(regs, &insn))