summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-03-19 05:23:12 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-03-28 16:50:05 +0100
commite3460f05cbe141073e62c24afe5e3a8f99c05ed4 (patch)
tree313a731d28871e59bdaee032599e860034dea2c9
parent71c43b24e0cfb1efab2519a97fbf74d677cc36c5 (diff)
trap.c: Add 32bit lcall 7 emulation on 64bit
* i386/i386/trap.c: Detect lcall 7 instructions.
-rw-r--r--i386/i386/trap.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/i386/i386/trap.c b/i386/i386/trap.c
index d3f61314..281594d5 100644
--- a/i386/i386/trap.c
+++ b/i386/i386/trap.c
@@ -471,6 +471,22 @@ int user_trap(struct i386_saved_state *regs)
return 1;
}
}
+#ifdef __x86_64__
+ {
+ unsigned char opcode, addr[4], seg[2];
+ int i;
+
+ opcode = inst_fetch(regs->eip, regs->cs);
+ for (i = 0; i < 4; i++)
+ addr[i] = inst_fetch(regs->eip+i+1, regs->cs);
+ for (i = 0; i < 2; i++)
+ seg[i] = inst_fetch(regs->eip+i+5, regs->cs);
+ if (opcode == 0x9a && seg[0] == 0x7 && seg[1] == 0) {
+ regs->eip += 7;
+ return 1;
+ }
+ }
+#endif
exc = EXC_BAD_INSTRUCTION;
code = EXC_I386_GPFLT;
subcode = regs->err & 0xffff;