diff options
author | cognet <cognet@FreeBSD.org> | 2007-11-27 22:12:05 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2007-11-27 22:12:05 +0000 |
commit | 8ee51043418b2b11413644c7a7057901d8c70caf (patch) | |
tree | 36d558d0fbb2e53cbf916acdb9252911d47fc2ef /sys/arm/include/atomic.h | |
parent | 3a88ba0aa7ff88fa2e8f84cb75a123567a99dd9f (diff) | |
download | FreeBSD-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.h | 5 |
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) |