Bug#333766: libc6: SIGBUS in libm on hppa breaks qt-x11-free
On Fri, Oct 14, 2005 at 06:17:46AM +0200, Aurelien Jarno wrote:
> I have attached a patch that changes the alignment of the f_env type. I
> have tested it separately from the glibc, it works.
Yes, your patch looks right.
Please also add the following comment in front of the fenv_t declaration.
It will help explain what's going on:
/* While fr0-fr3 appear as 64-bit registers, they aren't 64-bit quantities.
* They are really one 32-bit status register and seven 32-bit exception
* registers. We just sodomize the fpu 64-bit store semantics for efficiency.
* 8 byte alignment is "only" needed for performance.
* Normally the kernel will squawk about (but handle) unaligned accesses.
* fr4 is the first usable FP register.
The above is a summary of an IRC conversation with the hppa glibc
guru (Carlos O'donell), Kyle Mcmartin, and myself.
> However, I would prefer that some people have a look to the
> asm code of the glibc to see what can be done.
Sorry - I've no clue where the offending asm lives.
The asm ( 4 fstd ops) posted by Stephen Gran looked fine to me.
I don't think anything needs to be done.
BTW, the test case posted by Stephan Gran (sgran) does NOT fail for me.
grundler <523>gcc-3.4 -lm fptest.c -o test.3.4
grundler <524>gcc-4.0 -lm fptest.c -o test.4.0
Here's what I get in the dmesg log instead of SIGBUS:
test.4.0(3857): unaligned access to 0x00000000bff4244c at ip=0x000000004044e9ff
test.4.0(3857): unaligned access to 0x00000000bff4244c at ip=0x000000004044ea03
test.4.0(3857): unaligned access to 0x00000000bff4243c at ip=0x000000004044ea07
N.b.: I don't have high confidence in this kernel outout:
o I should see 4 lines of output - one for each fstd op.
o unaligned addresses should be 8 bytes apart, incrementing.
And for the record:
grundler <566>uname -a
Linux gsyprf11.external.hp.com 2.6.14-rc2-pa2 #2 SMP Thu Sep 29 20:24:31 PDT 2005 parisc64 GNU/Linux
gcc version 3.4.5 20050706 (prerelease) (Debian 3.4.4-5)
gcc version 4.0.2 (Debian 4.0.2-2)