Date: Sun, 21 Sep 2014 09:06:50 +0000 (UTC) From: Konstantin Belousov <kib@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r271924 - head/sys/amd64/amd64 Message-ID: <201409210906.s8L96ocK063432@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kib Date: Sun Sep 21 09:06:50 2014 New Revision: 271924 URL: http://svnweb.freebsd.org/changeset/base/271924 Log: 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 Modified: head/sys/amd64/amd64/fpu.c head/sys/amd64/amd64/trap.c Modified: head/sys/amd64/amd64/fpu.c ============================================================================== --- head/sys/amd64/amd64/fpu.c Sun Sep 21 07:16:51 2014 (r271923) +++ head/sys/amd64/amd64/fpu.c Sun Sep 21 09:06:50 2014 (r271924) @@ -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; Modified: head/sys/amd64/amd64/trap.c ============================================================================== --- head/sys/amd64/amd64/trap.c Sun Sep 21 07:16:51 2014 (r271923) +++ head/sys/amd64/amd64/trap.c Sun Sep 21 09:06:50 2014 (r271924) @@ -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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201409210906.s8L96ocK063432>