svn commit: r190426 - in head/sys: amd64/amd64 i386/isa

John Baldwin jhb at FreeBSD.org
Wed Mar 25 15:08:31 PDT 2009


Author: jhb
Date: Wed Mar 25 22:08:30 2009
New Revision: 190426
URL: http://svn.freebsd.org/changeset/base/190426

Log:
  Fix a few nits in the earlier changes to prevent local information leakage
  in AMD FPUs:
  - Do not clear the affected state in the case that the FPU registers for
    the thread that already owns the FPU are changed via fpu_setregs().  The
    only local information the thread would see is its own state in that
    case.
  - Fix a type mismatch for the dummy variable used in a "fld".  It accepts
    a float, not a double.
  
  Reviewed by:	bde
  Approved by:	so (cperciva)
  MFC after:	1 month

Modified:
  head/sys/amd64/amd64/fpu.c
  head/sys/i386/isa/npx.c

Modified: head/sys/amd64/amd64/fpu.c
==============================================================================
--- head/sys/amd64/amd64/fpu.c	Wed Mar 25 21:20:15 2009	(r190425)
+++ head/sys/amd64/amd64/fpu.c	Wed Mar 25 22:08:30 2009	(r190426)
@@ -480,7 +480,6 @@ fpusetregs(struct thread *td, struct sav
 
 	s = intr_disable();
 	if (td == PCPU_GET(fpcurthread)) {
-		fpu_clean_state();
 		fxrstor(addr);
 		intr_restore(s);
 	} else {
@@ -499,10 +498,10 @@ fpusetregs(struct thread *td, struct sav
  * In order to avoid leaking this information across processes, we clean
  * these values by performing a dummy load before executing fxrstor().
  */
-static	double	dummy_variable = 0.0;
 static void
 fpu_clean_state(void)
 {
+	static float dummy_variable = 0.0;
 	u_short status;
 
 	/*

Modified: head/sys/i386/isa/npx.c
==============================================================================
--- head/sys/i386/isa/npx.c	Wed Mar 25 21:20:15 2009	(r190425)
+++ head/sys/i386/isa/npx.c	Wed Mar 25 22:08:30 2009	(r190426)
@@ -794,6 +794,11 @@ npxdna(void)
 	PCPU_SET(fpcurthread, curthread);
 	pcb = PCPU_GET(curpcb);
 
+#ifdef CPU_ENABLE_SSE
+	if (cpu_fxsr)
+		fpu_clean_state();
+#endif
+
 	if ((pcb->pcb_flags & PCB_NPXINITDONE) == 0) {
 		/*
 		 * This is the first time this thread has used the FPU or
@@ -976,10 +981,10 @@ fpusave(addr)
  * In order to avoid leaking this information across processes, we clean
  * these values by performing a dummy load before executing fxrstor().
  */
-static	double	dummy_variable = 0.0;
 static void
 fpu_clean_state(void)
 {
+	static float dummy_variable = 0.0;
 	u_short status;
 
 	/*
@@ -1005,10 +1010,9 @@ fpurstor(addr)
 {
 
 #ifdef CPU_ENABLE_SSE
-	if (cpu_fxsr) {
-		fpu_clean_state();
+	if (cpu_fxsr)
 		fxrstor(addr);
-	} else
+	else
 #endif
 		frstor(addr);
 }


More information about the svn-src-all mailing list