]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
KVM: x86: Wrong operand size for far ret
authorNadav Amit <namit@cs.technion.ac.il>
Mon, 26 Jan 2015 07:32:22 +0000 (09:32 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 26 Jan 2015 11:14:25 +0000 (12:14 +0100)
Indeed, Intel SDM specifically states that for the RET instruction "In 64-bit
mode, the default operation size of this instruction is the stack-address size,
i.e. 64 bits."

However, experiments show this is not the case. Here is for example objdump of
small 64-bit asm:

  4004f1: ca 14 00              lret   $0x14
  4004f4: 48 cb                 lretq
  4004f6: 48 ca 14 00           lretq  $0x14

Therefore, remove the Stack flag from far-ret instructions.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/emulate.c

index aa272545402ecad0384bbb7db9686f13ca62e217..dd7100481aac9b03c5fc865d02343b1e724c0cf8 100644 (file)
@@ -4062,8 +4062,8 @@ static const struct opcode opcode_table[256] = {
        G(ByteOp, group11), G(0, group11),
        /* 0xC8 - 0xCF */
        I(Stack | SrcImmU16 | Src2ImmByte, em_enter), I(Stack, em_leave),
-       I(ImplicitOps | Stack | SrcImmU16, em_ret_far_imm),
-       I(ImplicitOps | Stack, em_ret_far),
+       I(ImplicitOps | SrcImmU16, em_ret_far_imm),
+       I(ImplicitOps, em_ret_far),
        D(ImplicitOps), DI(SrcImmByte, intn),
        D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret),
        /* 0xD0 - 0xD7 */