From: Paolo Bonzini Date: Thu, 21 Nov 2019 09:01:51 +0000 (+0100) Subject: Merge branch 'kvm-tsx-ctrl' into HEAD X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=46f4f0aabc61bfd365e1eb3c8a6d766d1a49cf32;p=linux.git Merge branch 'kvm-tsx-ctrl' into HEAD Conflicts: arch/x86/kvm/vmx/vmx.c --- 46f4f0aabc61bfd365e1eb3c8a6d766d1a49cf32 diff --cc arch/x86/kvm/vmx/nested.h index b9e519840f280,6280f33e5fa60..fc874d4ead0f0 --- a/arch/x86/kvm/vmx/nested.h +++ b/arch/x86/kvm/vmx/nested.h @@@ -11,9 -21,10 +21,10 @@@ void nested_vmx_setup_ctls_msrs(struct bool apicv); void nested_vmx_hardware_unsetup(void); __init int nested_vmx_hardware_setup(int (*exit_handlers[])(struct kvm_vcpu *)); -void nested_vmx_vcpu_setup(void); +void nested_vmx_set_vmcs_shadowing_bitmap(void); void nested_vmx_free_vcpu(struct kvm_vcpu *vcpu); - int nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu, bool from_vmentry); + enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu, + bool from_vmentry); bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason); void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, u32 exit_intr_info, unsigned long exit_qualification); diff --cc arch/x86/kvm/vmx/vmx.c index 89253d60e23a2,813171bb802ae..d39475e2d44e8 --- a/arch/x86/kvm/vmx/vmx.c +++ b/arch/x86/kvm/vmx/vmx.c @@@ -6703,21 -6791,6 +6738,34 @@@ static struct kvm_vcpu *vmx_create_vcpu if (!vmx->guest_msrs) goto free_pml; + for (i = 0; i < ARRAY_SIZE(vmx_msr_index); ++i) { + u32 index = vmx_msr_index[i]; + u32 data_low, data_high; + int j = vmx->nmsrs; + + if (rdmsr_safe(index, &data_low, &data_high) < 0) + continue; + if (wrmsr_safe(index, data_low, data_high) < 0) + continue; ++ + vmx->guest_msrs[j].index = i; + vmx->guest_msrs[j].data = 0; - vmx->guest_msrs[j].mask = -1ull; ++ switch (index) { ++ case MSR_IA32_TSX_CTRL: ++ /* ++ * No need to pass TSX_CTRL_CPUID_CLEAR through, so ++ * let's avoid changing CPUID bits under the host ++ * kernel's feet. ++ */ ++ vmx->guest_msrs[j].mask = ~(u64)TSX_CTRL_CPUID_CLEAR; ++ break; ++ default: ++ vmx->guest_msrs[j].mask = -1ull; ++ break; ++ } + ++vmx->nmsrs; + } + err = alloc_loaded_vmcs(&vmx->vmcs01); if (err < 0) goto free_msrs;