X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=include%2Furcu%2Farch%2Farm.h;h=e904b06e461cd56a6aa30fe685340cf51501193c;hb=39c2747c011f2d7563c8fa63e26cd92ca552d15b;hp=5cbca7d7f1d0d523186b40837ce93ff515615128;hpb=6893800a4d1cc14dff0395ddcd660a5138db183d;p=urcu.git diff --git a/include/urcu/arch/arm.h b/include/urcu/arch/arm.h index 5cbca7d..e904b06 100644 --- a/include/urcu/arch/arm.h +++ b/include/urcu/arch/arm.h @@ -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 @@ -47,6 +57,28 @@ 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 + +/* + * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42263 + */ +#ifdef URCU_GCC_VERSION +# if URCU_GCC_VERSION >= 40400 && URCU_GCC_VERSION <= 40402 +# error Your gcc version has a non-functional __sync_synchronize() +# endif +#endif + #ifdef __cplusplus } #endif