Module Name:    src
Committed By:   martin
Date:           Wed Aug 11 17:05:42 UTC 2021

Modified Files:
        src/common/lib/libc/arch/arm/atomic [netbsd-9]: atomic_add_16.S
            atomic_add_32.S atomic_add_64.S atomic_add_8.S atomic_and_16.S
            atomic_and_32.S atomic_and_64.S atomic_and_8.S atomic_cas_16.S
            atomic_cas_32.S atomic_cas_64.S atomic_cas_8.S atomic_cas_up.S
            atomic_dec_32.S atomic_dec_64.S atomic_inc_32.S atomic_inc_64.S
            atomic_nand_16.S atomic_nand_32.S atomic_nand_64.S atomic_nand_8.S
            atomic_op_asm.h atomic_or_16.S atomic_or_32.S atomic_or_64.S
            atomic_or_8.S atomic_sub_64.S atomic_swap.S atomic_swap_16.S
            atomic_swap_64.S atomic_xor_16.S atomic_xor_32.S atomic_xor_64.S
            atomic_xor_8.S membar_ops.S sync_bool_compare_and_swap_1.S
            sync_bool_compare_and_swap_2.S sync_bool_compare_and_swap_4.S
            sync_bool_compare_and_swap_8.S sync_fetch_and_add_8.S
            sync_fetch_and_and_8.S sync_fetch_and_nand_8.S
            sync_fetch_and_or_8.S sync_fetch_and_sub_8.S sync_fetch_and_xor_8.S

Log Message:
Pull up following revision(s) (requested by skrll in ticket #1330):

        common/lib/libc/arch/arm/atomic/atomic_swap.S: revision 1.18
        common/lib/libc/arch/arm/atomic/atomic_and_16.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_swap.S: revision 1.19
        common/lib/libc/arch/arm/atomic/atomic_xor_64.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_inc_32.S: revision 1.8
        common/lib/libc/arch/arm/atomic/atomic_and_32.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_add_8.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_xor_64.S: revision 1.7
        common/lib/libc/arch/arm/atomic/atomic_inc_32.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_cas_up.S: revision 1.8
        common/lib/libc/arch/arm/atomic/atomic_add_8.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_op_asm.h: revision 1.9
        common/lib/libc/arch/arm/atomic/membar_ops.S: revision 1.8
        common/lib/libc/arch/arm/atomic/membar_ops.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_op_asm.h: revision 1.10
        common/lib/libc/arch/arm/atomic/atomic_and_32.S: revision 1.10
        common/lib/libc/arch/arm/atomic/atomic_cas_16.S: revision 1.3
        common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_xor_32.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_xor_32.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_nand_64.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_xor_16.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_swap_16.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_nand_64.S: revision 1.7
        common/lib/libc/arch/arm/atomic/atomic_cas_32.S: revision 1.8
        common/lib/libc/arch/arm/atomic/atomic_xor_16.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_swap_16.S: revision 1.7
        common/lib/libc/arch/arm/atomic/atomic_add_32.S: revision 1.10
        common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_dec_64.S: revision 1.8
        common/lib/libc/arch/arm/atomic/atomic_add_16.S: revision 1.4
        common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_xor_8.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_dec_64.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_add_16.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_xor_8.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_or_64.S: revision 1.13
        common/lib/libc/arch/arm/atomic/atomic_add_32.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_or_64.S: revision 1.14
        common/lib/libc/arch/arm/atomic/atomic_or_16.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_or_16.S: revision 1.5
        common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_nand_16.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_nand_16.S: revision 1.5
        common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_nand_32.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_or_32.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_nand_32.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_cas_8.S: revision 1.9
        common/lib/libc/arch/arm/atomic/atomic_inc_64.S: revision 1.10
        common/lib/libc/arch/arm/atomic/atomic_inc_64.S: revision 1.11
        common/lib/libc/arch/arm/atomic/atomic_cas_64.S: revision 1.12
        common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S: 
revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_or_8.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_dec_32.S: revision 1.6
        common/lib/libc/arch/arm/atomic/atomic_or_8.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_dec_32.S: revision 1.7
        common/lib/libc/arch/arm/atomic/atomic_sub_64.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_sub_64.S: revision 1.5
        common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.S: revision 1.6
        common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S: 
revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_and_64.S: revision 1.12
        common/lib/libc/arch/arm/atomic/atomic_or_32.S: revision 1.10
        common/lib/libc/arch/arm/atomic/atomic_and_64.S: revision 1.13
        common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S: 
revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_swap_64.S: revision 1.14
        common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S: 
revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_nand_8.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_and_8.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_add_64.S: revision 1.13
        common/lib/libc/arch/arm/atomic/atomic_nand_8.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_and_8.S: revision 1.5
        common/lib/libc/arch/arm/atomic/atomic_and_16.S: revision 1.4
        common/lib/libc/arch/arm/atomic/atomic_add_64.S: revision 1.14

Give the thumb atomic ops a chance of working

s/ifdef _ARM_ARCH_6/if defined(_ARM_ARCH_6)/ for consistency.  NFCI.

Remove memory barriers from the atomic_ops(3) atomic operations.  They're
not needed for correctness.

Add the correct memory barriers to the gcc legacy __sync built-in
functions for atomic memory access.  From the gcc documentation:

In most cases, these built-in functions are considered a full barrier.

That is, no memory operand is moved across the operation, either forward
or backward. Further, instructions are issued as necessary to prevent the
processor from speculating loads across the operation and from queuing
stores after the operation.

type __sync_lock_test_and_set (type *ptr, type value, ...)
    This built-in function is not a full barrier, but rather an acquire
    barrier. This means that references after the operation cannot move to
    (or be speculated to) before the operation, but previous memory stores
    may not be globally visible yet, and previous memory loads may not yet
    be satisfied.

void __sync_lock_release (type *ptr, ...)
    This built-in function is not a full barrier, but rather a release
    barrier. This means that all previous memory stores are globally
    visible, and all previous memory loads have been satisfied, but
    following memory reads are not prevented from being speculated to
    before the barrier.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.3.28.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_add_16.S \
    src/common/lib/libc/arch/arm/atomic/atomic_add_8.S \
    src/common/lib/libc/arch/arm/atomic/atomic_and_16.S \
    src/common/lib/libc/arch/arm/atomic/atomic_and_8.S \
    src/common/lib/libc/arch/arm/atomic/atomic_or_16.S \
    src/common/lib/libc/arch/arm/atomic/atomic_or_8.S \
    src/common/lib/libc/arch/arm/atomic/atomic_xor_16.S \
    src/common/lib/libc/arch/arm/atomic/atomic_xor_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_xor_8.S
cvs rdiff -u -r1.8 -r1.8.26.1 \
    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_or_32.S
cvs rdiff -u -r1.11.28.1 -r1.11.28.2 \
    src/common/lib/libc/arch/arm/atomic/atomic_add_64.S
cvs rdiff -u -r1.10.28.1 -r1.10.28.2 \
    src/common/lib/libc/arch/arm/atomic/atomic_and_64.S
cvs rdiff -u -r1.2 -r1.2.32.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_16.S
cvs rdiff -u -r1.7 -r1.7.28.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S \
    src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S
cvs rdiff -u -r1.11 -r1.11.2.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S
cvs rdiff -u -r1.7.28.1 -r1.7.28.2 \
    src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S
cvs rdiff -u -r1.5 -r1.5.28.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S
cvs rdiff -u -r1.7 -r1.7.30.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S
cvs rdiff -u -r1.9 -r1.9.30.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S
cvs rdiff -u -r1.3 -r1.3.18.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_nand_16.S \
    src/common/lib/libc/arch/arm/atomic/atomic_nand_32.S \
    src/common/lib/libc/arch/arm/atomic/atomic_nand_8.S \
    src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S \
    src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S \
    src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S
cvs rdiff -u -r1.4.18.1 -r1.4.18.2 \
    src/common/lib/libc/arch/arm/atomic/atomic_nand_64.S \
    src/common/lib/libc/arch/arm/atomic/atomic_swap_16.S
cvs rdiff -u -r1.7 -r1.7.18.1 \
    src/common/lib/libc/arch/arm/atomic/atomic_op_asm.h
cvs rdiff -u -r1.10.28.2 -r1.10.28.3 \
    src/common/lib/libc/arch/arm/atomic/atomic_or_64.S
cvs rdiff -u -r1.2.32.1 -r1.2.32.2 \
    src/common/lib/libc/arch/arm/atomic/atomic_sub_64.S
cvs rdiff -u -r1.14.18.2 -r1.14.18.3 \
    src/common/lib/libc/arch/arm/atomic/atomic_swap.S
cvs rdiff -u -r1.10.18.3 -r1.10.18.4 \
    src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S
cvs rdiff -u -r1.3.32.2 -r1.3.32.3 \
    src/common/lib/libc/arch/arm/atomic/atomic_xor_64.S
cvs rdiff -u -r1.6.28.1 -r1.6.28.2 \
    src/common/lib/libc/arch/arm/atomic/membar_ops.S
cvs rdiff -u -r1.4 -r1.4.18.1 \
    src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S
cvs rdiff -u -r1.5 -r1.5.18.1 \
    src/common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S \
    src/common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S \
    src/common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S \
    src/common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S \
    src/common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S \
    src/common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.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_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_16.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_add_16.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_add_16.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_add_16.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_add_16.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_sub_16)
 	negs	r1, r1
@@ -43,11 +43,6 @@ ENTRY_NP(_atomic_add_16)
 	strexh	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_add_16)
 END(_atomic_sub_16)
@@ -55,7 +50,6 @@ END(_atomic_sub_16)
 ATOMIC_OP_ALIAS(atomic_add_16,_atomic_add_16)
 ATOMIC_OP_ALIAS(atomic_add_short,_atomic_add_16)
 ATOMIC_OP_ALIAS(atomic_add_ushort,_atomic_add_16)
-CRT_ALIAS(__sync_fetch_and_add_2,_atomic_add_16)
 CRT_ALIAS(__atomic_fetch_add_2,_atomic_add_16)
 STRONG_ALIAS(_atomic_add_short,_atomic_add_16)
 STRONG_ALIAS(_atomic_add_ushort,_atomic_add_16)
@@ -63,11 +57,27 @@ STRONG_ALIAS(_atomic_add_ushort,_atomic_
 ATOMIC_OP_ALIAS(atomic_sub_16,_atomic_sub_16)
 ATOMIC_OP_ALIAS(atomic_sub_short,_atomic_sub_16)
 ATOMIC_OP_ALIAS(atomic_sub_ushort,_atomic_sub_16)
-CRT_ALIAS(__sync_fetch_and_sub_2,_atomic_sub_16)
 CRT_ALIAS(__atomic_fetch_sub_2,_atomic_sub_16)
 STRONG_ALIAS(_atomic_sub_short,_atomic_sub_16)
 STRONG_ALIAS(_atomic_sub_ushort,_atomic_sub_16)
 
+ENTRY_NP(__sync_fetch_and_add_2)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_add_16
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_add_2)
+
+ENTRY_NP(__sync_fetch_and_sub_2)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_sub_16
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_sub_2)
+
+
 ENTRY_NP(_atomic_sub_16_nv)
 	negs	r1, r1
 	/* FALLTHROUGH */
@@ -78,25 +88,35 @@ ENTRY_NP(_atomic_add_16_nv)
 	strexh	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_add_16_nv)
 END(_atomic_sub_16_nv)
+
 ATOMIC_OP_ALIAS(atomic_add_16_nv,_atomic_add_16_nv)
 ATOMIC_OP_ALIAS(atomic_add_short_nv,_atomic_add_16_nv)
 ATOMIC_OP_ALIAS(atomic_add_ushort_nv,_atomic_add_16_nv)
-CRT_ALIAS(__sync_add_and_fetch_2,_atomic_add_16_nv)
 STRONG_ALIAS(_atomic_add_short_nv,_atomic_add_16_nv)
 STRONG_ALIAS(_atomic_add_ushort_nv,_atomic_add_16_nv)
-
 ATOMIC_OP_ALIAS(atomic_sub_16_nv,_atomic_sub_16_nv)
 ATOMIC_OP_ALIAS(atomic_sub_short_nv,_atomic_sub_16_nv)
 ATOMIC_OP_ALIAS(atomic_sub_ushort_nv,_atomic_sub_16_nv)
-CRT_ALIAS(__sync_sub_and_fetch_2,_atomic_sub_16_nv)
 STRONG_ALIAS(_atomic_sub_short_nv,_atomic_sub_16_nv)
 STRONG_ALIAS(_atomic_sub_ushort_nv,_atomic_sub_16_nv)
+
+ENTRY_NP(__sync_add_and_fetch_2)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_add_16_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_add_and_fetch_2)
+
+ENTRY_NP(__sync_sub_and_fetch_2)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_sub_16_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_sub_and_fetch_2)
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_add_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_8.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_add_8.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_add_8.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_add_8.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_add_8.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_sub_8)
 	negs	r1, r1
@@ -43,11 +43,6 @@ ENTRY_NP(_atomic_add_8)
 	strexb	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_add_8)
 END(_atomic_sub_8)
@@ -55,19 +50,34 @@ END(_atomic_sub_8)
 ATOMIC_OP_ALIAS(atomic_add_8,_atomic_add_8)
 ATOMIC_OP_ALIAS(atomic_add_char,_atomic_add_8)
 ATOMIC_OP_ALIAS(atomic_add_uchar,_atomic_add_8)
-CRT_ALIAS(__sync_fetch_and_add_1,_atomic_add_8)
 CRT_ALIAS(__atomic_fetch_add_1,_atomic_add_8)
 STRONG_ALIAS(_atomic_add_char,_atomic_add_8)
 STRONG_ALIAS(_atomic_add_uchar,_atomic_add_8)
 
+ENTRY_NP(__sync_fetch_and_add_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_add_8
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_add_1)
+
+ENTRY_NP(__sync_fetch_and_sub_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_sub_8
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_sub_1)
+
 ATOMIC_OP_ALIAS(atomic_sub_8,_atomic_sub_8)
 ATOMIC_OP_ALIAS(atomic_sub_char,_atomic_sub_8)
 ATOMIC_OP_ALIAS(atomic_sub_uchar,_atomic_sub_8)
-CRT_ALIAS(__sync_fetch_and_sub_1,_atomic_sub_8)
 CRT_ALIAS(__atomic_fetch_sub_1,_atomic_sub_8)
 STRONG_ALIAS(_atomic_sub_char,_atomic_sub_8)
 STRONG_ALIAS(_atomic_sub_uchar,_atomic_sub_8)
 
+
 ENTRY_NP(_atomic_sub_8_nv)
 	negs	r1, r1
 	/* FALLTHROUGH */
@@ -78,25 +88,36 @@ ENTRY_NP(_atomic_add_8_nv)
 	strexb	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_add_8_nv)
 END(_atomic_sub_8_nv)
+
 ATOMIC_OP_ALIAS(atomic_add_8_nv,_atomic_add_8_nv)
 ATOMIC_OP_ALIAS(atomic_add_char_nv,_atomic_add_8_nv)
 ATOMIC_OP_ALIAS(atomic_add_uchar_nv,_atomic_add_8_nv)
-CRT_ALIAS(__sync_add_and_fetch_1,_atomic_add_8_nv)
 STRONG_ALIAS(_atomic_add_char_nv,_atomic_add_8_nv)
 STRONG_ALIAS(_atomic_add_uchar_nv,_atomic_add_8_nv)
 
 ATOMIC_OP_ALIAS(atomic_sub_8_nv,_atomic_sub_8_nv)
 ATOMIC_OP_ALIAS(atomic_sub_char_nv,_atomic_sub_8_nv)
 ATOMIC_OP_ALIAS(atomic_sub_uchar_nv,_atomic_sub_8_nv)
-CRT_ALIAS(__sync_sub_and_fetch_1,_atomic_sub_8_nv)
 STRONG_ALIAS(_atomic_sub_char_nv,_atomic_sub_8_nv)
 STRONG_ALIAS(_atomic_sub_uchar_nv,_atomic_sub_8_nv)
+
+ENTRY_NP(__sync_add_and_fetch_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_add_8_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_add_and_fetch_1)
+
+ENTRY_NP(__sync_sub_and_fetch_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_sub_8_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_sub_and_fetch_1)
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_and_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_16.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_and_16.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_and_16.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_and_16.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_and_16.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_and_16)
 	mov	ip, r0
@@ -40,20 +40,23 @@ ENTRY_NP(_atomic_and_16)
 	strexh	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_and_16)
 
 ATOMIC_OP_ALIAS(atomic_and_16,_atomic_and_16)
 ATOMIC_OP_ALIAS(atomic_and_ushort,_atomic_and_16)
-CRT_ALIAS(__sync_fetch_and_and_2,_atomic_and_16)
 CRT_ALIAS(__atomic_fetch_and_2,_atomic_and_16)
 STRONG_ALIAS(_atomic_and_ushort,_atomic_and_16)
 
+ENTRY_NP(__sync_fetch_and_and_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_16
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_and_2)
+
+
 ENTRY_NP(_atomic_and_16_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexh	r0, [ip]		/* load old value */
@@ -61,17 +64,20 @@ ENTRY_NP(_atomic_and_16_nv)
 	strexh	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_and_16_nv)
 
 ATOMIC_OP_ALIAS(atomic_and_16_nv,_atomic_and_16_nv)
 ATOMIC_OP_ALIAS(atomic_and_ushort_nv,_atomic_and_16_nv)
-CRT_ALIAS(__sync_and_and_fetch_2,_atomic_and_16_nv)
 STRONG_ALIAS(_atomic_and_ushort_nv,_atomic_and_16_nv)
 
+ENTRY_NP(__sync_and_and_fetch_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_16_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_and_and_fetch_2)
+
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_and_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_8.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_and_8.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_and_8.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_and_8.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_and_8.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_and_8)
 	mov	ip, r0
@@ -40,20 +40,23 @@ ENTRY_NP(_atomic_and_8)
 	strexb	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_and_8)
 
 ATOMIC_OP_ALIAS(atomic_and_8,_atomic_and_8)
 ATOMIC_OP_ALIAS(atomic_and_uchar,_atomic_and_8)
-CRT_ALIAS(__sync_fetch_and_and_1,_atomic_and_8)
 CRT_ALIAS(__atomic_fetch_and_1,_atomic_and_8)
 STRONG_ALIAS(_atomic_and_uchar,_atomic_and_8)
 
+ENTRY_NP(__sync_fetch_and_and_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_8
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_and_1)
+
+
 ENTRY_NP(_atomic_and_8_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexb	r0, [ip]		/* load old value */
@@ -61,17 +64,20 @@ ENTRY_NP(_atomic_and_8_nv)
 	strexb	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_and_8_nv)
 
 ATOMIC_OP_ALIAS(atomic_and_8_nv,_atomic_and_8_nv)
 ATOMIC_OP_ALIAS(atomic_and_uchar_nv,_atomic_and_8_nv)
-CRT_ALIAS(__sync_and_and_fetch_1,_atomic_and_8_nv)
 STRONG_ALIAS(_atomic_and_uchar_nv,_atomic_and_8_nv)
 
+ENTRY_NP(__sync_and_and_fetch_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_8_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_and_and_fetch_1)
+
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_or_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_16.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_or_16.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_or_16.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_or_16.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_or_16.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_or_16)
 	mov	ip, r0
@@ -39,20 +39,23 @@ ENTRY_NP(_atomic_or_16)
 	strexh	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_or_16)
 
 ATOMIC_OP_ALIAS(atomic_or_16,_atomic_or_16)
 ATOMIC_OP_ALIAS(atomic_or_ushort,_atomic_or_16)
-CRT_ALIAS(__sync_fetch_and_or_2,_atomic_or_16)
 CRT_ALIAS(__atomic_fetch_or_2,_atomic_or_16)
 STRONG_ALIAS(_atomic_or_ushort,_atomic_or_16)
 
+ENTRY_NP(__sync_fetch_and_or_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_16
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_or_2)
+
+
 ENTRY_NP(_atomic_or_16_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexh	r0, [ip]		/* load old value */
@@ -60,17 +63,19 @@ ENTRY_NP(_atomic_or_16_nv)
 	strexh	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_or_16_nv)
 
 ATOMIC_OP_ALIAS(atomic_or_16_nv,_atomic_or_16_nv)
 ATOMIC_OP_ALIAS(atomic_or_ushort_nv,_atomic_or_16_nv)
-CRT_ALIAS(__sync_or_and_fetch_2,_atomic_or_16_nv)
 STRONG_ALIAS(_atomic_or_ushort_nv,_atomic_or_16_nv)
 
+ENTRY_NP(__sync_or_and_fetch_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_16_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_or_and_fetch_2)
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_or_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_8.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_or_8.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_or_8.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_or_8.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_or_8.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_or_8)
 	mov	ip, r0
@@ -40,20 +40,23 @@ ENTRY_NP(_atomic_or_8)
 	strexb	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_or_8)
 
 ATOMIC_OP_ALIAS(atomic_or_8,_atomic_or_8)
 ATOMIC_OP_ALIAS(atomic_or_char,_atomic_or_8)
-CRT_ALIAS(__sync_fetch_and_or_1,_atomic_or_8)
 CRT_ALIAS(__atomic_fetch_or_1,_atomic_or_8)
 STRONG_ALIAS(_atomic_or_char,_atomic_or_8)
 
+ENTRY_NP(__sync_fetch_and_or_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_8
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_or_1)
+
+
 ENTRY_NP(_atomic_or_8_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexb	r0, [ip]		/* load old value */
@@ -61,17 +64,19 @@ ENTRY_NP(_atomic_or_8_nv)
 	strexb	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_or_8_nv)
 
 ATOMIC_OP_ALIAS(atomic_or_8_nv,_atomic_or_8_nv)
 ATOMIC_OP_ALIAS(atomic_or_char_nv,_atomic_or_8_nv)
-CRT_ALIAS(__sync_or_and_fetch_1,_atomic_or_8_nv)
 STRONG_ALIAS(_atomic_or_char_nv,_atomic_or_8_nv)
 
+ENTRY_NP(__sync_or_and_fetch_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_8_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_or_and_fetch_1)
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_xor_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_xor_16.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_xor_16.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_xor_16.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_xor_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_xor_16.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_xor_16.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_xor_16)
 	mov	ip, r0
@@ -40,20 +40,23 @@ ENTRY_NP(_atomic_xor_16)
 	strexh	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_xor_16)
 
 ATOMIC_OP_ALIAS(atomic_xor_16,_atomic_xor_16)
 ATOMIC_OP_ALIAS(atomic_xor_ushort,_atomic_xor_16)
-CRT_ALIAS(__sync_fetch_and_xor_2,_atomic_xor_16)
 CRT_ALIAS(__atomic_fetch_xor_2,_atomic_xor_16)
 STRONG_ALIAS(_atomic_xor_ushort,_atomic_xor_16)
 
+ENTRY_NP(__sync_fetch_and_xor_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_xor_16
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_xor_2)
+
+
 ENTRY_NP(_atomic_xor_16_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexh	r0, [ip]		/* load old value */
@@ -61,17 +64,19 @@ ENTRY_NP(_atomic_xor_16_nv)
 	strexh	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_xor_16_nv)
 
 ATOMIC_OP_ALIAS(atomic_xor_16_nv,_atomic_xor_16_nv)
 ATOMIC_OP_ALIAS(atomic_xor_ushort_nv,_atomic_xor_16_nv)
-CRT_ALIAS(__sync_xor_and_fetch_2,_atomic_xor_16_nv)
 STRONG_ALIAS(_atomic_xor_ushort_nv,_atomic_xor_16_nv)
 
+ENTRY_NP(__sync_xor_and_fetch_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_xor_16_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_xor_and_fetch_2)
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_xor_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_xor_32.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_xor_32.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_xor_32.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_xor_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_xor_32.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_xor_32.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_xor_32)
 	mov	ip, r0
@@ -39,22 +39,24 @@ ENTRY_NP(_atomic_xor_32)
 	strex	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_xor_32)
 
 ATOMIC_OP_ALIAS(atomic_xor_32,_atomic_xor_32)
 ATOMIC_OP_ALIAS(atomic_xor_uint,_atomic_xor_32)
 ATOMIC_OP_ALIAS(atomic_xor_ulong,_atomic_xor_32)
-CRT_ALIAS(__sync_fetch_and_xor_4,_atomic_xor_32)
 CRT_ALIAS(__atomic_fetch_xor_4,_atomic_xor_32)
 STRONG_ALIAS(_atomic_xor_uint,_atomic_xor_32)
 STRONG_ALIAS(_atomic_xor_ulong,_atomic_xor_32)
 
+ENTRY_NP(__sync_fetch_and_xor_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_xor_32
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_xor_4)
+
 ENTRY_NP(_atomic_xor_32_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrex	r0, [ip]		/* load old value */
@@ -62,19 +64,22 @@ ENTRY_NP(_atomic_xor_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_xor_32_nv)
 
 ATOMIC_OP_ALIAS(atomic_xor_32_nv,_atomic_xor_32_nv)
 ATOMIC_OP_ALIAS(atomic_xor_uint_nv,_atomic_xor_32_nv)
 ATOMIC_OP_ALIAS(atomic_xor_ulong_nv,_atomic_xor_32_nv)
-CRT_ALIAS(__sync_xor_and_fetch_4,_atomic_xor_32_nv)
 STRONG_ALIAS(_atomic_xor_uint_nv,_atomic_xor_32_nv)
 STRONG_ALIAS(_atomic_xor_ulong_nv,_atomic_xor_32_nv)
 
+ENTRY_NP(__sync_xor_and_fetch_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_xor_32_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_xor_and_fetch_4)
+
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_xor_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_xor_8.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_xor_8.S:1.3.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_xor_8.S:1.3	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_xor_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_xor_8.S,v 1.3 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_xor_8.S,v 1.3.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_xor_8)
 	mov	ip, r0
@@ -40,20 +40,23 @@ ENTRY_NP(_atomic_xor_8)
 	strexb	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_xor_8)
 
 ATOMIC_OP_ALIAS(atomic_xor_8,_atomic_xor_8)
 ATOMIC_OP_ALIAS(atomic_xor_uchar,_atomic_xor_8)
-CRT_ALIAS(__sync_fetch_and_xor_1,_atomic_xor_8)
 CRT_ALIAS(__atomic_fetch_xor_1,_atomic_xor_8)
 STRONG_ALIAS(_atomic_xor_uchar,_atomic_xor_8)
 
+ENTRY_NP(__sync_fetch_and_xor_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_xor_8
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_xor_1)
+
+
 ENTRY_NP(_atomic_xor_8_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexb	r0, [ip]		/* load old value */
@@ -61,17 +64,19 @@ ENTRY_NP(_atomic_xor_8_nv)
 	strexb	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_xor_8_nv)
 
 ATOMIC_OP_ALIAS(atomic_xor_8_nv,_atomic_xor_8_nv)
 ATOMIC_OP_ALIAS(atomic_xor_uchar_nv,_atomic_xor_8_nv)
-CRT_ALIAS(__sync_xor_and_fetch_1,_atomic_xor_8_nv)
 STRONG_ALIAS(_atomic_xor_uchar_nv,_atomic_xor_8_nv)
 
+ENTRY_NP(__sync_xor_and_fetch_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_xor_8_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_xor_and_fetch_1)
+
 #endif /* _ARM_ARCH_6 */

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.8 src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.8.26.1
--- src/common/lib/libc/arch/arm/atomic/atomic_add_32.S:1.8	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_add_32.S,v 1.8 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_add_32.S,v 1.8.26.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_sub_32)
 	negs	r1, r1
@@ -43,20 +43,31 @@ ENTRY_NP(_atomic_add_32)
 	strex	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_add_32)
 END(_atomic_sub_32)
 
+ENTRY_NP(__sync_fetch_and_add_4)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_add_32
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_add_4)
+
+ENTRY_NP(__sync_fetch_and_sub_4)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_add_32
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_sub_4)
+
+
 ATOMIC_OP_ALIAS(atomic_add_32,_atomic_add_32)
 ATOMIC_OP_ALIAS(atomic_add_int,_atomic_add_32)
 ATOMIC_OP_ALIAS(atomic_add_long,_atomic_add_32)
 ATOMIC_OP_ALIAS(atomic_add_ptr,_atomic_add_32)
-CRT_ALIAS(__sync_fetch_and_add_4,_atomic_add_32)
 CRT_ALIAS(__atomic_fetch_add_4,_atomic_add_32)
 STRONG_ALIAS(_atomic_add_int,_atomic_add_32)
 STRONG_ALIAS(_atomic_add_long,_atomic_add_32)
@@ -66,7 +77,6 @@ ATOMIC_OP_ALIAS(atomic_sub_32,_atomic_su
 ATOMIC_OP_ALIAS(atomic_sub_int,_atomic_sub_32)
 ATOMIC_OP_ALIAS(atomic_sub_long,_atomic_sub_32)
 ATOMIC_OP_ALIAS(atomic_sub_ptr,_atomic_sub_32)
-CRT_ALIAS(__sync_fetch_and_sub_4,_atomic_sub_32)
 CRT_ALIAS(__atomic_fetch_sub_4,_atomic_sub_32)
 STRONG_ALIAS(_atomic_sub_int,_atomic_sub_32)
 STRONG_ALIAS(_atomic_sub_long,_atomic_sub_32)
@@ -82,19 +92,14 @@ ENTRY_NP(_atomic_add_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_add_32_nv)
 END(_atomic_sub_32_nv)
+
 ATOMIC_OP_ALIAS(atomic_add_32_nv,_atomic_add_32_nv)
 ATOMIC_OP_ALIAS(atomic_add_int_nv,_atomic_add_32_nv)
 ATOMIC_OP_ALIAS(atomic_add_long_nv,_atomic_add_32_nv)
 ATOMIC_OP_ALIAS(atomic_add_ptr_nv,_atomic_add_32_nv)
-CRT_ALIAS(__sync_add_and_fetch_4,_atomic_add_32_nv)
 STRONG_ALIAS(_atomic_add_int_nv,_atomic_add_32_nv)
 STRONG_ALIAS(_atomic_add_long_nv,_atomic_add_32_nv)
 STRONG_ALIAS(_atomic_add_ptr_nv,_atomic_add_32_nv)
@@ -103,8 +108,24 @@ ATOMIC_OP_ALIAS(atomic_sub_32_nv,_atomic
 ATOMIC_OP_ALIAS(atomic_sub_int_nv,_atomic_sub_32_nv)
 ATOMIC_OP_ALIAS(atomic_sub_long_nv,_atomic_sub_32_nv)
 ATOMIC_OP_ALIAS(atomic_sub_ptr_nv,_atomic_sub_32_nv)
-CRT_ALIAS(__sync_sub_and_fetch_4,_atomic_sub_32_nv)
 STRONG_ALIAS(_atomic_sub_int_nv,_atomic_sub_32_nv)
 STRONG_ALIAS(_atomic_sub_long_nv,_atomic_sub_32_nv)
 STRONG_ALIAS(_atomic_sub_ptr_nv,_atomic_sub_32_nv)
+
+ENTRY_NP(__sync_add_and_fetch_4)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_add_32_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_add_and_fetch_4)
+
+ENTRY_NP(__sync_sub_and_fetch_4)
+	push    {r4, lr}
+	DMB
+	bl	_atomic_sub_32_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_sub_and_fetch_4)
+
 #endif /* _ARM_ARCH_6 */
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.8 src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.8.26.1
--- src/common/lib/libc/arch/arm/atomic/atomic_and_32.S:1.8	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_and_32.S,v 1.8 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_and_32.S,v 1.8.26.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_and_32)
 	mov	ip, r0
@@ -40,22 +40,25 @@ ENTRY_NP(_atomic_and_32)
 	strex	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_and_32)
 
 ATOMIC_OP_ALIAS(atomic_and_32,_atomic_and_32)
 ATOMIC_OP_ALIAS(atomic_and_uint,_atomic_and_32)
 ATOMIC_OP_ALIAS(atomic_and_ulong,_atomic_and_32)
-CRT_ALIAS(__sync_fetch_and_and_4,_atomic_and_32)
 CRT_ALIAS(__atomic_fetch_and_4,_atomic_and_32)
 STRONG_ALIAS(_atomic_and_uint,_atomic_and_32)
 STRONG_ALIAS(_atomic_and_ulong,_atomic_and_32)
 
+ENTRY_NP(__sync_fetch_and_and_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_32
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_and_4)
+
+
 ENTRY_NP(_atomic_and_32_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrex	r0, [ip]		/* load old value */
@@ -63,19 +66,21 @@ ENTRY_NP(_atomic_and_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, 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)
 ATOMIC_OP_ALIAS(atomic_and_uint_nv,_atomic_and_32_nv)
 ATOMIC_OP_ALIAS(atomic_and_ulong_nv,_atomic_and_32_nv)
-CRT_ALIAS(__sync_and_and_fetch_4,_atomic_and_32_nv)
 STRONG_ALIAS(_atomic_and_uint_nv,_atomic_and_32_nv)
 STRONG_ALIAS(_atomic_and_ulong_nv,_atomic_and_32_nv)
 
+ENTRY_NP(__sync_and_and_fetch_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_32_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_and_and_fetch_4)
+
 #endif /* _ARM_ARCH_6 */
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.8 src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.8.26.1
--- src/common/lib/libc/arch/arm/atomic/atomic_or_32.S:1.8	Mon Jun 23 21:53:45 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_or_32.S,v 1.8 2014/06/23 21:53:45 joerg Exp $	*/
+/*	$NetBSD: atomic_or_32.S,v 1.8.26.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_or_32)
 	mov	ip, r0
@@ -39,22 +39,25 @@ ENTRY_NP(_atomic_or_32)
 	strex	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_or_32)
 
 ATOMIC_OP_ALIAS(atomic_or_32,_atomic_or_32)
 ATOMIC_OP_ALIAS(atomic_or_uint,_atomic_or_32)
 ATOMIC_OP_ALIAS(atomic_or_ulong,_atomic_or_32)
-CRT_ALIAS(__sync_fetch_and_or_4,_atomic_or_32)
 CRT_ALIAS(__atomic_fetch_or_4,_atomic_or_32)
 STRONG_ALIAS(_atomic_or_uint,_atomic_or_32)
 STRONG_ALIAS(_atomic_or_ulong,_atomic_or_32)
 
+ENTRY_NP(__sync_fetch_and_or_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_32
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_or_4)
+
+
 ENTRY_NP(_atomic_or_32_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrex	r0, [ip]		/* load old value */
@@ -62,19 +65,22 @@ ENTRY_NP(_atomic_or_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, 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)
 ATOMIC_OP_ALIAS(atomic_or_uint_nv,_atomic_or_32_nv)
 ATOMIC_OP_ALIAS(atomic_or_ulong_nv,_atomic_or_32_nv)
-CRT_ALIAS(__sync_or_and_fetch_4,_atomic_or_32_nv)
 STRONG_ALIAS(_atomic_or_uint_nv,_atomic_or_32_nv)
 STRONG_ALIAS(_atomic_or_ulong_nv,_atomic_or_32_nv)
 
+ENTRY_NP(__sync_or_and_fetch_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_32_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_or_and_fetch_4)
+
+
 #endif /* _ARM_ARCH_6 */

Index: src/common/lib/libc/arch/arm/atomic/atomic_add_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_add_64.S:1.11.28.1 src/common/lib/libc/arch/arm/atomic/atomic_add_64.S:1.11.28.2
--- src/common/lib/libc/arch/arm/atomic/atomic_add_64.S:1.11.28.1	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_add_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_add_64.S,v 1.11.28.1 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_add_64.S,v 1.11.28.2 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_add_64_nv)
 	push	{r3, r4}		/* save temporary */
@@ -45,11 +45,6 @@ ENTRY_NP(_atomic_add_64_nv)
 	strexd	r4, r0, r1, [ip]	/* try to store */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET				/* return new value */
 END(_atomic_add_64_nv)
@@ -57,6 +52,13 @@ END(_atomic_add_64_nv)
 STRONG_ALIAS(_atomic_add_64,_atomic_add_64_nv)
 ATOMIC_OP_ALIAS(atomic_add_64_nv,_atomic_add_64_nv)
 ATOMIC_OP_ALIAS(atomic_add_64,_atomic_add_64)
-CRT_ALIAS(__sync_add_and_fetch_8,_atomic_add_64_nv)
+
+ENTRY_NP(__sync_add_and_fetch_8)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_add_64_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_add_and_fetch_8)
 
 #endif /* _ARM_ARCH_6 */

Index: src/common/lib/libc/arch/arm/atomic/atomic_and_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_and_64.S:1.10.28.1 src/common/lib/libc/arch/arm/atomic/atomic_and_64.S:1.10.28.2
--- src/common/lib/libc/arch/arm/atomic/atomic_and_64.S:1.10.28.1	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_and_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_and_64.S,v 1.10.28.1 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_and_64.S,v 1.10.28.2 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_and_64_nv)
 	push	{r3, r4}		/* save temporary */
@@ -45,11 +45,6 @@ ENTRY_NP(_atomic_and_64_nv)
 	strexd	r4, r0, r1, [ip]	/* try to store */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET				/* return new value */
 END(_atomic_and_64_nv)
@@ -57,6 +52,13 @@ END(_atomic_and_64_nv)
 STRONG_ALIAS(_atomic_and_64,_atomic_and_64_nv)
 ATOMIC_OP_ALIAS(atomic_and_64_nv,_atomic_and_64_nv)
 ATOMIC_OP_ALIAS(atomic_and_64,_atomic_and_64_nv)
-CRT_ALIAS(__sync_and_and_fetch_8,_atomic_and_64_nv)
+
+ENTRY_NP(__sync_and_and_fetch_8)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_and_64_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_and_and_fetch_8)
 
 #endif /* _ARM_ARCH_6 */

Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_16.S:1.2 src/common/lib/libc/arch/arm/atomic/atomic_cas_16.S:1.2.32.1
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_16.S:1.2	Tue Mar  4 16:15:28 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_16.S,v 1.2 2014/03/04 16:15:28 matt Exp $ */
+/* $NetBSD: atomic_cas_16.S,v 1.2.32.1 2021/08/11 17:05:42 martin Exp $ */
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -31,6 +31,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -48,17 +49,19 @@ ENTRY_NP(_atomic_cas_16)
 	strexh	r3, r2, [ip]		/* store new value */
 	cmp	r3, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
-#ifdef _ARM_ARCH_7
-	dsb				/* data synchronization barrier */
-#else
-	mcr	p15, 0, r3, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	RET				/* return. */
 END(_atomic_cas_16)
 
 ATOMIC_OP_ALIAS(atomic_cas_16,_atomic_cas_16)
 STRONG_ALIAS(_atomic_cas_short,_atomic_cas_16)
 STRONG_ALIAS(_atomic_cas_ushort,_atomic_cas_16)
-CRT_ALIAS(__sync_val_compare_and_swap_2,_atomic_cas_16)
+
+ENTRY_NP(__sync_val_compare_and_swap_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_cas_16
+	DMB
+	pop	{r4, pc}
+END(__sync_val_compare_and_swap_2)
 
 #endif /* _ARM_ARCH_6 */

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.7 src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.7.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S:1.7	Tue Mar  4 16:15:28 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_cas_32.S,v 1.7 2014/03/04 16:15:28 matt Exp $	*/
+/*	$NetBSD: atomic_cas_32.S,v 1.7.28.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -31,6 +31,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -48,11 +49,6 @@ ENTRY_NP(_atomic_cas_32)
 	strex	r3, r2, [ip]		/* store new value */
 	cmp	r3, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
-#ifdef _ARM_ARCH_7
-	dsb
-#else
-	mcr	p15, 0, r3, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	RET				/* return. */
 END(_atomic_cas_32)
 
@@ -64,7 +60,6 @@ ATOMIC_OP_ALIAS(atomic_cas_32_ni,_atomic
 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)
-CRT_ALIAS(__sync_val_compare_and_swap_4,_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)
@@ -73,4 +68,12 @@ STRONG_ALIAS(_atomic_cas_uint_ni,_atomic
 STRONG_ALIAS(_atomic_cas_ulong_ni,_atomic_cas_32)
 STRONG_ALIAS(_atomic_cas_ptr,_atomic_cas_32)
 
+ENTRY_NP(__sync_val_compare_and_swap_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_cas_32
+	DMB
+	pop	{r4, pc}
+END(__sync_val_compare_and_swap_4)
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S:1.7 src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S:1.7.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S:1.7	Tue Mar  4 03:36:24 2014
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_up.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_cas_up.S,v 1.7 2014/03/04 03:36:24 matt Exp $	*/
+/*	$NetBSD: atomic_cas_up.S,v 1.7.28.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -41,6 +41,7 @@ RAS_START_ASM_HIDDEN(_atomic_cas)
 	cmp	r0, r1
 #if defined(__thumb__)
 	beq	1f
+	str	r2, [r3]
 #else
 	streq	r2, [r3]
 #endif
@@ -75,6 +76,7 @@ RAS_START_ASM_HIDDEN(_atomic_cas_16)
 	cmp	r0, r1
 #if defined(__thumb__)
 	beq	1f
+	strh	r2, [r3]
 #else
 	strheq	r2, [r3]
 #endif
@@ -91,6 +93,7 @@ RAS_START_ASM_HIDDEN(_atomic_cas_8)
 	cmp	r0, r1
 #if defined(__thumb__)
 	beq	1f
+	strb	r2, [r3]
 #else
 	strbeq	r2, [r3]
 #endif
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.7 src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.7.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S:1.7	Fri Nov  8 22:42:52 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_inc_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_inc_32.S,v 1.7 2013/11/08 22:42:52 matt Exp $	*/
+/*	$NetBSD: atomic_inc_32.S,v 1.7.28.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_inc_32)
 1:	ldrex	r3, [r0]		/* load old value (return value) */
@@ -38,13 +38,9 @@ ENTRY_NP(_atomic_inc_32)
 	strex	r2, r3, [r0]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_inc_32)
+
 ATOMIC_OP_ALIAS(atomic_inc_32,_atomic_inc_32)
 ATOMIC_OP_ALIAS(atomic_inc_uint,_atomic_inc_32)
 ATOMIC_OP_ALIAS(atomic_inc_ulong,_atomic_inc_32)
@@ -53,6 +49,7 @@ STRONG_ALIAS(_atomic_inc_uint,_atomic_in
 STRONG_ALIAS(_atomic_inc_ulong,_atomic_inc_32)
 STRONG_ALIAS(_atomic_inc_ptr,_atomic_inc_32)
 
+
 ENTRY_NP(_atomic_inc_32_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrex	r0, [ip]		/* load old value */
@@ -60,11 +57,6 @@ ENTRY_NP(_atomic_inc_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, 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_cas_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S:1.11 src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S:1.11.2.1
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S:1.11	Mon Feb 18 11:22:56 2019
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_cas_64.S,v 1.11 2019/02/18 11:22:56 martin Exp $	*/
+/*	$NetBSD: atomic_cas_64.S,v 1.11.2.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -31,6 +31,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -59,11 +60,6 @@ ENTRY_NP(_atomic_cas_64)
 	strexd	r6, r4, r5, [ip]	/* store new value */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
-#ifdef _ARM_ARCH_7
-	dsb
-#else
-	mcr	p15, 0, ip, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:
 	pop	{r4-r7}			/* restore temporaries */
 	RET				/* return. */
@@ -72,6 +68,13 @@ END(_atomic_cas_64)
 ATOMIC_OP_ALIAS(atomic_cas_64,_atomic_cas_64)
 ATOMIC_OP_ALIAS(atomic_cas_64_ni,_atomic_cas_64)
 STRONG_ALIAS(_atomic_cas_64_ni,_atomic_cas_64)
-CRT_ALIAS(__sync_val_compare_and_swap_8,_atomic_cas_64)
+
+ENTRY_NP(__sync_val_compare_and_swap_8)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_cas_64
+	DMB
+	pop	{r4, pc}
+END(__sync_val_compare_and_swap_8)
 
 #endif /* _ARM_ARCH_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.7.28.1 src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.7.28.2
--- src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S:1.7.28.1	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_cas_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic_cas_8.S,v 1.7.28.1 2021/07/06 04:11:31 martin Exp $ */
+/* $NetBSD: atomic_cas_8.S,v 1.7.28.2 2021/08/11 17:05:42 martin Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,6 +32,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -49,17 +50,19 @@ ENTRY_NP(_atomic_cas_8)
 	strexb	r3, r2, [ip]		/* store new value */
 	cmp	r3, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
-#ifdef _ARM_ARCH_7
-	dsb				/* data synchronization barrier */
-#else
-	mcr	p15, 0, r3, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	RET				/* return. */
 END(_atomic_cas_8)
 
 ATOMIC_OP_ALIAS(atomic_cas_8,_atomic_cas_8)
 STRONG_ALIAS(_atomic_cas_char,_atomic_cas_8)
 STRONG_ALIAS(_atomic_cas_uchar,_atomic_cas_8)
-CRT_ALIAS(__sync_val_compare_and_swap_1,_atomic_cas_8)
+
+ENTRY_NP(__sync_val_compare_and_swap_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_cas_8
+	DMB
+	pop	{r4, pc}
+END(__sync_val_compare_and_swap_1)
 
 #endif /* _ARM_ARCH_6 */

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.5 src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.5.28.1
--- src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S:1.5	Sun Aug 11 04:41:17 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_dec_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_dec_32.S,v 1.5 2013/08/11 04:41:17 matt Exp $	*/
+/*	$NetBSD: atomic_dec_32.S,v 1.5.28.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_dec_32)
 1:	ldrex	r3, [r0]		/* load old value (return value) */
@@ -38,11 +38,6 @@ ENTRY_NP(_atomic_dec_32)
 	strex	r2, r3, [r0]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_dec_32)
 
@@ -54,6 +49,7 @@ STRONG_ALIAS(_atomic_dec_uint,_atomic_de
 STRONG_ALIAS(_atomic_dec_ulong,_atomic_dec_32)
 STRONG_ALIAS(_atomic_dec_ptr,_atomic_dec_32)
 
+
 ENTRY_NP(_atomic_dec_32_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrex	r0, [ip]		/* load old value */
@@ -61,11 +57,6 @@ ENTRY_NP(_atomic_dec_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_dec_32_nv)
 

Index: src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S:1.7 src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S:1.7.30.1
--- src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S:1.7	Sat Nov 30 21:09:11 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_dec_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_dec_64.S,v 1.7 2013/11/30 21:09:11 joerg Exp $	*/
+/*	$NetBSD: atomic_dec_64.S,v 1.7.30.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_dec_64_nv)
 	mov	ip, r0			/* need r0 for return value */
@@ -40,11 +40,6 @@ ENTRY_NP(_atomic_dec_64_nv)
 	strexd	r2, r0, r1, [ip]	/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_dec_64_nv)
 

Index: src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S:1.9 src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S:1.9.30.1
--- src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S:1.9	Sat Nov 30 21:09:11 2013
+++ src/common/lib/libc/arch/arm/atomic/atomic_inc_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_inc_64.S,v 1.9 2013/11/30 21:09:11 joerg Exp $	*/
+/*	$NetBSD: atomic_inc_64.S,v 1.9.30.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_inc_64_nv)
 	mov	ip, r0			/* need r0 for return value */
@@ -40,11 +40,6 @@ ENTRY_NP(_atomic_inc_64_nv)
 	strexd	r2, r0, r1, [ip]	/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_inc_64_nv)
 

Index: src/common/lib/libc/arch/arm/atomic/atomic_nand_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_nand_16.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_nand_16.S:1.3.18.1
--- src/common/lib/libc/arch/arm/atomic/atomic_nand_16.S:1.3	Fri Dec 11 12:41:10 2015
+++ src/common/lib/libc/arch/arm/atomic/atomic_nand_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_nand_16.S,v 1.3 2015/12/11 12:41:10 skrll Exp $	*/
+/*	$NetBSD: atomic_nand_16.S,v 1.3.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_nand_16)
 	mov	ip, r0
@@ -41,19 +41,22 @@ ENTRY_NP(_atomic_nand_16)
 	strexh	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_nand_16)
 
 ATOMIC_OP_ALIAS(atomic_nand_16,_atomic_nand_16)
 ATOMIC_OP_ALIAS(atomic_nand_ushort,_atomic_nand_16)
-CRT_ALIAS(__sync_fetch_and_nand_2,_atomic_nand_16)
 STRONG_ALIAS(_atomic_nand_ushort,_atomic_nand_16)
 
+ENTRY_NP(__sync_fetch_and_nand_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_16
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_nand_2)
+
+
 ENTRY_NP(_atomic_nand_16_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexh	r0, [ip]		/* load old value */
@@ -62,17 +65,20 @@ ENTRY_NP(_atomic_nand_16_nv)
 	strexh	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_nand_16_nv)
 
 ATOMIC_OP_ALIAS(atomic_nand_16_nv,_atomic_nand_16_nv)
 ATOMIC_OP_ALIAS(atomic_nand_ushort_nv,_atomic_nand_16_nv)
-CRT_ALIAS(__sync_nand_and_fetch_2,_atomic_nand_16_nv)
 STRONG_ALIAS(_atomic_nand_ushort_nv,_atomic_nand_16_nv)
 
+ENTRY_NP(__sync_nand_and_fetch_2)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_16_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_nand_and_fetch_2)
+
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_nand_32.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_nand_32.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_nand_32.S:1.3.18.1
--- src/common/lib/libc/arch/arm/atomic/atomic_nand_32.S:1.3	Fri Dec 11 12:41:10 2015
+++ src/common/lib/libc/arch/arm/atomic/atomic_nand_32.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_nand_32.S,v 1.3 2015/12/11 12:41:10 skrll Exp $	*/
+/*	$NetBSD: atomic_nand_32.S,v 1.3.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_nand_32)
 	mov	ip, r0
@@ -41,21 +41,24 @@ ENTRY_NP(_atomic_nand_32)
 	strex	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_nand_32)
 
 ATOMIC_OP_ALIAS(atomic_nand_32,_atomic_nand_32)
 ATOMIC_OP_ALIAS(atomic_nand_uint,_atomic_nand_32)
 ATOMIC_OP_ALIAS(atomic_nand_ulong,_atomic_nand_32)
-CRT_ALIAS(__sync_fetch_and_nand_4,_atomic_nand_32)
 STRONG_ALIAS(_atomic_nand_uint,_atomic_nand_32)
 STRONG_ALIAS(_atomic_nand_ulong,_atomic_nand_32)
 
+ENTRY_NP(__sync_fetch_and_nand_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_32
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_nand_4)
+
+
 ENTRY_NP(_atomic_nand_32_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrex	r0, [ip]		/* load old value */
@@ -64,19 +67,22 @@ ENTRY_NP(_atomic_nand_32_nv)
 	strex	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_nand_32_nv)
 
 ATOMIC_OP_ALIAS(atomic_nand_32_nv,_atomic_nand_32_nv)
 ATOMIC_OP_ALIAS(atomic_nand_uint_nv,_atomic_nand_32_nv)
 ATOMIC_OP_ALIAS(atomic_nand_ulong_nv,_atomic_nand_32_nv)
-CRT_ALIAS(__sync_nand_and_fetch_4,_atomic_nand_32_nv)
 STRONG_ALIAS(_atomic_nand_uint_nv,_atomic_nand_32_nv)
 STRONG_ALIAS(_atomic_nand_ulong_nv,_atomic_nand_32_nv)
 
+ENTRY_NP(__sync_nand_and_fetch_4)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_32_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_nand_and_fetch_4)
+
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_nand_8.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_nand_8.S:1.3 src/common/lib/libc/arch/arm/atomic/atomic_nand_8.S:1.3.18.1
--- src/common/lib/libc/arch/arm/atomic/atomic_nand_8.S:1.3	Fri Dec 11 12:41:10 2015
+++ src/common/lib/libc/arch/arm/atomic/atomic_nand_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_nand_8.S,v 1.3 2015/12/11 12:41:10 skrll Exp $	*/
+/*	$NetBSD: atomic_nand_8.S,v 1.3.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_nand_8)
 	mov	ip, r0
@@ -41,19 +41,22 @@ ENTRY_NP(_atomic_nand_8)
 	strexb	r2, r3, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return old value */
 END(_atomic_nand_8)
 
 ATOMIC_OP_ALIAS(atomic_nand_8,_atomic_nand_8)
 ATOMIC_OP_ALIAS(atomic_nand_uchar,_atomic_nand_8)
-CRT_ALIAS(__sync_fetch_and_nand_1,_atomic_nand_8)
 STRONG_ALIAS(_atomic_nand_uchar,_atomic_nand_8)
 
+ENTRY_NP(__sync_fetch_and_nand_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_8
+	DMB
+	pop	{r4, pc}
+END(__sync_fetch_and_nand_1)
+
+
 ENTRY_NP(_atomic_nand_8_nv)
 	mov	ip, r0			/* need r0 for return value */
 1:	ldrexb	r0, [ip]		/* load old value */
@@ -62,17 +65,20 @@ ENTRY_NP(_atomic_nand_8_nv)
 	strexb	r2, r0, [ip]		/* try to store */
 	cmp	r2, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
 	RET				/* return new value */
 END(_atomic_nand_8_nv)
 
 ATOMIC_OP_ALIAS(atomic_nand_8_nv,_atomic_nand_8_nv)
 ATOMIC_OP_ALIAS(atomic_nand_uchar_nv,_atomic_nand_8_nv)
-CRT_ALIAS(__sync_nand_and_fetch_1,_atomic_nand_8_nv)
 STRONG_ALIAS(_atomic_nand_uchar_nv,_atomic_nand_8_nv)
 
+ENTRY_NP(__sync_nand_and_fetch_1)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_8_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_nand_and_fetch_1)
+
+
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S:1.3 src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S:1.3.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S:1.3	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_1.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sync_bool_compare_and_swap_1.S,v 1.3 2015/05/17 22:08:24 justin Exp $ */
+/* $NetBSD: sync_bool_compare_and_swap_1.S,v 1.3.18.1 2021/08/11 17:05:42 martin Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -32,6 +32,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -51,11 +52,6 @@ ENTRY_NP(__sync_bool_compare_and_swap_1)
 	cmp	r0, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
 	mov	r0, #1			/* it was a success */
-#ifdef _ARM_ARCH_7
-	dsb				/* data synchronization barrier */
-#else
-	mcr	p15, 0, r3, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	RET				/* return. */
 END(__sync_bool_compare_and_swap_1)
 
Index: src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S:1.3 src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S:1.3.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S:1.3	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_2.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: sync_bool_compare_and_swap_2.S,v 1.3 2015/05/17 22:08:24 justin Exp $ */
+/* $NetBSD: sync_bool_compare_and_swap_2.S,v 1.3.18.1 2021/08/11 17:05:42 martin Exp $ */
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -31,6 +31,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -50,11 +51,6 @@ ENTRY_NP(__sync_bool_compare_and_swap_2)
 	cmp	r0, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
 	movs	r0, #1			/* indicate success */
-#ifdef _ARM_ARCH_7
-	dsb				/* data synchronization barrier */
-#else
-	mcr	p15, 0, r3, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	RET				/* return. */
 END(__sync_bool_compare_and_swap_2)
 
Index: src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S:1.3 src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S:1.3.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S:1.3	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_4.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_bool_compare_and_swap_4.S,v 1.3 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_bool_compare_and_swap_4.S,v 1.3.18.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -31,6 +31,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -50,11 +51,6 @@ ENTRY_NP(__sync_bool_compare_and_swap_4)
 	cmp	r0, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
 	movs	r0, #1			/* indicate success */
-#ifdef _ARM_ARCH_7
-	dsb
-#else
-	mcr	p15, 0, r3, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	RET				/* return. */
 END(__sync_bool_compare_and_swap_4)
 

Index: src/common/lib/libc/arch/arm/atomic/atomic_nand_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_nand_64.S:1.4.18.1 src/common/lib/libc/arch/arm/atomic/atomic_nand_64.S:1.4.18.2
--- src/common/lib/libc/arch/arm/atomic/atomic_nand_64.S:1.4.18.1	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_nand_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_nand_64.S,v 1.4.18.1 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_nand_64.S,v 1.4.18.2 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_nand_64_nv)
 	push	{r3, r4}		/* save temporary */
@@ -47,11 +47,6 @@ ENTRY_NP(_atomic_nand_64_nv)
 	strexd	r4, r0, r1, [ip]	/* try to store */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET				/* return new value */
 END(_atomic_nand_64_nv)
@@ -59,6 +54,13 @@ END(_atomic_nand_64_nv)
 STRONG_ALIAS(_atomic_nand_64,_atomic_nand_64_nv)
 ATOMIC_OP_ALIAS(atomic_nand_64_nv,_atomic_nand_64_nv)
 ATOMIC_OP_ALIAS(atomic_nand_64,_atomic_nand_64_nv)
-CRT_ALIAS(__sync_nand_and_fetch_8,_atomic_nand_64_nv)
+
+ENTRY_NP(__sync_nand_and_fetch_8)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_nand_64_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_nand_and_fetch_8)
 
 #endif /* _ARM_ARCH_6 */
Index: src/common/lib/libc/arch/arm/atomic/atomic_swap_16.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap_16.S:1.4.18.1 src/common/lib/libc/arch/arm/atomic/atomic_swap_16.S:1.4.18.2
--- src/common/lib/libc/arch/arm/atomic/atomic_swap_16.S:1.4.18.1	Fri Apr 30 13:54:00 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_swap_16.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_swap_16.S,v 1.4.18.1 2021/04/30 13:54:00 martin Exp $ */
+/*	$NetBSD: atomic_swap_16.S,v 1.4.18.2 2021/08/11 17:05:42 martin Exp $ */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,12 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
+
+ENTRY_NP(__sync_lock_test_and_set_2)
+	DMB
+	/* FALLTHROUGH */
+
 ENTRY_NP(_atomic_swap_16)
 	mov	ip, r0
 1:
@@ -39,30 +44,22 @@ ENTRY_NP(_atomic_swap_16)
 	strexh	r3, r1, [ip]
 	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_16)
+END(__sync_lock_test_and_set_2)
 
 ATOMIC_OP_ALIAS(atomic_swap_16,_atomic_swap_16)
 ATOMIC_OP_ALIAS(atomic_swap_short,_atomic_swap_16)
 ATOMIC_OP_ALIAS(atomic_swap_ushort,_atomic_swap_16)
-CRT_ALIAS(__sync_lock_test_and_set_2,_atomic_swap_16)
 CRT_ALIAS(__atomic_exchange_2,_atomic_swap_16)
 STRONG_ALIAS(_atomic_swap_short,_atomic_swap_16)
 STRONG_ALIAS(_atomic_swap_ushort,_atomic_swap_16)
 
+
 #if (!defined(_KERNEL) || !defined(_RUMPKERNEL)) && !defined(_STANDALONE)
 ENTRY_NP(__sync_lock_release_2)
 	mov	r1, #0
-#ifdef _ARM_ARCH_7
-	dmb	ishst
-#else
-	mcr	p15, 0, r1, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	strh	r1, [r0]
 	RET
 END(__sync_lock_release_2)

Index: src/common/lib/libc/arch/arm/atomic/atomic_op_asm.h
diff -u src/common/lib/libc/arch/arm/atomic/atomic_op_asm.h:1.7 src/common/lib/libc/arch/arm/atomic/atomic_op_asm.h:1.7.18.1
--- src/common/lib/libc/arch/arm/atomic/atomic_op_asm.h:1.7	Sun May 17 20:57:11 2015
+++ src/common/lib/libc/arch/arm/atomic/atomic_op_asm.h	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_op_asm.h,v 1.7 2015/05/17 20:57:11 justin Exp $	*/
+/*	$NetBSD: atomic_op_asm.h,v 1.7.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -74,4 +74,12 @@
 #define	CRT_ALIAS(a,s)
 #endif
 
+#ifdef _ARM_ARCH_7
+#define	DMB	dmb	ish
+#define	DMBST	dmb	ishst
+#else
+#define	DMB	mcr	p15, 0, r0, c7, c10, 5	/* Data Memory Barrier */
+#define	DMBST	DMB
+#endif
+
 #endif /* _ATOMIC_OP_ASM_H_ */

Index: src/common/lib/libc/arch/arm/atomic/atomic_or_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_or_64.S:1.10.28.2 src/common/lib/libc/arch/arm/atomic/atomic_or_64.S:1.10.28.3
--- src/common/lib/libc/arch/arm/atomic/atomic_or_64.S:1.10.28.2	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_or_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_or_64.S,v 1.10.28.2 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_or_64.S,v 1.10.28.3 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_or_64_nv)
 	push	{r3, r4}		/* save temporary */
@@ -45,11 +45,6 @@ ENTRY_NP(_atomic_or_64_nv)
 	strexd	r4, r0, r1, [ip]	/* try to store */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET				/* return new value */
 END(_atomic_or_64_nv)
@@ -57,6 +52,13 @@ END(_atomic_or_64_nv)
 STRONG_ALIAS(_atomic_or_64,_atomic_or_64_nv)
 ATOMIC_OP_ALIAS(atomic_or_64_nv,_atomic_or_64_nv)
 ATOMIC_OP_ALIAS(atomic_or_64,_atomic_or_64)
-CRT_ALIAS(__sync_or_and_fetch_8,_atomic_or_64_nv)
+
+ENTRY_NP(__sync_or_and_fetch_8)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_or_64_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_or_and_fetch_8)
 
 #endif /* _ARM_ARCH_6 */

Index: src/common/lib/libc/arch/arm/atomic/atomic_sub_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_sub_64.S:1.2.32.1 src/common/lib/libc/arch/arm/atomic/atomic_sub_64.S:1.2.32.2
--- src/common/lib/libc/arch/arm/atomic/atomic_sub_64.S:1.2.32.1	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_sub_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_sub_64.S,v 1.2.32.1 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_sub_64.S,v 1.2.32.2 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_sub_64_nv)
 	push	{r3, r4}		/* save temporary */
@@ -46,11 +46,6 @@ ENTRY_NP(_atomic_sub_64_nv)
 	strexd	r4, r0, [ip]		/* try to store */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET				/* return new value */
 END(_atomic_sub_64_nv)
@@ -58,6 +53,14 @@ END(_atomic_sub_64_nv)
 STRONG_ALIAS(_atomic_sub_64,_atomic_sub_64_nv)
 ATOMIC_OP_ALIAS(atomic_sub_64_nv,_atomic_sub_64_nv)
 ATOMIC_OP_ALIAS(atomic_sub_64,_atomic_sub_64)
-CRT_ALIAS(__sync_sub_and_fetch_8,_atomic_sub_64_nv)
+
+ENTRY_NP(__sync_sub_and_fetch_8)
+	push	{r4, lr}
+	DMB
+	bl	_atomic_sub_64_nv
+	DMB
+	pop	{r4, pc}
+END(__sync_sub_and_fetch_8)
+
 
 #endif /* _ARM_ARCH_6 */

Index: src/common/lib/libc/arch/arm/atomic/atomic_swap.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.14.18.2 src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.14.18.3
--- src/common/lib/libc/arch/arm/atomic/atomic_swap.S:1.14.18.2	Fri Apr 30 13:54:00 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_swap.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_swap.S,v 1.14.18.2 2021/04/30 13:54:00 martin Exp $	*/
+/*	$NetBSD: atomic_swap.S,v 1.14.18.3 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2007,2012 The NetBSD Foundation, Inc.
@@ -44,10 +44,14 @@
  * and fix yet again).
  */
 
+ENTRY_NP(__sync_lock_test_and_set_4)
+	DMB
+	/* FALLTHROUGH */
+
 ENTRY_NP(_atomic_swap_32)
 	mov	ip, r0
 1:
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 	ldrex	r0, [ip]
 	cmp	r0, r1
 #ifdef __thumb__
@@ -65,20 +69,15 @@ ENTRY_NP(_atomic_swap_32)
 	cmpne	r3, #0
 #endif
 	bne	1b
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r3, c7, c10, 5	/* data memory barrier */
-#endif
 99:
 	RET
 END(_atomic_swap_32)
+END(__sync_lock_test_and_set_4)
 
 ATOMIC_OP_ALIAS(atomic_swap_32,_atomic_swap_32)
 ATOMIC_OP_ALIAS(atomic_swap_uint,_atomic_swap_32)
 ATOMIC_OP_ALIAS(atomic_swap_ulong,_atomic_swap_32)
 ATOMIC_OP_ALIAS(atomic_swap_ptr,_atomic_swap_32)
-CRT_ALIAS(__sync_lock_test_and_set_4,_atomic_swap_32)
 CRT_ALIAS(__atomic_exchange_4,_atomic_swap_32)
 STRONG_ALIAS(_atomic_swap_uint,_atomic_swap_32)
 STRONG_ALIAS(_atomic_swap_ulong,_atomic_swap_32)
@@ -87,20 +86,21 @@ STRONG_ALIAS(_atomic_swap_ptr,_atomic_sw
 #if (!defined(_KERNEL) || !defined(_RUMPKERNEL)) && !defined(_STANDALONE)
 ENTRY_NP(__sync_lock_release_4)
 	mov	r1, #0
-#ifdef _ARM_ARCH_7
-	dmb	ishst
-#else
-	mcr	p15, 0, r1, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
+
 	str	r1, [r0]
 	RET
 END(__sync_lock_release_4)
 #endif
 
+ENTRY_NP(__sync_lock_test_and_set_1)
+	DMB
+	/* FALLTHROUGH */
+
 ENTRY_NP(_atomic_swap_8)
 	mov	ip, r0
 1:
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 	ldrexb	r0, [ip]
 	strexb	r3, r1, [ip]
 #else
@@ -109,18 +109,13 @@ 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)
+END(__sync_lock_test_and_set_1)
 
 ATOMIC_OP_ALIAS(atomic_swap_8,_atomic_swap_8)
 ATOMIC_OP_ALIAS(atomic_swap_char,_atomic_swap_8)
 ATOMIC_OP_ALIAS(atomic_swap_uchar,_atomic_swap_8)
-CRT_ALIAS(__sync_lock_test_and_set_1,_atomic_swap_8)
 CRT_ALIAS(__atomic_exchange_1,_atomic_swap_8)
 STRONG_ALIAS(_atomic_swap_char,_atomic_swap_8)
 STRONG_ALIAS(_atomic_swap_uchar,_atomic_swap_8)
@@ -128,11 +123,8 @@ STRONG_ALIAS(_atomic_swap_uchar,_atomic_
 #if (!defined(_KERNEL) || !defined(_RUMPKERNEL)) && !defined(_STANDALONE)
 ENTRY_NP(__sync_lock_release_1)
 	mov	r1, #0
-#ifdef _ARM_ARCH_7
-	dmb	ishst
-#else
-	mcr	p15, 0, r1, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
+
 	strb	r1, [r0]
 	RET
 END(__sync_lock_release_1)

Index: src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S:1.10.18.3 src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S:1.10.18.4
--- src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S:1.10.18.3	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_swap_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_swap_64.S,v 1.10.18.3 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_swap_64.S,v 1.10.18.4 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,6 +30,10 @@
 
 #include "atomic_op_asm.h"
 
+ENTRY_NP(__sync_lock_test_and_set_8)
+	DMB
+	/* FALLTHROUGH */
+
 ENTRY_NP(_atomic_swap_64)
 	push	{r3, r4}		/* save temporary */
 	mov	ip, r0			/* return value will be in r0 */
@@ -41,27 +45,21 @@ ENTRY_NP(_atomic_swap_64)
 	strexd	r4, r2, r3, [ip]	/* store new value */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*    no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET
 END(_atomic_swap_64)
+END(__sync_lock_test_and_set_8)
+
+
 ATOMIC_OP_ALIAS(atomic_swap_64,_atomic_swap_64)
-CRT_ALIAS(__sync_lock_test_and_set_8,_atomic_swap_64)
 CRT_ALIAS(__atomic_exchange_8,_atomic_swap_64)
 
 #if (!defined(_KERNEL) || !defined(_RUMPKERNEL)) && !defined(_STANDALONE)
 ENTRY_NP(__sync_lock_release_8)
 	mov	r2, #0
 	mov	r3, #0
-#ifdef _ARM_ARCH_7
-	dmb	ishst
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+
+	DMB
 	strd	r2, r3, [r0]
 	RET
 END(__sync_lock_release_8)

Index: src/common/lib/libc/arch/arm/atomic/atomic_xor_64.S
diff -u src/common/lib/libc/arch/arm/atomic/atomic_xor_64.S:1.3.32.2 src/common/lib/libc/arch/arm/atomic/atomic_xor_64.S:1.3.32.3
--- src/common/lib/libc/arch/arm/atomic/atomic_xor_64.S:1.3.32.2	Tue Jul  6 04:11:31 2021
+++ src/common/lib/libc/arch/arm/atomic/atomic_xor_64.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_xor_64.S,v 1.3.32.2 2021/07/06 04:11:31 martin Exp $	*/
+/*	$NetBSD: atomic_xor_64.S,v 1.3.32.3 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,7 +30,7 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_atomic_xor_64_nv)
 	push	{r3, r4}		/* save temporary */
@@ -45,11 +45,6 @@ ENTRY_NP(_atomic_xor_64_nv)
 	strexd	r4, r0, r1, [ip]	/* try to store */
 	cmp	r4, #0			/*   succeed? */
 	bne	1b			/*     no, try again? */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r4, c7, c10, 5	/* data memory barrier */
-#endif
 	pop	{r3, r4}		/* restore temporary */
 	RET				/* return new value */
 END(_atomic_xor_64_nv)

Index: src/common/lib/libc/arch/arm/atomic/membar_ops.S
diff -u src/common/lib/libc/arch/arm/atomic/membar_ops.S:1.6.28.1 src/common/lib/libc/arch/arm/atomic/membar_ops.S:1.6.28.2
--- src/common/lib/libc/arch/arm/atomic/membar_ops.S:1.6.28.1	Fri Apr 30 13:54:00 2021
+++ src/common/lib/libc/arch/arm/atomic/membar_ops.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: membar_ops.S,v 1.6.28.1 2021/04/30 13:54:00 martin Exp $	*/
+/*	$NetBSD: membar_ops.S,v 1.6.28.2 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -30,15 +30,10 @@
 
 #include "atomic_op_asm.h"
 
-#ifdef _ARM_ARCH_6
+#if defined(_ARM_ARCH_6)
 
 ENTRY_NP(_membar_producer)
-#ifdef _ARM_ARCH_7
-	dmb	ishst
-#else
-	mov	r0, #0
-	mcr	p15, 0, r0, c7, c10, 5	/* Data Memory Barrier */
-#endif
+	DMBST
 	RET
 END(_membar_producer)
 ATOMIC_OP_ALIAS(membar_producer,_membar_producer)
@@ -46,12 +41,7 @@ ATOMIC_OP_ALIAS(membar_write,_membar_pro
 STRONG_ALIAS(_membar_write,_membar_producer)
 
 ENTRY_NP(_membar_sync)
-#ifdef _ARM_ARCH_7
-	dmb	ish
-#else
-	mov	r0, #0
-	mcr	p15, 0, r0, c7, c10, 5	/* Data Memory Barrier */
-#endif
+	DMB
 	RET
 END(_membar_sync)
 ATOMIC_OP_ALIAS(membar_sync,_membar_sync)
@@ -59,7 +49,7 @@ ATOMIC_OP_ALIAS(membar_enter,_membar_syn
 ATOMIC_OP_ALIAS(membar_exit,_membar_sync)
 ATOMIC_OP_ALIAS(membar_consumer,_membar_sync)
 ATOMIC_OP_ALIAS(membar_read,_membar_sync)
-CRT_ALIAS(__sync_synchronize,_membar_sync)
+STRONG_ALIAS(__sync_synchronize,_membar_sync)
 STRONG_ALIAS(_membar_enter,_membar_sync)
 STRONG_ALIAS(_membar_exit,_membar_sync)
 STRONG_ALIAS(_membar_consumer,_membar_sync)

Index: src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S:1.4 src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S:1.4.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S:1.4	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_bool_compare_and_swap_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_bool_compare_and_swap_8.S,v 1.4 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_bool_compare_and_swap_8.S,v 1.4.18.1 2021/08/11 17:05:42 martin Exp $	*/
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -31,6 +31,7 @@
 #include "atomic_op_asm.h"
 
 #if defined(_ARM_ARCH_6)
+
 /*
  * ARMv6 has load-exclusive/store-exclusive which works for both user
  * and kernel.
@@ -61,11 +62,6 @@ ENTRY_NP(__sync_bool_compare_and_swap_8)
 	cmp	r0, #0			/*   succeed? */
 	bne	1b			/*     nope, try again. */
 	movs	r0, #1			/* indicate success */
-#ifdef _ARM_ARCH_7
-	dsb
-#else
-	mcr	p15, 0, ip, c7, c10, 4	/* data synchronization barrier */
-#endif
 2:	pop	{r4-r7}			/* restore temporaries */
 	RET				/* return. */
 END(__sync_bool_compare_and_swap_8)

Index: src/common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S:1.5 src/common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S:1.5.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S:1.5	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_fetch_and_add_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_fetch_and_add_8.S,v 1.5 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_fetch_and_add_8.S,v 1.5.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,17 +40,14 @@ ENTRY_NP(__sync_fetch_and_add_8)
 	mov	r3, r2
 	mov	r2, r1
 #endif
+	DMB
 1:	ldrexd	r0, r1, [ip]		/* load old value */
 	adds	TLO, LO, NLO		/* calculate new value */
 	adcs	THI, HI, NHI		/* calculate new value */
 	strexd	r6, r4, r5, [ip]	/* try to store */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	pop	{r4-r7}
 	RET				/* return old value */
 END(__sync_fetch_and_add_8)
Index: src/common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S:1.5 src/common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S:1.5.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S:1.5	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_fetch_and_and_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_fetch_and_and_8.S,v 1.5 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_fetch_and_and_8.S,v 1.5.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,17 +40,14 @@ ENTRY_NP(__sync_fetch_and_and_8)
 	mov	r3, r2
 	mov	r2, r1
 #endif
+	DMB
 1:	ldrexd	r0, r1, [ip]		/* load old value */
 	ands	r4, r0, r2		/* calculate new value */
 	ands	r5, r1, r3		/* calculate new value */
 	strexd	r6, r4, r5, [ip]	/* try to store */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	pop	{r4-r7}
 	RET				/* return old value */
 END(__sync_fetch_and_and_8)
Index: src/common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S:1.5 src/common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S:1.5.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S:1.5	Fri Dec 11 12:41:10 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_fetch_and_nand_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_fetch_and_nand_8.S,v 1.5 2015/12/11 12:41:10 skrll Exp $	*/
+/*	$NetBSD: sync_fetch_and_nand_8.S,v 1.5.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,6 +40,7 @@ ENTRY_NP(__sync_fetch_and_nand_8)
 	mov	r3, r2
 	mov	r2, r1
 #endif
+	DMB
 1:	ldrexd	r0, r1, [ip]		/* load old value */
 	ands	r4, r0, r2		/* calculate new value step 1 */
 	ands	r5, r1, r3		/* calculate new value step 1 */
@@ -48,11 +49,7 @@ ENTRY_NP(__sync_fetch_and_nand_8)
 	strexd	r6, r4, r5, [ip]	/* try to store */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	pop	{r4-r7}
 	RET				/* return old value */
 END(__sync_fetch_and_nand_8)
Index: src/common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S:1.5 src/common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S:1.5.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S:1.5	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_fetch_and_or_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_fetch_and_or_8.S,v 1.5 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_fetch_and_or_8.S,v 1.5.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,17 +40,14 @@ ENTRY_NP(__sync_fetch_and_or_8)
 	mov	r3, r2
 	mov	r2, r1
 #endif
+	DMB
 1:	ldrexd	r0, r1, [ip]		/* load old value */
 	orrs	r4, r0, r2		/* calculate new value */
 	orrs	r5, r1, r3		/* calculate new value */
 	strexd	r6, r4, r5, [ip]	/* try to store */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	pop	{r4-r7}
 	RET				/* return old value */
 END(__sync_fetch_and_or_8)
Index: src/common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S:1.5 src/common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S:1.5.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S:1.5	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_fetch_and_sub_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_fetch_and_sub_8.S,v 1.5 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_fetch_and_sub_8.S,v 1.5.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,17 +40,14 @@ ENTRY_NP(__sync_fetch_and_sub_8)
 	mov	r3, r2
 	mov	r2, r1
 #endif
+	DMB
 1:	ldrexd	r0, r1, [ip]		/* load old value */
 	subs	TLO, LO, NLO		/* calculate new value */
 	sbcs	THI, HI, NHI		/* calculate new value */
 	strexd	r6, r4, r5, [ip]	/* try to store */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	pop	{r4-r7}
 	RET				/* return old value */
 END(__sync_fetch_and_sub_8)
Index: src/common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.S
diff -u src/common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.S:1.5 src/common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.S:1.5.18.1
--- src/common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.S:1.5	Sun May 17 22:08:24 2015
+++ src/common/lib/libc/arch/arm/atomic/sync_fetch_and_xor_8.S	Wed Aug 11 17:05:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: sync_fetch_and_xor_8.S,v 1.5 2015/05/17 22:08:24 justin Exp $	*/
+/*	$NetBSD: sync_fetch_and_xor_8.S,v 1.5.18.1 2021/08/11 17:05:42 martin Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -40,17 +40,14 @@ ENTRY_NP(__sync_fetch_and_xor_8)
 	mov	r3, r2
 	mov	r2, r1
 #endif
+	DMB
 1:	ldrexd	r0, r1, [ip]		/* load old value */
 	eors	r4, r0, r2		/* calculate new value */
 	eors	r5, r1, r3		/* calculate new value */
 	strexd	r6, r4, r5, [ip]	/* try to store */
 	cmp	r6, #0			/*   succeed? */
 	bne	1b			/*     no, try again */
-#ifdef _ARM_ARCH_7
-	dmb
-#else
-	mcr	p15, 0, r2, c7, c10, 5	/* data memory barrier */
-#endif
+	DMB
 	pop	{r4-r7}
 	RET				/* return old value */
 END(__sync_fetch_and_xor_8)

Reply via email to