[PATCH] atomic_dec_if_positive sign extension fix

Segher Boessenkool segher at kernel.crashing.org
Mon Jan 15 10:32:18 EST 2007


>> 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]
>
>>  	__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




More information about the Linuxppc-dev mailing list