> > if (current->used_math) { /* Using the FPU again.
*/
> > lazy_fpu_switch(last_task_used_math);
> > } else { /* First time FPU user.
*/
> > init_fpu();
> > current->used_math = 1;
> > }
> > last_task_used_math = current;
> >
...
> > BTW, do I see another bug here in do_cpu()? It seems that before we
call
> > init_fpu(), we should check last_task_used_math. If it is not NULL, we
should
> > save the FP state to the last_task_used_math. Hmm, strange ...
>
> I thought I got all of these... <sigh>
Looks like that should be:
} else {
if (last_task_used_math != NULL)
save_fp(last_task_used_math);
init_fpu()
current->used_math = 1;
}
And things will be OK. What's wierd is that I could have sworn
that I looked at this code long ago, and that there was a save
there. But even in the 2.2.12-based tree, there is none.
It's quite late here in France. If one (or more) of you guys could
sketch a code fragment that would copy FP context back and
forth between a thread structure and a sigcontext without passing
through the FPU while I'm sleeping, I'll put together an integrated
patch tomorrow.
Regards,
Kevin K.
|