mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-26 20:12:44 +00:00
atomic(9): Implement atomic_testand(clear|set)_ptr
For current architectures, these are just aliases for the existing operation on the relevant scalar integer. Reviewed by: imp, kib Obtained from: CheriBSD Sponsored by: AFRL, DARPA Differential Revision: https://reviews.freebsd.org/D47631
This commit is contained in:
parent
3ca22e1e8f
commit
a80b9ee15a
@ -481,6 +481,7 @@ and
|
||||
functions are only implemented for the types
|
||||
.Dq Li int ,
|
||||
.Dq Li long ,
|
||||
.Dq ptr ,
|
||||
.Dq Li 32 ,
|
||||
and
|
||||
.Dq Li 64
|
||||
|
@ -589,6 +589,8 @@ atomic_swap_long(volatile u_long *p, u_long v)
|
||||
#define atomic_fcmpset_rel_ptr atomic_fcmpset_rel_long
|
||||
#define atomic_swap_ptr atomic_swap_long
|
||||
#define atomic_readandclear_ptr atomic_readandclear_long
|
||||
#define atomic_testandset_ptr atomic_testandset_long
|
||||
#define atomic_testandclear_ptr atomic_testandclear_long
|
||||
|
||||
#endif /* !WANT_FUNCTIONS */
|
||||
|
||||
|
@ -1076,6 +1076,8 @@ atomic_thread_fence_seq_cst(void)
|
||||
#define atomic_load_acq_ptr atomic_load_acq_32
|
||||
#define atomic_store_rel_ptr atomic_store_rel_32
|
||||
#define atomic_swap_ptr atomic_swap_32
|
||||
#define atomic_testandset_ptr atomic_testandset_32
|
||||
#define atomic_testandclear_ptr atomic_testandclear_32
|
||||
|
||||
#define atomic_add_int atomic_add_32
|
||||
#define atomic_add_acq_int atomic_add_acq_32
|
||||
|
@ -609,6 +609,8 @@ _ATOMIC_STORE_REL_IMPL(64, , )
|
||||
#define atomic_set_ptr atomic_set_64
|
||||
#define atomic_swap_ptr atomic_swap_64
|
||||
#define atomic_subtract_ptr atomic_subtract_64
|
||||
#define atomic_testandclear_ptr atomic_testandclear_64
|
||||
#define atomic_testandset_ptr atomic_testandset_64
|
||||
|
||||
#define atomic_add_acq_long atomic_add_acq_64
|
||||
#define atomic_fcmpset_acq_long atomic_fcmpset_acq_64
|
||||
|
@ -865,6 +865,10 @@ atomic_swap_long(volatile u_long *p, u_long v)
|
||||
atomic_swap_int((volatile u_int *)(p), (u_int)(v))
|
||||
#define atomic_readandclear_ptr(p) \
|
||||
atomic_readandclear_int((volatile u_int *)(p))
|
||||
#define atomic_testandclear_ptr(p, val) \
|
||||
atomic_testandclear_int((volatile u_int *)(p), (val))
|
||||
#define atomic_testandset_ptr(p, val) \
|
||||
atomic_testandset_int((volatile u_int *)(p), (val))
|
||||
|
||||
#endif /* !WANT_FUNCTIONS */
|
||||
|
||||
|
@ -827,11 +827,13 @@ ASAN_ATOMIC_FUNC_TESTANDCLEAR(32, uint32_t);
|
||||
ASAN_ATOMIC_FUNC_TESTANDCLEAR(64, uint64_t);
|
||||
ASAN_ATOMIC_FUNC_TESTANDCLEAR(int, u_int);
|
||||
ASAN_ATOMIC_FUNC_TESTANDCLEAR(long, u_long);
|
||||
ASAN_ATOMIC_FUNC_TESTANDCLEAR(ptr, uintptr_t);
|
||||
|
||||
ASAN_ATOMIC_FUNC_TESTANDSET(32, uint32_t);
|
||||
ASAN_ATOMIC_FUNC_TESTANDSET(64, uint64_t);
|
||||
ASAN_ATOMIC_FUNC_TESTANDSET(int, u_int);
|
||||
ASAN_ATOMIC_FUNC_TESTANDSET(long, u_long);
|
||||
ASAN_ATOMIC_FUNC_TESTANDSET(ptr, uintptr_t);
|
||||
|
||||
ASAN_ATOMIC_FUNC_SWAP(32, uint32_t);
|
||||
ASAN_ATOMIC_FUNC_SWAP(64, uint64_t);
|
||||
|
@ -658,10 +658,8 @@ CSAN_ATOMIC_FUNC_SET(ptr, uintptr_t)
|
||||
CSAN_ATOMIC_FUNC_SUBTRACT(ptr, uintptr_t)
|
||||
CSAN_ATOMIC_FUNC_STORE(ptr, uintptr_t)
|
||||
CSAN_ATOMIC_FUNC_SWAP(ptr, uintptr_t)
|
||||
#if 0
|
||||
CSAN_ATOMIC_FUNC_TESTANDCLEAR(ptr, uintptr_t)
|
||||
CSAN_ATOMIC_FUNC_TESTANDSET(ptr, uintptr_t)
|
||||
#endif
|
||||
|
||||
#define CSAN_ATOMIC_FUNC_THREAD_FENCE(name) \
|
||||
void kcsan_atomic_thread_fence_##name(void) \
|
||||
|
@ -1289,11 +1289,13 @@ MSAN_ATOMIC_FUNC_TESTANDCLEAR(32, uint32_t);
|
||||
MSAN_ATOMIC_FUNC_TESTANDCLEAR(64, uint64_t);
|
||||
MSAN_ATOMIC_FUNC_TESTANDCLEAR(int, u_int);
|
||||
MSAN_ATOMIC_FUNC_TESTANDCLEAR(long, u_long);
|
||||
MSAN_ATOMIC_FUNC_TESTANDCLEAR(ptr, uintptr_t);
|
||||
|
||||
MSAN_ATOMIC_FUNC_TESTANDSET(32, uint32_t);
|
||||
MSAN_ATOMIC_FUNC_TESTANDSET(64, uint64_t);
|
||||
MSAN_ATOMIC_FUNC_TESTANDSET(int, u_int);
|
||||
MSAN_ATOMIC_FUNC_TESTANDSET(long, u_long);
|
||||
MSAN_ATOMIC_FUNC_TESTANDSET(ptr, uintptr_t);
|
||||
|
||||
MSAN_ATOMIC_FUNC_SWAP(32, uint32_t);
|
||||
MSAN_ATOMIC_FUNC_SWAP(64, uint64_t);
|
||||
|
@ -1093,6 +1093,16 @@ atomic_testandset_acq_long(volatile u_long *p, u_int v)
|
||||
return (a);
|
||||
}
|
||||
|
||||
#ifdef __powerpc64__
|
||||
#define atomic_testandclear_ptr atomic_testandclear_long
|
||||
#define atomic_testandset_ptr atomic_testandset_long
|
||||
#else
|
||||
#define atomic_testandclear_ptr(p,v) \
|
||||
atomic_testandclear_32((volatile u_int *)(p), v)
|
||||
#define atomic_testandset_ptr(p,v) \
|
||||
atomic_testandset_32((volatile u_int *)(p), v)
|
||||
#endif
|
||||
|
||||
static __inline void
|
||||
atomic_thread_fence_acq(void)
|
||||
{
|
||||
|
@ -557,6 +557,8 @@ atomic_swap_64(volatile uint64_t *p, uint64_t val)
|
||||
#define atomic_set_ptr atomic_set_64
|
||||
#define atomic_subtract_ptr atomic_subtract_64
|
||||
#define atomic_swap_ptr atomic_swap_64
|
||||
#define atomic_testandclear_ptr atomic_testandclear_64
|
||||
#define atomic_testandset_ptr atomic_testandset_64
|
||||
|
||||
ATOMIC_ACQ_REL(set, 64)
|
||||
ATOMIC_ACQ_REL(clear, 64)
|
||||
|
Loading…
Reference in New Issue
Block a user