aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/x86_emulate.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2007-11-26 16:46:22 +0000
committerKeir Fraser <keir.fraser@citrix.com>2007-11-26 16:46:22 +0000
commitedfee9bba50f0963be0497b05435f5f61d19ec9b (patch)
tree1ceaa939adb37fe6e994946a4a9e119682232055 /xen/arch/x86/x86_emulate.c
parentdbccb328c8a573703fdffdfb35323fe11b086b64 (diff)
downloadxen-edfee9bba50f0963be0497b05435f5f61d19ec9b.tar.gz
xen-edfee9bba50f0963be0497b05435f5f61d19ec9b.tar.bz2
xen-edfee9bba50f0963be0497b05435f5f61d19ec9b.zip
x86_emulate: Emulate RETF and RETF imm16.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
Diffstat (limited to 'xen/arch/x86/x86_emulate.c')
-rw-r--r--xen/arch/x86/x86_emulate.c17
1 files changed, 16 insertions, 1 deletions
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;