[RFC PATCH v2 4/4] Revert "arm64: kprobes: Allow reentering kprobes while single-stepping"
Hongyan Xia <[email protected]>
| Newsgroups | org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <3af98e883046497ff9998e8f17fdff652570de13.1786603168.git.hongyan.xia@transsion.com> |
From: Hongyan Xia <[email protected]> With the debug exception path noinstr from the vectors down to the kprobe handlers, any Kprobe reentry under KPROBE_HIT_SS must be considered a bug now. The special case is no longer needed. This reverts commit 23f851ac0078a908bf3422d6467ebc1db5828c46. Signed-off-by: Hongyan Xia <[email protected]> --- arch/arm64/include/asm/kprobes.h | 6 ------ arch/arm64/kernel/probes/kprobes.c | 23 +---------------------- 2 files changed, 1 insertion(+), 28 deletions(-) diff --git a/arch/arm64/include/asm/kprobes.h b/arch/arm64/include/asm/kprobes.h index a694f7d34f45..bff8ba9c1689 100644 --- a/arch/arm64/include/asm/kprobes.h +++ b/arch/arm64/include/asm/kprobes.h @@ -26,12 +26,6 @@ struct prev_kprobe { struct kprobe *kp; unsigned int status; - - /* - * The original DAIF state of the outer kprobe, saved here before - * a nested kprobe overwrites kcb->saved_irqflag during reentry. - */ - unsigned long saved_irqflag; }; /* per-cpu kprobe control block */ diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c index 5ec5f4ef9985..ae5147a0de38 100644 --- a/arch/arm64/kernel/probes/kprobes.c +++ b/arch/arm64/kernel/probes/kprobes.c @@ -174,27 +174,12 @@ static void noinstr save_previous_kprobe(struct kprobe_ctlblk *kcb) { kcb->prev_kprobe.kp = kprobe_running(); kcb->prev_kprobe.status = kcb->kprobe_status; - - /* - * Save the outer kprobe's original DAIF flags before the nested - * kprobe calls kprobes_save_local_irqflag() and overwrites - * kcb->saved_irqflag. Without this, the outer kprobe will restore - * the wrong DAIF state and leave interrupts permanently masked. - */ - kcb->prev_kprobe.saved_irqflag = kcb->saved_irqflag; } static void noinstr restore_previous_kprobe(struct kprobe_ctlblk *kcb) { __this_cpu_write(current_kprobe, kcb->prev_kprobe.kp); kcb->kprobe_status = kcb->prev_kprobe.status; - - /* - * Restore the outer kprobe's saved_irqflag so that when its - * single-step completes, kprobes_restore_local_irqflag() uses - * the correct original DAIF value. - */ - kcb->saved_irqflag = kcb->prev_kprobe.saved_irqflag; } static void noinstr set_current_kprobe(struct kprobe *p) @@ -255,16 +240,10 @@ static int noinstr reenter_kprobe(struct kprobe *p, switch (kcb->kprobe_status) { case KPROBE_HIT_SSDONE: case KPROBE_HIT_ACTIVE: - case KPROBE_HIT_SS: - /* - * A probe can be hit while another kprobe is preparing or - * executing its XOL single-step instruction. This is still a - * recoverable one-level reentry, so handle it in the same way as - * reentry from KPROBE_HIT_ACTIVE or KPROBE_HIT_SSDONE. - */ kprobes_inc_nmissed_count(p); setup_singlestep(p, regs, kcb, 1); break; + case KPROBE_HIT_SS: case KPROBE_REENTER: pr_warn("Failed to recover from reentered kprobes.\n"); dump_kprobe(p); -- 2.47.3