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:
John Baldwin 2024-11-19 10:24:50 -05:00
parent 3ca22e1e8f
commit a80b9ee15a
10 changed files with 27 additions and 2 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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);

View File

@ -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) \

View File

@ -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);

View File

@ -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)
{

View File

@ -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)