|
@@ -7985,6 +7985,7 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
|
|
|
{
|
|
|
struct msr_data apic_base_msr;
|
|
|
int mmu_reset_needed = 0;
|
|
|
+ int cpuid_update_needed = 0;
|
|
|
int pending_vec, max_bits, idx;
|
|
|
struct desc_ptr dt;
|
|
|
int ret = -EINVAL;
|
|
@@ -8023,8 +8024,10 @@ static int __set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
|
|
|
vcpu->arch.cr0 = sregs->cr0;
|
|
|
|
|
|
mmu_reset_needed |= kvm_read_cr4(vcpu) != sregs->cr4;
|
|
|
+ cpuid_update_needed |= ((kvm_read_cr4(vcpu) ^ sregs->cr4) &
|
|
|
+ (X86_CR4_OSXSAVE | X86_CR4_PKE));
|
|
|
kvm_x86_ops->set_cr4(vcpu, sregs->cr4);
|
|
|
- if (sregs->cr4 & (X86_CR4_OSXSAVE | X86_CR4_PKE))
|
|
|
+ if (cpuid_update_needed)
|
|
|
kvm_update_cpuid(vcpu);
|
|
|
|
|
|
idx = srcu_read_lock(&vcpu->kvm->srcu);
|