]> www.infradead.org Git - users/hch/misc.git/commitdiff
KVM: arm64: Factor out setting HCRX_EL2 traps into separate function
authorFuad Tabba <tabba@google.com>
Fri, 14 Mar 2025 11:18:29 +0000 (11:18 +0000)
committerOliver Upton <oliver.upton@linux.dev>
Fri, 14 Mar 2025 23:00:49 +0000 (16:00 -0700)
Factor out the code for setting a vcpu's HCRX_EL2 traps in to a
separate inline function. This allows us to share the logic with
pKVM when setting the traps in protected mode.

No functional change intended.

Reviewed-by: Marc Zyngier <maz@kernel.org>
Signed-off-by: Fuad Tabba <tabba@google.com>
Link: https://lore.kernel.org/r/20250314111832.4137161-2-tabba@google.com
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
arch/arm64/include/asm/kvm_emulate.h
arch/arm64/kvm/sys_regs.c

index 78ec1ef2cfe82ac31b19cc26ece0d94cea19b46c..31c8497372d0e8f71d9dddb18d62a3ecd470d365 100644 (file)
@@ -649,4 +649,28 @@ static inline bool guest_hyp_sve_traps_enabled(const struct kvm_vcpu *vcpu)
 {
        return __guest_hyp_cptr_xen_trap_enabled(vcpu, ZEN);
 }
+
+static inline void vcpu_set_hcrx(struct kvm_vcpu *vcpu)
+{
+       struct kvm *kvm = vcpu->kvm;
+
+       if (cpus_have_final_cap(ARM64_HAS_HCX)) {
+               /*
+                * In general, all HCRX_EL2 bits are gated by a feature.
+                * The only reason we can set SMPME without checking any
+                * feature is that its effects are not directly observable
+                * from the guest.
+                */
+               vcpu->arch.hcrx_el2 = HCRX_EL2_SMPME;
+
+               if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP))
+                       vcpu->arch.hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2);
+
+               if (kvm_has_tcr2(kvm))
+                       vcpu->arch.hcrx_el2 |= HCRX_EL2_TCR2En;
+
+               if (kvm_has_fpmr(kvm))
+                       vcpu->arch.hcrx_el2 |= HCRX_EL2_EnFPM;
+       }
+}
 #endif /* __ARM64_KVM_EMULATE_H__ */
index 82430c1e1dd02b1ac24fd2ddcd05a91272997fdb..16ce5f584e7cc686b7da790273d1b81b58631bda 100644 (file)
@@ -4971,25 +4971,7 @@ void kvm_calculate_traps(struct kvm_vcpu *vcpu)
        mutex_lock(&kvm->arch.config_lock);
        vcpu_set_hcr(vcpu);
        vcpu_set_ich_hcr(vcpu);
-
-       if (cpus_have_final_cap(ARM64_HAS_HCX)) {
-               /*
-                * In general, all HCRX_EL2 bits are gated by a feature.
-                * The only reason we can set SMPME without checking any
-                * feature is that its effects are not directly observable
-                * from the guest.
-                */
-               vcpu->arch.hcrx_el2 = HCRX_EL2_SMPME;
-
-               if (kvm_has_feat(kvm, ID_AA64ISAR2_EL1, MOPS, IMP))
-                       vcpu->arch.hcrx_el2 |= (HCRX_EL2_MSCEn | HCRX_EL2_MCE2);
-
-               if (kvm_has_tcr2(kvm))
-                       vcpu->arch.hcrx_el2 |= HCRX_EL2_TCR2En;
-
-               if (kvm_has_fpmr(kvm))
-                       vcpu->arch.hcrx_el2 |= HCRX_EL2_EnFPM;
-       }
+       vcpu_set_hcrx(vcpu);
 
        if (test_bit(KVM_ARCH_FLAG_FGU_INITIALIZED, &kvm->arch.flags))
                goto out;