• Wanpeng Li's avatar
    KVM: VMX: Fix invalid guest state detection after task-switch emulation · f244deed
    Wanpeng Li authored
    This can be reproduced by EPT=1, unrestricted_guest=N, emulate_invalid_state=Y
    or EPT=0, the trace of kvm-unit-tests/taskswitch2.flat is like below, it tries
    to emulate invalid guest state task-switch:
    
    kvm_exit: reason TASK_SWITCH rip 0x0 info 40000058 0
    kvm_emulate_insn: 42000:0:0f 0b (0x2)
    kvm_emulate_insn: 42000:0:0f 0b (0x2) failed
    kvm_inj_exception: #UD (0x0)
    kvm_entry: vcpu 0
    kvm_exit: reason TASK_SWITCH rip 0x0 info 40000058 0
    kvm_emulate_insn: 42000:0:0f 0b (0x2)
    kvm_emulate_insn: 42000:0:0f 0b (0x2) failed
    kvm_inj_exception: #UD (0x0)
    ......................
    
    It appears that the task-switch emulation updates rflags (and vm86
    flag) only after the segments are loaded, causing vmx->emulation_required
    to be set, when in fact invalid guest state emulation is not needed.
    
    This patch fixes it by updating vmx->emulation_required after the
    rflags (and vm86 flag) is updated in task-switch emulation.
    
    Thanks Radim for moving the update to vmx__set_flags and adding Paolo's
    suggestion for the check.
    Suggested-by: default avatarNadav Amit <nadav.amit@gmail.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Cc: Nadav Amit <nadav.amit@gmail.com>
    Signed-off-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    f244deed
vmx.c 332 KB