KVM: arm64: Force HCR_E2H in guest context when ARM64_KVM_HVHE is set
authorMarc Zyngier <maz@kernel.org>
Fri, 9 Jun 2023 16:21:58 +0000 (17:21 +0100)
committerOliver Upton <oliver.upton@linux.dev>
Mon, 12 Jun 2023 23:17:24 +0000 (23:17 +0000)
Also make sure HCR_EL2.E2H is set when switching HCR_EL2 in guest
context.

Signed-off-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20230609162200.2024064-16-maz@kernel.org
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_emulate.h
arch/arm64/kvm/hyp/nvhe/pkvm.c

index 4d82e62..cf40d19 100644 (file)
@@ -74,7 +74,7 @@ static __always_inline bool vcpu_el1_is_32bit(struct kvm_vcpu *vcpu)
 static inline void vcpu_reset_hcr(struct kvm_vcpu *vcpu)
 {
        vcpu->arch.hcr_el2 = HCR_GUEST_FLAGS;
-       if (is_kernel_in_hyp_mode())
+       if (has_vhe() || has_hvhe())
                vcpu->arch.hcr_el2 |= HCR_E2H;
        if (cpus_have_const_cap(ARM64_HAS_RAS_EXTN)) {
                /* route synchronous external abort exceptions to EL2 */
index 5d5ee73..8033ef3 100644 (file)
@@ -44,6 +44,9 @@ static void pvm_init_traps_aa64pfr0(struct kvm_vcpu *vcpu)
        BUILD_BUG_ON(!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_AdvSIMD),
                                PVM_ID_AA64PFR0_ALLOW));
 
+       if (has_hvhe())
+               hcr_set |= HCR_E2H;
+
        /* Trap RAS unless all current versions are supported */
        if (FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_RAS), feature_ids) <
            ID_AA64PFR0_EL1_RAS_V1P1) {