]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
kvm: nVMX: Set VM instruction error for VMPTRLD of unbacked page
authorJim Mattson <jmattson@google.com>
Wed, 15 Mar 2017 14:40:55 +0000 (07:40 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 27 Nov 2018 11:55:46 +0000 (12:55 +0100)
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>
arch/x86/kvm/vmx.c

index d78fe0abf9ac1a54049b0520d1ba7a685ca5a3a7..c379d0bfdcba948651dbbebff284e87749b09455 100644 (file)
@@ -9318,9 +9318,17 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu)
                struct vmcs12 *new_vmcs12;
                struct page *page;
                page = kvm_vcpu_gpa_to_page(vcpu, vmptr);
-               if (is_error_page(page))
-                       return nested_vmx_failInvalid(vcpu);
-
+               if (is_error_page(page)) {
+                       /*
+                        * 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);
                if (new_vmcs12->hdr.revision_id != VMCS12_REVISION ||
                    (new_vmcs12->hdr.shadow_vmcs &&