summaryrefslogtreecommitdiffstats
path: root/sys/arm/include/atomic.h
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2007-11-27 22:12:05 +0000
committercognet <cognet@FreeBSD.org>2007-11-27 22:12:05 +0000
commit8ee51043418b2b11413644c7a7057901d8c70caf (patch)
tree36d558d0fbb2e53cbf916acdb9252911d47fc2ef /sys/arm/include/atomic.h
parent3a88ba0aa7ff88fa2e8f84cb75a123567a99dd9f (diff)
downloadFreeBSD-src-8ee51043418b2b11413644c7a7057901d8c70caf.zip
FreeBSD-src-8ee51043418b2b11413644c7a7057901d8c70caf.tar.gz
In atomic_fetchadd_32(), do not blindly increase the value of %3.
It should just contain the value we want to add, as if we're interrupted between the add and the str, we will restart from the beginning. Just use a register we can scratch instead. MFC After: 1 week
Diffstat (limited to 'sys/arm/include/atomic.h')
-rw-r--r--sys/arm/include/atomic.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h
index 3bbbb24..79e10eb 100644
--- a/sys/arm/include/atomic.h
+++ b/sys/arm/include/atomic.h
@@ -271,9 +271,10 @@ atomic_fetchadd_32(volatile uint32_t *p, uint32_t v)
"mov %0, #0xe0000004\n"
"str %1, [%0]\n"
"ldr %1, [%2]\n"
- "add %3, %1, %3\n"
- "str %3, [%2]\n"
+ "add %0, %1, %3\n"
+ "str %0, [%2]\n"
"2:\n"
+ "mov %0, #0xe0000004\n"
"mov %3, #0\n"
"str %3, [%0]\n"
: "=r" (ras_start), "=r" (start), "+r" (p), "+r" (v)
OpenPOWER on IntegriCloud