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:
parent
9f21b0b8b2
commit
060cd4d500
@ -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;
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user