quoted
Please apply for 2.6.20. If an atomic counter is explicitly set to a
negative value the atomic_dec_if_positive function will decrement and
store the next smallest value in the atomic counter contrary to it's
intended operation.
[snip]
quoted
__asm__ __volatile__(
LWSYNC_ON_SMP
"1: lwarx %0,0,%1 # atomic_dec_if_positive\n\
+ extsw %0,%0\n\
addic. %0,%0,-1\n\
blt- 2f\n"
PPC405_ERR77(0,%1)
NAK: Good fix for 64-bit, but it will break 32-bit. I think a better
fix would be to use a cmpwi after the lwarx, and use addi rather than
addic..
Instead of the "extsw %0,%0" you could do "rlwinm %0,%0,0,0,31"
but I guess it's not worth it.
What is this function supposed to do if it gets 0x80000000 as
input btw? The current code happily makes it 0x7fffffff as
far as I can see? The "rlwinm" thing would fix that ;-) (Or
unfix, if the current behaviour is intended).
Segher