x86/kvm/fpu: Remove kvm_vcpu_arch.guest_supported_xcr0
authorLeonardo Bras <leobras@redhat.com>
Thu, 17 Feb 2022 05:30:30 +0000 (02:30 -0300)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 17 Feb 2022 15:06:49 +0000 (10:06 -0500)
kvm_vcpu_arch currently contains the guest supported features in both
guest_supported_xcr0 and guest_fpu.fpstate->user_xfeatures field.

Currently both fields are set to the same value in
kvm_vcpu_after_set_cpuid() and are not changed anywhere else after that.

Since it's not good to keep duplicated data, remove guest_supported_xcr0.

To keep the code more readable, introduce kvm_guest_supported_xcr()
and kvm_guest_supported_xfd() to replace the previous usages of
guest_supported_xcr0.

Signed-off-by: Leonardo Bras <leobras@redhat.com>
Message-Id: <20220217053028.96432-3-leobras@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/cpuid.c
arch/x86/kvm/x86.c

index 6dcccb304775411a8f38738526c79a5aa670c820..ec9830d2aabf8882ad12b96fb21a9c6bf7dee84b 100644 (file)
@@ -703,7 +703,6 @@ struct kvm_vcpu_arch {
        struct fpu_guest guest_fpu;
 
        u64 xcr0;
-       u64 guest_supported_xcr0;
 
        struct kvm_pio_request pio;
        void *pio_data;
index 71125291c5787455ebb0aa7bec923bdb1af1a400..b8f8d268d0585e9791a5cc06e144e59968fab966 100644 (file)
@@ -282,6 +282,7 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
        struct kvm_cpuid_entry2 *best;
+       u64 guest_supported_xcr0;
 
        best = kvm_find_cpuid_entry(vcpu, 1, 0);
        if (best && apic) {
@@ -293,10 +294,10 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
                kvm_apic_set_version(vcpu);
        }
 
-       vcpu->arch.guest_supported_xcr0 =
+       guest_supported_xcr0 =
                cpuid_get_supported_xcr0(vcpu->arch.cpuid_entries, vcpu->arch.cpuid_nent);
 
-       vcpu->arch.guest_fpu.fpstate->user_xfeatures = vcpu->arch.guest_supported_xcr0;
+       vcpu->arch.guest_fpu.fpstate->user_xfeatures = guest_supported_xcr0;
 
        kvm_update_pv_runtime(vcpu);
 
index 3471efe47e5fffb5fe76d05884ccff25ea5ca3c3..20ad6fe391bf8ff53f9dc11b5e0d28a74e7cf6d9 100644 (file)
@@ -984,6 +984,16 @@ void kvm_load_host_xsave_state(struct kvm_vcpu *vcpu)
 }
 EXPORT_SYMBOL_GPL(kvm_load_host_xsave_state);
 
+static inline u64 kvm_guest_supported_xcr0(struct kvm_vcpu *vcpu)
+{
+       return vcpu->arch.guest_fpu.fpstate->user_xfeatures;
+}
+
+static inline u64 kvm_guest_supported_xfd(struct kvm_vcpu *vcpu)
+{
+       return kvm_guest_supported_xcr0(vcpu) & XFEATURE_MASK_USER_DYNAMIC;
+}
+
 static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
 {
        u64 xcr0 = xcr;
@@ -1003,7 +1013,7 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
         * saving.  However, xcr0 bit 0 is always set, even if the
         * emulated CPU does not support XSAVE (see kvm_vcpu_reset()).
         */
-       valid_bits = vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FP;
+       valid_bits = kvm_guest_supported_xcr0(vcpu) | XFEATURE_MASK_FP;
        if (xcr0 & ~valid_bits)
                return 1;
 
@@ -3706,8 +3716,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                    !guest_cpuid_has(vcpu, X86_FEATURE_XFD))
                        return 1;
 
-               if (data & ~(XFEATURE_MASK_USER_DYNAMIC &
-                            vcpu->arch.guest_supported_xcr0))
+               if (data & ~kvm_guest_supported_xfd(vcpu))
                        return 1;
 
                fpu_update_guest_xfd(&vcpu->arch.guest_fpu, data);
@@ -3717,8 +3726,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                    !guest_cpuid_has(vcpu, X86_FEATURE_XFD))
                        return 1;
 
-               if (data & ~(XFEATURE_MASK_USER_DYNAMIC &
-                            vcpu->arch.guest_supported_xcr0))
+               if (data & ~kvm_guest_supported_xfd(vcpu))
                        return 1;
 
                vcpu->arch.guest_fpu.xfd_err = data;