On Mon, 10 Mar 2003 11:25:55 -0800 (PST), Linus Torvalds wrote:
>We could _probably_ do it on x86 too. The standard C calling convention on
>x86 says FPU register state is clobbered, if I remember correctly.
>However, some of the state is "long-term", like rounding modes, exception
>masking etc, and even if we didn't save the register state we would have
>to save that part.
...
>As it was, the x86 state was pretty much random after fork(), and that can
>definitely lead to problems for real programs if they depend on things
>like silent underflow etc.
Do you mean x87 control or the x87 stack here?
>(Now, in _practice_ all processes on the machine tends to use the same
>rounding and exception control, so the "random" state wasn't actually very
>random, and would not lead to problems. It's a security issue, though).
Sorry for being dense, but can you clarify: will current 2.{2,4,5}
kernels preserve or destroy the parent process' FPU control at fork()?
We're using unmasked FPU exceptions on x86 (and Solaris/SPARC) in the
runtime system for the Erlang telecom systems programming language.
This gives a noticeable performance improvement, but it relies on
the FPU control not changing beneath it: the FPU control is only
initialised at startup and when SIGFPU has occurred.
/Mikael
On Tue, 11 Mar 2003, Mikael Pettersson wrote:
> On Mon, 10 Mar 2003 11:25:55 -0800 (PST), Linus Torvalds wrote:
> ...
> >As it was, the x86 state was pretty much random after fork(), and that can
> >definitely lead to problems for real programs if they depend on things
> >like silent underflow etc.
>
> Do you mean x87 control or the x87 stack here?
everything was random - the child would (if the fork() happened while the
parent had a lazy pending x87 state) get a random state from somebody
else.
HOWEVER: this only happens if the fork() actually has pending state on
that CPU, which is often not the case (if it has slept at all since the
last x87 op, or has been timesliced away etc, it won't have any pending
state on the CPU).
> >(Now, in _practice_ all processes on the machine tends to use the same
> >rounding and exception control, so the "random" state wasn't actually very
> >random, and would not lead to problems. It's a security issue, though).
>
> Sorry for being dense, but can you clarify: will current 2.{2,4,5}
> kernels preserve or destroy the parent process' FPU control at fork()?
They're guaranteed to preserve the control state (it has to: you can't
just change the exception mask over a function call). However, that was
buggy at least in 2.5.x, and very possibly in 2.4.x too - haven't checked.
And since preserving the exception mask basically implies doing the whole
fxsave/fxrestor thing, in practice _everything_ is saved over fork() into
the child.
Linus
Linus Torvalds writes:
> > Sorry for being dense, but can you clarify: will current 2.{2,4,5}
> > kernels preserve or destroy the parent process' FPU control at fork()?
>
> They're guaranteed to preserve the control state (it has to: you can't
> just change the exception mask over a function call). However, that was
> buggy at least in 2.5.x, and very possibly in 2.4.x too - haven't checked.
Thanks. Our use of unmasked FPU exceptions should be safe then, unless
2.4 also has the bug you fixed in 2.5.
/Mikael