Index: sys/sys/atomic_common.h =================================================================== --- sys/sys/atomic_common.h +++ sys/sys/atomic_common.h @@ -36,38 +36,35 @@ #error do not include this header, use machine/atomic.h #endif -#define atomic_load_char(p) (*(volatile u_char *)(p)) -#define atomic_load_short(p) (*(volatile u_short *)(p)) -#define atomic_load_int(p) (*(volatile u_int *)(p)) -#define atomic_load_long(p) (*(volatile u_long *)(p)) -#define atomic_load_ptr(p) (*(volatile __typeof(*p) *)(p)) -#define atomic_load_8(p) (*(volatile uint8_t *)(p)) -#define atomic_load_16(p) (*(volatile uint16_t *)(p)) -#define atomic_load_32(p) (*(volatile uint32_t *)(p)) -#ifdef _LP64 -#define atomic_load_64(p) (*(volatile uint64_t *)(p)) -#endif +#include -#define atomic_store_char(p, v) \ - (*(volatile u_char *)(p) = (u_char)(v)) -#define atomic_store_short(p, v) \ - (*(volatile u_short *)(p) = (u_short)(v)) -#define atomic_store_int(p, v) \ - (*(volatile u_int *)(p) = (u_int)(v)) -#define atomic_store_long(p, v) \ - (*(volatile u_long *)(p) = (u_long)(v)) -#define atomic_store_ptr(p, v) \ - (*(volatile __typeof(*p) *)(p) = (v)) -#define atomic_store_8(p, v) \ - (*(volatile uint8_t *)(p) = (uint8_t)(v)) -#define atomic_store_16(p, v) \ - (*(volatile uint16_t *)(p) = (uint16_t)(v)) -#define atomic_store_32(p, v) \ - (*(volatile uint32_t *)(p) = (uint32_t)(v)) +#define ATOMIC_LOADSTORE(t, n) \ +static inline volatile t \ +atomic_load_ ## n (volatile t *p) \ +{ \ + return (*p); \ +} \ + \ +static inline void \ +atomic_store_ ## n (volatile t *p, t v) \ +{ \ + *p = v; \ +} + +ATOMIC_LOADSTORE(u_char, char); +ATOMIC_LOADSTORE(u_short, short); +ATOMIC_LOADSTORE(u_int, int); +ATOMIC_LOADSTORE(u_long, long); +ATOMIC_LOADSTORE(uint8_t, 8); +ATOMIC_LOADSTORE(uint16_t, 16); +ATOMIC_LOADSTORE(uint32_t, 32); #ifdef _LP64 -#define atomic_store_64(p, v) \ - (*(volatile uint64_t *)(p) = (uint64_t)(v)) +ATOMIC_LOADSTORE(uint64_t, 64); #endif +#undef ATOMIC_LOADSTORE + +#define atomic_load_ptr(p) (*(volatile __typeof(*p) *)(p)) +#define atomic_store_ptr(p, v) (*(volatile __typeof(*p) *)(p) = (v)) /* * Currently all architectures provide acquire and release fences on their own,