Module Name:    src
Committed By:   skrll
Date:           Thu Aug  6 10:00:21 UTC 2020

Modified Files:
        src/common/lib/libc/arch/mips/atomic: atomic_add.S atomic_and.S
            atomic_cas.S atomic_dec.S atomic_inc.S atomic_or.S atomic_swap.S
        src/sys/arch/mips/include: asm.h
        src/sys/arch/mips/mips: lock_stubs_llsc.S

Log Message:
Centralise SYNC/BDSYNC in asm.h and introduce a new LLCSCSYNC and use it
before any ll/sc sequences.

Define LLSCSYNC as syncw; syncw for cnMIPS - issue two as early cnMIPS
has errat{um,a} that means the first can fail.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/common/lib/libc/arch/mips/atomic/atomic_add.S \
    src/common/lib/libc/arch/mips/atomic/atomic_dec.S \
    src/common/lib/libc/arch/mips/atomic/atomic_inc.S \
    src/common/lib/libc/arch/mips/atomic/atomic_swap.S
cvs rdiff -u -r1.5 -r1.6 src/common/lib/libc/arch/mips/atomic/atomic_and.S \
    src/common/lib/libc/arch/mips/atomic/atomic_or.S
cvs rdiff -u -r1.7 -r1.8 src/common/lib/libc/arch/mips/atomic/atomic_cas.S
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/mips/include/asm.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/mips/mips/lock_stubs_llsc.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/mips/atomic/atomic_add.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_add.S:1.6 src/common/lib/libc/arch/mips/atomic/atomic_add.S:1.7
--- src/common/lib/libc/arch/mips/atomic/atomic_add.S:1.6	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_add.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_add.S,v 1.6 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_add.S,v 1.7 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 #include "atomic_op_asm.h"
 
-RCSID("$NetBSD: atomic_add.S,v 1.6 2020/08/01 09:26:49 skrll Exp $")
+RCSID("$NetBSD: atomic_add.S,v 1.7 2020/08/06 10:00:21 skrll Exp $")
 
 	.text
 	.set	noreorder
@@ -49,6 +49,7 @@ LEAF(_atomic_add_32)
 #if defined(_MIPS_ARCH_OCTEONP) || defined(_MIPS_ARCH_OCTEON2)
 	saa		a1, (a0)
 #else
+	LLSCSYNC
 1:	INT_LL		t0, 0(a0)
 	 nop
 	INT_ADDU	t0, a1
@@ -62,6 +63,7 @@ END(_atomic_add_32)
 ATOMIC_OP_ALIAS(atomic_add_32, _atomic_add_32)
 
 LEAF(_atomic_add_32_nv)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	INT_ADDU	v0, a1
@@ -79,6 +81,7 @@ LEAF(_atomic_add_64)
 #if defined(_MIPS_ARCH_OCTEONP) || defined(_MIPS_ARCH_OCTEON2)
 	saad		a1, (a0)
 #else
+	LLSCSYNC
 1:	REG_LL		t0, 0(a0)
 	 nop
 	REG_ADDU	t0, a1
@@ -92,6 +95,7 @@ END(_atomic_add_64)
 ATOMIC_OP_ALIAS(atomic_add_64, _atomic_add_64)
 
 LEAF(_atomic_add_64_nv)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	REG_ADDU	v0, a1
Index: src/common/lib/libc/arch/mips/atomic/atomic_dec.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_dec.S:1.6 src/common/lib/libc/arch/mips/atomic/atomic_dec.S:1.7
--- src/common/lib/libc/arch/mips/atomic/atomic_dec.S:1.6	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_dec.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_dec.S,v 1.6 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_dec.S,v 1.7 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 #include "atomic_op_asm.h"
 
-RCSID("$NetBSD: atomic_dec.S,v 1.6 2020/08/01 09:26:49 skrll Exp $")
+RCSID("$NetBSD: atomic_dec.S,v 1.7 2020/08/06 10:00:21 skrll Exp $")
 
 	.text
 	.set	noreorder
@@ -49,6 +49,7 @@ LEAF(_atomic_dec_32)
 	li		t0, -1
 	saa		t0, (a0)
 #else
+	LLSCSYNC
 1:	INT_LL		t0, 0(a0)
 	 nop
 	INT_ADDU	t0, -1
@@ -62,6 +63,7 @@ END(_atomic_dec_32)
 ATOMIC_OP_ALIAS(atomic_dec_32, _atomic_dec_32)
 
 LEAF(_atomic_dec_32_nv)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	INT_ADDU	v0, -1
@@ -80,6 +82,7 @@ LEAF(_atomic_dec_64)
 	li		t0, -1
 	saad		t0, (a0)
 #else
+	LLSCSYNC
 1:	REG_LL		t0, 0(a0)
 	 nop
 	REG_ADDU	t0, -1
@@ -93,6 +96,7 @@ END(_atomic_dec_64)
 ATOMIC_OP_ALIAS(atomic_dec_64, _atomic_dec_64)
 
 LEAF(_atomic_dec_64_nv)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	REG_ADDU	v0, -1
Index: src/common/lib/libc/arch/mips/atomic/atomic_inc.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_inc.S:1.6 src/common/lib/libc/arch/mips/atomic/atomic_inc.S:1.7
--- src/common/lib/libc/arch/mips/atomic/atomic_inc.S:1.6	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_inc.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_inc.S,v 1.6 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_inc.S,v 1.7 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 #include "atomic_op_asm.h"
 
-RCSID("$NetBSD: atomic_inc.S,v 1.6 2020/08/01 09:26:49 skrll Exp $")
+RCSID("$NetBSD: atomic_inc.S,v 1.7 2020/08/06 10:00:21 skrll Exp $")
 
 	.text
 	.set	noreorder
@@ -50,6 +50,7 @@ LEAF(_atomic_inc_32)
 	li		t0, 1
 	saa		t0, (a0)
 #else
+	LLSCSYNC
 1:	INT_LL		t0, 0(a0)
 	 nop
 	INT_ADDU	t0, 1
@@ -63,6 +64,7 @@ END(_atomic_inc_32)
 ATOMIC_OP_ALIAS(atomic_inc_32, _atomic_inc_32)
 
 LEAF(_atomic_inc_32_nv)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	INT_ADDU	v0, 1
@@ -81,6 +83,7 @@ LEAF(_atomic_inc_64)
 	li		t0, 1
 	saad		t0, (a0)
 #else
+	LLSCSYNC
 1:	REG_LL		t0, 0(a0)
 	 nop
 	REG_ADDU	t0, 1
@@ -94,6 +97,7 @@ END(_atomic_inc_64)
 ATOMIC_OP_ALIAS(atomic_inc_64, _atomic_inc_64)
 
 LEAF(_atomic_inc_64_nv)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	REG_ADDU	v0, 1
Index: src/common/lib/libc/arch/mips/atomic/atomic_swap.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_swap.S:1.6 src/common/lib/libc/arch/mips/atomic/atomic_swap.S:1.7
--- src/common/lib/libc/arch/mips/atomic/atomic_swap.S:1.6	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_swap.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_swap.S,v 1.6 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_swap.S,v 1.7 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 #include "atomic_op_asm.h"
 
-RCSID("$NetBSD: atomic_swap.S,v 1.6 2020/08/01 09:26:49 skrll Exp $")
+RCSID("$NetBSD: atomic_swap.S,v 1.7 2020/08/06 10:00:21 skrll Exp $")
 
 	.text
 	.set	noreorder
@@ -44,8 +44,8 @@ RCSID("$NetBSD: atomic_swap.S,v 1.6 2020
 	.set	nomacro
 #endif /* _KERNEL_OPT */
 
-
 LEAF(_atomic_swap_32)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	move		t0, a1
@@ -60,6 +60,7 @@ ATOMIC_OP_ALIAS(atomic_swap_32, _atomic_
 
 #if !defined(__mips_o32)
 LEAF(_atomic_swap_64)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	move		t0, a1

Index: src/common/lib/libc/arch/mips/atomic/atomic_and.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_and.S:1.5 src/common/lib/libc/arch/mips/atomic/atomic_and.S:1.6
--- src/common/lib/libc/arch/mips/atomic/atomic_and.S:1.5	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_and.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_and.S,v 1.5 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_and.S,v 1.6 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 #include "atomic_op_asm.h"
 
-RCSID("$NetBSD: atomic_and.S,v 1.5 2020/08/01 09:26:49 skrll Exp $")
+RCSID("$NetBSD: atomic_and.S,v 1.6 2020/08/06 10:00:21 skrll Exp $")
 
 	.text
 	.set	noreorder
@@ -46,6 +46,7 @@ RCSID("$NetBSD: atomic_and.S,v 1.5 2020/
 
 
 LEAF(_atomic_and_32)
+	LLSCSYNC
 1:	INT_LL		t0, 0(a0)
 	 nop
 	and		t0, a1
@@ -58,6 +59,7 @@ END(_atomic_and_32)
 ATOMIC_OP_ALIAS(atomic_and_32, _atomic_and_32)
 
 LEAF(_atomic_and_32_nv)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	and		v0, a1
@@ -72,6 +74,7 @@ ATOMIC_OP_ALIAS(atomic_and_32_nv, _atomi
 
 #if !defined(__mips_o32)
 LEAF(_atomic_and_64)
+	LLSCSYNC
 1:	REG_LL		t0, 0(a0)
 	 nop
 	and		t0, a1
@@ -84,6 +87,7 @@ END(_atomic_and_64)
 ATOMIC_OP_ALIAS(atomic_and_64, _atomic_and_64)
 
 LEAF(_atomic_and_64_nv)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	and		v0, a1
Index: src/common/lib/libc/arch/mips/atomic/atomic_or.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_or.S:1.5 src/common/lib/libc/arch/mips/atomic/atomic_or.S:1.6
--- src/common/lib/libc/arch/mips/atomic/atomic_or.S:1.5	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_or.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_or.S,v 1.5 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_or.S,v 1.6 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -43,6 +43,7 @@
 #endif /* _KERNEL_OPT */
 
 LEAF(_atomic_or_32)
+	LLSCSYNC
 1:	INT_LL		t0, 0(a0)
 	 nop
 	or		t0, a1
@@ -55,6 +56,7 @@ END(_atomic_or_32)
 ATOMIC_OP_ALIAS(atomic_or_32, _atomic_or_32)
 
 LEAF(_atomic_or_32_nv)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	or		v0, a1
@@ -69,6 +71,7 @@ ATOMIC_OP_ALIAS(atomic_or_32_nv, _atomic
 
 #if !defined(__mips_o32)
 LEAF(_atomic_or_64)
+	LLSCSYNC
 1:	REG_LL		t0, 0(a0)
 	 nop
 	or		t0, a1
@@ -81,6 +84,7 @@ END(_atomic_or_64)
 ATOMIC_OP_ALIAS(atomic_or_64, _atomic_or_64)
 
 LEAF(_atomic_or_64_nv)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	or		v0, a1

Index: src/common/lib/libc/arch/mips/atomic/atomic_cas.S
diff -u src/common/lib/libc/arch/mips/atomic/atomic_cas.S:1.7 src/common/lib/libc/arch/mips/atomic/atomic_cas.S:1.8
--- src/common/lib/libc/arch/mips/atomic/atomic_cas.S:1.7	Sat Aug  1 09:26:49 2020
+++ src/common/lib/libc/arch/mips/atomic/atomic_cas.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: atomic_cas.S,v 1.7 2020/08/01 09:26:49 skrll Exp $	*/
+/*	$NetBSD: atomic_cas.S,v 1.8 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
 #include <machine/asm.h>
 #include "atomic_op_asm.h"
 
-RCSID("$NetBSD: atomic_cas.S,v 1.7 2020/08/01 09:26:49 skrll Exp $")
+RCSID("$NetBSD: atomic_cas.S,v 1.8 2020/08/06 10:00:21 skrll Exp $")
 
 	.text
 	.set	noat
@@ -37,6 +37,7 @@ RCSID("$NetBSD: atomic_cas.S,v 1.7 2020/
 	.set	nomacro
 
 LEAF(_atomic_cas_32)
+	LLSCSYNC
 1:	INT_LL		v0, 0(a0)
 	 nop
 	bne		v0, a1, 2f
@@ -58,6 +59,7 @@ ATOMIC_OP_ALIAS(atomic_cas_32_ni, _atomi
 
 #if !defined(__mips_o32)
 LEAF(_atomic_cas_64)
+	LLSCSYNC
 1:	REG_LL		v0, 0(a0)
 	 nop
 	bne		v0, a1, 2f

Index: src/sys/arch/mips/include/asm.h
diff -u src/sys/arch/mips/include/asm.h:1.57 src/sys/arch/mips/include/asm.h:1.58
--- src/sys/arch/mips/include/asm.h:1.57	Sun Jul 26 08:08:41 2020
+++ src/sys/arch/mips/include/asm.h	Thu Aug  6 10:00:20 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: asm.h,v 1.57 2020/07/26 08:08:41 simonb Exp $	*/
+/*	$NetBSD: asm.h,v 1.58 2020/08/06 10:00:20 skrll Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -54,6 +54,10 @@
 #ifndef _MIPS_ASM_H
 #define	_MIPS_ASM_H
 
+#include "opt_cputype.h"
+#include "opt_lockdebug.h"
+#include "opt_multiprocessor.h"
+
 #include <sys/cdefs.h>		/* for API selection */
 #include <mips/regdef.h>
 
@@ -513,6 +517,24 @@ _C_LABEL(x):
 #define	NOP_L		/* nothing */
 #endif
 
+#if defined(MULTIPROCESSOR)
+#if defined(MIPS64_OCTEON)
+				/* early cnMIPS have erratum which means 2 */
+#define	LLSCSYNC	sync 4; sync 4
+#define	SYNC		sync 4		/* sync 4 == syncw - sync all writes */
+#define	BDSYNC		sync 4		/* sync 4 == syncw - sync all writes */
+#else
+#define	LLSCSYNC	/* nothing (something?) */
+#define	SYNC		sync
+#define	BDSYNC		sync
+#endif
+#else
+#define	LLSCSYNC	/* nothing */
+#define	SYNC		/* nothing */
+#define	BDSYNC		nop
+#endif /* defined(MULTIPROCESSOR) */
+
+
 /* CPU dependent hook for cp0 load delays */
 #if defined(MIPS1) || defined(MIPS2) || defined(MIPS3)
 #define	MFC0_HAZARD	sll $0,$0,1	/* super scalar nop */

Index: src/sys/arch/mips/mips/lock_stubs_llsc.S
diff -u src/sys/arch/mips/mips/lock_stubs_llsc.S:1.10 src/sys/arch/mips/mips/lock_stubs_llsc.S:1.11
--- src/sys/arch/mips/mips/lock_stubs_llsc.S:1.10	Sat Aug  1 07:09:41 2020
+++ src/sys/arch/mips/mips/lock_stubs_llsc.S	Thu Aug  6 10:00:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: lock_stubs_llsc.S,v 1.10 2020/08/01 07:09:41 simonb Exp $	*/
+/*	$NetBSD: lock_stubs_llsc.S,v 1.11 2020/08/06 10:00:21 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 
 #include <machine/asm.h>
 
-RCSID("$NetBSD: lock_stubs_llsc.S,v 1.10 2020/08/01 07:09:41 simonb Exp $")
+RCSID("$NetBSD: lock_stubs_llsc.S,v 1.11 2020/08/06 10:00:21 skrll Exp $")
 
 #include "assym.h"
 
@@ -45,20 +45,6 @@ RCSID("$NetBSD: lock_stubs_llsc.S,v 1.10
 #define	FULL
 #endif
 
-#if defined(MULTIPROCESSOR)
-#if defined(__OCTEON__)
-#define	SYNC		sync 4		/* sync 4 == syncw - sync all writes */
-#define	BDSYNC		sync 4		/* sync 4 == syncw - sync all writes */
-#else
-#define	SYNC		sync
-#define	BDSYNC		sync
-#endif
-#else
-#define	SYNC		/* nothing */
-#define	BDSYNC		nop
-#endif /* MIPS_HAS_LLSC != 0 && defined(MULTIPROCESSOR) */
-
-
 /*
  * Set ISA level for the assembler.
  * XXX Clean up with a macro?  Same code fragment is in mipsX_subr.S too.
@@ -84,6 +70,7 @@ RCSID("$NetBSD: lock_stubs_llsc.S,v 1.10
  *     unsigned long old, unsigned long new);
  */
 STATIC_LEAF(llsc_atomic_cas_ulong)
+	LLSCSYNC
 1:
 	LONG_LL	t0, (a0)
 	bne	t0, a1, 2f
@@ -104,6 +91,7 @@ END(llsc_atomic_cas_ulong)
  *    unsigned int old, unsigned int new);
  */
 STATIC_LEAF(llsc_atomic_cas_uint)
+	LLSCSYNC
 1:
 	INT_LL	t0, (a0)
 	bne	t0, a1, 2f
@@ -133,6 +121,7 @@ STATIC_LEAF(llsc_ucas_32)
 	 nop
 	move	v0, zero
 
+	LLSCSYNC
 1:	ll	t0, 0(a0)
 	bne	t0, a1, 2f
 	 move	t1, a2
@@ -161,6 +150,7 @@ STATIC_LEAF(llsc_ucas_64)
 	 nop
 	move	v0, zero
 
+	LLSCSYNC
 1:	lld	t0, 0(a0)
 	bne	t0, a1, 2f
 	 move	t1, a2
@@ -187,6 +177,7 @@ END(llsc_ucaserr)
  * void	mutex_enter(kmutex_t *mtx);
  */
 STATIC_LEAF(llsc_mutex_enter)
+	LLSCSYNC
 	PTR_LL	t0, MTX_OWNER(a0)
 1:
 	bnez	t0, 2f
@@ -205,6 +196,7 @@ END(llsc_mutex_enter)
  * void	mutex_exit(kmutex_t *mtx);
  */
 STATIC_LEAF(llsc_mutex_exit)
+	LLSCSYNC
 	PTR_LL	t0, MTX_OWNER(a0)
 	SYNC
 1:
@@ -268,6 +260,7 @@ STATIC_NESTED(llsc_mutex_spin_enter, CAL
 	 nop
 #endif /* PARANOIA */
 #if defined(FULL)
+	LLSCSYNC
 	INT_LL	t3, MTX_LOCK(t0)
 3:
 	bnez	t3, 4f

Reply via email to