diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2012-03-19 05:23:12 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-03-28 16:50:05 +0100 |
commit | e3460f05cbe141073e62c24afe5e3a8f99c05ed4 (patch) | |
tree | 313a731d28871e59bdaee032599e860034dea2c9 /i386 | |
parent | 71c43b24e0cfb1efab2519a97fbf74d677cc36c5 (diff) | |
download | gnumach-e3460f05cbe141073e62c24afe5e3a8f99c05ed4.tar.gz gnumach-e3460f05cbe141073e62c24afe5e3a8f99c05ed4.tar.bz2 gnumach-e3460f05cbe141073e62c24afe5e3a8f99c05ed4.zip |
trap.c: Add 32bit lcall 7 emulation on 64bit
* i386/i386/trap.c: Detect lcall 7 instructions.
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386/trap.c | 16 |
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; |