kvm: nVMX: Refactor handle_vmptrld()
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>
This commit is contained in:
parent
e29acc55bf
commit
a8bc284eb7
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue