mirror of
https://git.FreeBSD.org/src.git
synced 2024-11-21 07:15:49 +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
|
functions are only implemented for the types
|
||||||
.Dq Li int ,
|
.Dq Li int ,
|
||||||
.Dq Li long ,
|
.Dq Li long ,
|
||||||
|
.Dq ptr ,
|
||||||
.Dq Li 32 ,
|
.Dq Li 32 ,
|
||||||
and
|
and
|
||||||
.Dq Li 64
|
.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_fcmpset_rel_ptr atomic_fcmpset_rel_long
|
||||||
#define atomic_swap_ptr atomic_swap_long
|
#define atomic_swap_ptr atomic_swap_long
|
||||||
#define atomic_readandclear_ptr atomic_readandclear_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 */
|
#endif /* !WANT_FUNCTIONS */
|
||||||
|
|
||||||
|
@ -1076,6 +1076,8 @@ atomic_thread_fence_seq_cst(void)
|
|||||||
#define atomic_load_acq_ptr atomic_load_acq_32
|
#define atomic_load_acq_ptr atomic_load_acq_32
|
||||||
#define atomic_store_rel_ptr atomic_store_rel_32
|
#define atomic_store_rel_ptr atomic_store_rel_32
|
||||||
#define atomic_swap_ptr atomic_swap_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_int atomic_add_32
|
||||||
#define atomic_add_acq_int atomic_add_acq_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_set_ptr atomic_set_64
|
||||||
#define atomic_swap_ptr atomic_swap_64
|
#define atomic_swap_ptr atomic_swap_64
|
||||||
#define atomic_subtract_ptr atomic_subtract_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_add_acq_long atomic_add_acq_64
|
||||||
#define atomic_fcmpset_acq_long atomic_fcmpset_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))
|
atomic_swap_int((volatile u_int *)(p), (u_int)(v))
|
||||||
#define atomic_readandclear_ptr(p) \
|
#define atomic_readandclear_ptr(p) \
|
||||||
atomic_readandclear_int((volatile u_int *)(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 */
|
#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(64, uint64_t);
|
||||||
ASAN_ATOMIC_FUNC_TESTANDCLEAR(int, u_int);
|
ASAN_ATOMIC_FUNC_TESTANDCLEAR(int, u_int);
|
||||||
ASAN_ATOMIC_FUNC_TESTANDCLEAR(long, u_long);
|
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(32, uint32_t);
|
||||||
ASAN_ATOMIC_FUNC_TESTANDSET(64, uint64_t);
|
ASAN_ATOMIC_FUNC_TESTANDSET(64, uint64_t);
|
||||||
ASAN_ATOMIC_FUNC_TESTANDSET(int, u_int);
|
ASAN_ATOMIC_FUNC_TESTANDSET(int, u_int);
|
||||||
ASAN_ATOMIC_FUNC_TESTANDSET(long, u_long);
|
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(32, uint32_t);
|
||||||
ASAN_ATOMIC_FUNC_SWAP(64, uint64_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_SUBTRACT(ptr, uintptr_t)
|
||||||
CSAN_ATOMIC_FUNC_STORE(ptr, uintptr_t)
|
CSAN_ATOMIC_FUNC_STORE(ptr, uintptr_t)
|
||||||
CSAN_ATOMIC_FUNC_SWAP(ptr, uintptr_t)
|
CSAN_ATOMIC_FUNC_SWAP(ptr, uintptr_t)
|
||||||
#if 0
|
|
||||||
CSAN_ATOMIC_FUNC_TESTANDCLEAR(ptr, uintptr_t)
|
CSAN_ATOMIC_FUNC_TESTANDCLEAR(ptr, uintptr_t)
|
||||||
CSAN_ATOMIC_FUNC_TESTANDSET(ptr, uintptr_t)
|
CSAN_ATOMIC_FUNC_TESTANDSET(ptr, uintptr_t)
|
||||||
#endif
|
|
||||||
|
|
||||||
#define CSAN_ATOMIC_FUNC_THREAD_FENCE(name) \
|
#define CSAN_ATOMIC_FUNC_THREAD_FENCE(name) \
|
||||||
void kcsan_atomic_thread_fence_##name(void) \
|
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(64, uint64_t);
|
||||||
MSAN_ATOMIC_FUNC_TESTANDCLEAR(int, u_int);
|
MSAN_ATOMIC_FUNC_TESTANDCLEAR(int, u_int);
|
||||||
MSAN_ATOMIC_FUNC_TESTANDCLEAR(long, u_long);
|
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(32, uint32_t);
|
||||||
MSAN_ATOMIC_FUNC_TESTANDSET(64, uint64_t);
|
MSAN_ATOMIC_FUNC_TESTANDSET(64, uint64_t);
|
||||||
MSAN_ATOMIC_FUNC_TESTANDSET(int, u_int);
|
MSAN_ATOMIC_FUNC_TESTANDSET(int, u_int);
|
||||||
MSAN_ATOMIC_FUNC_TESTANDSET(long, u_long);
|
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(32, uint32_t);
|
||||||
MSAN_ATOMIC_FUNC_SWAP(64, uint64_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);
|
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
|
static __inline void
|
||||||
atomic_thread_fence_acq(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_set_ptr atomic_set_64
|
||||||
#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
|
||||||
|
#define atomic_testandclear_ptr atomic_testandclear_64
|
||||||
|
#define atomic_testandset_ptr atomic_testandset_64
|
||||||
|
|
||||||
ATOMIC_ACQ_REL(set, 64)
|
ATOMIC_ACQ_REL(set, 64)
|
||||||
ATOMIC_ACQ_REL(clear, 64)
|
ATOMIC_ACQ_REL(clear, 64)
|
||||||
|
Loading…
Reference in New Issue
Block a user