From c394763d350f92ff1dbfb79fcd7124da47bc7043 Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Sun, 27 Jul 2014 21:13:37 -0400 Subject: 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. --- arch/sh/src/atomic.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'arch') 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"); -- cgit v1.2.1