From: Marc Zyngier <[email protected]>

In order to avoid including the whole of the switching helpers
in unrelated files, move the __get_fault_info() and related helpers
into their own include file.

Signed-off-by: Marc Zyngier <[email protected]>
Signed-off-by: Fuad Tabba <[email protected]>
---
 arch/arm64/kvm/hyp/include/hyp/fault.h  | 75 +++++++++++++++++++++++++
 arch/arm64/kvm/hyp/include/hyp/switch.h | 61 +-------------------
 arch/arm64/kvm/hyp/nvhe/mem_protect.c   |  2 +-
 3 files changed, 77 insertions(+), 61 deletions(-)
 create mode 100644 arch/arm64/kvm/hyp/include/hyp/fault.h

diff --git a/arch/arm64/kvm/hyp/include/hyp/fault.h 
b/arch/arm64/kvm/hyp/include/hyp/fault.h
new file mode 100644
index 000000000000..1b8a2dcd712f
--- /dev/null
+++ b/arch/arm64/kvm/hyp/include/hyp/fault.h
@@ -0,0 +1,75 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2015 - ARM Ltd
+ * Author: Marc Zyngier <[email protected]>
+ */
+
+#ifndef __ARM64_KVM_HYP_FAULT_H__
+#define __ARM64_KVM_HYP_FAULT_H__
+
+#include <asm/kvm_asm.h>
+#include <asm/kvm_emulate.h>
+#include <asm/kvm_hyp.h>
+#include <asm/kvm_mmu.h>
+
+static inline bool __translate_far_to_hpfar(u64 far, u64 *hpfar)
+{
+       u64 par, tmp;
+
+       /*
+        * Resolve the IPA the hard way using the guest VA.
+        *
+        * Stage-1 translation already validated the memory access
+        * rights. As such, we can use the EL1 translation regime, and
+        * don't have to distinguish between EL0 and EL1 access.
+        *
+        * We do need to save/restore PAR_EL1 though, as we haven't
+        * saved the guest context yet, and we may return early...
+        */
+       par = read_sysreg_par();
+       if (!__kvm_at("s1e1r", far))
+               tmp = read_sysreg_par();
+       else
+               tmp = SYS_PAR_EL1_F; /* back to the guest */
+       write_sysreg(par, par_el1);
+
+       if (unlikely(tmp & SYS_PAR_EL1_F))
+               return false; /* Translation failed, back to guest */
+
+       /* Convert PAR to HPFAR format */
+       *hpfar = PAR_TO_HPFAR(tmp);
+       return true;
+}
+
+static inline bool __get_fault_info(u64 esr, struct kvm_vcpu_fault_info *fault)
+{
+       u64 hpfar, far;
+
+       far = read_sysreg_el2(SYS_FAR);
+
+       /*
+        * The HPFAR can be invalid if the stage 2 fault did not
+        * happen during a stage 1 page table walk (the ESR_EL2.S1PTW
+        * bit is clear) and one of the two following cases are true:
+        *   1. The fault was due to a permission fault
+        *   2. The processor carries errata 834220
+        *
+        * Therefore, for all non S1PTW faults where we either have a
+        * permission fault or the errata workaround is enabled, we
+        * resolve the IPA using the AT instruction.
+        */
+       if (!(esr & ESR_ELx_S1PTW) &&
+           (cpus_have_final_cap(ARM64_WORKAROUND_834220) ||
+            (esr & ESR_ELx_FSC_TYPE) == FSC_PERM)) {
+               if (!__translate_far_to_hpfar(far, &hpfar))
+                       return false;
+       } else {
+               hpfar = read_sysreg(hpfar_el2);
+       }
+
+       fault->far_el2 = far;
+       fault->hpfar_el2 = hpfar;
+       return true;
+}
+
+#endif
diff --git a/arch/arm64/kvm/hyp/include/hyp/switch.h 
b/arch/arm64/kvm/hyp/include/hyp/switch.h
index a0e78a6027be..54abc8298ec3 100644
--- a/arch/arm64/kvm/hyp/include/hyp/switch.h
+++ b/arch/arm64/kvm/hyp/include/hyp/switch.h
@@ -8,6 +8,7 @@
 #define __ARM64_KVM_HYP_SWITCH_H__
 
 #include <hyp/adjust_pc.h>
+#include <hyp/fault.h>
 
 #include <linux/arm-smccc.h>
 #include <linux/kvm_host.h>
@@ -133,66 +134,6 @@ static inline void ___deactivate_traps(struct kvm_vcpu 
*vcpu)
        }
 }
 
-static inline bool __translate_far_to_hpfar(u64 far, u64 *hpfar)
-{
-       u64 par, tmp;
-
-       /*
-        * Resolve the IPA the hard way using the guest VA.
-        *
-        * Stage-1 translation already validated the memory access
-        * rights. As such, we can use the EL1 translation regime, and
-        * don't have to distinguish between EL0 and EL1 access.
-        *
-        * We do need to save/restore PAR_EL1 though, as we haven't
-        * saved the guest context yet, and we may return early...
-        */
-       par = read_sysreg_par();
-       if (!__kvm_at("s1e1r", far))
-               tmp = read_sysreg_par();
-       else
-               tmp = SYS_PAR_EL1_F; /* back to the guest */
-       write_sysreg(par, par_el1);
-
-       if (unlikely(tmp & SYS_PAR_EL1_F))
-               return false; /* Translation failed, back to guest */
-
-       /* Convert PAR to HPFAR format */
-       *hpfar = PAR_TO_HPFAR(tmp);
-       return true;
-}
-
-static inline bool __get_fault_info(u64 esr, struct kvm_vcpu_fault_info *fault)
-{
-       u64 hpfar, far;
-
-       far = read_sysreg_el2(SYS_FAR);
-
-       /*
-        * The HPFAR can be invalid if the stage 2 fault did not
-        * happen during a stage 1 page table walk (the ESR_EL2.S1PTW
-        * bit is clear) and one of the two following cases are true:
-        *   1. The fault was due to a permission fault
-        *   2. The processor carries errata 834220
-        *
-        * Therefore, for all non S1PTW faults where we either have a
-        * permission fault or the errata workaround is enabled, we
-        * resolve the IPA using the AT instruction.
-        */
-       if (!(esr & ESR_ELx_S1PTW) &&
-           (cpus_have_final_cap(ARM64_WORKAROUND_834220) ||
-            (esr & ESR_ELx_FSC_TYPE) == FSC_PERM)) {
-               if (!__translate_far_to_hpfar(far, &hpfar))
-                       return false;
-       } else {
-               hpfar = read_sysreg(hpfar_el2);
-       }
-
-       fault->far_el2 = far;
-       fault->hpfar_el2 = hpfar;
-       return true;
-}
-
 static inline bool __populate_fault_info(struct kvm_vcpu *vcpu)
 {
        u8 ec;
diff --git a/arch/arm64/kvm/hyp/nvhe/mem_protect.c 
b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
index bacd493a4eac..2a07d63b8498 100644
--- a/arch/arm64/kvm/hyp/nvhe/mem_protect.c
+++ b/arch/arm64/kvm/hyp/nvhe/mem_protect.c
@@ -11,7 +11,7 @@
 #include <asm/kvm_pgtable.h>
 #include <asm/stage2_pgtable.h>
 
-#include <hyp/switch.h>
+#include <hyp/fault.h>
 
 #include <nvhe/gfp.h>
 #include <nvhe/memory.h>
-- 
2.33.0.882.g93a45727a2-goog

_______________________________________________
kvmarm mailing list
[email protected]
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

Reply via email to