• Nicholas Piggin's avatar
    powerpc/64s: Fix may_hard_irq_enable() for PMI soft masking · 6cc3f91b
    Nicholas Piggin authored
    The soft IRQ masking code has to hard-disable interrupts in cases
    where the exception is not cleared by the masked handler. External
    interrupts used this approach for soft masking. Now recently PMU
    interrupts do the same thing.
    
    The soft IRQ masking code additionally allowed for interrupt handlers
    to hard-enable interrupts after soft-disabling them. The idea is to
    allow PMU interrupts through to profile interrupt handlers.
    
    So when interrupts are being replayed when there is a pending
    interrupt that requires hard-disabling, there is a test to prevent
    those handlers from hard-enabling them if there is a pending external
    interrupt. may_hard_irq_enable() handles this.
    
    After f442d004 ("powerpc/64s: Add support to mask perf interrupts
    and replay them"), may_hard_irq_enable() could prematurely enable
    MSR[EE] when a PMU exception exists, which would result in the
    interrupt firing again while masked, and MSR[EE] being disabled again.
    
    I haven't seen that this could cause a serious problem, but it's
    more consistent to handle these soft-masked interrupts in the same
    way. So introduce a define for all types of interrupts that require
    MSR[EE] masking in their soft-disable handlers, and use that in
    may_hard_irq_enable().
    
    Fixes: f442d004 ("powerpc/64s: Add support to mask perf interrupts and replay them")
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    Reviewed-by: default avatarMadhavan Srinivasan <maddy@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    6cc3f91b
exceptions-64s.S 52.9 KB