Browse Source

[ARM] 3165/1: fix atomic_cmpxchg() implementation for ARMv6+

Patch from Nicolas Pitre

If 'old' and 'oldval' are different then 'res' never gets set.  In that
case, if ever %0 happened to contain anything but zero (rather likely)
then the code will loop forever (or until another CPU just come along
and change the atomic value to match 'old' which is rather unlikely).

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Nicolas Pitre 19 năm trước cách đây
mục cha
commit
a7d0683361
1 tập tin đã thay đổi với 1 bổ sung0 xóa
  1. 1 0
      include/asm-arm/atomic.h

+ 1 - 0
include/asm-arm/atomic.h

@@ -87,6 +87,7 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
 	do {
 	do {
 		__asm__ __volatile__("@ atomic_cmpxchg\n"
 		__asm__ __volatile__("@ atomic_cmpxchg\n"
 		"ldrex	%1, [%2]\n"
 		"ldrex	%1, [%2]\n"
+		"mov	%0, #0\n"
 		"teq	%1, %3\n"
 		"teq	%1, %3\n"
 		"strexeq %0, %4, [%2]\n"
 		"strexeq %0, %4, [%2]\n"
 		    : "=&r" (res), "=&r" (oldval)
 		    : "=&r" (res), "=&r" (oldval)