KVM: arm64: Key use of VHE instructions in nVHE code off ARM64_KVM_HVHE
authorMarc Zyngier <maz@kernel.org>
Fri, 9 Jun 2023 16:21:52 +0000 (17:21 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 12 Jun 2023 23:17:23 +0000 (23:17 +0000)
We can now start with the fun stuff: if we enable VHE *only* for
the hypervisor, we need to generate the VHE instructions when
accessing the system registers.

For this, reporpose the alternative sequence to be keyed off
ARM64_KVM_HVHE in the nVHE hypervisor code, and only there.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20230609162200.2024064-10-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_hyp.h

index fea04eb..b7238c7 100644 (file)
@@ -33,12 +33,18 @@ DECLARE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params);
 
 #else // !__KVM_VHE_HYPERVISOR__
 
+#if defined(__KVM_NVHE_HYPERVISOR__)
+#define VHE_ALT_KEY    ARM64_KVM_HVHE
+#else
+#define VHE_ALT_KEY    ARM64_HAS_VIRT_HOST_EXTN
+#endif
+
 #define read_sysreg_elx(r,nvh,vh)                                      \
        ({                                                              \
                u64 reg;                                                \
-               asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh), \
+               asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh),         \
                                         __mrs_s("%0", r##vh),          \
-                                        ARM64_HAS_VIRT_HOST_EXTN)      \
+                                        VHE_ALT_KEY)                   \
                             : "=r" (reg));                             \
                reg;                                                    \
        })
@@ -48,7 +54,7 @@ DECLARE_PER_CPU(struct kvm_nvhe_init_params, kvm_init_params);
                u64 __val = (u64)(v);                                   \
                asm volatile(ALTERNATIVE(__msr_s(r##nvh, "%x0"),        \
                                         __msr_s(r##vh, "%x0"),         \
-                                        ARM64_HAS_VIRT_HOST_EXTN)      \
+                                        VHE_ALT_KEY)                   \
                                         : : "rZ" (__val));             \
        } while (0)