Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[sfrench/cifs-2.6.git] / arch / arm64 / include / asm / barrier.h
index 4e0497f581a05ea791564badc73ffa7a1f4a0699..0fe7e43b7fbc26bf2f6f2a47354a21943ae56ab9 100644 (file)
 #define __smp_rmb()    dmb(ishld)
 #define __smp_wmb()    dmb(ishst)
 
-#define __smp_store_release(p, v)                                              \
+#define __smp_store_release(p, v)                                      \
 do {                                                                   \
+       union { typeof(*p) __val; char __c[1]; } __u =                  \
+               { .__val = (__force typeof(*p)) (v) };                  \
        compiletime_assert_atomic_type(*p);                             \
        switch (sizeof(*p)) {                                           \
        case 1:                                                         \
                asm volatile ("stlrb %w1, %0"                           \
-                               : "=Q" (*p) : "r" (v) : "memory");      \
+                               : "=Q" (*p)                             \
+                               : "r" (*(__u8 *)__u.__c)                \
+                               : "memory");                            \
                break;                                                  \
        case 2:                                                         \
                asm volatile ("stlrh %w1, %0"                           \
-                               : "=Q" (*p) : "r" (v) : "memory");      \
+                               : "=Q" (*p)                             \
+                               : "r" (*(__u16 *)__u.__c)               \
+                               : "memory");                            \
                break;                                                  \
        case 4:                                                         \
                asm volatile ("stlr %w1, %0"                            \
-                               : "=Q" (*p) : "r" (v) : "memory");      \
+                               : "=Q" (*p)                             \
+                               : "r" (*(__u32 *)__u.__c)               \
+                               : "memory");                            \
                break;                                                  \
        case 8:                                                         \
                asm volatile ("stlr %1, %0"                             \
-                               : "=Q" (*p) : "r" (v) : "memory");      \
+                               : "=Q" (*p)                             \
+                               : "r" (*(__u64 *)__u.__c)               \
+                               : "memory");                            \
                break;                                                  \
        }                                                               \
 } while (0)