// SPDX-FileCopyrightText: 2020 Michael Jeanson // // SPDX-License-Identifier: LGPL-2.1-or-later #ifndef _URCU_UATOMIC_H #define _URCU_UATOMIC_H #include #include #include enum cmm_memorder { CMM_RELAXED = 0, CMM_CONSUME = 1, CMM_ACQUIRE = 2, CMM_RELEASE = 3, CMM_ACQ_REL = 4, CMM_SEQ_CST = 5, CMM_SEQ_CST_FENCE = 6, }; #if defined(_CMM_TOOLCHAIN_SUPPORT_C11_MM) /* * Make sure that CMM_SEQ_CST_FENCE is not equivalent to other memory orders. */ urcu_static_assert(CMM_RELAXED == __ATOMIC_RELAXED, "CMM_RELAXED vs __ATOMIC_RELAXED values mismatch", cmm_relaxed_values_mismatch); urcu_static_assert(CMM_CONSUME == __ATOMIC_CONSUME, "CMM_CONSUME vs __ATOMIC_CONSUME values mismatch", cmm_consume_values_mismatch); urcu_static_assert(CMM_ACQUIRE == __ATOMIC_ACQUIRE, "CMM_ACQUIRE vs __ATOMIC_ACQUIRE values mismatch", cmm_acquire_values_mismatch); urcu_static_assert(CMM_RELEASE == __ATOMIC_RELEASE, "CMM_RELEASE vs __ATOMIC_RELEASE values mismatch", cmm_release_values_mismatch); urcu_static_assert(CMM_ACQ_REL == __ATOMIC_ACQ_REL, "CMM_ACQ_REL vs __ATOMIC_ACQ_REL values mismatch", cmm_acq_rel_values_mismatch); urcu_static_assert(CMM_SEQ_CST == __ATOMIC_SEQ_CST, "CMM_SEQ_CST vs __ATOMIC_SEQ_CST values mismatch", cmm_seq_cst_values_mismatch); /* * This is not part of the public API. It it used internally to implement the * CMM_SEQ_CST_FENCE memory order. * * NOTE: Using switch here instead of if statement to avoid -Wduplicated-cond * warning when memory order is conditionally determined. */ static inline void cmm_seq_cst_fence_after_atomic(enum cmm_memorder mo) { switch (mo) { case CMM_SEQ_CST_FENCE: cmm_smp_mb(); break; default: break; } } #endif /* * This is not part of the public API. It is used internally to convert from the * CMM memory model to the C11 memory model. */ static inline int cmm_to_c11(int mo) { if (mo == CMM_SEQ_CST_FENCE) { return CMM_SEQ_CST; } return mo; } #include #if defined(CONFIG_RCU_USE_ATOMIC_BUILTINS) #include #elif defined(URCU_ARCH_X86) #include #elif defined(URCU_ARCH_PPC) #include #elif defined(URCU_ARCH_S390) #include #elif defined(URCU_ARCH_SPARC64) #include #elif defined(URCU_ARCH_ALPHA) #include #elif defined(URCU_ARCH_IA64) #include #elif defined(URCU_ARCH_ARM) #include #elif defined(URCU_ARCH_AARCH64) #include #elif defined(URCU_ARCH_MIPS) #include #elif defined(URCU_ARCH_NIOS2) #include #elif defined(URCU_ARCH_TILE) #include #elif defined(URCU_ARCH_HPPA) #include #elif defined(URCU_ARCH_M68K) #include #elif defined(URCU_ARCH_RISCV) #include #elif defined(URCU_ARCH_LOONGARCH) #include #elif defined(URCU_ARCH_SH3) #include #elif defined(URCU_ARCH_VAX) #include #else #error "Cannot build: unrecognized architecture, see ." #endif #endif /* _URCU_UATOMIC_H */