Cleanup: Move ARM specific code to urcu/arch/arm.h
[urcu.git] / include / urcu / arch / arm.h
index 5cbca7d7f1d0d523186b40837ce93ff515615128..5d1c60836da9a34fb1f2f71783255f5532d546b3 100644 (file)
@@ -31,9 +31,19 @@ extern "C" {
 #endif
 
 #ifdef CONFIG_RCU_ARM_HAVE_DMB
-#define cmm_mb()       __asm__ __volatile__ ("dmb":::"memory")
-#define cmm_rmb()      __asm__ __volatile__ ("dmb":::"memory")
-#define cmm_wmb()      __asm__ __volatile__ ("dmb":::"memory")
+/*
+ * Issues full system DMB operation.
+ */
+#define cmm_mb()       __asm__ __volatile__ ("dmb sy":::"memory")
+#define cmm_rmb()      __asm__ __volatile__ ("dmb sy":::"memory")
+#define cmm_wmb()      __asm__ __volatile__ ("dmb sy":::"memory")
+
+/*
+ * Issues DMB operation only to the inner shareable domain.
+ */
+#define cmm_smp_mb()   __asm__ __volatile__ ("dmb ish":::"memory")
+#define cmm_smp_rmb()  __asm__ __volatile__ ("dmb ish":::"memory")
+#define cmm_smp_wmb()  __asm__ __volatile__ ("dmb ish":::"memory")
 #endif /* CONFIG_RCU_ARM_HAVE_DMB */
 
 #include <stdlib.h>
@@ -47,6 +57,19 @@ extern "C" {
 #define __NR_membarrier                389
 #endif
 
+/*
+ * Error out for compilers with known bugs.
+ */
+
+/*
+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854
+ */
+#ifdef URCU_GCC_VERSION
+# if URCU_GCC_VERSION >= 40800 && URCU_GCC_VERSION <= 40802
+#  error Your gcc version produces clobbered frame accesses
+# endif
+#endif
+
 #ifdef __cplusplus
 }
 #endif
This page took 0.023022 seconds and 4 git commands to generate.