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