From: Rich Felker <dalias@aerifal.cx>
Date: Mon, 28 Jul 2014 01:13:37 +0000 (-0400)
Subject: fix insufficient synchronization in sh atomic asm
X-Git-Tag: v1.1.4~18
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c394763d350f92ff1dbfb79fcd7124da47bc7043;p=musl

fix insufficient synchronization in sh atomic asm

while other usage I've seen only has the synco instruction after the
atomic operation, I cannot find any documentation indicating that this
is correct. certainly all stores before the atomic need to have been
synchronized before the atomic operation takes place.
---

diff --git a/arch/sh/src/atomic.c b/arch/sh/src/atomic.c
index d29b0538..13395673 100644
--- a/arch/sh/src/atomic.c
+++ b/arch/sh/src/atomic.c
@@ -1,7 +1,7 @@
 #include "libc.h"
 
 #define LLSC_CLOBBERS   "r0", "t", "memory"
-#define LLSC_START(mem)            \
+#define LLSC_START(mem) "synco\n"  \
 	"0:	movli.l @" mem ", r0\n"
 #define LLSC_END(mem)              \
 	"1:	movco.l r0, @" mem "\n"    \
@@ -99,6 +99,7 @@ void __sh_store(volatile int *p, int x)
 {
 	if (__hwcap & CPU_HAS_LLSC) {
 		__asm__ __volatile__(
+			"	synco\n"
 			"	mov.l %1, @%0\n"
 			"	synco\n"
 			: : "r"(p), "r"(x) : "memory");