|
@@ -14,74 +14,75 @@
|
|
|
#define wmb() asm volatile("dmb ishst" ::: "memory")
|
|
|
#define rmb() asm volatile("dmb ishld" ::: "memory")
|
|
|
|
|
|
-#define smp_store_release(p, v) \
|
|
|
-do { \
|
|
|
- union { typeof(*p) __val; char __c[1]; } __u = \
|
|
|
- { .__val = (__force typeof(*p)) (v) }; \
|
|
|
- \
|
|
|
- switch (sizeof(*p)) { \
|
|
|
- case 1: \
|
|
|
- asm volatile ("stlrb %w1, %0" \
|
|
|
- : "=Q" (*p) \
|
|
|
- : "r" (*(__u8 *)__u.__c) \
|
|
|
- : "memory"); \
|
|
|
- break; \
|
|
|
- case 2: \
|
|
|
- asm volatile ("stlrh %w1, %0" \
|
|
|
- : "=Q" (*p) \
|
|
|
- : "r" (*(__u16 *)__u.__c) \
|
|
|
- : "memory"); \
|
|
|
- break; \
|
|
|
- case 4: \
|
|
|
- asm volatile ("stlr %w1, %0" \
|
|
|
- : "=Q" (*p) \
|
|
|
- : "r" (*(__u32 *)__u.__c) \
|
|
|
- : "memory"); \
|
|
|
- break; \
|
|
|
- case 8: \
|
|
|
- asm volatile ("stlr %1, %0" \
|
|
|
- : "=Q" (*p) \
|
|
|
- : "r" (*(__u64 *)__u.__c) \
|
|
|
- : "memory"); \
|
|
|
- break; \
|
|
|
- default: \
|
|
|
- /* Only to shut up gcc ... */ \
|
|
|
- mb(); \
|
|
|
- break; \
|
|
|
- } \
|
|
|
+#define smp_store_release(p, v) \
|
|
|
+do { \
|
|
|
+ union { typeof(*p) __val; char __c[1]; } __u = \
|
|
|
+ { .__val = (v) }; \
|
|
|
+ \
|
|
|
+ switch (sizeof(*p)) { \
|
|
|
+ case 1: \
|
|
|
+ asm volatile ("stlrb %w1, %0" \
|
|
|
+ : "=Q" (*p) \
|
|
|
+ : "r" (*(__u8_alias_t *)__u.__c) \
|
|
|
+ : "memory"); \
|
|
|
+ break; \
|
|
|
+ case 2: \
|
|
|
+ asm volatile ("stlrh %w1, %0" \
|
|
|
+ : "=Q" (*p) \
|
|
|
+ : "r" (*(__u16_alias_t *)__u.__c) \
|
|
|
+ : "memory"); \
|
|
|
+ break; \
|
|
|
+ case 4: \
|
|
|
+ asm volatile ("stlr %w1, %0" \
|
|
|
+ : "=Q" (*p) \
|
|
|
+ : "r" (*(__u32_alias_t *)__u.__c) \
|
|
|
+ : "memory"); \
|
|
|
+ break; \
|
|
|
+ case 8: \
|
|
|
+ asm volatile ("stlr %1, %0" \
|
|
|
+ : "=Q" (*p) \
|
|
|
+ : "r" (*(__u64_alias_t *)__u.__c) \
|
|
|
+ : "memory"); \
|
|
|
+ break; \
|
|
|
+ default: \
|
|
|
+ /* Only to shut up gcc ... */ \
|
|
|
+ mb(); \
|
|
|
+ break; \
|
|
|
+ } \
|
|
|
} while (0)
|
|
|
|
|
|
-#define smp_load_acquire(p) \
|
|
|
-({ \
|
|
|
- union { typeof(*p) __val; char __c[1]; } __u; \
|
|
|
- \
|
|
|
- switch (sizeof(*p)) { \
|
|
|
- case 1: \
|
|
|
- asm volatile ("ldarb %w0, %1" \
|
|
|
- : "=r" (*(__u8 *)__u.__c) \
|
|
|
- : "Q" (*p) : "memory"); \
|
|
|
- break; \
|
|
|
- case 2: \
|
|
|
- asm volatile ("ldarh %w0, %1" \
|
|
|
- : "=r" (*(__u16 *)__u.__c) \
|
|
|
- : "Q" (*p) : "memory"); \
|
|
|
- break; \
|
|
|
- case 4: \
|
|
|
- asm volatile ("ldar %w0, %1" \
|
|
|
- : "=r" (*(__u32 *)__u.__c) \
|
|
|
- : "Q" (*p) : "memory"); \
|
|
|
- break; \
|
|
|
- case 8: \
|
|
|
- asm volatile ("ldar %0, %1" \
|
|
|
- : "=r" (*(__u64 *)__u.__c) \
|
|
|
- : "Q" (*p) : "memory"); \
|
|
|
- break; \
|
|
|
- default: \
|
|
|
- /* Only to shut up gcc ... */ \
|
|
|
- mb(); \
|
|
|
- break; \
|
|
|
- } \
|
|
|
- __u.__val; \
|
|
|
+#define smp_load_acquire(p) \
|
|
|
+({ \
|
|
|
+ union { typeof(*p) __val; char __c[1]; } __u = \
|
|
|
+ { .__c = { 0 } }; \
|
|
|
+ \
|
|
|
+ switch (sizeof(*p)) { \
|
|
|
+ case 1: \
|
|
|
+ asm volatile ("ldarb %w0, %1" \
|
|
|
+ : "=r" (*(__u8_alias_t *)__u.__c) \
|
|
|
+ : "Q" (*p) : "memory"); \
|
|
|
+ break; \
|
|
|
+ case 2: \
|
|
|
+ asm volatile ("ldarh %w0, %1" \
|
|
|
+ : "=r" (*(__u16_alias_t *)__u.__c) \
|
|
|
+ : "Q" (*p) : "memory"); \
|
|
|
+ break; \
|
|
|
+ case 4: \
|
|
|
+ asm volatile ("ldar %w0, %1" \
|
|
|
+ : "=r" (*(__u32_alias_t *)__u.__c) \
|
|
|
+ : "Q" (*p) : "memory"); \
|
|
|
+ break; \
|
|
|
+ case 8: \
|
|
|
+ asm volatile ("ldar %0, %1" \
|
|
|
+ : "=r" (*(__u64_alias_t *)__u.__c) \
|
|
|
+ : "Q" (*p) : "memory"); \
|
|
|
+ break; \
|
|
|
+ default: \
|
|
|
+ /* Only to shut up gcc ... */ \
|
|
|
+ mb(); \
|
|
|
+ break; \
|
|
|
+ } \
|
|
|
+ __u.__val; \
|
|
|
})
|
|
|
|
|
|
#endif /* _TOOLS_LINUX_ASM_AARCH64_BARRIER_H */
|