mirror of https://gitee.com/openkylin/linux.git
KVM: nVMX: Sync unsync'd vmcs02 state to vmcs12 on migration
Even when we are outside the nested guest, some vmcs02 fields
may not be in sync vs vmcs12. This is intentional, even across
nested VM-exit, because the sync can be delayed until the nested
hypervisor performs a VMCLEAR or a VMREAD/VMWRITE that affects those
rarely accessed fields.
However, during KVM_GET_NESTED_STATE, the vmcs12 has to be up to date to
be able to restore it. To fix that, call copy_vmcs02_to_vmcs12_rare()
before the vmcs12 contents are copied to userspace.
Fixes: 7952d769c2
("KVM: nVMX: Sync rarely accessed guest fields only when needed")
Reviewed-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Message-Id: <20210114205449.8715-2-mlevitsk@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d95df95106
commit
d51e1d3f6b
|
@ -6077,11 +6077,14 @@ static int vmx_get_nested_state(struct kvm_vcpu *vcpu,
|
||||||
if (is_guest_mode(vcpu)) {
|
if (is_guest_mode(vcpu)) {
|
||||||
sync_vmcs02_to_vmcs12(vcpu, vmcs12);
|
sync_vmcs02_to_vmcs12(vcpu, vmcs12);
|
||||||
sync_vmcs02_to_vmcs12_rare(vcpu, vmcs12);
|
sync_vmcs02_to_vmcs12_rare(vcpu, vmcs12);
|
||||||
} else if (!vmx->nested.need_vmcs12_to_shadow_sync) {
|
} else {
|
||||||
if (vmx->nested.hv_evmcs)
|
copy_vmcs02_to_vmcs12_rare(vcpu, get_vmcs12(vcpu));
|
||||||
copy_enlightened_to_vmcs12(vmx);
|
if (!vmx->nested.need_vmcs12_to_shadow_sync) {
|
||||||
else if (enable_shadow_vmcs)
|
if (vmx->nested.hv_evmcs)
|
||||||
copy_shadow_to_vmcs12(vmx);
|
copy_enlightened_to_vmcs12(vmx);
|
||||||
|
else if (enable_shadow_vmcs)
|
||||||
|
copy_shadow_to_vmcs12(vmx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BUILD_BUG_ON(sizeof(user_vmx_nested_state->vmcs12) < VMCS12_SIZE);
|
BUILD_BUG_ON(sizeof(user_vmx_nested_state->vmcs12) < VMCS12_SIZE);
|
||||||
|
|
Loading…
Reference in New Issue