MFamd64 r238668:

Stop clearing x87 exceptions in the #MF handler.

Requested by:	bde
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2012-07-21 21:49:05 +00:00
parent 4596f12de7
commit dad46c5594
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=238677

View File

@ -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)]);
}