Module Name:    src
Committed By:   matt
Date:           Fri Aug 31 23:41:52 UTC 2012

Modified Files:
        src/common/lib/libc/arch/arm/atomic: atomic_add_32.S atomic_and_32.S
            atomic_cas_32.S atomic_cas_8.S atomic_dec_32.S atomic_inc_32.S
            atomic_or_32.S atomic_swap.S

Log Message:
Add dmb/dsb instructions as required by the armv7 arch man.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_and_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S \
    src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_or_32.S
cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/arm/atomic/atomic_swap.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/common/lib/libc/arch/arm/atomic/atomic_add_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.2	Sat Aug 16 07:12:39 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_32.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_add_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $	*/
+/*	$NetBSD: atomic_add_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -40,6 +40,11 @@ ENTRY_NP(_atomic_add_32)
 	strex	ip, r2, [r3]		/* try to store */
 	cmp	ip, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return old value */
 	END(_atomic_add_32)
 ATOMIC_OP_ALIAS(atomic_add_32,_atomic_add_32)
@@ -57,6 +62,11 @@ ENTRY_NP(_atomic_add_32_nv)
 	strex	r2, r0, [r3]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_add_32_nv)
 ATOMIC_OP_ALIAS(atomic_add_32_nv,_atomic_add_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_and_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.2	Sat Aug 16 07:12:39 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_32.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_and_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $	*/
+/*	$NetBSD: atomic_and_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -40,6 +40,11 @@ ENTRY_NP(_atomic_and_32)
 	strex	ip, r2, [r3]		/* try to store */
 	cmp	ip, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return old value */
 	END(_atomic_and_32)
 ATOMIC_OP_ALIAS(atomic_and_32,_atomic_and_32)
@@ -55,6 +60,11 @@ ENTRY_NP(_atomic_and_32_nv)
 	strex	r2, r0, [r3]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_and_32_nv)
 ATOMIC_OP_ALIAS(atomic_and_32_nv,_atomic_and_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.2	Sat Aug 16 07:12:39 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_cas_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $	*/
+/*	$NetBSD: atomic_cas_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -44,15 +44,28 @@ ENTRY_NP(_atomic_cas_32)
 	strex	ip, r2, [r3]		/* store new value */
 	cmp	ip, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
-	RET				/*    yes, return. */
+#ifdef _ARM_ARCH_7
+	dsb
+#else
+	mcr	p15, 0, ip, c7, c10, 4	/* data synchronization barrier */
+#endif
+	RET				/* return. */
 	END(_atomic_cas_32)
 
 ATOMIC_OP_ALIAS(atomic_cas_32,_atomic_cas_32)
 ATOMIC_OP_ALIAS(atomic_cas_uint,_atomic_cas_32)
 ATOMIC_OP_ALIAS(atomic_cas_ulong,_atomic_cas_32)
 ATOMIC_OP_ALIAS(atomic_cas_ptr,_atomic_cas_32)
+ATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic_cas_32)
+ATOMIC_OP_ALIAS(atomic_cas_uint_ni,_atomic_cas_32)
+ATOMIC_OP_ALIAS(atomic_cas_ulong_ni,_atomic_cas_32)
+ATOMIC_OP_ALIAS(atomic_cas_ptr_ni,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_uint,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_ulong,_atomic_cas_32)
+STRONG_ALIAS(_atomic_cas_32_ni,_atomic_cas_32)
+STRONG_ALIAS(_atomic_cas_ptr_ni,_atomic_cas_32)
+STRONG_ALIAS(_atomic_cas_uint_ni,_atomic_cas_32)
+STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_32)
 
 #endif /* _ARCH_ARM_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.2	Thu Aug 16 16:49:10 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_8.S,v 1.2 2012/08/16 16:49:10 matt Exp $ */
+/* $NetBSD: atomic_cas_8.S,v 1.3 2012/08/31 23:41:52 matt Exp $ */
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -44,7 +44,12 @@ ENTRY_NP(_atomic_cas_8)
 	strexb	ip, r2, [r3]		/* store new value */
 	cmp	ip, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
-	RET				/*    yes, return. */
+#ifdef _ARM_ARCH_7
+	dsb				/* data synchronization barrier */
+#else
+	mcr	p15, 0, ip, c7, c10, 4	/* data synchronization barrier */
+#endif
+	RET				/* return. */
 	END(_atomic_cas_8)
 
 ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8)
Index: src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.2	Sat Aug 16 07:12:39 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_dec_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $	*/
+/*	$NetBSD: atomic_dec_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -39,6 +39,11 @@ ENTRY_NP(_atomic_dec_32)
 	strex	r3, r1, [r2]		/* try to store */
 	cmp	r3, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_dec_32)
 ATOMIC_OP_ALIAS(atomic_dec_32,_atomic_dec_32)
@@ -56,6 +61,11 @@ ENTRY_NP(_atomic_dec_32_nv)
 	strex	r1, r0, [r2]		/* try to store */
 	cmp	r1, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_dec_32_nv)
 ATOMIC_OP_ALIAS(atomic_dec_32_nv,_atomic_dec_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.2	Sat Aug 16 07:12:39 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_inc_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $	*/
+/*	$NetBSD: atomic_inc_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -39,6 +39,11 @@ ENTRY_NP(_atomic_inc_32)
 	strex	r3, r1, [r2]		/* try to store */
 	cmp	r3, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_inc_32)
 ATOMIC_OP_ALIAS(atomic_inc_32,_atomic_inc_32)
@@ -56,6 +61,11 @@ ENTRY_NP(_atomic_inc_32_nv)
 	strex	r1, r0, [r2]		/* try to store */
 	cmp	r1, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_inc_32_nv)
 ATOMIC_OP_ALIAS(atomic_inc_32_nv,_atomic_inc_32_nv)
Index: src/common/lib/libc/arch/arm/atomic/atomic_or_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.3
--- src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.2	Sat Aug 16 07:12:39 2008
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_32.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_or_32.S,v 1.2 2008/08/16 07:12:39 matt Exp $	*/
+/*	$NetBSD: atomic_or_32.S,v 1.3 2012/08/31 23:41:52 matt Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -39,6 +39,11 @@ ENTRY_NP(_atomic_or_32)
 	strex	ip, r2, [r3]		/* try to store */
 	cmp	ip, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return old value */
 	END(_atomic_or_32)
 ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32)
@@ -54,6 +59,11 @@ ENTRY_NP(_atomic_or_32_nv)
 	strex	r2, r0, [r3]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET				/* return new value */
 	END(_atomic_or_32_nv)
 ATOMIC_OP_ALIAS(atomic_or_32_nv,_atomic_or_32_nv)

Index: src/common/lib/libc/arch/arm/atomic/atomic_swap.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.4
--- src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.3	Thu Aug 16 16:49:10 2012
+++ src/common/lib/libc/arch/arm/atomic/atomic_swap.S	Fri Aug 31 23:41:52 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_swap.S,v 1.3 2012/08/16 16:49:10 matt Exp $	*/
+/*	$NetBSD: atomic_swap.S,v 1.4 2012/08/31 23:41:52 matt Exp $	*/
 
 /*-
  * Copyright (c) 2007,2012 The NetBSD Foundation, Inc.
@@ -49,13 +49,20 @@ ENTRY_NP(_atomic_swap_32)
 1:
 #ifdef _ARM_ARCH_6
 	ldrex	r0, [r2]
-	strex	r3, r1, [r2]
+	cmp	r0, r1
+	strexne	ip, r1, [r2]
 #else
 	swp	r0, r1, [r2]
-	mov	r3, #0
+	cmp	r0, r1
+	movsne	ip, #0
 #endif
-	cmp	r3, #0
+	cmpne	ip, #0
 	bne	1b
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET
 	END(_atomic_swap_32)
 ATOMIC_OP_ALIAS(atomic_swap_32,_atomic_swap_32)
@@ -78,6 +85,11 @@ ENTRY_NP(_atomic_swap_8)
 #endif
 	cmp	r3, #0
 	bne	1b
+#ifdef _ARM_ARCH_7
+	dmb
+#else
+	mcr	p15, 0, ip, c7, c10, 5	/* data memory barrier */
+#endif
 	RET
 	END(_atomic_swap_8)
 ATOMIC_OP_ALIAS(atomic_swap_8,_atomic_swap_8)

Reply via email to