Page MenuHomeFreeBSD

D47631.diff
No OneTemporary

D47631.diff

diff --git a/share/man/man9/atomic.9 b/share/man/man9/atomic.9
--- a/share/man/man9/atomic.9
+++ b/share/man/man9/atomic.9
@@ -481,6 +481,7 @@
functions are only implemented for the types
.Dq Li int ,
.Dq Li long ,
+.Dq ptr ,
.Dq Li 32 ,
and
.Dq Li 64
diff --git a/sys/amd64/include/atomic.h b/sys/amd64/include/atomic.h
--- a/sys/amd64/include/atomic.h
+++ b/sys/amd64/include/atomic.h
@@ -589,6 +589,8 @@
#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 */
diff --git a/sys/arm/include/atomic.h b/sys/arm/include/atomic.h
--- a/sys/arm/include/atomic.h
+++ b/sys/arm/include/atomic.h
@@ -1076,6 +1076,8 @@
#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
diff --git a/sys/arm64/include/atomic.h b/sys/arm64/include/atomic.h
--- a/sys/arm64/include/atomic.h
+++ b/sys/arm64/include/atomic.h
@@ -609,6 +609,8 @@
#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
diff --git a/sys/i386/include/atomic.h b/sys/i386/include/atomic.h
--- a/sys/i386/include/atomic.h
+++ b/sys/i386/include/atomic.h
@@ -865,6 +865,10 @@
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 */
diff --git a/sys/kern/subr_asan.c b/sys/kern/subr_asan.c
--- a/sys/kern/subr_asan.c
+++ b/sys/kern/subr_asan.c
@@ -827,11 +827,13 @@
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);
diff --git a/sys/kern/subr_csan.c b/sys/kern/subr_csan.c
--- a/sys/kern/subr_csan.c
+++ b/sys/kern/subr_csan.c
@@ -658,10 +658,8 @@
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) \
diff --git a/sys/kern/subr_msan.c b/sys/kern/subr_msan.c
--- a/sys/kern/subr_msan.c
+++ b/sys/kern/subr_msan.c
@@ -1289,11 +1289,13 @@
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);
diff --git a/sys/powerpc/include/atomic.h b/sys/powerpc/include/atomic.h
--- a/sys/powerpc/include/atomic.h
+++ b/sys/powerpc/include/atomic.h
@@ -1093,6 +1093,16 @@
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)
{
diff --git a/sys/riscv/include/atomic.h b/sys/riscv/include/atomic.h
--- a/sys/riscv/include/atomic.h
+++ b/sys/riscv/include/atomic.h
@@ -557,6 +557,8 @@
#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)

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 17, 12:20 AM (22 h, 19 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14668167
Default Alt Text
D47631.diff (4 KB)

Event Timeline