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