Skip to content
Snippets Groups Projects
Commit a7d06833 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King
Browse files

[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: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 224b5be6
No related branches found
No related tags found
No related merge requests found
...@@ -87,6 +87,7 @@ static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new) ...@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment