From owner-cvs-all@FreeBSD.ORG Sun May 28 07:41:39 2006 Return-Path: X-Original-To: cvs-all@FreeBSD.org Delivered-To: cvs-all@FreeBSD.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4512316BF21; Sun, 28 May 2006 07:25:18 +0000 (UTC) (envelope-from bde@zeta.org.au) Received: from mailout1.pacific.net.au (mailout1.pacific.net.au [61.8.0.84]) by mx1.FreeBSD.org (Postfix) with ESMTP id D848643D46; Sun, 28 May 2006 07:25:17 +0000 (GMT) (envelope-from bde@zeta.org.au) Received: from mailproxy2.pacific.net.au (mailproxy2.pacific.net.au [61.8.0.87]) by mailout1.pacific.net.au (Postfix) with ESMTP id AF60E328CDE; Sun, 28 May 2006 17:25:16 +1000 (EST) Received: from epsplex.bde.org (katana.zip.com.au [61.8.7.246]) by mailproxy2.pacific.net.au (8.13.4/8.13.4/Debian-3sarge1) with ESMTP id k4S7PEbe027476; Sun, 28 May 2006 17:25:15 +1000 Date: Sun, 28 May 2006 17:25:14 +1000 (EST) From: Bruce Evans X-X-Sender: bde@epsplex.bde.org To: David Xu In-Reply-To: <200605280440.k4S4ej96064322@repoman.freebsd.org> Message-ID: <20060528163018.F1344@epsplex.bde.org> References: <200605280440.k4S4ej96064322@repoman.freebsd.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed Cc: cvs-src@FreeBSD.org, src-committers@FreeBSD.org, cvs-all@FreeBSD.org Subject: Re: cvs commit: src/sys/i386/isa npx.c X-BeenThere: cvs-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: CVS commit messages for the entire tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 28 May 2006 07:41:57 -0000 On Sun, 28 May 2006, David Xu wrote: > davidxu 2006-05-28 04:40:45 UTC > > FreeBSD src repository > > Modified files: > sys/i386/isa npx.c > Log: > If parent thread never used FPU, the only work is to clear flag PCB_NPXINITDONE doesn't mean that a thread never used the FPU. It means that the FPU state is not the default. > PCB_NPXINITDONE for new thread and let trap code initialize it. > > Revision Changes Path > 1.168 +6 -1 src/sys/i386/isa/npx.c Why do so much? If PCB_NPXINITDONE is clear in the parent, then it is already clear in the child, since it has just been copied (the whole pcb has been copied). It doesn't take a function call to check if PCB_INITDONE is clear in the parent. cpu_fork() calls npxsave() to force the FPU state to the pcb so that it is automatically copied at no extra cost when the whole pcb is copied. This causes the entire FPU state to be inherited. Why is cpu_set_upcall() different? I the old difference was just an invalid "optimization" and the new difference is not good. POSIX requires fork() to duplicate the process _exactly_ except for some things not including any FPU or even integer state, and FreeBSD implements this except for clobbering a few integer registers. POSIX places fewer requirments on pthread_create() by listing things that are inherited and not requiring things not listed to be preserved; old versions of POSIX apparently didn't even require the FPU state to be preserved, but that was a bug and was fixed by aligning with SUS. Since there is considerable experience that duplicating the whole FPU state in fork() doesn't cause problems, I think it wouldn't cause problems in pthread_create() either. Anyway, POSIX must really mean that the whole FP environment must be inherited, so all that pthread_create() is permitted to do differently than fork() is scrubbing the data registers. Bruce