CVE-2026-98395: powerpc/entry: Fix irq_soft_mask corruption on replayed interrupt exit

Published Oct 14, 2026
·
Updated

In the Linux kernel, the following vulnerability has been resolved:

powerpc/entry: Fix irqsoftmask corruption on replayed interrupt exit

When replaysoftinterrupts() replays a pending interrupt (e.g. PACAIRQDEC -> timerinterrupt), it calls the handler directly with a synthetic ptregs. The DEFINEINTERRUPTHANDLERASYNC wrapper around each handler calls archinterruptasyncexitprepare() on the way out, which calls archinterruptexitprepare() -> localirqdisable() -> archlocalirqdisable(), which does:

irqsoftmaskset(IRQSDISABLED) / 0x1 /

This unconditionally overwrites irqsoftmask with IRQSDISABLED (0x1), stripping the IRQSPMIDISABLED (0x2) bit. The result is that irqsoftmask is 0x1 instead of IRQSALLDISABLED (0x3) when the handler returns to replaysoftinterrupts().

For a normally-taken interrupt this is harmless: the next interrupt always enters through archinterruptenterprepare() which unconditionally sets irqsoftmask to IRQSALLDISABLED. But during replay, nextinterrupt() is called directly between replayed handlers without going back through archinterruptenterprepare(), so the stripped bit is never restored. nextinterrupt() then fires a WARNING:

WARNING: arch/powerpc/kernel/irq64.c:75 WARNON(irqsoftmaskreturn() != IRQSALLDISABLED)

The warning was observed early in boot on a POWER10 pseries guest during kmemcacheinitlate(), where a spinlock release triggers interrupt replay that processes a pending timer interrupt.

Debugger state confirming the bug: Before timerinterrupt(&regs): irqsoftmask = 0x3 (IRQSALLDISABLED) correct irqhappened = 0x41 (HARDDIS|REPLAYING) correct After timerinterrupt(&regs) returns: irqsoftmask = 0x1 (IRQSDISABLED) WRONG - PMI bit stripped irqhappened = 0x41 unchanged

The fix is to replace localirqdisable() with hardirqdisable().

hardirqdisable() is the right primitive here for two reasons:

1. On PPC64 (hwirq.h:301) it calls irqsoftmasksetreturn(IRQSALLDISABLED), setting the soft mask to 0x3 (both IRQSDISABLED and IRQSPMIDISABLED), which preserves the PMI bit and fixes the WARNING. The additional work it does (hardirqdisable(), PACAIRQHARDDIS |=) is redundant but safe since both are already set at this point in the exit path; the tracehardirqsoff() inside is guarded by if (!archirqsdisabledflags(flags)) so it will not double-fire.

2. On PPC32 (hwirq.h:467) hardirqdisable() maps to archlocalirqdisable() -> hardirqdisable(), which clears MSR[EE] in hardware. This is exactly correct: PPC32 has no soft-mask PACA mechanism, so the hardware disable is the right way to satisfy irqentryexit()'s requirement. This also fixes a build error on PPC32 where irqsoftmaskset() is only defined under CONFIGPPC64:

arch/powerpc/include/asm/entry-common.h:273: error: implicit declaration of function 'irqsoftmaskset'

Using hardirqdisable() requires no #ifdef and is consistent with how the rest of the entry code (e.g. entry-common.h:463) handles the same PPC32/PPC64 split.

Affected Software

1 affected component
Linux Linux kernel

Event History

Oct 14, 2026
CVE Published
via MITRE·01:25 PM
Data Sourced
via MITRE·01:25 PM
Description

Frequently Asked Questions

1

What runtime condition is required for the incorrect interrupt-mask state to persist?

A pending soft interrupt must be replayed through __replay_soft_interrupts(), where handlers are called with synthetic pt_regs. The condition persists when replay moves directly to the next handler via next_interrupt() without re-entering through arch_interrupt_enter_prepare().

2

Does the same mask corruption affect ordinarily delivered interrupts?

For a normally taken interrupt, the stripped IRQS_PMI_DISABLED bit is restored on the next interrupt entry because arch_interrupt_enter_prepare() sets irq_soft_mask to IRQS_ALL_DISABLED. The problematic path is replayed interrupt handling, which bypasses that entry preparation between handlers.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203