Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

Commit

Permalink
BACKPORT: KVM: arm/arm64: Add kvm_ras.h to collect kvm specific RAS p…
Browse files Browse the repository at this point in the history
…lumbing

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.

This patch is needed because Quicksilver firmware-first error handling
uses the SDEI notification type for communication between trusted
firmware and the OS. This adds needed NMI and SDEI functionality so
that the SDEI path in the kernel through APEI acts as an NMI and is
properly wired up to the APEI interfaces.

Backported from: torvalds/linux@0db5e02

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: Tyler Baicar <[email protected]>
  • Loading branch information
James Morse authored and tphan-ampere committed Apr 21, 2020
1 parent 7e0c9ae commit f78e808
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 @@ -45,8 +45,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 @@ -725,7 +725,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)
{
int ret = -ENOENT;

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 @@ -1754,7 +1754,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 f78e808

Please sign in to comment.