forked from Minki/linux
KVM: x86: Wrong operand size for far ret
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>
This commit is contained in:
parent
2fcf5c8ae2
commit
16794aaaab
@ -4062,8 +4062,8 @@ static const struct opcode opcode_table[256] = {
|
|||||||
G(ByteOp, group11), G(0, group11),
|
G(ByteOp, group11), G(0, group11),
|
||||||
/* 0xC8 - 0xCF */
|
/* 0xC8 - 0xCF */
|
||||||
I(Stack | SrcImmU16 | Src2ImmByte, em_enter), I(Stack, em_leave),
|
I(Stack | SrcImmU16 | Src2ImmByte, em_enter), I(Stack, em_leave),
|
||||||
I(ImplicitOps | Stack | SrcImmU16, em_ret_far_imm),
|
I(ImplicitOps | SrcImmU16, em_ret_far_imm),
|
||||||
I(ImplicitOps | Stack, em_ret_far),
|
I(ImplicitOps, em_ret_far),
|
||||||
D(ImplicitOps), DI(SrcImmByte, intn),
|
D(ImplicitOps), DI(SrcImmByte, intn),
|
||||||
D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret),
|
D(ImplicitOps | No64), II(ImplicitOps, em_iret, iret),
|
||||||
/* 0xD0 - 0xD7 */
|
/* 0xD0 - 0xD7 */
|
||||||
|
Loading…
Reference in New Issue
Block a user