It is known that some kvm's users (e.g. qemu) load part of L2's register state prior to setting the nested state after a migration. If a 32 bit L2 guest is running in a 64 bit L1 guest, and nested migration happens, Qemu will restore L2's EFER, and then the nested state load function will use it as if it was L1's EFER. Signed-off-by: Maxim Levitsky <mlevitsk@xxxxxxxxxx> --- arch/x86/kvm/vmx/nested.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 49ae96c0cc4d1..28e270824e5b1 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -6404,6 +6404,17 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu, kvm_state->hdr.vmx.preemption_timer_deadline; } + /* + * The vcpu might currently contain L2's IA32_EFER, due to the way + * some userspace kvm users (e.g qemu) restore nested state. + * + * To fix this, restore its IA32_EFER to the value it would have + * after VM exit from the nested guest. + * + */ + + vcpu->arch.efer = nested_vmx_get_vmcs12_host_efer(vcpu, vmcs12); + if (nested_vmx_check_controls(vcpu, vmcs12) || nested_vmx_check_host_state(vcpu, vmcs12) || nested_vmx_check_guest_state(vcpu, vmcs12, &ignored)) -- 2.26.3