summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-07-21 21:49:05 +0000
committerkib <kib@FreeBSD.org>2012-07-21 21:49:05 +0000
commit7925edc16eae8c1b2933c3bb83e9005b8c8f18fa (patch)
tree9a3e80d389e7bb3c00b58f8330b31203d8f1ff46 /sys/i386/isa
parent6f4572bd6d49ef538ad4214d1404ae8cc4b84a06 (diff)
downloadFreeBSD-src-7925edc16eae8c1b2933c3bb83e9005b8c8f18fa.zip
FreeBSD-src-7925edc16eae8c1b2933c3bb83e9005b8c8f18fa.tar.gz
MFamd64 r238668:
Stop clearing x87 exceptions in the #MF handler. Requested by: bde MFC after: 1 week
Diffstat (limited to 'sys/i386/isa')
-rw-r--r--sys/i386/isa/npx.c29
1 files changed, 13 insertions, 16 deletions
diff --git a/sys/i386/isa/npx.c b/sys/i386/isa/npx.c
index 913cee9..4e61ad2 100644
--- a/sys/i386/isa/npx.c
+++ b/sys/i386/isa/npx.c
@@ -583,21 +583,21 @@ static char fpetable[128] = {
};
/*
- * Preserve the FP status word, clear FP exceptions, then generate a SIGFPE.
+ * Read the FP status and control words, then generate si_code value
+ * for SIGFPE. The error code chosen will be one of the
+ * FPE_... macros. It will be sent as the second argument to old
+ * BSD-style signal handlers and as "siginfo_t->si_code" (second
+ * argument) to SA_SIGINFO signal handlers.
*
- * Clearing exceptions is necessary mainly to avoid IRQ13 bugs. We now
- * depend on longjmp() restoring a usable state. Restoring the state
- * or examining it might fail if we didn't clear exceptions.
+ * Some time ago, we cleared the x87 exceptions with FNCLEX there.
+ * Clearing exceptions was necessary mainly to avoid IRQ13 bugs. The
+ * usermode code which understands the FPU hardware enough to enable
+ * the exceptions, can also handle clearing the exception state in the
+ * handler. The only consequence of not clearing the exception is the
+ * rethrow of the SIGFPE on return from the signal handler and
+ * reexecution of the corresponding instruction.
*
- * The error code chosen will be one of the FPE_... macros. It will be
- * sent as the second argument to old BSD-style signal handlers and as
- * "siginfo_t->si_code" (second argument) to SA_SIGINFO signal handlers.
- *
- * XXX the FP state is not preserved across signal handlers. So signal
- * handlers cannot afford to do FP unless they preserve the state or
- * longjmp() out. Both preserving the state and longjmp()ing may be
- * destroyed by IRQ13 bugs. Clearing FP exceptions is not an acceptable
- * solution for signals other than SIGFPE.
+ * For XMM traps, the exceptions were never cleared.
*/
int
npxtrap()
@@ -623,9 +623,6 @@ npxtrap()
fnstcw(&control);
fnstsw(&status);
}
-
- if (PCPU_GET(fpcurthread) == curthread)
- fnclex();
critical_exit();
return (fpetable[status & ((~control & 0x3f) | 0x40)]);
}
OpenPOWER on IntegriCloud