diff options
author | kib <kib@FreeBSD.org> | 2012-07-21 21:49:05 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2012-07-21 21:49:05 +0000 |
commit | 7925edc16eae8c1b2933c3bb83e9005b8c8f18fa (patch) | |
tree | 9a3e80d389e7bb3c00b58f8330b31203d8f1ff46 | |
parent | 6f4572bd6d49ef538ad4214d1404ae8cc4b84a06 (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/i386/isa/npx.c | 29 |
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)]); } |