Update and clarify comments. Remove the useless counter for impossible, but

seen in wild situation (on buggy hypervisors).

In collaboration with:	bde
MFC after:	1 week
This commit is contained in:
Konstantin Belousov 2014-09-21 09:06:50 +00:00
parent 9f21b0b8b2
commit 060cd4d500
2 changed files with 13 additions and 12 deletions

View File

@ -602,29 +602,30 @@ fputrap_sse(void)
return (fpetable[(mxcsr & (~mxcsr >> 7)) & 0x3f]);
}
static int err_count = 0;
/*
* Device Not Available (DNA, #NM) exception handler.
*
* It would be better to switch FP context here (if curthread !=
* fpcurthread) and not necessarily for every context switch, but it
* is too hard to access foreign pcb's.
*
* The handler is entered with interrupts enabled, which allows the
* context switch to happen before critical enter() is executed, and
* causes restoration of FPU context on CPU other than that caused
* DNA. It is fine, since context switch started emulation on the
* current CPU as well.
*/
void
fpudna(void)
{
/*
* This handler is entered with interrupts enabled, so context
* switches may occur before critical_enter() is executed. If
* a context switch occurs, then when we regain control, our
* state will have been completely restored. The CPU may
* change underneath us, but the only part of our context that
* lives in the CPU is CR0.TS and that will be "restored" by
* setting it on the new CPU.
*/
critical_enter();
if (PCPU_GET(fpcurthread) == curthread) {
printf("fpudna: fpcurthread == curthread %d times\n",
++err_count);
printf("fpudna: fpcurthread == curthread\n");
stop_emulating();
critical_exit();
return;

View File

@ -436,8 +436,8 @@ trap(struct trapframe *frame)
case T_XMMFLT: /* SIMD floating-point exception */
case T_FPOPFLT: /* FPU operand fetch fault */
/*
* XXXKIB for now disable any FPU traps in kernel
* handler registration seems to be overkill
* For now, supporting kernel handler
* registration for FPU traps is overkill.
*/
trap_fatal(frame, 0);
goto out;