fix insufficient synchronization in sh atomic asm
authorRich Felker <dalias@aerifal.cx>
Mon, 28 Jul 2014 01:13:37 +0000 (21:13 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 28 Jul 2014 01:13:37 +0000 (21:13 -0400)
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

index d29b05380cd0b8d6c9d63f7cd4e817b50ba2e153..133956734d0d96c7b0e1b5dc52512ac785172eb2 100644 (file)
@@ -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");