diff options
author | Xiao Guangrong <guangrong.xiao@linux.intel.com> | 2015-09-09 02:05:55 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-10-01 09:06:39 -0400 |
commit | feda805fe7c4ed9cf78158e73b1218752e3b4314 (patch) | |
tree | 3a2e54ee326b32f3fa76e7fc030491f44f3ae2b9 | |
parent | 8b97265a1516819d54c2d24b3874489a52f269d4 (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.c | 35 |
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 | ||
8671 | static 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 | |||
8671 | static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | 8690 | static 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 |= |