From: Ladi Prosek Date: Thu, 23 Mar 2017 06:18:08 +0000 (+0100) Subject: KVM: nVMX: fix nested EPT detection X-Git-Tag: v4.1.12-111.0.20170907_2225~98^2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=4289a203187142446b58cf2ef4c2aa0cbaba15b1;p=users%2Fjedix%2Flinux-maple.git KVM: nVMX: fix nested EPT detection The nested_ept_enabled flag introduced in commit 7ca29de2136 was not computed correctly. We are interested only in L1's EPT state, not the the combined L0+L1 value. In particular, if L0 uses EPT but L1 does not, nested_ept_enabled must be false to make sure that PDPSTRs are loaded based on CR3 as usual, because the special case described in 26.3.2.4 Loading Page-Directory- Pointer-Table Entries does not apply. Fixes: 7ca29de21362 ("KVM: nVMX: fix CR3 load if L2 uses PAE paging and EPT") Cc: qemu-stable@nongnu.org Reported-by: Wanpeng Li Reviewed-by: David Hildenbrand Signed-off-by: Ladi Prosek Signed-off-by: Paolo Bonzini (cherry picked from commit 7ad658b693536741c37b16aeb07840a2ce75f5b9) OraBug: 26628813 KVM: nVMX: fix CR3 load if L2 uses PAE paging and EPT - backport+regression fix Signed-off-by: Krish Sadhukhan Reviewed-by: Jack Vogel Tested-by: Eyal Moscovici Tested-by: Chris Kenna Acked-by: Konrad Wilk --- diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 21492d6d85efd..88dad40c19fe1 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c @@ -9133,7 +9133,6 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, { struct vcpu_vmx *vmx = to_vmx(vcpu); u32 exec_control; - bool nested_ept_enabled = false; vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector); vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector); @@ -9294,7 +9293,6 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, vmcs12->guest_intr_status); } - nested_ept_enabled = (exec_control & SECONDARY_EXEC_ENABLE_EPT) != 0; vmcs_write32(SECONDARY_VM_EXEC_CONTROL, exec_control); } @@ -9423,7 +9421,7 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, vmcs_writel(CR4_READ_SHADOW, nested_read_cr4(vmcs12)); /* Shadow page tables on either EPT or shadow page tables. */ - if (nested_vmx_load_cr3(vcpu, vmcs12->guest_cr3, nested_ept_enabled, + if (nested_vmx_load_cr3(vcpu, vmcs12->guest_cr3, nested_cpu_has_ept(vmcs12), entry_failure_code)) return 1;