KVM: arm/arm64: Add kvm_ras.h to collect kvm specific RAS plumbing
To split up APEIs in_nmi() path, the caller needs to always be in_nmi(). KVM shouldn't have to know about this, pull the RAS plumbing out into a header file. Currently guest synchronous external aborts are claimed as RAS notifications by handle_guest_sea(), which is hidden in the arch codes mm/fault.c. 32bit gets a dummy declaration in system_misc.h. There is going to be more of this in the future if/when the kernel supports the SError-based firmware-first notification mechanism and/or kernel-first notifications for both synchronous external abort and SError. Each of these will come with some Kconfig symbols and a handful of header files. Create a header file for all this. This patch gives handle_guest_sea() a 'kvm_' prefix, and moves the declarations to kvm_ras.h as preparation for a future patch that moves the ACPI-specific RAS code out of mm/fault.c. Signed-off-by: James Morse <james.morse@arm.com> Reviewed-by: Punit Agrawal <punit.agrawal@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>
This commit is contained in:
parent
255097c82d
commit
0db5e02230
|
@ -0,0 +1,14 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/* Copyright (C) 2018 - Arm Ltd */
|
||||||
|
|
||||||
|
#ifndef __ARM_KVM_RAS_H__
|
||||||
|
#define __ARM_KVM_RAS_H__
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
static inline int kvm_handle_guest_sea(phys_addr_t addr, unsigned int esr)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* __ARM_KVM_RAS_H__ */
|
|
@ -38,11 +38,6 @@ static inline void harden_branch_predictor(void)
|
||||||
|
|
||||||
extern unsigned int user_debug;
|
extern unsigned int user_debug;
|
||||||
|
|
||||||
static inline int handle_guest_sea(phys_addr_t addr, unsigned int esr)
|
|
||||||
{
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* __ASM_ARM_SYSTEM_MISC_H */
|
#endif /* __ASM_ARM_SYSTEM_MISC_H */
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
/* Copyright (C) 2018 - Arm Ltd */
|
||||||
|
|
||||||
|
#ifndef __ARM64_KVM_RAS_H__
|
||||||
|
#define __ARM64_KVM_RAS_H__
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
int kvm_handle_guest_sea(phys_addr_t addr, unsigned int esr);
|
||||||
|
|
||||||
|
#endif /* __ARM64_KVM_RAS_H__ */
|
|
@ -46,8 +46,6 @@ extern void __show_regs(struct pt_regs *);
|
||||||
|
|
||||||
extern void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
|
extern void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
|
||||||
|
|
||||||
int handle_guest_sea(phys_addr_t addr, unsigned int esr);
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLY__ */
|
#endif /* __ASSEMBLY__ */
|
||||||
|
|
||||||
#endif /* __ASM_SYSTEM_MISC_H */
|
#endif /* __ASM_SYSTEM_MISC_H */
|
||||||
|
|
|
@ -733,7 +733,7 @@ static const struct fault_info fault_info[] = {
|
||||||
{ do_bad, SIGKILL, SI_KERNEL, "unknown 63" },
|
{ do_bad, SIGKILL, SI_KERNEL, "unknown 63" },
|
||||||
};
|
};
|
||||||
|
|
||||||
int handle_guest_sea(phys_addr_t addr, unsigned int esr)
|
int kvm_handle_guest_sea(phys_addr_t addr, unsigned int esr)
|
||||||
{
|
{
|
||||||
return ghes_notify_sea();
|
return ghes_notify_sea();
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,10 @@
|
||||||
#include <asm/kvm_arm.h>
|
#include <asm/kvm_arm.h>
|
||||||
#include <asm/kvm_mmu.h>
|
#include <asm/kvm_mmu.h>
|
||||||
#include <asm/kvm_mmio.h>
|
#include <asm/kvm_mmio.h>
|
||||||
|
#include <asm/kvm_ras.h>
|
||||||
#include <asm/kvm_asm.h>
|
#include <asm/kvm_asm.h>
|
||||||
#include <asm/kvm_emulate.h>
|
#include <asm/kvm_emulate.h>
|
||||||
#include <asm/virt.h>
|
#include <asm/virt.h>
|
||||||
#include <asm/system_misc.h>
|
|
||||||
|
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
|
|
||||||
|
@ -1903,7 +1903,7 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
* For RAS the host kernel may handle this abort.
|
* For RAS the host kernel may handle this abort.
|
||||||
* There is no need to pass the error into the guest.
|
* There is no need to pass the error into the guest.
|
||||||
*/
|
*/
|
||||||
if (!handle_guest_sea(fault_ipa, kvm_vcpu_get_hsr(vcpu)))
|
if (!kvm_handle_guest_sea(fault_ipa, kvm_vcpu_get_hsr(vcpu)))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (unlikely(!is_iabt)) {
|
if (unlikely(!is_iabt)) {
|
||||||
|
|
Loading…
Reference in New Issue