git: 1f6b6cf1774c - main - atomic: Intercept atomic_(load|store)_bool for kernel sanitizers

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Sat, 29 Oct 2022 15:11:19 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=1f6b6cf1774c4f173df1cde3e5cff459f340c95f

commit 1f6b6cf1774c4f173df1cde3e5cff459f340c95f
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2022-10-29 15:02:02 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2022-10-29 15:10:58 +0000

    atomic: Intercept atomic_(load|store)_bool for kernel sanitizers
    
    Fixes:          2bed73739aac ("atomic: Add plain atomic_load/store_bool()")
---
 sys/kern/subr_asan.c |  2 ++
 sys/kern/subr_csan.c |  3 +++
 sys/kern/subr_msan.c |  2 ++
 sys/sys/atomic_san.h | 18 ++++++++++++++++--
 4 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/sys/kern/subr_asan.c b/sys/kern/subr_asan.c
index e727c1d03dd7..8a70b525648b 100644
--- a/sys/kern/subr_asan.c
+++ b/sys/kern/subr_asan.c
@@ -843,6 +843,7 @@ ASAN_ATOMIC_FUNC_FCMPSET(int, u_int);
 ASAN_ATOMIC_FUNC_FCMPSET(long, u_long);
 ASAN_ATOMIC_FUNC_FCMPSET(ptr, uintptr_t);
 
+_ASAN_ATOMIC_FUNC_LOAD(bool, bool);
 ASAN_ATOMIC_FUNC_LOAD(8, uint8_t);
 ASAN_ATOMIC_FUNC_LOAD(16, uint16_t);
 ASAN_ATOMIC_FUNC_LOAD(32, uint32_t);
@@ -853,6 +854,7 @@ ASAN_ATOMIC_FUNC_LOAD(int, u_int);
 ASAN_ATOMIC_FUNC_LOAD(long, u_long);
 ASAN_ATOMIC_FUNC_LOAD(ptr, uintptr_t);
 
+_ASAN_ATOMIC_FUNC_STORE(bool, bool);
 ASAN_ATOMIC_FUNC_STORE(8, uint8_t);
 ASAN_ATOMIC_FUNC_STORE(16, uint16_t);
 ASAN_ATOMIC_FUNC_STORE(32, uint32_t);
diff --git a/sys/kern/subr_csan.c b/sys/kern/subr_csan.c
index 1ae8dd614222..8723777ce84b 100644
--- a/sys/kern/subr_csan.c
+++ b/sys/kern/subr_csan.c
@@ -520,6 +520,9 @@ kcsan_copyout(const void *kaddr, void *uaddr, size_t len)
 		return (atomic_testandset_##name(ptr, val)); 		\
 	}
 
+_CSAN_ATOMIC_FUNC_LOAD(bool, bool)
+_CSAN_ATOMIC_FUNC_STORE(bool, bool)
+
 CSAN_ATOMIC_FUNC_ADD(8, uint8_t)
 CSAN_ATOMIC_FUNC_CLEAR(8, uint8_t)
 CSAN_ATOMIC_FUNC_CMPSET(8, uint8_t)
diff --git a/sys/kern/subr_msan.c b/sys/kern/subr_msan.c
index 816f38fc74cb..236693cfd841 100644
--- a/sys/kern/subr_msan.c
+++ b/sys/kern/subr_msan.c
@@ -1375,6 +1375,7 @@ MSAN_ATOMIC_FUNC_FCMPSET(int, u_int);
 MSAN_ATOMIC_FUNC_FCMPSET(long, u_long);
 MSAN_ATOMIC_FUNC_FCMPSET(ptr, uintptr_t);
 
+_MSAN_ATOMIC_FUNC_LOAD(bool, bool);
 MSAN_ATOMIC_FUNC_LOAD(8, uint8_t);
 MSAN_ATOMIC_FUNC_LOAD(16, uint16_t);
 MSAN_ATOMIC_FUNC_LOAD(32, uint32_t);
@@ -1385,6 +1386,7 @@ MSAN_ATOMIC_FUNC_LOAD(int, u_int);
 MSAN_ATOMIC_FUNC_LOAD(long, u_long);
 MSAN_ATOMIC_FUNC_LOAD(ptr, uintptr_t);
 
+_MSAN_ATOMIC_FUNC_STORE(bool, bool);
 MSAN_ATOMIC_FUNC_STORE(8, uint8_t);
 MSAN_ATOMIC_FUNC_STORE(16, uint16_t);
 MSAN_ATOMIC_FUNC_STORE(32, uint32_t);
diff --git a/sys/sys/atomic_san.h b/sys/sys/atomic_san.h
index b0790962d8bd..1f7d615ebd11 100644
--- a/sys/sys/atomic_san.h
+++ b/sys/sys/atomic_san.h
@@ -65,11 +65,15 @@
 	type sp##_atomic_readandclear_##name(volatile type *)
 
 #define	ATOMIC_SAN_LOAD(sp, name, type)					\
-	type sp##_atomic_load_##name(volatile type *);			\
+	type sp##_atomic_load_##name(volatile type *)
+
+#define	ATOMIC_SAN_LOAD_ACQ(sp, name, type)				\
 	type sp##_atomic_load_acq_##name(volatile type *)
 
 #define	ATOMIC_SAN_STORE(sp, name, type)				\
-	void sp##_atomic_store_##name(volatile type *, type);		\
+	void sp##_atomic_store_##name(volatile type *, type)
+
+#define	ATOMIC_SAN_STORE_REL(sp, name, type)				\
 	void sp##_atomic_store_rel_##name(volatile type *, type)
 
 #define	ATOMIC_SAN_TEST(sp, op, name, type)				\
@@ -86,6 +90,10 @@
 #define	ATOMIC_SAN_THREAD_FENCE(sp)					\
 	_ATOMIC_SAN_THREAD_FENCE(sp)
 
+#define	ATOMIC_SAN_LOAD_STORE(sp, name, type)				\
+	ATOMIC_SAN_LOAD(sp, name, type);				\
+	ATOMIC_SAN_STORE(sp, name, type)
+
 #define	_ATOMIC_SAN_FUNCS(sp, name, type)				\
 	ATOMIC_SAN_FUNC_1(sp, add, name, type);				\
 	ATOMIC_SAN_FUNC_1(sp, clear, name, type);			\
@@ -93,10 +101,12 @@
 	ATOMIC_SAN_FCMPSET(sp, name, type);				\
 	ATOMIC_SAN_READ(sp, fetchadd, name, type);			\
 	ATOMIC_SAN_LOAD(sp, name, type);				\
+	ATOMIC_SAN_LOAD_ACQ(sp, name, type);				\
 	ATOMIC_SAN_READANDCLEAR(sp, name, type);			\
 	ATOMIC_SAN_FUNC_1(sp, set, name, type);				\
 	ATOMIC_SAN_FUNC_1(sp, subtract, name, type);			\
 	ATOMIC_SAN_STORE(sp, name, type);				\
+	ATOMIC_SAN_STORE_REL(sp, name, type);				\
 	ATOMIC_SAN_READ(sp, swap, name, type);				\
 	ATOMIC_SAN_TEST(sp, testandclear, name, type);			\
 	ATOMIC_SAN_TEST(sp, testandset, name, type)
@@ -113,6 +123,7 @@ ATOMIC_SAN_FUNCS(8, uint8_t);
 ATOMIC_SAN_FUNCS(16, uint16_t);
 ATOMIC_SAN_FUNCS(32, uint32_t);
 ATOMIC_SAN_FUNCS(64, uint64_t);
+ATOMIC_SAN_LOAD_STORE(SAN_INTERCEPTOR_PREFIX, bool, bool);
 ATOMIC_SAN_THREAD_FENCE(SAN_INTERCEPTOR_PREFIX);
 
 #ifndef SAN_RUNTIME
@@ -125,6 +136,9 @@ ATOMIC_SAN_THREAD_FENCE(SAN_INTERCEPTOR_PREFIX);
 #define	ATOMIC_SAN(func)						\
 	__CONCAT(SAN_INTERCEPTOR_PREFIX, __CONCAT(_atomic_, func))
 
+#define	atomic_load_bool		ATOMIC_SAN(load_bool)
+#define	atomic_store_bool		ATOMIC_SAN(store_bool)
+
 #define	atomic_add_char			ATOMIC_SAN(add_char)
 #define	atomic_add_acq_char		ATOMIC_SAN(add_acq_char)
 #define	atomic_add_rel_char		ATOMIC_SAN(add_rel_char)