From edfee9bba50f0963be0497b05435f5f61d19ec9b Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 26 Nov 2007 16:46:22 +0000 Subject: [PATCH] x86_emulate: Emulate RETF and RETF imm16. Signed-off-by: Keir Fraser --- xen/arch/x86/x86_emulate.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/x86_emulate.c b/xen/arch/x86/x86_emulate.c index d6d849c14d..1397732a7f 100644 --- a/xen/arch/x86/x86_emulate.c +++ b/xen/arch/x86/x86_emulate.c @@ -152,7 +152,8 @@ static uint8_t opcode_table[256] = { DstReg|SrcMem|ModRM|Mov, DstReg|SrcMem|ModRM|Mov, ByteOp|DstMem|SrcImm|ModRM|Mov, DstMem|SrcImm|ModRM|Mov, /* 0xC8 - 0xCF */ - 0, 0, 0, 0, ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, + 0, 0, ImplicitOps, ImplicitOps, + ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, /* 0xD0 - 0xD7 */ ByteOp|DstMem|SrcImplicit|ModRM, DstMem|SrcImplicit|ModRM, ByteOp|DstMem|SrcImplicit|ModRM, DstMem|SrcImplicit|ModRM, @@ -2262,6 +2263,20 @@ x86_emulate( break; } + case 0xca: /* ret imm16 (far) */ + case 0xcb: /* ret (far) */ { + int offset = (b == 0xca) ? insn_fetch_type(uint16_t) : 0; + op_bytes = mode_64bit() ? 8 : op_bytes; + if ( (rc = ops->read(x86_seg_ss, sp_post_inc(op_bytes), + &dst.val, op_bytes, ctxt)) || + (rc = ops->read(x86_seg_ss, sp_post_inc(op_bytes + offset), + &src.val, op_bytes, ctxt)) || + (rc = load_seg(x86_seg_cs, (uint16_t)src.val, ctxt, ops)) ) + goto done; + _regs.eip = dst.val; + break; + } + case 0xcc: /* int3 */ src.val = EXC_BP; goto swint; -- 2.30.2