lkml.org 
[lkml]   [2021]   [Jul]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.12 663/700] powerpc/64s/interrupt: preserve regs->softe for NMI interrupts
    Date
    From: Nicholas Piggin <npiggin@gmail.com>

    [ Upstream commit 1b0482229c302a3c6afd00d6b3bf0169cf279b44 ]

    If an NMI interrupt hits in an implicit soft-masked region, regs->softe
    is modified to reflect that. This may not be necessary for correctness
    at the moment, but it is less surprising and it's unhelpful when
    debugging or adding checks.

    Make sure this is changed back to how it was found before returning.

    Fixes: 4ec5feec1ad0 ("powerpc/64s: Make NMI record implicitly soft-masked code as irqs disabled")
    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210630074621.2109197-6-npiggin@gmail.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/powerpc/include/asm/interrupt.h | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/arch/powerpc/include/asm/interrupt.h b/arch/powerpc/include/asm/interrupt.h
    index 31ed5356590a..6d15728f0680 100644
    --- a/arch/powerpc/include/asm/interrupt.h
    +++ b/arch/powerpc/include/asm/interrupt.h
    @@ -120,6 +120,7 @@ struct interrupt_nmi_state {
    u8 irq_happened;
    #endif
    u8 ftrace_enabled;
    + u64 softe;
    #endif
    };

    @@ -129,6 +130,7 @@ static inline void interrupt_nmi_enter_prepare(struct pt_regs *regs, struct inte
    #ifdef CONFIG_PPC_BOOK3S_64
    state->irq_soft_mask = local_paca->irq_soft_mask;
    state->irq_happened = local_paca->irq_happened;
    + state->softe = regs->softe;

    /*
    * Set IRQS_ALL_DISABLED unconditionally so irqs_disabled() does
    @@ -178,6 +180,7 @@ static inline void interrupt_nmi_exit_prepare(struct pt_regs *regs, struct inter
    #ifdef CONFIG_PPC_BOOK3S_64
    /* Check we didn't change the pending interrupt mask. */
    WARN_ON_ONCE((state->irq_happened | PACA_IRQ_HARD_DIS) != local_paca->irq_happened);
    + regs->softe = state->softe;
    local_paca->irq_happened = state->irq_happened;
    local_paca->irq_soft_mask = state->irq_soft_mask;
    #endif
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-12 10:41    [W:4.146 / U:0.788 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site