Re: Intel floating-point initialization

Xavier Leroy (Xavier.Leroy@inria.fr)
Tue, 19 May 1998 10:14:52 +0200


In 2.1.102, floating-point initialization in arch/i386/kernel/process.c,
function copy_thread, has been changed to the following:

/*
* This tried to copy the FPU state, but I wonder whether we really
* want this at all. It is probably nicer to just have a newly started
* process start with a clean slate wrt the fpu. - Linus
*/
#if 1
current->used_math = 0;
current->flags &= ~PF_USEDFPU;
#else
if (last_task_used_math == current)
__asm__("clts ; fnsave %0 ; frstor %0":"=m" (p->tss.i387));
#endif

I beg to disagree with Linus. The parent process/thread may have set
the FPU control word to a non-default value (i.e. change rounding
modes, etc). The programmer legitimely expects the child process to
inherit those settings (just like it inherits pretty much everything
else from its parent).

So, it is not correct to reinitialize the FPU in the new process.
At least the FPU control word should be copied from the parent process.
Let's just copy the whole FPU state as the original code meant to do,
and fix it so that it works correctly on an SMP machine as well:

#ifdef __SMP__
if (current->flags & PF_USEDFPU)
#else
if (last_task_used_math == current)
#endif
__asm__("clts ; fnsave %0 ; frstor %0":"=m" (p->tss.i387));

- Xavier Leroy

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu