Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/common/lib/libc/arch/arm/atomic Add dmb/dsb instructions as ...
details: https://anonhg.NetBSD.org/src/rev/ce4f299edac2
branches: trunk
changeset: 781309:ce4f299edac2
user: matt <matt%NetBSD.org@localhost>
date: Fri Aug 31 23:41:52 2012 +0000
description:
Add dmb/dsb instructions as required by the armv7 arch man.
diffstat:
common/lib/libc/arch/arm/atomic/atomic_add_32.S | 12 +++++++++++-
common/lib/libc/arch/arm/atomic/atomic_and_32.S | 12 +++++++++++-
common/lib/libc/arch/arm/atomic/atomic_cas_32.S | 17 +++++++++++++++--
common/lib/libc/arch/arm/atomic/atomic_cas_8.S | 9 +++++++--
common/lib/libc/arch/arm/atomic/atomic_dec_32.S | 12 +++++++++++-
common/lib/libc/arch/arm/atomic/atomic_inc_32.S | 12 +++++++++++-
common/lib/libc/arch/arm/atomic/atomic_or_32.S | 12 +++++++++++-
common/lib/libc/arch/arm/atomic/atomic_swap.S | 20 ++++++++++++++++----
8 files changed, 93 insertions(+), 13 deletions(-)
diffs (272 lines):
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_add_32.S
--- a/common/lib/libc/arch/arm/atomic/atomic_add_32.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_add_32.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 @@
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)
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_and_32.S
--- a/common/lib/libc/arch/arm/atomic/atomic_and_32.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_and_32.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 @@
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)
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_cas_32.S
--- a/common/lib/libc/arch/arm/atomic/atomic_cas_32.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_cas_32.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 */
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_cas_8.S
--- a/common/lib/libc/arch/arm/atomic/atomic_cas_8.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_cas_8.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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)
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_dec_32.S
--- a/common/lib/libc/arch/arm/atomic/atomic_dec_32.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_dec_32.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 @@
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)
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_inc_32.S
--- a/common/lib/libc/arch/arm/atomic/atomic_inc_32.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_inc_32.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 @@
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)
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_or_32.S
--- a/common/lib/libc/arch/arm/atomic/atomic_or_32.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_or_32.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 @@
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)
diff -r 52f281ef12ef -r ce4f299edac2 common/lib/libc/arch/arm/atomic/atomic_swap.S
--- a/common/lib/libc/arch/arm/atomic/atomic_swap.S Fri Aug 31 20:57:24 2012 +0000
+++ b/common/lib/libc/arch/arm/atomic/atomic_swap.S Fri Aug 31 23:41:52 2012 +0000
@@ -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 @@
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 @@
#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)
Home |
Main Index |
Thread Index |
Old Index