Module Name: src
Committed By: skrll
Date: Tue Apr 27 09:14:24 UTC 2021
Modified Files:
src/common/lib/libc: Makefile.inc
src/common/lib/libc/arch/aarch64/atomic: Makefile.inc
Added Files:
src/common/lib/libc/arch/aarch64/atomic: __aarch64_lse.S
Removed Files:
src/common/lib/libc/arch/aarch64/atomic: __aarch64_swp1_acq.S
__aarch64_swp1_acq_rel.S __aarch64_swp1_rel.S
__aarch64_swp1_relax.S __aarch64_swp2_acq.S
__aarch64_swp2_acq_rel.S __aarch64_swp2_rel.S
__aarch64_swp2_relax.S __aarch64_swp4_acq.S
__aarch64_swp4_acq_rel.S __aarch64_swp4_rel.S
__aarch64_swp4_relax.S __aarch64_swp8_acq.S
__aarch64_swp8_acq_rel.S __aarch64_swp8_rel.S
__aarch64_swp8_relax.S
Log Message:
Provide all the LSE operation fuctions. The use of LSE instructions is
currently disabled.
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/common/lib/libc/Makefile.inc
cvs rdiff -u -r1.3 -r1.4 src/common/lib/libc/arch/aarch64/atomic/Makefile.inc
cvs rdiff -u -r0 -r1.1 \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S
cvs rdiff -u -r1.1 -r0 \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_acq.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_acq_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp1_relax.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_acq.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_acq_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp2_relax.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_acq.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_acq_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp4_relax.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_acq.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_acq_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_rel.S \
src/common/lib/libc/arch/aarch64/atomic/__aarch64_swp8_relax.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/Makefile.inc
diff -u src/common/lib/libc/Makefile.inc:1.20 src/common/lib/libc/Makefile.inc:1.21
--- src/common/lib/libc/Makefile.inc:1.20 Thu Apr 30 03:28:18 2020
+++ src/common/lib/libc/Makefile.inc Tue Apr 27 09:14:24 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.20 2020/04/30 03:28:18 riastradh Exp $
+# $NetBSD: Makefile.inc,v 1.21 2021/04/27 09:14:24 skrll Exp $
.include <bsd.own.mk>
@@ -44,5 +44,6 @@ COMMON_ARCHDIR=${COMMON_DIR}/arch/${COMM
CPPFLAGS+=-I${COMMON_DIR}/quad -I${COMMON_DIR}/string
.if defined(COMMON_ARCHSUBDIR)
CPPFLAGS+=-I${COMMON_ARCHDIR}/string
+CPPFLAGS+=-I${COMMON_ARCHDIR}/atomic
.endif
CPPFLAGS+=-I${COMMON_DIR}/hash/sha3
Index: src/common/lib/libc/arch/aarch64/atomic/Makefile.inc
diff -u src/common/lib/libc/arch/aarch64/atomic/Makefile.inc:1.3 src/common/lib/libc/arch/aarch64/atomic/Makefile.inc:1.4
--- src/common/lib/libc/arch/aarch64/atomic/Makefile.inc:1.3 Wed Apr 21 16:23:47 2021
+++ src/common/lib/libc/arch/aarch64/atomic/Makefile.inc Tue Apr 27 09:14:24 2021
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.inc,v 1.3 2021/04/21 16:23:47 skrll Exp $
+# $NetBSD: Makefile.inc,v 1.4 2021/04/27 09:14:24 skrll Exp $
.if defined(LIB) && (${LIB} == "kern" || ${LIB} == "c" || ${LIB} == "pthread" \
|| ${LIB} == "rump")
@@ -12,13 +12,24 @@ SRCS.atomic+= atomic_dec_32.S atomic_dec
SRCS.atomic+= atomic_inc_32.S atomic_inc_64.S
SRCS.atomic+= membar_ops.S
#and cas nand or sub swap xor
-.for op in swp
+.for op in swp cas clr set eor add
.for sz in 1 2 4 8
-.for ar in relax acq rel acq_rel
-SRCS.atomic+= __aarch64_${op}${sz}_${ar}.S
+.for ar in _relax _acq _rel _acq_rel
+__aarch64_${op}${sz}${ar}.S: __aarch64_lse.S
+ ${_MKTARGET_CREATE}
+ printf '#define OP ${op}\n#define OP_${op}\n#define SZ ${sz}\n#define AR ${ar}\n#define AR${ar}\n#include "__aarch64_lse.S"\n' > ${.TARGET}
+SRCS.gen+= __aarch64_${op}${sz}${ar}.S
.endfor
.endfor
.endfor
+.for op in casp
+.for ar in _relax _acq _rel _acq_rel
+__aarch64_${op}${ar}.S: __aarch64_lse.S
+ ${_MKTARGET_CREATE}
+ printf '#define OP ${op}\n#define OP_${op}\n#define AR ${ar}\n#define AR${ar}\n#include "__aarch64_lse.S"\n' > ${.TARGET}
+SRCS.gen+= __aarch64_${op}${ar}.S
+.endfor
+.endfor
#.for op in add and nand or sub xor
#SRCS.atomic+= sync_fetch_and_${op}_8.S
#.endfor
@@ -30,4 +41,5 @@ SRCS.atomic+= __aarch64_${op}${sz}_${ar}
SRCS.atomic+= atomic_init_cas.c
-SRCS+= ${SRCS.atomic}
+SRCS+= ${SRCS.atomic} ${SRCS.gen}
+CLEANFILES+= ${SRCS.gen}
Added files:
Index: src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S
diff -u /dev/null src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S:1.1
--- /dev/null Tue Apr 27 09:14:24 2021
+++ src/common/lib/libc/arch/aarch64/atomic/__aarch64_lse.S Tue Apr 27 09:14:24 2021
@@ -0,0 +1,207 @@
+/* $NetBSD: __aarch64_lse.S,v 1.1 2021/04/27 09:14:24 skrll Exp $ */
+
+/*-
+ * Copyright (c) 2021 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Nick Hudson.
+w *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#include "atomic_op_asm.h"
+
+#if SZ == 1
+#define OPSFX b
+#define R0 w0
+#define R1 w1
+#define R4 w4
+#endif
+
+#if SZ == 2
+#define OPSFX h
+#define R0 w0
+#define R1 w1
+#define R4 w4
+#endif
+
+#if SZ == 4
+#define OPSFX
+#define R0 w0
+#define R1 w1
+#define R4 w4
+#endif
+
+#if SZ == 8
+#define OPSFX
+#define R0 x0
+#define R1 x1
+#define R4 x4
+#endif
+
+#if defined(AR_relax)
+#define ACQ
+#define REL
+#endif
+
+#if defined(AR_acq)
+#define ACQ a
+#define REL
+#endif
+
+#if defined(AR_rel)
+#define ACQ
+#define REL l
+#endif
+
+#if defined(AR_acq_rel)
+#define ACQ a
+#define REL l
+#endif
+
+#if defined(OP_clr)
+#define INSNOP bic
+#endif
+
+#if defined(OP_set)
+#define INSNOP orr
+#endif
+
+#if defined(OP_add)
+#define INSNOP add
+#endif
+
+#if defined(OP_eor)
+#define INSNOP eor
+#endif
+
+#define _CONCAT3(A, B, C) __CONCAT3(A,B,C)
+#define _CONCAT4(A, B, C, D) __CONCAT4(A,B,C,D)
+#define _CONCAT5(A, B, C, D, E) __CONCAT5(A,B,C,D,E)
+
+#define FUNC2 _CONCAT3(__aarch64_,OP,AR)
+#define FUNC3 _CONCAT4(__aarch64_,OP,SZ,AR)
+
+#define CASP_FUNC FUNC2
+#define CAS_FUNC FUNC3
+#define SWP_FUNC FUNC3
+#define INSN_FUNC FUNC3
+
+#define LDXR _CONCAT4(ld, ACQ, xr, OPSFX)
+#define STXR _CONCAT4(st, REL, xr, OPSFX)
+#define LDXP _CONCAT3(ld, ACQ, xp)
+#define STXP _CONCAT3(st, REL, xp)
+
+#ifdef _HAVE_LSE
+#define SWP _CONCAT4(swp, ACQ, REL, OPSFX)
+#define CAS _CONCAT4(cas, ACQ, REL, OPSFX)
+#define CASP _CONCAT3(casp, ACQ, REL)
+#define INSN _CONCAT5(ld, OP, ACQ, REL, OPSFX)
+
+ .hidden __aarch64_have_lse_atomics
+ .arch armv8-a+lse
+
+#define DO_LSE_INSN_IF_SUPPORTED(label) \
+ adrp x4, __aarch64_have_lse_atomics ;\
+ ldrb w4, [x4, #:lo12:__aarch64_have_lse_atomics] ;\
+ cbnz w4, label
+
+#endif
+
+#if defined(OP_swp)
+ENTRY_NP(SWP_FUNC)
+#ifdef _HAVE_LSE
+ DO_LSE_INSN_IF_SUPPORTED(99f)
+ SWP R0, R0, [x1]
+ ret
+99:
+#endif
+ mov x4, x0 /* need x0 for return value */
+1: LDXR R0, [x1] /* load old value */
+ STXR w3, R4, [x1] /* store new value */
+ cbnz w3, 2f /* succeed?? no, try again */
+ ret /* return old value */
+2: b 1b
+END(SWP_FUNC)
+#endif
+
+#if defined(OP_cas)
+ENTRY_NP(CAS_FUNC)
+#ifdef _HAVE_LSE
+ DO_LSE_INSN_IF_SUPPORTED(99f)
+ CAS R0, R1, [x2]
+ ret
+99:
+#endif
+ mov x4, x0 /* need x0 for return value */
+1: LDXR R0, [x2] /* load old value */
+ cmp R0, R4 /* compare */
+ b.ne 2f /* not equal? return */
+ STXR w3, R1, [x2] /* store new value */
+ cbnz w3, 3f /* succeed? nope, try again. */
+2: ret /* return. */
+3: b 1b
+END(CAS_FUNC)
+#endif
+
+#if defined(OP_casp)
+ENTRY_NP(CASP_FUNC)
+#ifdef _HAVE_LSE
+ DO_LSE_INSN_IF_SUPPORTED(99f)
+ CASP x0, x1, x2, x3, [x4]
+ ret
+99:
+#endif
+ mov x4, x0 /* need x0 for return value */
+1: LDXP x5, x6, [x4] /* load old value */
+ cmp x5, x0 /* compare */
+ b.ne 2f /* not equal? return */
+ cmp x6, x1
+ b.ne 2f /* not equal? return */
+ STXP w7, x2, x3, [x4] /* store new value */
+ cbnz w7, 3f /* succeed? nope, try again. */
+2: ret /* return. */
+3: b 1b
+END(CASP_FUNC)
+#endif
+
+#if defined(OP_set) || defined(OP_clr) || defined(OP_add) || defined(OP_eor)
+ENTRY_NP(INSN_FUNC)
+#ifdef _HAVE_LSE
+ DO_LSE_INSN_IF_SUPPORTED(99f)
+ INSN R0, R0, [x1]
+ ret
+99:
+#endif
+ mov x4, x0 /* need x0 for return value */
+1: LDXR R0, [x1] /* load old value */
+ INSNOP R4, R0, R4
+ STXR w3, R4, [x1] /* store new value */
+ cbnz w3, 2f /* succeed?? no, try again */
+ ret /* return old value */
+2: b 1b
+END(INSN_FUNC)
+#endif
+