• Mark Rutland's avatar
    arm64: acpi: fix DAIF manipulation with pNMI · e533dbe9
    Mark Rutland authored
    Since commit:
    
      d44f1b8d ("arm64: KVM/mm: Move SEA handling behind a single 'claim' interface")
    
    ... the top-level APEI SEA handler has the shape:
    
    1. current_flags = arch_local_save_flags()
    2. local_daif_restore(DAIF_ERRCTX)
    3. <GHES handler>
    4. local_daif_restore(current_flags)
    
    However, since commit:
    
      4a503217 ("arm64: irqflags: Use ICC_PMR_EL1 for interrupt masking")
    
    ... when pseudo-NMIs (pNMIs) are in use, arch_local_save_flags() will save
    the PMR value rather than the DAIF flags.
    
    The combination of these two commits means that the APEI SEA handler will
    erroneously attempt to restore the PMR value into DAIF. Fix this by
    factoring local_daif_save_flags() out of local_daif_save(), so that we
    can consistently save DAIF in step #1, regardless of whether pNMIs are in
    use.
    
    Both commits were introduced concurrently in v5.0.
    
    Cc: <stable@vger.kernel.org>
    Fixes: 4a503217 ("arm64: irqflags: Use ICC_PMR_EL1 for interrupt masking")
    Fixes: d44f1b8d ("arm64: KVM/mm: Move SEA handling behind a single 'claim' interface")
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: James Morse <james.morse@arm.com>
    Cc: Julien Thierry <julien.thierry.kdev@gmail.com>
    Cc: Will Deacon <will@kernel.org>
    Signed-off-by: default avatarWill Deacon <will@kernel.org>
    e533dbe9
daifflags.h 3.24 KB