I finally found the problem which caused the DSI traps in userland
binaries
since the 10th of February.
The following part of rtld_start.S:
/*
* Instead of division which is costly we will use
multiplicative
* inverse. a / n = ((a * inv(n)) >> 32)
* where inv(n) = (0x100000000 + n - 1) / n
*/
mr %r0,%r11
lis %r11,0x10000000b/12@h # load multiplicative inverse
of 12
ori %r11,%r11,0x10000000b/12@l
mulhwu %r11,%r11,%r0 # get high half of
multiplication
...is assembled as:
2264: 7d 60 5b 78 mr r0,r11
2268: 3d 60 00 00 lis r11,0
226c: 61 6b 00 00 ori r11,r11,0
2270: 7d 6b 00 16 mulhwu r11,r11,r0
And the following warning are shown by the assembler on a 32-bit
system:
rtld_start.S:97: Warning: left operand is a bignum; integer 0 assumed
rtld_start.S:98: Warning: left operand is a bignum; integer 0 assumed
This explains why the daily builds do work, but all of my private
builds
failed with DSI-traps. The build server is a 64-bit system, and I
tried it
on several PPC and x86 platforms, but all were 32-bit... :P
To fix the source I would suggest the following modification:
mr %r0,%r11
lis %r11,0x15555556@h # load multiplicative inverse of 12
ori %r11,%r11,0x15555556@l
mulhwu %r11,%r11,%r0 # get high half of
multiplication