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)