data corruption: gcc/powerpc implicit use of FP registers
Joel Sherrill <joel@OARcorp.com>
joel.sherrill at OARcorp.com
Tue Nov 1 23:28:28 UTC 2005
Till Straumann wrote:
> It seems that some versions of gcc (gcc-3.2, gcc-3.4 but not gcc-4.0.2)
> implicitely use floating-point registers, at least for 64bit data
> moves. This means that an integer-only task doing things like
>
> struct x { unsigned a,b; };
>
> void cpx(struct x *p1, struct x *p2)
> {
> *p1 = *p2;
> }
>
> may suffer from corruption by a FP task being scheduled while the
> copy is in process.
>
> There is an old thread (10/2002) on the gcc mailing list discussing
> a '-no-implicit-fp' option which, however, was never adopted.
>
> Joel had posted that RTEMS/PPC [as a workaround] implicitely treats
> all tasks as FP but I believe this is not true (anymore?).
This is correct. The macro CPU_ALL_TASKS_ARE_FP is FALSE in
cpukit/score/cpu/powerpc/rtems/score/cpu.h.
> *Hence, I believe that data corruption
> is lingering out there*.
>
> It is quite unlikely but not impossible. (task switch to
> a FP task must happen while integer-only task is using
> the FPU [e.g., interrupt during 64-bit move scheduling
> FP task]).
>
> -- Till
>
> PS:
> I am not affected here since I enabled 'lazy FP switching' with
> special patches to setjmp/longjmp and vfprintf and I disable
> the FPU for integer-only tasks to catch these problems...
Is code disabling the FPU in the MSR for no-FP tasks in the main CVS code?
How should we treat the FPU in general? Enable it by default in all
tasks since we can't reliably predict which threads will use it?
How should the Altivec be treated?
+ As another context (integer, FPU, etc).
+ As an extension to the integer context on Altivec capable CPUs
+ As an extension to the FPU context on Altivec capable CPUs
I can easily see the 2nd or 3rd alternative as easily implementable.
But we need to be careful to disabled the FPU and Altivec unit on all
threads and ISRs which we do not expect to use it. In that light, it
would be easier to take the 3rd alternative above and say that if a task
has the FPU enabled, then the Altivec is also enabled.
GCCs use of the FPU and Altivec registers certainly complicates things. :(
--joel
More information about the users
mailing list