[RFC PATCH 31/36] arm64: nmi: Add handling of superpriority interrupts as NMIs

Vladimir Murzin vladimir.murzin at arm.com
Tue Jul 14 09:24:28 PDT 2026


On 7/10/26 11:13, Jinjie Ruan wrote:
>> diff --git a/arch/arm64/kernel/entry-common.c b/arch/arm64/kernel/entry-common.c
>> index a13653b228b7..de71d5a3a6a1 100644
>> --- a/arch/arm64/kernel/entry-common.c
>> +++ b/arch/arm64/kernel/entry-common.c
>> @@ -525,8 +525,8 @@ asmlinkage void noinstr el1h_64_sync_handler(struct pt_regs *regs)
>>  	arm64_debug_exc_context(CRITICAL_CONTEXT);
>>  }
>>  
>> -static __always_inline void __el1_pnmi(struct pt_regs *regs,
>> -				       void (*handler)(struct pt_regs *))
>> +static __always_inline void __el1_nmi(struct pt_regs *regs,
>> +				      void (*handler)(struct pt_regs *))
>>  {
>>  	arm64_exc_hwstate_t hwstate;
>>  	irqentry_state_t state;
>> @@ -545,7 +545,10 @@ static __always_inline void __el1_irq(struct pt_regs *regs,
>>  
>>  	state = arm64_enter_from_kernel_mode(regs);
>>  
>> -	arm64_unmask_exc_context(NONMI_CONTEXT);
>> +	if (system_uses_nmi())
>> +		arm64_unmask_exc_context(NOIRQ_CONTEXT);
>> +	else
>> +		arm64_unmask_exc_context(NONMI_CONTEXT);
> This looks strange; whether it's a pseudo NMI or FEAT_NMI, the behavior
> should be consistent.

Here is my understanding of how things behave.

No NMI support

  NONMI_CONTEXT and NOIRQ_CONTEXT are the same, so we cannot take any
  IRQ while handling an IRQ. On return from the handler, we remain in
  NOIRQ_CONTEXT. Easy.

pNMI

  We cannot distinguish between an NMI and an IRQ on exception entry,
  so we have to postpone unmasking the IF bits until the interrupt
  handler. In other words, we enter the interrupt handler in
  NONMI_CONTEXT.
  
  In the handler:

    1. For an NMI, we handle the NMI and then drop to NOIRQ_CONTEXT.

    2. For an IRQ, we drop to NOIRQ_CONTEXT (allowing NMIs to preempt
       the IRQ handler) and then handle the IRQ.

  In both cases, we return from the handler in NOIRQ_CONTEXT.

FEAT_NMI

  We can distinguish between an NMI and an IRQ on exception
  entry. Thus, for an IRQ, we can immediately drop to NOIRQ_CONTEXT
  before passing control to the IRQ handler, allowing NMIs to preempt
  the IRQ handler. This corresponds to case 2 of the pNMI flow above.


Perhaps above could be better expressed with:

if (gic_supports_pseudo_nmis())
	arm64_unmask_exc_context(NONMI_CONTEXT);
else
	arm64_unmask_exc_context(NOIRQ_CONTEXT);


Have I missed anything?

Cheers
Vladimir



More information about the linux-arm-kernel mailing list