KVM: nVMX: initialize PML fields in vmcs02
authorLadi Prosek <lprosek@redhat.com>
Tue, 4 Apr 2017 12:18:53 +0000 (14:18 +0200)
committerSasha Levin <alexander.levin@verizon.com>
Tue, 13 Jun 2017 13:29:19 +0000 (09:29 -0400)
[ Upstream commit 1fb883bb827ee8efc1cc9ea0154f953f8a219d38 ]

L2 was running with uninitialized PML fields which led to incomplete
dirty bitmap logging. This manifested as all kinds of subtle erratic
behavior of the nested guest.

Fixes: 843e4330573c ("KVM: VMX: Add PML support in VMX")
Signed-off-by: Ladi Prosek <lprosek@redhat.com>
Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
arch/x86/kvm/vmx.c

index c1534af627fb62f589c8655feb723f9ab3724de2..99a15e38fa06bc93540fa539d526dcc3056fc7f6 100644 (file)
@@ -9345,6 +9345,18 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
                vmx_flush_tlb(vcpu);
        }
 
+       if (enable_pml) {
+               /*
+                * Conceptually we want to copy the PML address and index from
+                * vmcs01 here, and then back to vmcs01 on nested vmexit. But,
+                * since we always flush the log on each vmexit, this happens
+                * to be equivalent to simply resetting the fields in vmcs02.
+                */
+               ASSERT(vmx->pml_pg);
+               vmcs_write64(PML_ADDRESS, page_to_phys(vmx->pml_pg));
+               vmcs_write16(GUEST_PML_INDEX, PML_ENTITY_NUM - 1);
+       }
+
        if (nested_cpu_has_ept(vmcs12)) {
                kvm_mmu_unload(vcpu);
                nested_ept_init_mmu_context(vcpu);