aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/kvm/vmx.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 30974c3efa45..25a650638305 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -2198,7 +2198,8 @@ static __init void nested_vmx_setup_ctls_msrs(void)
2198#else 2198#else
2199 nested_vmx_exit_ctls_high = 0; 2199 nested_vmx_exit_ctls_high = 0;
2200#endif 2200#endif
2201 nested_vmx_exit_ctls_high |= VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR; 2201 nested_vmx_exit_ctls_high |= (VM_EXIT_ALWAYSON_WITHOUT_TRUE_MSR |
2202 VM_EXIT_LOAD_IA32_EFER);
2202 2203
2203 /* entry controls */ 2204 /* entry controls */
2204 rdmsr(MSR_IA32_VMX_ENTRY_CTLS, 2205 rdmsr(MSR_IA32_VMX_ENTRY_CTLS,
@@ -2207,8 +2208,8 @@ static __init void nested_vmx_setup_ctls_msrs(void)
2207 nested_vmx_entry_ctls_low = VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; 2208 nested_vmx_entry_ctls_low = VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR;
2208 nested_vmx_entry_ctls_high &= 2209 nested_vmx_entry_ctls_high &=
2209 VM_ENTRY_LOAD_IA32_PAT | VM_ENTRY_IA32E_MODE; 2210 VM_ENTRY_LOAD_IA32_PAT | VM_ENTRY_IA32E_MODE;
2210 nested_vmx_entry_ctls_high |= VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR; 2211 nested_vmx_entry_ctls_high |= (VM_ENTRY_ALWAYSON_WITHOUT_TRUE_MSR |
2211 2212 VM_ENTRY_LOAD_IA32_EFER);
2212 /* cpu-based controls */ 2213 /* cpu-based controls */
2213 rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, 2214 rdmsr(MSR_IA32_VMX_PROCBASED_CTLS,
2214 nested_vmx_procbased_ctls_low, nested_vmx_procbased_ctls_high); 2215 nested_vmx_procbased_ctls_low, nested_vmx_procbased_ctls_high);
@@ -7529,10 +7530,18 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
7529 vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask; 7530 vcpu->arch.cr0_guest_owned_bits &= ~vmcs12->cr0_guest_host_mask;
7530 vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits); 7531 vmcs_writel(CR0_GUEST_HOST_MASK, ~vcpu->arch.cr0_guest_owned_bits);
7531 7532
7532 /* Note: IA32_MODE, LOAD_IA32_EFER are modified by vmx_set_efer below */ 7533 /* L2->L1 exit controls are emulated - the hardware exit is to L0 so
7533 vmcs_write32(VM_EXIT_CONTROLS, 7534 * we should use its exit controls. Note that VM_EXIT_LOAD_IA32_EFER
7534 vmcs12->vm_exit_controls | vmcs_config.vmexit_ctrl); 7535 * bits are further modified by vmx_set_efer() below.
7535 vmcs_write32(VM_ENTRY_CONTROLS, vmcs12->vm_entry_controls | 7536 */
7537 vmcs_write32(VM_EXIT_CONTROLS, vmcs_config.vmexit_ctrl);
7538
7539 /* vmcs12's VM_ENTRY_LOAD_IA32_EFER and VM_ENTRY_IA32E_MODE are
7540 * emulated by vmx_set_efer(), below.
7541 */
7542 vmcs_write32(VM_ENTRY_CONTROLS,
7543 (vmcs12->vm_entry_controls & ~VM_ENTRY_LOAD_IA32_EFER &
7544 ~VM_ENTRY_IA32E_MODE) |
7536 (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE)); 7545 (vmcs_config.vmentry_ctrl & ~VM_ENTRY_IA32E_MODE));
7537 7546
7538 if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT) 7547 if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT)