cvs commit: src/sys/i386/isa npx.c

Bruce Evans bde at
Sun May 28 00:41:57 PDT 2006

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


More information about the cvs-src mailing list