Blob Blame History Raw
From: Jim Mattson <jmattson@google.com>
Date: Wed, 15 Mar 2017 07:40:55 -0700
Subject: kvm: nVMX: Set VM instruction error for VMPTRLD of unbacked page
Git-commit: fca91f6d60b6ee53b8d43c8ad5bad153a758961c
Patch-mainline: v5.0-rc1
References: bsc#1129293

It is never correct for a VMX instruction to fail with "invalid VMCS"
if there is, in fact, a current VMCS. Reads from unbacked addresses
return all 1's, which means that an unbacked VMCS will not have the
correct VMCS revision ID (i.e. VMCS12_REVISION).

Fixes: 63846663eac78 ("KVM: nVMX: Implement VMPTRLD")
Signed-off-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Joerg Roedel <jroedel@suse.de>
---
 arch/x86/kvm/vmx.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -8043,7 +8043,14 @@ static int handle_vmptrld(struct kvm_vcp
 		struct page *page;
 		page = kvm_vcpu_gpa_to_page(vcpu, vmptr);
 		if (is_error_page(page)) {
-			nested_vmx_failInvalid(vcpu);
+			/*
+			 * Reads from an unbacked page return all 1s,
+			 * which means that the 32 bits located at the
+			 * given physical address won't match the required
+			 * VMCS12_REVISION identifier.
+			 */
+			nested_vmx_failValid(vcpu,
+				VMXERR_VMPTRLD_INCORRECT_VMCS_REVISION_ID);
 			return kvm_skip_emulated_instruction(vcpu);
 		}
 		new_vmcs12 = kmap(page);