KVM: x86: Processor mode may be determined incorrectly
authorNadav Amit <namit@cs.technion.ac.il>
Fri, 18 Apr 2014 04:11:34 +0000 (07:11 +0300)
committerMarcelo Tosatti <mtosatti@redhat.com>
Wed, 23 Apr 2014 20:47:00 +0000 (17:47 -0300)
If EFER.LMA is off, cs.l does not determine execution mode.
Currently, the emulation engine assumes differently.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/x86.c

index e4ccc6cf41089109b48eb028959f829cdaabb021..7cc646626afd78f72b76a5e226d5bacb69228eb0 100644 (file)
@@ -4888,7 +4888,7 @@ static void init_emulate_ctxt(struct kvm_vcpu *vcpu)
        ctxt->eip = kvm_rip_read(vcpu);
        ctxt->mode = (!is_protmode(vcpu))               ? X86EMUL_MODE_REAL :
                     (ctxt->eflags & X86_EFLAGS_VM)     ? X86EMUL_MODE_VM86 :
-                    cs_l                               ? X86EMUL_MODE_PROT64 :
+                    (cs_l && is_long_mode(vcpu))       ? X86EMUL_MODE_PROT64 :
                     cs_db                              ? X86EMUL_MODE_PROT32 :
                                                          X86EMUL_MODE_PROT16;
        ctxt->guest_mode = is_guest_mode(vcpu);