Skip to content

Commit

Permalink
KVM: arm/arm64: Add kvm_ras.h to collect kvm specific RAS plumbing
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Punit Agrawal <[email protected]>
Acked-by: Marc Zyngier <[email protected]>
Tested-by: Tyler Baicar <[email protected]>
Acked-by: Catalin Marinas <[email protected]>
Signed-off-by: Rafael J. Wysocki <[email protected]>
  • Loading branch information
James Morse authored and rafaeljw committed Feb 7, 2019
1 parent 255097c commit 0db5e02
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 10 deletions.
14 changes: 14 additions & 0 deletions arch/arm/include/asm/kvm_ras.h
Original file line number Diff line number Diff line change
@@ -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__ */
5 changes: 0 additions & 5 deletions arch/arm/include/asm/system_misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,6 @@ static inline void harden_branch_predictor(void)

extern unsigned int user_debug;

static inline int handle_guest_sea(phys_addr_t addr, unsigned int esr)
{
return -1;
}

#endif /* !__ASSEMBLY__ */

#endif /* __ASM_ARM_SYSTEM_MISC_H */
11 changes: 11 additions & 0 deletions arch/arm64/include/asm/kvm_ras.h
Original file line number Diff line number Diff line change
@@ -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__ */
2 changes: 0 additions & 2 deletions arch/arm64/include/asm/system_misc.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ extern void __show_regs(struct pt_regs *);

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 /* __ASM_SYSTEM_MISC_H */
2 changes: 1 addition & 1 deletion arch/arm64/mm/fault.c
Original file line number Diff line number Diff line change
Expand Up @@ -733,7 +733,7 @@ static const struct fault_info fault_info[] = {
{ 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();
}
Expand Down
4 changes: 2 additions & 2 deletions virt/kvm/arm/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,10 @@
#include <asm/kvm_arm.h>
#include <asm/kvm_mmu.h>
#include <asm/kvm_mmio.h>
#include <asm/kvm_ras.h>
#include <asm/kvm_asm.h>
#include <asm/kvm_emulate.h>
#include <asm/virt.h>
#include <asm/system_misc.h>

#include "trace.h"

Expand Down Expand Up @@ -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.
* 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;

if (unlikely(!is_iabt)) {
Expand Down

0 comments on commit 0db5e02

Please sign in to comment.