KVM: arm64: Move vcpu SVE/SME flags to the state flag set
authorMarc Zyngier <maz@kernel.org>
Sat, 28 May 2022 11:38:20 +0000 (12:38 +0100)
committerMarc Zyngier <maz@kernel.org>
Wed, 29 Jun 2022 09:23:14 +0000 (10:23 +0100)
The two HOST_{SVE,SME}_ENABLED are only used for the host kernel
to track its own state across a vcpu run so that it can be fully
restored.

Move these flags to the so called state set.

Reviewed-by: Fuad Tabba <tabba@google.com>
Reviewed-by: Reiji Watanabe <reijiw@google.com>
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/fpsimd.c

index 4c74464..4f147bd 100644 (file)
@@ -515,6 +515,11 @@ struct kvm_vcpu_arch {
 /* Save TRBE context if active  */
 #define DEBUG_STATE_SAVE_TRBE  __vcpu_single_flag(iflags, BIT(6))
 
+/* SVE enabled for host EL0 */
+#define HOST_SVE_ENABLED       __vcpu_single_flag(sflags, BIT(0))
+/* SME enabled for EL0 */
+#define HOST_SME_ENABLED       __vcpu_single_flag(sflags, BIT(1))
+
 /* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */
 #define vcpu_sve_pffr(vcpu) (kern_hyp_va((vcpu)->arch.sve_state) +     \
                             sve_ffr_offset((vcpu)->arch.sve_max_vl))
@@ -536,11 +541,8 @@ struct kvm_vcpu_arch {
 })
 
 /* vcpu_arch flags field values: */
-#define KVM_ARM64_HOST_SVE_ENABLED     (1 << 4) /* SVE enabled for EL0 */
 #define KVM_ARM64_ON_UNSUPPORTED_CPU   (1 << 15) /* Physical CPU not in supported_cpus */
-#define KVM_ARM64_HOST_SME_ENABLED     (1 << 16) /* SME enabled for EL0 */
 #define KVM_ARM64_WFIT                 (1 << 17) /* WFIT instruction trapped */
-
 #define KVM_GUESTDBG_VALID_MASK (KVM_GUESTDBG_ENABLE | \
                                 KVM_GUESTDBG_USE_SW_BP | \
                                 KVM_GUESTDBG_USE_HW | \
index d397efe..557a96f 100644 (file)
@@ -79,9 +79,9 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
 
        vcpu->arch.fp_state = FP_STATE_HOST_OWNED;
 
-       vcpu->arch.flags &= ~KVM_ARM64_HOST_SVE_ENABLED;
+       vcpu_clear_flag(vcpu, HOST_SVE_ENABLED);
        if (read_sysreg(cpacr_el1) & CPACR_EL1_ZEN_EL0EN)
-               vcpu->arch.flags |= KVM_ARM64_HOST_SVE_ENABLED;
+               vcpu_set_flag(vcpu, HOST_SVE_ENABLED);
 
        /*
         * We don't currently support SME guests but if we leave
@@ -93,9 +93,9 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
         * operations. Do this for ZA as well for now for simplicity.
         */
        if (system_supports_sme()) {
-               vcpu->arch.flags &= ~KVM_ARM64_HOST_SME_ENABLED;
+               vcpu_clear_flag(vcpu, HOST_SME_ENABLED);
                if (read_sysreg(cpacr_el1) & CPACR_EL1_SMEN_EL0EN)
-                       vcpu->arch.flags |= KVM_ARM64_HOST_SME_ENABLED;
+                       vcpu_set_flag(vcpu, HOST_SME_ENABLED);
 
                if (read_sysreg_s(SYS_SVCR) & (SVCR_SM_MASK | SVCR_ZA_MASK)) {
                        vcpu->arch.fp_state = FP_STATE_FREE;
@@ -164,7 +164,7 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)
         */
        if (has_vhe() && system_supports_sme()) {
                /* Also restore EL0 state seen on entry */
-               if (vcpu->arch.flags & KVM_ARM64_HOST_SME_ENABLED)
+               if (vcpu_get_flag(vcpu, HOST_SME_ENABLED))
                        sysreg_clear_set(CPACR_EL1, 0,
                                         CPACR_EL1_SMEN_EL0EN |
                                         CPACR_EL1_SMEN_EL1EN);
@@ -193,7 +193,7 @@ void kvm_arch_vcpu_put_fp(struct kvm_vcpu *vcpu)
                 * for EL0.  To avoid spurious traps, restore the trap state
                 * seen by kvm_arch_vcpu_load_fp():
                 */
-               if (vcpu->arch.flags & KVM_ARM64_HOST_SVE_ENABLED)
+               if (vcpu_get_flag(vcpu, HOST_SVE_ENABLED))
                        sysreg_clear_set(CPACR_EL1, 0, CPACR_EL1_ZEN_EL0EN);
                else
                        sysreg_clear_set(CPACR_EL1, CPACR_EL1_ZEN_EL0EN, 0);