linux/arch/arm64/kernel/probes
Pu Hu 23f851ac00 arm64: kprobes: Allow reentering kprobes while single-stepping
A kprobe can be hit while another kprobe is in KPROBE_HIT_SS state. This
can happen when tracing or perf code runs from the debug exception path
while the first kprobe is preparing or executing its out-of-line
single-step instruction.

Currently arm64 treats a kprobe hit in KPROBE_HIT_SS as unrecoverable,
the same as a hit in KPROBE_REENTER. This is too strict. A hit in
KPROBE_HIT_SS is still a one-level reentry and can be handled by saving
the current kprobe state and setting up single-step for the new probe,
just like reentry from KPROBE_HIT_ACTIVE or KPROBE_HIT_SSDONE.

The truly unrecoverable case is hitting another kprobe while already in
KPROBE_REENTER, because the reentry save area has already been consumed.

Move KPROBE_HIT_SS to the recoverable reentry cases and leave
KPROBE_REENTER as the unrecoverable nested reentry case.

This change also requires saving saved_irqflag in struct prev_kprobe.
When a nested kprobe calls kprobes_save_local_irqflag(), it overwrites
kcb->saved_irqflag with the currently masked DAIF value, losing the
outer kprobe's original DAIF state. Without this fix, when the outer
kprobe's single-step finishes, kprobes_restore_local_irqflag() applies
the wrong DAIF mask and leaves interrupts permanently disabled.

Extend struct prev_kprobe with a saved_irqflag field and save/restore it
alongside kp and status. This ensures the outer kprobe's original
interrupt state is preserved across reentry.

This mirrors the x86 fix in commit 6a5022a56a
("kprobes/x86: Allow to handle reentered kprobe on single-stepping").

Signed-off-by: Pu Hu <hupu@transsion.com>
Signed-off-by: Hongyan Xia <hongyan.xia@transsion.com>
Reviewed-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Signed-off-by: Will Deacon <will@kernel.org>
2026-07-17 19:03:08 +01:00
..
decode-insn.c arm64: probes: Break ret out from bl/blr 2025-09-16 20:31:44 +01:00
decode-insn.h arm64: probes: Remove probe_opcode_t 2024-10-15 18:16:20 +01:00
kprobes_trampoline.S arm64: debug: call software breakpoint handlers statically 2025-07-08 13:27:41 +01:00
kprobes.c arm64: kprobes: Allow reentering kprobes while single-stepping 2026-07-17 19:03:08 +01:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
simulate-insn.c arm64: probes: Fix incorrect bl/blr address and register usage 2025-09-18 21:06:59 +01:00
simulate-insn.h arm64: probes: Break ret out from bl/blr 2025-09-16 20:31:44 +01:00
uprobes.c Performance events changes for v7.0: 2026-02-10 12:00:46 -08:00