]> git.baikalelectronics.ru Git - kernel.git/commit
arm64: acpi: fix DAIF manipulation with pNMI
authorMark Rutland <mark.rutland@arm.com>
Wed, 22 Jan 2020 12:45:46 +0000 (12:45 +0000)
committerWill Deacon <will@kernel.org>
Wed, 22 Jan 2020 14:41:22 +0000 (14:41 +0000)
commita3d5d779f591ee5d5d1e43fab3cf4fa09a667593
tree7f8cb38dac83c3f72063fc091da4ac4edf4d1335
parent2482786b8bc786d5dc53896b8f16c42d759dfd2c
arm64: acpi: fix DAIF manipulation with pNMI

Since commit:

  d025ef0d666e4405 ("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:

  5e57cca3bf4c5294 ("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: 5e57cca3bf4c5294 ("arm64: irqflags: Use ICC_PMR_EL1 for interrupt masking")
Fixes: d025ef0d666e4405 ("arm64: KVM/mm: Move SEA handling behind a single 'claim' interface")
Signed-off-by: Mark 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: Will Deacon <will@kernel.org>
arch/arm64/include/asm/daifflags.h
arch/arm64/kernel/acpi.c