Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Dec 2010 16:16:39 +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: r216394 - in head/sys: amd64/amd64 i386/isa
Message-ID:  <201012121616.oBCGGdta051073@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun Dec 12 16:16:39 2010
New Revision: 216394
URL: http://svn.freebsd.org/changeset/base/216394

Log:
  In fpudna()/npxdna(), mark FPU context initialized and optionally
  mark user FPU context initialized, if current context is user context.
  It was reversed in r215865, by inadequate change of this code fragment
  to a call to fpuuserinited()/npxuserinited().
  
  The issue is only relevant for in-kernel users of FPU.
  
  Reported by:	Jan Henrik Sylvester <me janh de>, Mike Tancsa <mike sentex net>
  Tested by:	Mike Tancsa
  MFC after:	3 days

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	Sun Dec 12 13:04:30 2010	(r216393)
+++ head/sys/amd64/amd64/fpu.c	Sun Dec 12 16:16:39 2010	(r216394)
@@ -426,7 +426,9 @@ fpudna(void)
 		fxrstor(&fpu_initialstate);
 		if (pcb->pcb_initial_fpucw != __INITIAL_FPUCW__)
 			fldcw(pcb->pcb_initial_fpucw);
-		fpuuserinited(curthread);
+		pcb->pcb_flags |= PCB_FPUINITDONE;
+		if (PCB_USER_FPU(pcb))
+			pcb->pcb_flags |= PCB_USERFPUINITDONE;
 	} else
 		fxrstor(pcb->pcb_save);
 	critical_exit();

Modified: head/sys/i386/isa/npx.c
==============================================================================
--- head/sys/i386/isa/npx.c	Sun Dec 12 13:04:30 2010	(r216393)
+++ head/sys/i386/isa/npx.c	Sun Dec 12 16:16:39 2010	(r216394)
@@ -684,7 +684,9 @@ npxdna(void)
 		fpurstor(&npx_initialstate);
 		if (pcb->pcb_initial_npxcw != __INITIAL_NPXCW__)
 			fldcw(pcb->pcb_initial_npxcw);
-		npxuserinited(curthread);
+		pcb->pcb_flags |= PCB_NPXINITDONE;
+		if (PCB_USER_FPU(pcb))
+			pcb->pcb_flags |= PCB_NPXUSERINITDONE;
 	} else {
 		/*
 		 * The following fpurstor() may cause an IRQ13 when the



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012121616.oBCGGdta051073>