Changeset View
Changeset View
Standalone View
Standalone View
head/sys/riscv/include/atomic.h
Show All 38 Lines | |||||
#include <sys/atomic_common.h> | #include <sys/atomic_common.h> | ||||
#define fence() __asm __volatile("fence" ::: "memory"); | #define fence() __asm __volatile("fence" ::: "memory"); | ||||
#define mb() fence() | #define mb() fence() | ||||
#define rmb() fence() | #define rmb() fence() | ||||
#define wmb() fence() | #define wmb() fence() | ||||
static __inline int atomic_cmpset_8(__volatile uint8_t *, uint8_t, uint8_t); | |||||
static __inline int atomic_fcmpset_8(__volatile uint8_t *, uint8_t *, uint8_t); | |||||
static __inline int atomic_cmpset_16(__volatile uint16_t *, uint16_t, uint16_t); | |||||
static __inline int atomic_fcmpset_16(__volatile uint16_t *, uint16_t *, | |||||
uint16_t); | |||||
#define ATOMIC_ACQ_REL(NAME, WIDTH) \ | #define ATOMIC_ACQ_REL(NAME, WIDTH) \ | ||||
static __inline void \ | static __inline void \ | ||||
atomic_##NAME##_acq_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ | atomic_##NAME##_acq_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ | ||||
{ \ | { \ | ||||
atomic_##NAME##_##WIDTH(p, v); \ | atomic_##NAME##_##WIDTH(p, v); \ | ||||
fence(); \ | fence(); \ | ||||
} \ | } \ | ||||
\ | \ | ||||
static __inline void \ | static __inline void \ | ||||
atomic_##NAME##_rel_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ | atomic_##NAME##_rel_##WIDTH(__volatile uint##WIDTH##_t *p, uint##WIDTH##_t v)\ | ||||
{ \ | { \ | ||||
fence(); \ | fence(); \ | ||||
atomic_##NAME##_##WIDTH(p, v); \ | atomic_##NAME##_##WIDTH(p, v); \ | ||||
} | } | ||||
#define ATOMIC_CMPSET_ACQ_REL(WIDTH) \ | |||||
static __inline int \ | |||||
atomic_cmpset_acq_##WIDTH(__volatile uint##WIDTH##_t *p, \ | |||||
uint##WIDTH##_t cmpval, uint##WIDTH##_t newval) \ | |||||
{ \ | |||||
int retval; \ | |||||
\ | |||||
retval = atomic_cmpset_##WIDTH(p, cmpval, newval); \ | |||||
fence(); \ | |||||
return (retval); \ | |||||
} \ | |||||
\ | |||||
static __inline int \ | |||||
atomic_cmpset_rel_##WIDTH(__volatile uint##WIDTH##_t *p, \ | |||||
uint##WIDTH##_t cmpval, uint##WIDTH##_t newval) \ | |||||
{ \ | |||||
fence(); \ | |||||
return (atomic_cmpset_##WIDTH(p, cmpval, newval)); \ | |||||
} | |||||
#define ATOMIC_FCMPSET_ACQ_REL(WIDTH) \ | |||||
static __inline int \ | |||||
atomic_fcmpset_acq_##WIDTH(__volatile uint##WIDTH##_t *p, \ | |||||
uint##WIDTH##_t *cmpval, uint##WIDTH##_t newval) \ | |||||
{ \ | |||||
int retval; \ | |||||
\ | |||||
retval = atomic_fcmpset_##WIDTH(p, cmpval, newval); \ | |||||
fence(); \ | |||||
return (retval); \ | |||||
} \ | |||||
\ | |||||
static __inline int \ | |||||
atomic_fcmpset_rel_##WIDTH(__volatile uint##WIDTH##_t *p, \ | |||||
uint##WIDTH##_t *cmpval, uint##WIDTH##_t newval) \ | |||||
{ \ | |||||
fence(); \ | |||||
return (atomic_fcmpset_##WIDTH(p, cmpval, newval)); \ | |||||
} | |||||
ATOMIC_CMPSET_ACQ_REL(8); | |||||
ATOMIC_FCMPSET_ACQ_REL(8); | |||||
ATOMIC_CMPSET_ACQ_REL(16); | |||||
ATOMIC_FCMPSET_ACQ_REL(16); | |||||
#define atomic_cmpset_char atomic_cmpset_8 | |||||
#define atomic_cmpset_acq_char atomic_cmpset_acq_8 | |||||
#define atomic_cmpset_rel_char atomic_cmpset_rel_8 | |||||
#define atomic_fcmpset_char atomic_fcmpset_8 | |||||
#define atomic_fcmpset_acq_char atomic_fcmpset_acq_8 | |||||
#define atomic_fcmpset_rel_char atomic_fcmpset_rel_8 | |||||
#define atomic_cmpset_short atomic_cmpset_16 | |||||
#define atomic_cmpset_acq_short atomic_cmpset_acq_16 | |||||
#define atomic_cmpset_rel_short atomic_cmpset_rel_16 | |||||
#define atomic_fcmpset_short atomic_fcmpset_16 | |||||
#define atomic_fcmpset_acq_short atomic_fcmpset_acq_16 | |||||
#define atomic_fcmpset_rel_short atomic_fcmpset_rel_16 | |||||
static __inline void | static __inline void | ||||
atomic_add_32(volatile uint32_t *p, uint32_t val) | atomic_add_32(volatile uint32_t *p, uint32_t val) | ||||
{ | { | ||||
__asm __volatile("amoadd.w zero, %1, %0" | __asm __volatile("amoadd.w zero, %1, %0" | ||||
: "+A" (*p) | : "+A" (*p) | ||||
: "r" (val) | : "r" (val) | ||||
: "memory"); | : "memory"); | ||||
▲ Show 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | |||||
#define atomic_set_int atomic_set_32 | #define atomic_set_int atomic_set_32 | ||||
#define atomic_subtract_int atomic_subtract_32 | #define atomic_subtract_int atomic_subtract_32 | ||||
ATOMIC_ACQ_REL(set, 32) | ATOMIC_ACQ_REL(set, 32) | ||||
ATOMIC_ACQ_REL(clear, 32) | ATOMIC_ACQ_REL(clear, 32) | ||||
ATOMIC_ACQ_REL(add, 32) | ATOMIC_ACQ_REL(add, 32) | ||||
ATOMIC_ACQ_REL(subtract, 32) | ATOMIC_ACQ_REL(subtract, 32) | ||||
static __inline int | ATOMIC_CMPSET_ACQ_REL(32); | ||||
atomic_cmpset_acq_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | ATOMIC_FCMPSET_ACQ_REL(32); | ||||
{ | |||||
int res; | |||||
res = atomic_cmpset_32(p, cmpval, newval); | |||||
fence(); | |||||
return (res); | |||||
} | |||||
static __inline int | |||||
atomic_cmpset_rel_32(volatile uint32_t *p, uint32_t cmpval, uint32_t newval) | |||||
{ | |||||
fence(); | |||||
return (atomic_cmpset_32(p, cmpval, newval)); | |||||
} | |||||
static __inline int | |||||
atomic_fcmpset_acq_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) | |||||
{ | |||||
int res; | |||||
res = atomic_fcmpset_32(p, cmpval, newval); | |||||
fence(); | |||||
return (res); | |||||
} | |||||
static __inline int | |||||
atomic_fcmpset_rel_32(volatile uint32_t *p, uint32_t *cmpval, uint32_t newval) | |||||
{ | |||||
fence(); | |||||
return (atomic_fcmpset_32(p, cmpval, newval)); | |||||
} | |||||
static __inline uint32_t | static __inline uint32_t | ||||
atomic_load_acq_32(volatile uint32_t *p) | atomic_load_acq_32(volatile uint32_t *p) | ||||
{ | { | ||||
uint32_t ret; | uint32_t ret; | ||||
ret = *p; | ret = *p; | ||||
fence(); | fence(); | ||||
▲ Show 20 Lines • Show All 191 Lines • ▼ Show 20 Lines | |||||
#define atomic_subtract_ptr atomic_subtract_64 | #define atomic_subtract_ptr atomic_subtract_64 | ||||
#define atomic_swap_ptr atomic_swap_64 | #define atomic_swap_ptr atomic_swap_64 | ||||
ATOMIC_ACQ_REL(set, 64) | ATOMIC_ACQ_REL(set, 64) | ||||
ATOMIC_ACQ_REL(clear, 64) | ATOMIC_ACQ_REL(clear, 64) | ||||
ATOMIC_ACQ_REL(add, 64) | ATOMIC_ACQ_REL(add, 64) | ||||
ATOMIC_ACQ_REL(subtract, 64) | ATOMIC_ACQ_REL(subtract, 64) | ||||
static __inline int | ATOMIC_CMPSET_ACQ_REL(64); | ||||
atomic_cmpset_acq_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) | ATOMIC_FCMPSET_ACQ_REL(64); | ||||
{ | |||||
int res; | |||||
res = atomic_cmpset_64(p, cmpval, newval); | |||||
fence(); | |||||
return (res); | |||||
} | |||||
static __inline int | |||||
atomic_cmpset_rel_64(volatile uint64_t *p, uint64_t cmpval, uint64_t newval) | |||||
{ | |||||
fence(); | |||||
return (atomic_cmpset_64(p, cmpval, newval)); | |||||
} | |||||
static __inline int | |||||
atomic_fcmpset_acq_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | |||||
{ | |||||
int res; | |||||
res = atomic_fcmpset_64(p, cmpval, newval); | |||||
fence(); | |||||
return (res); | |||||
} | |||||
static __inline int | |||||
atomic_fcmpset_rel_64(volatile uint64_t *p, uint64_t *cmpval, uint64_t newval) | |||||
{ | |||||
fence(); | |||||
return (atomic_fcmpset_64(p, cmpval, newval)); | |||||
} | |||||
static __inline uint64_t | static __inline uint64_t | ||||
atomic_load_acq_64(volatile uint64_t *p) | atomic_load_acq_64(volatile uint64_t *p) | ||||
{ | { | ||||
uint64_t ret; | uint64_t ret; | ||||
ret = *p; | ret = *p; | ||||
fence(); | fence(); | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | |||||
#define atomic_add_rel_ptr atomic_add_rel_64 | #define atomic_add_rel_ptr atomic_add_rel_64 | ||||
#define atomic_clear_rel_ptr atomic_clear_rel_64 | #define atomic_clear_rel_ptr atomic_clear_rel_64 | ||||
#define atomic_cmpset_rel_ptr atomic_cmpset_rel_64 | #define atomic_cmpset_rel_ptr atomic_cmpset_rel_64 | ||||
#define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_64 | #define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_64 | ||||
#define atomic_set_rel_ptr atomic_set_rel_64 | #define atomic_set_rel_ptr atomic_set_rel_64 | ||||
#define atomic_subtract_rel_ptr atomic_subtract_rel_64 | #define atomic_subtract_rel_ptr atomic_subtract_rel_64 | ||||
#define atomic_store_rel_ptr atomic_store_rel_64 | #define atomic_store_rel_ptr atomic_store_rel_64 | ||||
#include <sys/_atomic_subword.h> | |||||
#endif /* _MACHINE_ATOMIC_H_ */ | #endif /* _MACHINE_ATOMIC_H_ */ |