Skip to content

Commit 988896b

Browse files
Leonardo Brasbonzini
authored andcommitted
x86/kvm/fpu: Remove kvm_vcpu_arch.guest_supported_xcr0
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>
1 parent ad85628 commit 988896b

3 files changed

Lines changed: 16 additions & 8 deletions

File tree

arch/x86/include/asm/kvm_host.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,6 @@ struct kvm_vcpu_arch {
703703
struct fpu_guest guest_fpu;
704704

705705
u64 xcr0;
706-
u64 guest_supported_xcr0;
707706

708707
struct kvm_pio_request pio;
709708
void *pio_data;

arch/x86/kvm/cpuid.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
282282
{
283283
struct kvm_lapic *apic = vcpu->arch.apic;
284284
struct kvm_cpuid_entry2 *best;
285+
u64 guest_supported_xcr0;
285286

286287
best = kvm_find_cpuid_entry(vcpu, 1, 0);
287288
if (best && apic) {
@@ -293,10 +294,10 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
293294
kvm_apic_set_version(vcpu);
294295
}
295296

296-
vcpu->arch.guest_supported_xcr0 =
297+
guest_supported_xcr0 =
297298
cpuid_get_supported_xcr0(vcpu->arch.cpuid_entries, vcpu->arch.cpuid_nent);
298299

299-
vcpu->arch.guest_fpu.fpstate->user_xfeatures = vcpu->arch.guest_supported_xcr0;
300+
vcpu->arch.guest_fpu.fpstate->user_xfeatures = guest_supported_xcr0;
300301

301302
kvm_update_pv_runtime(vcpu);
302303

arch/x86/kvm/x86.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -984,6 +984,16 @@ void kvm_load_host_xsave_state(struct kvm_vcpu *vcpu)
984984
}
985985
EXPORT_SYMBOL_GPL(kvm_load_host_xsave_state);
986986

987+
static inline u64 kvm_guest_supported_xcr0(struct kvm_vcpu *vcpu)
988+
{
989+
return vcpu->arch.guest_fpu.fpstate->user_xfeatures;
990+
}
991+
992+
static inline u64 kvm_guest_supported_xfd(struct kvm_vcpu *vcpu)
993+
{
994+
return kvm_guest_supported_xcr0(vcpu) & XFEATURE_MASK_USER_DYNAMIC;
995+
}
996+
987997
static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
988998
{
989999
u64 xcr0 = xcr;
@@ -1003,7 +1013,7 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
10031013
* saving. However, xcr0 bit 0 is always set, even if the
10041014
* emulated CPU does not support XSAVE (see kvm_vcpu_reset()).
10051015
*/
1006-
valid_bits = vcpu->arch.guest_supported_xcr0 | XFEATURE_MASK_FP;
1016+
valid_bits = kvm_guest_supported_xcr0(vcpu) | XFEATURE_MASK_FP;
10071017
if (xcr0 & ~valid_bits)
10081018
return 1;
10091019

@@ -3706,8 +3716,7 @@ int kvm_set_msr_common(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
37063716
!guest_cpuid_has(vcpu, X86_FEATURE_XFD))
37073717
return 1;
37083718

3709-
if (data & ~(XFEATURE_MASK_USER_DYNAMIC &
3710-
vcpu->arch.guest_supported_xcr0))
3719+
if (data & ~kvm_guest_supported_xfd(vcpu))
37113720
return 1;
37123721

37133722
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)
37173726
!guest_cpuid_has(vcpu, X86_FEATURE_XFD))
37183727
return 1;
37193728

3720-
if (data & ~(XFEATURE_MASK_USER_DYNAMIC &
3721-
vcpu->arch.guest_supported_xcr0))
3729+
if (data & ~kvm_guest_supported_xfd(vcpu))
37223730
return 1;
37233731

37243732
vcpu->arch.guest_fpu.xfd_err = data;

0 commit comments

Comments
 (0)