summaryrefslogtreecommitdiff
path: root/i386/i386/trap.c
diff options
context:
space:
mode:
Diffstat (limited to 'i386/i386/trap.c')
-rw-r--r--i386/i386/trap.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/i386/i386/trap.c b/i386/i386/trap.c
index d3f61314..51c0f0a5 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;
@@ -557,10 +573,10 @@ int user_trap(struct i386_saved_state *regs)
void
i386_astintr(void)
{
- int mycpu = cpu_number();
-
(void) splsched(); /* block interrupts to check reasons */
#ifndef MACH_RING1
+ int mycpu = cpu_number();
+
if (need_ast[mycpu] & AST_I386_FP) {
/*
* AST was for delayed floating-point exception -