mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 11:51:27 +00:00
d44f1b8dd7
To split up APEIs in_nmi() path, the caller needs to always be in_nmi(). Add a helper to do the work and claim the notification. When KVM or the arch code takes an exception that might be a RAS notification, it asks the APEI firmware-first code whether it wants to claim the exception. A future kernel-first mechanism may be queried afterwards, and claim the notification, otherwise we fall through to the existing default behaviour. The NOTIFY_SEA code was merged before considering multiple, possibly interacting, NMI-like notifications and the need to consider kernel first in the future. Make the 'claiming' behaviour explicit. Restructuring the APEI code to allow multiple NMI-like notifications means any notification that might interrupt interrupts-masked code must always be wrapped in nmi_enter()/nmi_exit(). This will allow APEI to use in_nmi() to use the right fixmap entries. Mask SError over this window to prevent an asynchronous RAS error arriving and tripping 'nmi_enter()'s BUG_ON(in_nmi()). Signed-off-by: James Morse <james.morse@arm.com> Acked-by: Marc Zyngier <marc.zyngier@arm.com> Tested-by: Tyler Baicar <tbaicar@codeaurora.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
26 lines
603 B
C
26 lines
603 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright (C) 2018 - Arm Ltd */
|
|
|
|
#ifndef __ARM64_KVM_RAS_H__
|
|
#define __ARM64_KVM_RAS_H__
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/types.h>
|
|
|
|
#include <asm/acpi.h>
|
|
|
|
/*
|
|
* Was this synchronous external abort a RAS notification?
|
|
* Returns '0' for errors handled by some RAS subsystem, or -ENOENT.
|
|
*/
|
|
static inline int kvm_handle_guest_sea(phys_addr_t addr, unsigned int esr)
|
|
{
|
|
/* apei_claim_sea(NULL) expects to mask interrupts itself */
|
|
lockdep_assert_irqs_enabled();
|
|
|
|
return apei_claim_sea(NULL);
|
|
}
|
|
|
|
#endif /* __ARM64_KVM_RAS_H__ */
|