kvm: nVMX: Refactor handle_vmptrld()
authorJim Mattson <jmattson@google.com>
Wed, 30 Nov 2016 20:03:44 +0000 (12:03 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 15 Feb 2017 13:54:37 +0000 (14:54 +0100)
Handle_vmptrld is split into two parts: the part that handles the
VMPTRLD instruction, and the part that establishes the current VMCS
pointer.  The latter will be used when restoring the checkpointed state
of a vCPU that had a valid VMCS pointer when a snapshot was taken.

Signed-off-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx.c

index 33cb8d2..ef9affc 100644 (file)
@@ -7678,6 +7678,18 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu)
        return kvm_skip_emulated_instruction(vcpu);
 }
 
+static void set_current_vmptr(struct vcpu_vmx *vmx, gpa_t vmptr)
+{
+       vmx->nested.current_vmptr = vmptr;
+       if (enable_shadow_vmcs) {
+               vmcs_set_bits(SECONDARY_VM_EXEC_CONTROL,
+                             SECONDARY_EXEC_SHADOW_VMCS);
+               vmcs_write64(VMCS_LINK_POINTER,
+                            __pa(vmx->vmcs01.shadow_vmcs));
+               vmx->nested.sync_shadow_vmcs = true;
+       }
+}
+
 /* Emulate the VMPTRLD instruction */
 static int handle_vmptrld(struct kvm_vcpu *vcpu)
 {
@@ -7708,7 +7720,6 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu)
                }
 
                nested_release_vmcs12(vmx);
-               vmx->nested.current_vmptr = vmptr;
                vmx->nested.current_vmcs12 = new_vmcs12;
                vmx->nested.current_vmcs12_page = page;
                /*
@@ -7717,14 +7728,7 @@ static int handle_vmptrld(struct kvm_vcpu *vcpu)
                 */
                memcpy(vmx->nested.cached_vmcs12,
                       vmx->nested.current_vmcs12, VMCS12_SIZE);
-
-               if (enable_shadow_vmcs) {
-                       vmcs_set_bits(SECONDARY_VM_EXEC_CONTROL,
-                                     SECONDARY_EXEC_SHADOW_VMCS);
-                       vmcs_write64(VMCS_LINK_POINTER,
-                                    __pa(vmx->vmcs01.shadow_vmcs));
-                       vmx->nested.sync_shadow_vmcs = true;
-               }
+               set_current_vmptr(vmx, vmptr);
        }
 
        nested_vmx_succeed(vcpu);