svn commit: r271924 - head/sys/amd64/amd64

Konstantin Belousov kib at FreeBSD.org
Sun Sep 21 09:06:51 UTC 2014


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;


More information about the svn-src-all mailing list