Module Name:    src
Committed By:   skrll
Date:           Tue Apr 27 06:03:09 UTC 2021

Modified Files:
        src/sys/arch/arm/include: lock.h

Log Message:
Fix the barrier confusion.  From Riastradh - thanks!.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/arm/include/lock.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/include/lock.h
diff -u src/sys/arch/arm/include/lock.h:1.37 src/sys/arch/arm/include/lock.h:1.38
--- src/sys/arch/arm/include/lock.h:1.37	Mon Apr 26 16:35:54 2021
+++ src/sys/arch/arm/include/lock.h	Tue Apr 27 06:03:09 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: lock.h,v 1.37 2021/04/26 16:35:54 skrll Exp $	*/
+/*	$NetBSD: lock.h,v 1.38 2021/04/27 06:03:09 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -131,32 +131,34 @@ __swp(int __val, __cpu_simple_lock_t *__
 }
 #endif /* !_ARM_ARCH_6 */
 
+/* load/dmb implies load-acquire */
 static __inline void
-__arm_membar_producer(void)
+__arm_load_dmb(void)
 {
 #if defined(_ARM_ARCH_7)
-	__asm __volatile("dsb" ::: "memory");
+	__asm __volatile("dmb ish" ::: "memory");
 #elif defined(_ARM_ARCH_6)
-	__asm __volatile("mcr\tp15,0,%0,c7,c10,4" :: "r"(0) : "memory");
+	__asm __volatile("mcr\tp15,0,%0,c7,c10,5" :: "r"(0) : "memory");
 #endif
 }
 
+/* dmb/store implies store-release */
 static __inline void
-__arm_membar_consumer(void)
+__arm_dmb_store(void)
 {
 #if defined(_ARM_ARCH_7)
-	__asm __volatile("dmb" ::: "memory");
+	__asm __volatile("dmb ish" ::: "memory");
 #elif defined(_ARM_ARCH_6)
 	__asm __volatile("mcr\tp15,0,%0,c7,c10,5" :: "r"(0) : "memory");
 #endif
 }
 
+
 static __inline void __unused
 __cpu_simple_lock_init(__cpu_simple_lock_t *__alp)
 {
 
 	*__alp = __SIMPLELOCK_UNLOCKED;
-	__arm_membar_producer();
 }
 
 #if !defined(__thumb__) || defined(_ARM_ARCH_T2)
@@ -164,12 +166,11 @@ static __inline void __unused
 __cpu_simple_lock(__cpu_simple_lock_t *__alp)
 {
 #if defined(_ARM_ARCH_6)
-	__arm_membar_consumer();
 	do {
 		/* spin */
 	} while (__arm_load_exclusive(__alp) != __SIMPLELOCK_UNLOCKED
 		 || __arm_store_exclusive(__alp, __SIMPLELOCK_LOCKED));
-	__arm_membar_producer();
+	__arm_load_dmb();
 #else
 	while (__swp(__SIMPLELOCK_LOCKED, __alp) != __SIMPLELOCK_UNLOCKED)
 		continue;
@@ -184,13 +185,12 @@ static __inline int __unused
 __cpu_simple_lock_try(__cpu_simple_lock_t *__alp)
 {
 #if defined(_ARM_ARCH_6)
-	__arm_membar_consumer();
 	do {
 		if (__arm_load_exclusive(__alp) != __SIMPLELOCK_UNLOCKED) {
 			return 0;
 		}
 	} while (__arm_store_exclusive(__alp, __SIMPLELOCK_LOCKED));
-	__arm_membar_producer();
+	__arm_load_dmb();
 	return 1;
 #else
 	return (__swp(__SIMPLELOCK_LOCKED, __alp) == __SIMPLELOCK_UNLOCKED);
@@ -213,9 +213,8 @@ __cpu_simple_unlock(__cpu_simple_lock_t 
 		    :: "r"(__SIMPLELOCK_UNLOCKED), "r"(__alp) : "memory");
 	}
 #else
-	__arm_membar_consumer();
+	__arm_dmb_store();
 	*__alp = __SIMPLELOCK_UNLOCKED;
-	__arm_membar_producer();
 #endif
 }
 

Reply via email to