From a471e1eda3e12400a7ccd0c1c44b3458b6cb043f Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Tue, 31 Mar 2009 23:47:18 +0000 Subject: [PATCH] Fix the userland, RAS, version of atomic_fetchadd_32 : return the correct value, and do not store the wrong one in the supplied pointer. Submitted by: Mark Tinguely --- sys/arm/include/atomic.h | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h index 71e31c38e26..9f162201d52 100644 --- a/sys/arm/include/atomic.h +++ b/sys/arm/include/atomic.h @@ -264,22 +264,23 @@ atomic_clear_32(volatile uint32_t *address, uint32_t clearmask) static __inline uint32_t atomic_fetchadd_32(volatile uint32_t *p, uint32_t v) { - uint32_t start, ras_start = ARM_RAS_START; + uint32_t start, tmp, ras_start = ARM_RAS_START; __asm __volatile("1:\n" "adr %1, 1b\n" "str %1, [%0]\n" "adr %1, 2f\n" "str %1, [%0, #4]\n" - "ldr %1, [%2]\n" - "add %1, %1, %3\n" - "str %0, [%2]\n" + "ldr %1, [%3]\n" + "mov %2, %1\n" + "add %2, %2, %4\n" + "str %2, [%3]\n" "2:\n" - "mov %3, #0\n" - "str %3, [%0]\n" - "mov %3, #0xffffffff\n" - "str %3, [%0, #4]\n" - : "+r" (ras_start), "=r" (start), "+r" (p), "+r" (v) + "mov %2, #0\n" + "str %2, [%0]\n" + "mov %2, #0xffffffff\n" + "str %2, [%0, #4]\n" + : "+r" (ras_start), "=r" (start), "=r" (tmp), "+r" (p), "+r" (v) : : "memory"); return (start); }