--- cpukit/score/cpu/arm/rtems/score/cpuatomic.h | 1 + cpukit/score/include/rtems/score/atomic.h | 80 +++---- .../score/include/rtems/score/genericatomicops.h | 240 ++++++++++---------- .../score/include/rtems/score/genericcpuatomic.h | 21 +- cpukit/score/inline/rtems/score/atomic.inl | 80 +++---- 5 files changed, 217 insertions(+), 205 deletions(-)
diff --git a/cpukit/score/cpu/arm/rtems/score/cpuatomic.h b/cpukit/score/cpu/arm/rtems/score/cpuatomic.h index 227b3ce..5680c3c 100644 --- a/cpukit/score/cpu/arm/rtems/score/cpuatomic.h +++ b/cpukit/score/cpu/arm/rtems/score/cpuatomic.h @@ -29,6 +29,7 @@ extern "C" { #if !defined(RTEMS_SMP) #include <rtems/score/genericatomicops.h> #else +#include <rtems/score/genericstdatomicops.h> #endif #ifdef __cplusplus diff --git a/cpukit/score/include/rtems/score/atomic.h b/cpukit/score/include/rtems/score/atomic.h index 3b62cb1..a2126be 100644 --- a/cpukit/score/include/rtems/score/atomic.h +++ b/cpukit/score/include/rtems/score/atomic.h @@ -56,23 +56,23 @@ typedef enum { * a type of Atomic_Memory_barrier @a memory_barrier. The @a memory_barrier * shall not be ATOMIC_RELEASE_BARRIER. */ -RTEMS_INLINE_ROUTINE Atomic_Int _Atomic_Load_int( +RTEMS_INLINE_ROUTINE unsigned int _Atomic_Load_int( volatile Atomic_Int *address, Atomic_Memory_barrier memory_barrier ); -RTEMS_INLINE_ROUTINE Atomic_Long _Atomic_Load_long( +RTEMS_INLINE_ROUTINE unsigned long _Atomic_Load_long( volatile Atomic_Long *address, Atomic_Memory_barrier memory_barrier ); -RTEMS_INLINE_ROUTINE Atomic_Pointer _Atomic_Load_ptr( +RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Load_ptr( volatile Atomic_Pointer *address, Atomic_Memory_barrier memory_barrier ); -RTEMS_INLINE_ROUTINE Atomic_Int32 _Atomic_Load_32( +RTEMS_INLINE_ROUTINE uint32_t _Atomic_Load_32( volatile Atomic_Int32 *address, Atomic_Memory_barrier memory_barrier ); -RTEMS_INLINE_ROUTINE Atomic_Int64 _Atomic_Load_64( +RTEMS_INLINE_ROUTINE uint64_t _Atomic_Load_64( volatile Atomic_Int64 *address, Atomic_Memory_barrier memory_barrier ); @@ -84,27 +84,27 @@ RTEMS_INLINE_ROUTINE Atomic_Int64 _Atomic_Load_64( */ RTEMS_INLINE_ROUTINE void _Atomic_Store_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Store_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Store_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Store_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Store_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ); @@ -114,27 +114,27 @@ RTEMS_INLINE_ROUTINE void _Atomic_Store_64( */ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ); @@ -144,27 +144,27 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_64( */ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ); @@ -174,27 +174,27 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_64( */ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ); @@ -204,27 +204,27 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_64( */ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ); @@ -237,32 +237,32 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_64( */ RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_int( volatile Atomic_Int *address, - Atomic_Int old_value, - Atomic_Int new_value, + unsigned int *old_value, + unsigned int new_value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_long( volatile Atomic_Long *address, - Atomic_Long old_value, - Atomic_Long new_value, + unsigned long *old_value, + unsigned long new_value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer old_value, - Atomic_Pointer new_value, + uintptr_t *old_value, + uintptr_t new_value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_32( volatile Atomic_Int32 *address, - Atomic_Int32 old_value, - Atomic_Int32 new_value, + uint32_t *old_value, + uint32_t new_value, Atomic_Memory_barrier memory_barrier ); RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_64( volatile Atomic_Int64 *address, - Atomic_Int64 old_value, - Atomic_Int64 new_value, + uint64_t *old_value, + uint64_t new_value, Atomic_Memory_barrier memory_barrier ); diff --git a/cpukit/score/include/rtems/score/genericatomicops.h b/cpukit/score/include/rtems/score/genericatomicops.h index a6c09d3..271089f 100644 --- a/cpukit/score/include/rtems/score/genericatomicops.h +++ b/cpukit/score/include/rtems/score/genericatomicops.h @@ -36,190 +36,190 @@ extern "C" { /** * @brief Atomically load an atomic type value from address @a address. */ -#define ATOMIC_LOAD(NAME, TYPE) \ -RTEMS_INLINE_ROUTINE Atomic_##TYPE _CPU_Atomic_Load_##NAME( \ +#define ATOMIC_LOAD(NAME, TYPE, R_TYPE) \ +RTEMS_INLINE_ROUTINE R_TYPE _CPU_Atomic_Load_##NAME( \ volatile Atomic_##TYPE *address \ ) \ { \ - Atomic_##TYPE tmp; \ + R_TYPE tmp; \ ISR_Level level; \ \ _ISR_Disable( level ); \ - tmp = *address; \ + tmp = address->__val; \ _ISR_Enable( level ); \ return tmp; \ } \ -ATOMIC_LOAD(int, Int); -ATOMIC_LOAD(acq_int, Int); -ATOMIC_LOAD(long, Long); -ATOMIC_LOAD(acq_long, Long); -ATOMIC_LOAD(ptr, Pointer); -ATOMIC_LOAD(acq_ptr, Pointer); -ATOMIC_LOAD(32, Int32); -ATOMIC_LOAD(acq_32, Int32); -ATOMIC_LOAD(64, Int64); -ATOMIC_LOAD(acq_64, Int64); +ATOMIC_LOAD(int, Int, unsigned int); +ATOMIC_LOAD(acq_int, Int, unsigned int); +ATOMIC_LOAD(long, Long, unsigned long); +ATOMIC_LOAD(acq_long, Long, unsigned long); +ATOMIC_LOAD(ptr, Pointer, uintptr_t); +ATOMIC_LOAD(acq_ptr, Pointer, uintptr_t); +ATOMIC_LOAD(32, Int32, uint32_t); +ATOMIC_LOAD(acq_32, Int32, uint32_t); +ATOMIC_LOAD(64, Int64, uint64_t); +ATOMIC_LOAD(acq_64, Int64, uint64_t); /** * @brief Atomically store an atomic type value @a value into address @a * address. */ -#define ATOMIC_STORE(NAME, TYPE) \ -RTEMS_INLINE_ROUTINE void _CPU_Atomic_Store_##NAME( \ +#define ATOMIC_STORE(NAME, TYPE, R_TYPE) \ +RTEMS_INLINE_ROUTINE void _CPU_Atomic_Store_##NAME( \ volatile Atomic_##TYPE *address, \ - Atomic_##TYPE value \ + R_TYPE value \ ) \ { \ ISR_Level level; \ \ _ISR_Disable( level ); \ - *address = value; \ + address->__val = value; \ _ISR_Enable( level ); \ } \ -ATOMIC_STORE(int, Int); -ATOMIC_STORE(rel_int, Int); -ATOMIC_STORE(long, Long); -ATOMIC_STORE(rel_long, Long); -ATOMIC_STORE(ptr, Pointer); -ATOMIC_STORE(rel_ptr, Pointer); -ATOMIC_STORE(32, Int32); -ATOMIC_STORE(rel_32, Int32); -ATOMIC_STORE(64, Int64); -ATOMIC_STORE(rel_64, Int64); +ATOMIC_STORE(int, Int, unsigned int); +ATOMIC_STORE(rel_int, Int, unsigned int); +ATOMIC_STORE(long, Long, unsigned long); +ATOMIC_STORE(rel_long, Long, unsigned long); +ATOMIC_STORE(ptr, Pointer, uintptr_t); +ATOMIC_STORE(rel_ptr, Pointer, uintptr_t); +ATOMIC_STORE(32, Int32, uint32_t); +ATOMIC_STORE(rel_32, Int32, uint32_t); +ATOMIC_STORE(64, Int64, uint64_t); +ATOMIC_STORE(rel_64, Int64, uint64_t); /** * @brief Atomically load-add-store an atomic type value @a value into address * @a address. */ -#define ATOMIC_FETCH_ADD(NAME, TYPE) \ +#define ATOMIC_FETCH_ADD(NAME, TYPE, R_TYPE) \ RTEMS_INLINE_ROUTINE void _CPU_Atomic_Fetch_add_##NAME( \ volatile Atomic_##TYPE *address, \ - Atomic_##TYPE value \ + R_TYPE value \ ) \ { \ ISR_Level level; \ \ _ISR_Disable( level ); \ - *address += value; \ + address->__val += value; \ _ISR_Enable( level ); \ } \ -ATOMIC_FETCH_ADD(int, Int); -ATOMIC_FETCH_ADD(acq_int, Int); -ATOMIC_FETCH_ADD(rel_int, Int); -ATOMIC_FETCH_ADD(long, Long); -ATOMIC_FETCH_ADD(acq_long, Long); -ATOMIC_FETCH_ADD(rel_long, Long); -ATOMIC_FETCH_ADD(ptr, Pointer); -ATOMIC_FETCH_ADD(acq_ptr, Pointer); -ATOMIC_FETCH_ADD(rel_ptr, Pointer); -ATOMIC_FETCH_ADD(32, Int32); -ATOMIC_FETCH_ADD(acq_32, Int32); -ATOMIC_FETCH_ADD(rel_32, Int32); -ATOMIC_FETCH_ADD(64, Int64); -ATOMIC_FETCH_ADD(acq_64, Int64); -ATOMIC_FETCH_ADD(rel_64, Int64); +ATOMIC_FETCH_ADD(int, Int, unsigned int); +ATOMIC_FETCH_ADD(acq_int, Int, unsigned int); +ATOMIC_FETCH_ADD(rel_int, Int, unsigned int); +ATOMIC_FETCH_ADD(long, Long, unsigned long); +ATOMIC_FETCH_ADD(acq_long, Long, unsigned long); +ATOMIC_FETCH_ADD(rel_long, Long, unsigned long); +ATOMIC_FETCH_ADD(ptr, Pointer, uintptr_t); +ATOMIC_FETCH_ADD(acq_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_ADD(rel_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_ADD(32, Int32, uint32_t); +ATOMIC_FETCH_ADD(acq_32, Int32, uint32_t); +ATOMIC_FETCH_ADD(rel_32, Int32, uint32_t); +ATOMIC_FETCH_ADD(64, Int64, uint64_t); +ATOMIC_FETCH_ADD(acq_64, Int64, uint64_t); +ATOMIC_FETCH_ADD(rel_64, Int64, uint64_t); /** * @brief Atomically load-sub-store an atomic type value @a value into address * @a address. */ -#define ATOMIC_FETCH_SUB(NAME, TYPE) \ +#define ATOMIC_FETCH_SUB(NAME, TYPE, R_TYPE) \ RTEMS_INLINE_ROUTINE void _CPU_Atomic_Fetch_sub_##NAME( \ volatile Atomic_##TYPE *address, \ - Atomic_##TYPE value \ + R_TYPE value \ ) \ { \ ISR_Level level; \ \ _ISR_Disable( level ); \ - *address -= value; \ + address->__val -= value; \ _ISR_Enable( level ); \ } \ -ATOMIC_FETCH_SUB(int, Int); -ATOMIC_FETCH_SUB(acq_int, Int); -ATOMIC_FETCH_SUB(rel_int, Int); -ATOMIC_FETCH_SUB(long, Long); -ATOMIC_FETCH_SUB(acq_long, Long); -ATOMIC_FETCH_SUB(rel_long, Long); -ATOMIC_FETCH_SUB(ptr, Pointer); -ATOMIC_FETCH_SUB(acq_ptr, Pointer); -ATOMIC_FETCH_SUB(rel_ptr, Pointer); -ATOMIC_FETCH_SUB(32, Int32); -ATOMIC_FETCH_SUB(acq_32, Int32); -ATOMIC_FETCH_SUB(rel_32, Int32); -ATOMIC_FETCH_SUB(64, Int64); -ATOMIC_FETCH_SUB(acq_64, Int64); -ATOMIC_FETCH_SUB(rel_64, Int64); +ATOMIC_FETCH_SUB(int, Int, unsigned int); +ATOMIC_FETCH_SUB(acq_int, Int, unsigned int); +ATOMIC_FETCH_SUB(rel_int, Int, unsigned int); +ATOMIC_FETCH_SUB(long, Long, unsigned long); +ATOMIC_FETCH_SUB(acq_long, Long, unsigned long); +ATOMIC_FETCH_SUB(rel_long, Long, unsigned long); +ATOMIC_FETCH_SUB(ptr, Pointer, uintptr_t); +ATOMIC_FETCH_SUB(acq_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_SUB(rel_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_SUB(32, Int32, uint32_t); +ATOMIC_FETCH_SUB(acq_32, Int32, uint32_t); +ATOMIC_FETCH_SUB(rel_32, Int32, uint32_t); +ATOMIC_FETCH_SUB(64, Int64, uint64_t); +ATOMIC_FETCH_SUB(acq_64, Int64, uint64_t); +ATOMIC_FETCH_SUB(rel_64, Int64, uint64_t); /** * @brief Atomically load-or-store an atomic type value @a value into address * @a address. */ -#define ATOMIC_FETCH_OR(NAME, TYPE) \ +#define ATOMIC_FETCH_OR(NAME, TYPE, R_TYPE) \ RTEMS_INLINE_ROUTINE void _CPU_Atomic_Fetch_or_##NAME( \ volatile Atomic_##TYPE *address, \ - Atomic_##TYPE value \ + R_TYPE value \ ) \ { \ ISR_Level level; \ \ _ISR_Disable( level ); \ - *address |= value; \ + address->__val |= value; \ _ISR_Enable( level ); \ } \ -ATOMIC_FETCH_OR(int, Int); -ATOMIC_FETCH_OR(acq_int, Int); -ATOMIC_FETCH_OR(rel_int, Int); -ATOMIC_FETCH_OR(long, Long); -ATOMIC_FETCH_OR(acq_long, Long); -ATOMIC_FETCH_OR(rel_long, Long); -ATOMIC_FETCH_OR(ptr, Pointer); -ATOMIC_FETCH_OR(acq_ptr, Pointer); -ATOMIC_FETCH_OR(rel_ptr, Pointer); -ATOMIC_FETCH_OR(32, Int32); -ATOMIC_FETCH_OR(acq_32, Int32); -ATOMIC_FETCH_OR(rel_32, Int32); -ATOMIC_FETCH_OR(64, Int64); -ATOMIC_FETCH_OR(acq_64, Int64); -ATOMIC_FETCH_OR(rel_64, Int64); +ATOMIC_FETCH_OR(int, Int, unsigned int); +ATOMIC_FETCH_OR(acq_int, Int, unsigned int); +ATOMIC_FETCH_OR(rel_int, Int, unsigned int); +ATOMIC_FETCH_OR(long, Long, unsigned long); +ATOMIC_FETCH_OR(acq_long, Long, unsigned long); +ATOMIC_FETCH_OR(rel_long, Long, unsigned long); +ATOMIC_FETCH_OR(ptr, Pointer, uintptr_t); +ATOMIC_FETCH_OR(acq_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_OR(rel_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_OR(32, Int32, uint32_t); +ATOMIC_FETCH_OR(acq_32, Int32, uint32_t); +ATOMIC_FETCH_OR(rel_32, Int32, uint32_t); +ATOMIC_FETCH_OR(64, Int64, uint64_t); +ATOMIC_FETCH_OR(acq_64, Int64, uint64_t); +ATOMIC_FETCH_OR(rel_64, Int64, uint64_t); /** * @brief Atomically load-and-store an atomic type value @a value into address * @a address. */ -#define ATOMIC_FETCH_AND(NAME, TYPE) \ +#define ATOMIC_FETCH_AND(NAME, TYPE, R_TYPE) \ RTEMS_INLINE_ROUTINE void _CPU_Atomic_Fetch_and_##NAME( \ volatile Atomic_##TYPE *address, \ - Atomic_##TYPE value \ + R_TYPE value \ ) \ { \ ISR_Level level; \ \ _ISR_Disable( level ); \ - *address &= value; \ + address->__val &= value; \ _ISR_Enable( level ); \ } \ -ATOMIC_FETCH_AND(int, Int); -ATOMIC_FETCH_AND(acq_int, Int); -ATOMIC_FETCH_AND(rel_int, Int); -ATOMIC_FETCH_AND(long, Long); -ATOMIC_FETCH_AND(acq_long, Long); -ATOMIC_FETCH_AND(rel_long, Long); -ATOMIC_FETCH_AND(ptr, Pointer); -ATOMIC_FETCH_AND(acq_ptr, Pointer); -ATOMIC_FETCH_AND(rel_ptr, Pointer); -ATOMIC_FETCH_AND(32, Int32); -ATOMIC_FETCH_AND(acq_32, Int32); -ATOMIC_FETCH_AND(rel_32, Int32); -ATOMIC_FETCH_AND(64, Int64); -ATOMIC_FETCH_AND(acq_64, Int64); -ATOMIC_FETCH_AND(rel_64, Int64); +ATOMIC_FETCH_AND(int, Int, unsigned int); +ATOMIC_FETCH_AND(acq_int, Int, unsigned int); +ATOMIC_FETCH_AND(rel_int, Int, unsigned int); +ATOMIC_FETCH_AND(long, Long, unsigned long); +ATOMIC_FETCH_AND(acq_long, Long, unsigned long); +ATOMIC_FETCH_AND(rel_long, Long, unsigned long); +ATOMIC_FETCH_AND(ptr, Pointer, uintptr_t); +ATOMIC_FETCH_AND(acq_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_AND(rel_ptr, Pointer, uintptr_t); +ATOMIC_FETCH_AND(32, Int32, uint32_t); +ATOMIC_FETCH_AND(acq_32, Int32, uint32_t); +ATOMIC_FETCH_AND(rel_32, Int32, uint32_t); +ATOMIC_FETCH_AND(64, Int64, uint64_t); +ATOMIC_FETCH_AND(acq_64, Int64, uint64_t); +ATOMIC_FETCH_AND(rel_64, Int64, uint64_t); /** * @brief Atomically compare the value stored at @a address with @a @@ -227,19 +227,19 @@ ATOMIC_FETCH_AND(rel_64, Int64); * address with @a new_value. Returns zero if the compare failed, * nonzero otherwise. */ -#define ATOMIC_COMPARE_EXCHANGE(NAME, TYPE) \ +#define ATOMIC_COMPARE_EXCHANGE(NAME, TYPE, R_TYPE) \ RTEMS_INLINE_ROUTINE int _CPU_Atomic_Compare_exchange_##NAME( \ volatile Atomic_##TYPE *address, \ - Atomic_##TYPE old_value, \ - Atomic_##TYPE new_value \ + R_TYPE *old_value, \ + R_TYPE new_value \ ) \ { \ ISR_Level level; \ int ret; \ \ _ISR_Disable( level ); \ - if (*address == old_value) { \ - *address = new_value; \ + if (address->__val == *old_value) { \ + address->__val = new_value; \ ret = TRUE; \ } else { \ ret = FALSE; \ @@ -249,21 +249,21 @@ RTEMS_INLINE_ROUTINE int _CPU_Atomic_Compare_exchange_##NAME( \ return ret; \ } \ -ATOMIC_COMPARE_EXCHANGE(int, Int); -ATOMIC_COMPARE_EXCHANGE(acq_int, Int); -ATOMIC_COMPARE_EXCHANGE(rel_int, Int); -ATOMIC_COMPARE_EXCHANGE(long, Long); -ATOMIC_COMPARE_EXCHANGE(acq_long, Long); -ATOMIC_COMPARE_EXCHANGE(rel_long, Long); -ATOMIC_COMPARE_EXCHANGE(ptr, Pointer); -ATOMIC_COMPARE_EXCHANGE(acq_ptr, Pointer); -ATOMIC_COMPARE_EXCHANGE(rel_ptr, Pointer); -ATOMIC_COMPARE_EXCHANGE(32, Int32); -ATOMIC_COMPARE_EXCHANGE(acq_32, Int32); -ATOMIC_COMPARE_EXCHANGE(rel_32, Int32); -ATOMIC_COMPARE_EXCHANGE(64, Int64); -ATOMIC_COMPARE_EXCHANGE(acq_64, Int64); -ATOMIC_COMPARE_EXCHANGE(rel_64, Int64); +ATOMIC_COMPARE_EXCHANGE(int, Int, unsigned int); +ATOMIC_COMPARE_EXCHANGE(acq_int, Int, unsigned int); +ATOMIC_COMPARE_EXCHANGE(rel_int, Int, unsigned int); +ATOMIC_COMPARE_EXCHANGE(long, Long, unsigned long); +ATOMIC_COMPARE_EXCHANGE(acq_long, Long, unsigned long); +ATOMIC_COMPARE_EXCHANGE(rel_long, Long, unsigned long); +ATOMIC_COMPARE_EXCHANGE(ptr, Pointer, uintptr_t); +ATOMIC_COMPARE_EXCHANGE(acq_ptr, Pointer, uintptr_t); +ATOMIC_COMPARE_EXCHANGE(rel_ptr, Pointer, uintptr_t); +ATOMIC_COMPARE_EXCHANGE(32, Int32, uint32_t); +ATOMIC_COMPARE_EXCHANGE(acq_32, Int32, uint32_t); +ATOMIC_COMPARE_EXCHANGE(rel_32, Int32, uint32_t); +ATOMIC_COMPARE_EXCHANGE(64, Int64, uint64_t); +ATOMIC_COMPARE_EXCHANGE(acq_64, Int64, uint64_t); +ATOMIC_COMPARE_EXCHANGE(rel_64, Int64, uint64_t); #ifdef __cplusplus } diff --git a/cpukit/score/include/rtems/score/genericcpuatomic.h b/cpukit/score/include/rtems/score/genericcpuatomic.h index 2599d0d..ed5868a 100644 --- a/cpukit/score/include/rtems/score/genericcpuatomic.h +++ b/cpukit/score/include/rtems/score/genericcpuatomic.h @@ -16,6 +16,7 @@ #define _RTEMS_SCORE_GEMERAL_ATOMIC_CPU_H #include <stdint.h> +#include <stdatomic.h> #ifdef __cplusplus extern "C" { @@ -31,27 +32,37 @@ extern "C" { /** * @brief atomic operation unsigned integer type */ -typedef unsigned int Atomic_Int; +//typedef unsigned int Atomic_Int; +//typedef _Atomic(unsigned int) Atomic_Int; +typedef atomic_uint Atomic_Int; /** * @brief atomic operation unsigned long integer type */ -typedef unsigned long Atomic_Long; +//typedef unsigned long Atomic_Long; +//typedef _Atomic(unsigned long) Atomic_Long; +typedef atomic_ulong Atomic_Long; /** * @brief atomic operation unsigned 32-bit integer type */ -typedef uint32_t Atomic_Int32; +//typedef uint32_t Atomic_Int32; +//typedef _Atomic(uint32_t) Atomic_Int32; +typedef atomic_uint_least32_t Atomic_Int32; /** * @brief atomic operation unsigned 64-bit integer type */ -typedef uint64_t Atomic_Int64; +//typedef uint64_t Atomic_Int64; +//typedef _Atomic(uint64_t) Atomic_Int64; +typedef atomic_uint_least64_t Atomic_Int64; /** * @brief atomic operation unsigned integer the size of a pointer type */ -typedef uintptr_t Atomic_Pointer; +//typedef uintptr_t Atomic_Pointer; +//typedef _Atomic(uintptr_t) Atomic_Pointer; +typedef atomic_uintptr_t Atomic_Pointer; #ifdef __cplusplus } diff --git a/cpukit/score/inline/rtems/score/atomic.inl b/cpukit/score/inline/rtems/score/atomic.inl index 313366c..3486924 100644 --- a/cpukit/score/inline/rtems/score/atomic.inl +++ b/cpukit/score/inline/rtems/score/atomic.inl @@ -31,7 +31,7 @@ #ifndef _RTEMS_SCORE_ATOMIC_INL #define _RTEMS_SCORE_ATOMIC_INL -RTEMS_INLINE_ROUTINE Atomic_Int _Atomic_Load_int( +RTEMS_INLINE_ROUTINE unsigned int _Atomic_Load_int( volatile Atomic_Int *address, Atomic_Memory_barrier memory_barrier ) @@ -41,7 +41,7 @@ RTEMS_INLINE_ROUTINE Atomic_Int _Atomic_Load_int( return _CPU_Atomic_Load_int(address); } -RTEMS_INLINE_ROUTINE Atomic_Long _Atomic_Load_long( +RTEMS_INLINE_ROUTINE unsigned long _Atomic_Load_long( volatile Atomic_Long *address, Atomic_Memory_barrier memory_barrier ) @@ -51,7 +51,7 @@ RTEMS_INLINE_ROUTINE Atomic_Long _Atomic_Load_long( return _CPU_Atomic_Load_long(address); } -RTEMS_INLINE_ROUTINE Atomic_Pointer _Atomic_Load_ptr( +RTEMS_INLINE_ROUTINE uintptr_t _Atomic_Load_ptr( volatile Atomic_Pointer *address, Atomic_Memory_barrier memory_barrier ) @@ -61,7 +61,7 @@ RTEMS_INLINE_ROUTINE Atomic_Pointer _Atomic_Load_ptr( return _CPU_Atomic_Load_ptr(address); } -RTEMS_INLINE_ROUTINE Atomic_Int32 _Atomic_Load_32( +RTEMS_INLINE_ROUTINE uint32_t _Atomic_Load_32( volatile Atomic_Int32 *address, Atomic_Memory_barrier memory_barrier ) @@ -71,7 +71,7 @@ RTEMS_INLINE_ROUTINE Atomic_Int32 _Atomic_Load_32( return _CPU_Atomic_Load_32(address); } -RTEMS_INLINE_ROUTINE Atomic_Int64 _Atomic_Load_64( +RTEMS_INLINE_ROUTINE uint64_t _Atomic_Load_64( volatile Atomic_Int64 *address, Atomic_Memory_barrier memory_barrier ) @@ -84,7 +84,7 @@ RTEMS_INLINE_ROUTINE Atomic_Int64 _Atomic_Load_64( RTEMS_INLINE_ROUTINE void _Atomic_Store_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ) { @@ -95,7 +95,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Store_int( RTEMS_INLINE_ROUTINE void _Atomic_Store_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ) { @@ -106,7 +106,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Store_long( RTEMS_INLINE_ROUTINE void _Atomic_Store_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ) { @@ -117,7 +117,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Store_ptr( RTEMS_INLINE_ROUTINE void _Atomic_Store_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ) { @@ -128,7 +128,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Store_32( RTEMS_INLINE_ROUTINE void _Atomic_Store_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ) { @@ -139,7 +139,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Store_64( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ) { @@ -153,7 +153,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_int( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ) { @@ -167,7 +167,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_long( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ) { @@ -181,7 +181,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_ptr( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ) { @@ -195,7 +195,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_32( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ) { @@ -209,7 +209,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_add_64( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ) { @@ -223,7 +223,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_int( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ) { @@ -237,7 +237,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_long( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ) { @@ -251,7 +251,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_ptr( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ) { @@ -265,7 +265,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_32( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ) { @@ -279,7 +279,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_sub_64( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ) { @@ -293,7 +293,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_int( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ) { @@ -307,7 +307,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_long( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ) { @@ -321,7 +321,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_ptr( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ) { @@ -335,7 +335,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_32( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ) { @@ -349,7 +349,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_or_64( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_int( volatile Atomic_Int *address, - Atomic_Int value, + unsigned int value, Atomic_Memory_barrier memory_barrier ) { @@ -363,7 +363,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_int( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_long( volatile Atomic_Long *address, - Atomic_Long value, + unsigned long value, Atomic_Memory_barrier memory_barrier ) { @@ -377,7 +377,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_long( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer value, + uintptr_t value, Atomic_Memory_barrier memory_barrier ) { @@ -391,7 +391,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_ptr( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_32( volatile Atomic_Int32 *address, - Atomic_Int32 value, + uint32_t value, Atomic_Memory_barrier memory_barrier ) { @@ -405,7 +405,7 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_32( RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_64( volatile Atomic_Int64 *address, - Atomic_Int64 value, + uint64_t value, Atomic_Memory_barrier memory_barrier ) { @@ -419,8 +419,8 @@ RTEMS_INLINE_ROUTINE void _Atomic_Fetch_and_64( RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_int( volatile Atomic_Int *address, - Atomic_Int old_value, - Atomic_Int new_value, + unsigned int *old_value, + unsigned int new_value, Atomic_Memory_barrier memory_barrier ) { @@ -434,8 +434,8 @@ RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_int( RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_long( volatile Atomic_Long *address, - Atomic_Long old_value, - Atomic_Long new_value, + unsigned long *old_value, + unsigned long new_value, Atomic_Memory_barrier memory_barrier ) { @@ -449,8 +449,8 @@ RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_long( RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_ptr( volatile Atomic_Pointer *address, - Atomic_Pointer old_value, - Atomic_Pointer new_value, + uintptr_t *old_value, + uintptr_t new_value, Atomic_Memory_barrier memory_barrier ) { @@ -464,8 +464,8 @@ RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_ptr( RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_32( volatile Atomic_Int32 *address, - Atomic_Int32 old_value, - Atomic_Int32 new_value, + uint32_t *old_value, + uint32_t new_value, Atomic_Memory_barrier memory_barrier ) { @@ -479,8 +479,8 @@ RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_32( RTEMS_INLINE_ROUTINE int _Atomic_Compare_exchange_64( volatile Atomic_Int64 *address, - Atomic_Int64 old_value, - Atomic_Int64 new_value, + uint64_t *old_value, + uint64_t new_value, Atomic_Memory_barrier memory_barrier ) { -- 1.7.9.5 _______________________________________________ rtems-devel mailing list rtems-devel@rtems.org http://www.rtems.org/mailman/listinfo/rtems-devel