aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiao Guangrong <guangrong.xiao@linux.intel.com>2015-09-09 02:05:55 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2015-10-01 09:06:39 -0400
commitfeda805fe7c4ed9cf78158e73b1218752e3b4314 (patch)
tree3a2e54ee326b32f3fa76e7fc030491f44f3ae2b9
parent8b97265a1516819d54c2d24b3874489a52f269d4 (diff)
KVM: VMX: unify SECONDARY_VM_EXEC_CONTROL update
Unify the update in vmx_cpuid_update() Signed-off-by: Xiao Guangrong <guangrong.xiao@linux.intel.com> [Rewrite to use vmcs_set_secondary_exec_control. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/vmx.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index dad471f8ca57..a7a0ed6906fe 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -8668,23 +8668,38 @@ static int vmx_get_lpage_level(void)
8668 return PT_PDPE_LEVEL; 8668 return PT_PDPE_LEVEL;
8669} 8669}
8670 8670
8671static void vmcs_set_secondary_exec_control(u32 new_ctl)
8672{
8673 /*
8674 * These bits in the secondary execution controls field
8675 * are dynamic, the others are mostly based on the hypervisor
8676 * architecture and the guest's CPUID. Do not touch the
8677 * dynamic bits.
8678 */
8679 u32 mask =
8680 SECONDARY_EXEC_SHADOW_VMCS |
8681 SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE |
8682 SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
8683
8684 u32 cur_ctl = vmcs_read32(SECONDARY_VM_EXEC_CONTROL);
8685
8686 vmcs_write32(SECONDARY_VM_EXEC_CONTROL,
8687 (new_ctl & ~mask) | (cur_ctl & mask));
8688}
8689
8671static void vmx_cpuid_update(struct kvm_vcpu *vcpu) 8690static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
8672{ 8691{
8673 struct kvm_cpuid_entry2 *best; 8692 struct kvm_cpuid_entry2 *best;
8674 struct vcpu_vmx *vmx = to_vmx(vcpu); 8693 struct vcpu_vmx *vmx = to_vmx(vcpu);
8675 u32 exec_control; 8694 u32 secondary_exec_ctl = vmx_secondary_exec_control(vmx);
8676 8695
8677 vmx->rdtscp_enabled = false; 8696 vmx->rdtscp_enabled = false;
8678 if (vmx_rdtscp_supported()) { 8697 if (vmx_rdtscp_supported()) {
8679 exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL);
8680 best = kvm_find_cpuid_entry(vcpu, 0x80000001, 0); 8698 best = kvm_find_cpuid_entry(vcpu, 0x80000001, 0);
8681 if (best && (best->edx & bit(X86_FEATURE_RDTSCP))) 8699 if (best && (best->edx & bit(X86_FEATURE_RDTSCP)))
8682 vmx->rdtscp_enabled = true; 8700 vmx->rdtscp_enabled = true;
8683 else { 8701 else
8684 exec_control &= ~SECONDARY_EXEC_RDTSCP; 8702 secondary_exec_ctl &= ~SECONDARY_EXEC_RDTSCP;
8685 vmcs_write32(SECONDARY_VM_EXEC_CONTROL,
8686 exec_control);
8687 }
8688 8703
8689 if (nested) { 8704 if (nested) {
8690 if (vmx->rdtscp_enabled) 8705 if (vmx->rdtscp_enabled)
@@ -8701,14 +8716,14 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
8701 if (vmx_invpcid_supported() && 8716 if (vmx_invpcid_supported() &&
8702 (!best || !(best->ebx & bit(X86_FEATURE_INVPCID)) || 8717 (!best || !(best->ebx & bit(X86_FEATURE_INVPCID)) ||
8703 !guest_cpuid_has_pcid(vcpu))) { 8718 !guest_cpuid_has_pcid(vcpu))) {
8704 exec_control = vmcs_read32(SECONDARY_VM_EXEC_CONTROL); 8719 secondary_exec_ctl &= ~SECONDARY_EXEC_ENABLE_INVPCID;
8705 exec_control &= ~SECONDARY_EXEC_ENABLE_INVPCID;
8706 vmcs_write32(SECONDARY_VM_EXEC_CONTROL, exec_control);
8707 8720
8708 if (best) 8721 if (best)
8709 best->ebx &= ~bit(X86_FEATURE_INVPCID); 8722 best->ebx &= ~bit(X86_FEATURE_INVPCID);
8710 } 8723 }
8711 8724
8725 vmcs_set_secondary_exec_control(secondary_exec_ctl);
8726
8712 if (static_cpu_has(X86_FEATURE_PCOMMIT) && nested) { 8727 if (static_cpu_has(X86_FEATURE_PCOMMIT) && nested) {
8713 if (guest_cpuid_has_pcommit(vcpu)) 8728 if (guest_cpuid_has_pcommit(vcpu))
8714 vmx->nested.nested_vmx_secondary_ctls_high |= 8729 vmx->nested.nested_vmx_secondary_ctls_high |=