[RFC PATCH 34/36] arm64: kprobes: Disable NMIs

Jinjie Ruan ruanjinjie at huawei.com
Mon Jul 13 01:12:33 PDT 2026



On 7/9/2026 8:13 PM, Vladimir Murzin wrote:
> Kprobes masks all DAIF exceptions to keep things simple and avoid
> nested exceptions. With FEAT_NMI, that is no longer enough. Mask
> ALLINT as well to ensure things stay simple.
> 
> Signed-off-by: Vladimir Murzin <vladimir.murzin at arm.com>
> ---
>  arch/arm64/kernel/probes/kprobes.c | 22 ++++++++++++++++------
>  1 file changed, 16 insertions(+), 6 deletions(-)
> 
> diff --git a/arch/arm64/kernel/probes/kprobes.c b/arch/arm64/kernel/probes/kprobes.c
> index d9d25d184309..defbe6061546 100644
> --- a/arch/arm64/kernel/probes/kprobes.c
> +++ b/arch/arm64/kernel/probes/kprobes.c
> @@ -193,17 +193,27 @@ static void __kprobes set_current_kprobe(struct kprobe *p)
>   * the kprobe state is per-CPU and doesn't get migrated.
>   */
>  static void __kprobes kprobes_save_local_irqflag(struct kprobe_ctlblk *kcb,
> -						struct pt_regs *regs)
> +						 struct pt_regs *regs)
>  {
> -	kcb->saved_irqflag = regs->pstate & DAIF_MASK;
> -	regs->pstate |= DAIF_MASK;
> +	arm64_exc_hwstate_t next = arm64_exc_hwstate_of_context(CRITICAL_CONTEXT);
> +
> +	kcb->saved_irqflag = arm64_inherit_exc_hwstate(regs).flags;
> +
> +	regs->pstate &= ~(DAIF_MASK | PSR_ALLINT_BIT);
> +
> +	regs->pstate |= next.daif;
> +	regs->pstate |= next.allint;
>  }
>  
>  static void __kprobes kprobes_restore_local_irqflag(struct kprobe_ctlblk *kcb,
> -						struct pt_regs *regs)
> +						    struct pt_regs *regs)
>  {
> -	regs->pstate &= ~DAIF_MASK;
> -	regs->pstate |= kcb->saved_irqflag;
> +	arm64_exc_hwstate_t prev = {.flags = kcb->saved_irqflag};
> +
> +	regs->pstate &= ~(DAIF_MASK | PSR_ALLINT_BIT);
> +
> +	regs->pstate |= prev.daif;
> +	regs->pstate |= prev.allint;

Reviewed-by: Jinjie Ruan <ruanjinjie at huawei.com>

>  }
>  
>  static void __kprobes setup_singlestep(struct kprobe *p,




More information about the linux-arm-kernel mailing list