hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/kernel/kcsan/core.c
....@@ -9,10 +9,12 @@
99 #include <linux/init.h>
1010 #include <linux/kernel.h>
1111 #include <linux/list.h>
12
+#include <linux/minmax.h>
1213 #include <linux/moduleparam.h>
1314 #include <linux/percpu.h>
1415 #include <linux/preempt.h>
1516 #include <linux/sched.h>
17
+#include <linux/string.h>
1618 #include <linux/uaccess.h>
1719
1820 #include "atomic.h"
....@@ -1033,7 +1035,9 @@
10331035 DEFINE_TSAN_ATOMIC_OPS(8);
10341036 DEFINE_TSAN_ATOMIC_OPS(16);
10351037 DEFINE_TSAN_ATOMIC_OPS(32);
1038
+#ifdef CONFIG_64BIT
10361039 DEFINE_TSAN_ATOMIC_OPS(64);
1040
+#endif
10371041
10381042 void __tsan_atomic_thread_fence(int memorder);
10391043 void __tsan_atomic_thread_fence(int memorder)
....@@ -1045,3 +1049,51 @@
10451049 void __tsan_atomic_signal_fence(int memorder);
10461050 void __tsan_atomic_signal_fence(int memorder) { }
10471051 EXPORT_SYMBOL(__tsan_atomic_signal_fence);
1052
+
1053
+#ifdef __HAVE_ARCH_MEMSET
1054
+void *__tsan_memset(void *s, int c, size_t count);
1055
+noinline void *__tsan_memset(void *s, int c, size_t count)
1056
+{
1057
+ /*
1058
+ * Instead of not setting up watchpoints where accessed size is greater
1059
+ * than MAX_ENCODABLE_SIZE, truncate checked size to MAX_ENCODABLE_SIZE.
1060
+ */
1061
+ size_t check_len = min_t(size_t, count, MAX_ENCODABLE_SIZE);
1062
+
1063
+ check_access(s, check_len, KCSAN_ACCESS_WRITE);
1064
+ return memset(s, c, count);
1065
+}
1066
+#else
1067
+void *__tsan_memset(void *s, int c, size_t count) __alias(memset);
1068
+#endif
1069
+EXPORT_SYMBOL(__tsan_memset);
1070
+
1071
+#ifdef __HAVE_ARCH_MEMMOVE
1072
+void *__tsan_memmove(void *dst, const void *src, size_t len);
1073
+noinline void *__tsan_memmove(void *dst, const void *src, size_t len)
1074
+{
1075
+ size_t check_len = min_t(size_t, len, MAX_ENCODABLE_SIZE);
1076
+
1077
+ check_access(dst, check_len, KCSAN_ACCESS_WRITE);
1078
+ check_access(src, check_len, 0);
1079
+ return memmove(dst, src, len);
1080
+}
1081
+#else
1082
+void *__tsan_memmove(void *dst, const void *src, size_t len) __alias(memmove);
1083
+#endif
1084
+EXPORT_SYMBOL(__tsan_memmove);
1085
+
1086
+#ifdef __HAVE_ARCH_MEMCPY
1087
+void *__tsan_memcpy(void *dst, const void *src, size_t len);
1088
+noinline void *__tsan_memcpy(void *dst, const void *src, size_t len)
1089
+{
1090
+ size_t check_len = min_t(size_t, len, MAX_ENCODABLE_SIZE);
1091
+
1092
+ check_access(dst, check_len, KCSAN_ACCESS_WRITE);
1093
+ check_access(src, check_len, 0);
1094
+ return memcpy(dst, src, len);
1095
+}
1096
+#else
1097
+void *__tsan_memcpy(void *dst, const void *src, size_t len) __alias(memcpy);
1098
+#endif
1099
+EXPORT_SYMBOL(__tsan_memcpy);