{"id":39066,"date":"2026-10-16T00:34:57","date_gmt":"2026-10-15T16:34:57","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98395"},"modified":"2026-10-16T00:34:57","modified_gmt":"2026-10-15T16:34:57","slug":"cve-2026-98395","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98395","title":{"rendered":"CVE-2026-98395 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\npowerpc\/entry: Fix ir"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>powerpc\/entry: Fix irq_soft_mask corruption on replayed interrupt exit<\/p>\n<p>When __replay_soft_interrupts() replays a pending interrupt (e.g.<br \/>\nPACA_IRQ_DEC -&gt; timer_interrupt), it calls the handler directly with a<br \/>\nsynthetic pt_regs. The DEFINE_INTERRUPT_HANDLER_ASYNC wrapper around<br \/>\neach handler calls arch_interrupt_async_exit_prepare() on the way out,<br \/>\nwhich calls arch_interrupt_exit_prepare() -&gt; local_irq_disable() -&gt;<br \/>\narch_local_irq_disable(), which does:<\/p>\n<p>    irq_soft_mask_set(IRQS_DISABLED)   \/* 0x1 *\/<\/p>\n<p>This unconditionally overwrites irq_soft_mask with IRQS_DISABLED (0x1),<br \/>\nstripping the IRQS_PMI_DISABLED (0x2) bit. The result is that<br \/>\nirq_soft_mask is 0x1 instead of IRQS_ALL_DISABLED (0x3) when the<br \/>\nhandler returns to __replay_soft_interrupts().<\/p>\n<p>For a normally-taken interrupt this is harmless: the next interrupt<br \/>\nalways enters through arch_interrupt_enter_prepare() which<br \/>\nunconditionally sets irq_soft_mask to IRQS_ALL_DISABLED. But during<br \/>\nreplay, next_interrupt() is called directly between replayed handlers<br \/>\nwithout going back through arch_interrupt_enter_prepare(), so the<br \/>\nstripped bit is never restored. next_interrupt() then fires a WARNING:<\/p>\n<p>    WARNING: arch\/powerpc\/kernel\/irq_64.c:75<br \/>\n    WARN_ON(irq_soft_mask_return() != IRQS_ALL_DISABLED)<\/p>\n<p>The warning was observed early in boot on a POWER10 pseries guest<br \/>\nduring kmem_cache_init_late(), where a spinlock release triggers<br \/>\ninterrupt replay that processes a pending timer interrupt.<\/p>\n<p>Debugger state confirming the bug:<br \/>\n  Before timer_interrupt(&amp;regs):<br \/>\n    irq_soft_mask = 0x3 (IRQS_ALL_DISABLED)   correct<br \/>\n    irq_happened  = 0x41 (HARD_DIS|REPLAYING)  correct<br \/>\n  After timer_interrupt(&amp;regs) returns:<br \/>\n    irq_soft_mask = 0x1 (IRQS_DISABLED)        WRONG &#8211; PMI bit stripped<br \/>\n    irq_happened  = 0x41                        unchanged<\/p>\n<p>The fix is to replace local_irq_disable() with hard_irq_disable().<\/p>\n<p>hard_irq_disable() is the right primitive here for two reasons:<\/p>\n<p>1. On PPC64 (hw_irq.h:301) it calls irq_soft_mask_set_return(IRQS_ALL_DISABLED),<br \/>\n   setting the soft mask to 0x3 (both IRQS_DISABLED and IRQS_PMI_DISABLED),<br \/>\n   which preserves the PMI bit and fixes the WARNING. The additional<br \/>\n   work it does (__hard_irq_disable(), PACA_IRQ_HARD_DIS |=) is<br \/>\n   redundant but safe since both are already set at this point in the<br \/>\n   exit path; the trace_hardirqs_off() inside is guarded by<br \/>\n   if (!arch_irqs_disabled_flags(flags)) so it will not double-fire.<\/p>\n<p>2. On PPC32 (hw_irq.h:467) hard_irq_disable() maps to<br \/>\n   arch_local_irq_disable() -&gt; __hard_irq_disable(), which clears<br \/>\n   MSR[EE] in hardware. This is exactly correct: PPC32 has no soft-mask<br \/>\n   PACA mechanism, so the hardware disable is the right way to satisfy<br \/>\n   irqentry_exit()&#8217;s requirement. This also fixes a build error on PPC32<br \/>\n   where irq_soft_mask_set() is only defined under CONFIG_PPC64:<\/p>\n<p>       arch\/powerpc\/include\/asm\/entry-common.h:273: error: implicit<br \/>\n       declaration of function &#8216;irq_soft_mask_set&#8217;<\/p>\n<p>   Using hard_irq_disable() requires no #ifdef and is consistent with<br \/>\n   how the rest of the entry code (e.g. entry-common.h:463) handles the<br \/>\n   same PPC32\/PPC64 split.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>powerpc\/entry: Fix irq_soft_mask corruption on replayed interrupt exit<\/p>\n<p>When __replay_soft_interrupts() replays a pending interrupt<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-39066","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/39066","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=39066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=39066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=39066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}