svn commit: r190603 - head/sys/arm/include
Olivier Houchard
cognet at FreeBSD.org
Tue Mar 31 16:47:18 PDT 2009
Author: cognet
Date: Tue Mar 31 23:47:18 2009
New Revision: 190603
URL: http://svn.freebsd.org/changeset/base/190603
Log:
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 <tinguely casselton net>
Modified:
head/sys/arm/include/atomic.h
Modified: head/sys/arm/include/atomic.h
==============================================================================
--- head/sys/arm/include/atomic.h Tue Mar 31 23:06:20 2009 (r190602)
+++ head/sys/arm/include/atomic.h Tue Mar 31 23:47:18 2009 (r190603)
@@ -264,22 +264,23 @@ atomic_clear_32(volatile uint32_t *addre
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);
}
More information about the svn-src-head
mailing list