KVM: arm64: Move host SME/SVE tracking flags to host data
authorOliver Upton <oliver.upton@linux.dev>
Thu, 19 Dec 2024 22:41:01 +0000 (14:41 -0800)
committerMarc Zyngier <maz@kernel.org>
Fri, 20 Dec 2024 08:49:09 +0000 (08:49 +0000)
The SME/SVE state tracking flags have no business in the vCPU. Move them
to kvm_host_data.

Tested-by: James Clark <james.clark@linaro.org>
Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
Link: https://lore.kernel.org/r/20241219224116.3941496-5-oliver.upton@linux.dev
Signed-off-by: Marc Zyngier <maz@kernel.org>
arch/arm64/include/asm/kvm_host.h
arch/arm64/kvm/fpsimd.c

index fb252d5408500159f2718ad2379c8b7d7c83ca92..d196bf0fce524c9befbf33f16c554eeb6d0e4583 100644 (file)
@@ -610,8 +610,10 @@ struct cpu_sve_state {
  * field.
  */
 struct kvm_host_data {
-#define KVM_HOST_DATA_FLAG_HAS_SPE     0
-#define KVM_HOST_DATA_FLAG_HAS_TRBE    1
+#define KVM_HOST_DATA_FLAG_HAS_SPE                     0
+#define KVM_HOST_DATA_FLAG_HAS_TRBE                    1
+#define KVM_HOST_DATA_FLAG_HOST_SVE_ENABLED            2
+#define KVM_HOST_DATA_FLAG_HOST_SME_ENABLED            3
        unsigned long flags;
 
        struct kvm_cpu_context host_ctxt;
@@ -916,22 +918,18 @@ struct kvm_vcpu_arch {
 /* Guest debug is live */
 #define DEBUG_DIRTY            __vcpu_single_flag(iflags, BIT(4))
 
-/* 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))
 /* Physical CPU not in supported_cpus */
-#define ON_UNSUPPORTED_CPU     __vcpu_single_flag(sflags, BIT(2))
+#define ON_UNSUPPORTED_CPU     __vcpu_single_flag(sflags, BIT(0))
 /* WFIT instruction trapped */
-#define IN_WFIT                        __vcpu_single_flag(sflags, BIT(3))
+#define IN_WFIT                        __vcpu_single_flag(sflags, BIT(1))
 /* vcpu system registers loaded on physical CPU */
-#define SYSREGS_ON_CPU         __vcpu_single_flag(sflags, BIT(4))
+#define SYSREGS_ON_CPU         __vcpu_single_flag(sflags, BIT(2))
 /* Software step state is Active-pending */
-#define DBG_SS_ACTIVE_PENDING  __vcpu_single_flag(sflags, BIT(5))
+#define DBG_SS_ACTIVE_PENDING  __vcpu_single_flag(sflags, BIT(3))
 /* PMUSERENR for the guest EL0 is on physical CPU */
-#define PMUSERENR_ON_CPU       __vcpu_single_flag(sflags, BIT(6))
+#define PMUSERENR_ON_CPU       __vcpu_single_flag(sflags, BIT(4))
 /* WFI instruction trapped */
-#define IN_WFI                 __vcpu_single_flag(sflags, BIT(7))
+#define IN_WFI                 __vcpu_single_flag(sflags, BIT(5))
 
 
 /* Pointer to the vcpu's SVE FFR for sve_{save,load}_state() */
index ea5484ce1f3ba3121b6938bda15f7a8057d49051..0e0f37d1990a34af023f48f4357a6c0b4927e7cb 100644 (file)
@@ -65,14 +65,14 @@ void kvm_arch_vcpu_load_fp(struct kvm_vcpu *vcpu)
        *host_data_ptr(fpsimd_state) = kern_hyp_va(&current->thread.uw.fpsimd_state);
        *host_data_ptr(fpmr_ptr) = kern_hyp_va(&current->thread.uw.fpmr);
 
-       vcpu_clear_flag(vcpu, HOST_SVE_ENABLED);
+       host_data_clear_flag(HOST_SVE_ENABLED);
        if (read_sysreg(cpacr_el1) & CPACR_EL1_ZEN_EL0EN)
-               vcpu_set_flag(vcpu, HOST_SVE_ENABLED);
+               host_data_set_flag(HOST_SVE_ENABLED);
 
        if (system_supports_sme()) {
-               vcpu_clear_flag(vcpu, HOST_SME_ENABLED);
+               host_data_clear_flag(HOST_SME_ENABLED);
                if (read_sysreg(cpacr_el1) & CPACR_EL1_SMEN_EL0EN)
-                       vcpu_set_flag(vcpu, HOST_SME_ENABLED);
+                       host_data_set_flag(HOST_SME_ENABLED);
 
                /*
                 * If PSTATE.SM is enabled then save any pending FP
@@ -168,7 +168,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_get_flag(vcpu, HOST_SME_ENABLED))
+               if (host_data_test_flag(HOST_SME_ENABLED))
                        sysreg_clear_set(CPACR_EL1, 0, CPACR_ELx_SMEN);
                else
                        sysreg_clear_set(CPACR_EL1,
@@ -227,7 +227,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_get_flag(vcpu, HOST_SVE_ENABLED))
+               if (host_data_test_flag(HOST_SVE_ENABLED))
                        sysreg_clear_set(CPACR_EL1, 0, CPACR_EL1_ZEN_EL0EN);
                else
                        sysreg_clear_set(CPACR_EL1, CPACR_EL1_ZEN_EL0EN, 0);