diff options
Diffstat (limited to 'arch/x86/kvm/cpuid.c')
| -rw-r--r-- | arch/x86/kvm/cpuid.c | 29 | 
1 files changed, 21 insertions, 8 deletions
| diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c index 06a278b3701d..83637a2ff605 100644 --- a/arch/x86/kvm/cpuid.c +++ b/arch/x86/kvm/cpuid.c @@ -90,6 +90,20 @@ static int kvm_check_cpuid(struct kvm_cpuid_entry2 *entries, int nent)  	return 0;  } +void kvm_update_pv_runtime(struct kvm_vcpu *vcpu) +{ +	struct kvm_cpuid_entry2 *best; + +	best = kvm_find_cpuid_entry(vcpu, KVM_CPUID_FEATURES, 0); + +	/* +	 * save the feature bitmap to avoid cpuid lookup for every PV +	 * operation +	 */ +	if (best) +		vcpu->arch.pv_cpuid.features = best->eax; +} +  void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)  {  	struct kvm_cpuid_entry2 *best; @@ -124,13 +138,6 @@ void kvm_update_cpuid_runtime(struct kvm_vcpu *vcpu)  		(best->eax & (1 << KVM_FEATURE_PV_UNHALT)))  		best->eax &= ~(1 << KVM_FEATURE_PV_UNHALT); -	/* -	 * save the feature bitmap to avoid cpuid lookup for every PV -	 * operation -	 */ -	if (best) -		vcpu->arch.pv_cpuid.features = best->eax; -  	if (!kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT)) {  		best = kvm_find_cpuid_entry(vcpu, 0x1, 0);  		if (best) @@ -162,6 +169,8 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)  		vcpu->arch.guest_supported_xcr0 =  			(best->eax | ((u64)best->edx << 32)) & supported_xcr0; +	kvm_update_pv_runtime(vcpu); +  	vcpu->arch.maxphyaddr = cpuid_query_maxphyaddr(vcpu);  	kvm_mmu_reset_context(vcpu); @@ -169,6 +178,8 @@ static void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)  	vcpu->arch.cr4_guest_rsvd_bits =  	    __cr4_reserved_bits(guest_cpuid_has, vcpu); +	vcpu->arch.cr3_lm_rsvd_bits = rsvd_bits(cpuid_maxphyaddr(vcpu), 63); +  	/* Invoke the vendor callback only after the above state is updated. */  	kvm_x86_ops.vcpu_after_set_cpuid(vcpu);  } @@ -672,7 +683,9 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)  		edx.split.num_counters_fixed = min(cap.num_counters_fixed, MAX_FIXED_COUNTERS);  		edx.split.bit_width_fixed = cap.bit_width_fixed; -		edx.split.reserved = 0; +		edx.split.anythread_deprecated = 1; +		edx.split.reserved1 = 0; +		edx.split.reserved2 = 0;  		entry->eax = eax.full;  		entry->ebx = cap.events_mask; | 
