hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/arch/s390/include/asm/string.h
....@@ -12,15 +12,21 @@
1212 #include <linux/types.h>
1313 #endif
1414
15
-#define __HAVE_ARCH_MEMCHR /* inline & arch function */
16
-#define __HAVE_ARCH_MEMCMP /* arch function */
1715 #define __HAVE_ARCH_MEMCPY /* gcc builtin & arch function */
1816 #define __HAVE_ARCH_MEMMOVE /* gcc builtin & arch function */
19
-#define __HAVE_ARCH_MEMSCAN /* inline & arch function */
2017 #define __HAVE_ARCH_MEMSET /* gcc builtin & arch function */
2118 #define __HAVE_ARCH_MEMSET16 /* arch function */
2219 #define __HAVE_ARCH_MEMSET32 /* arch function */
2320 #define __HAVE_ARCH_MEMSET64 /* arch function */
21
+
22
+void *memcpy(void *dest, const void *src, size_t n);
23
+void *memset(void *s, int c, size_t n);
24
+void *memmove(void *dest, const void *src, size_t n);
25
+
26
+#ifndef CONFIG_KASAN
27
+#define __HAVE_ARCH_MEMCHR /* inline & arch function */
28
+#define __HAVE_ARCH_MEMCMP /* arch function */
29
+#define __HAVE_ARCH_MEMSCAN /* inline & arch function */
2430 #define __HAVE_ARCH_STRCAT /* inline & arch function */
2531 #define __HAVE_ARCH_STRCMP /* arch function */
2632 #define __HAVE_ARCH_STRCPY /* inline & arch function */
....@@ -35,9 +41,6 @@
3541
3642 /* Prototypes for non-inlined arch strings functions. */
3743 int memcmp(const void *s1, const void *s2, size_t n);
38
-void *memcpy(void *dest, const void *src, size_t n);
39
-void *memset(void *s, int c, size_t n);
40
-void *memmove(void *dest, const void *src, size_t n);
4144 int strcmp(const char *s1, const char *s2);
4245 size_t strlcat(char *dest, const char *src, size_t n);
4346 size_t strlcpy(char *dest, const char *src, size_t size);
....@@ -45,6 +48,7 @@
4548 char *strncpy(char *dest, const char *src, size_t n);
4649 char *strrchr(const char *s, int c);
4750 char *strstr(const char *s1, const char *s2);
51
+#endif /* !CONFIG_KASAN */
4852
4953 #undef __HAVE_ARCH_STRCHR
5054 #undef __HAVE_ARCH_STRNCHR
....@@ -52,6 +56,32 @@
5256 #undef __HAVE_ARCH_STRPBRK
5357 #undef __HAVE_ARCH_STRSEP
5458 #undef __HAVE_ARCH_STRSPN
59
+
60
+#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
61
+
62
+extern void *__memcpy(void *dest, const void *src, size_t n);
63
+extern void *__memset(void *s, int c, size_t n);
64
+extern void *__memmove(void *dest, const void *src, size_t n);
65
+
66
+/*
67
+ * For files that are not instrumented (e.g. mm/slub.c) we
68
+ * should use not instrumented version of mem* functions.
69
+ */
70
+
71
+#define memcpy(dst, src, len) __memcpy(dst, src, len)
72
+#define memmove(dst, src, len) __memmove(dst, src, len)
73
+#define memset(s, c, n) __memset(s, c, n)
74
+#define strlen(s) __strlen(s)
75
+
76
+#define __no_sanitize_prefix_strfunc(x) __##x
77
+
78
+#ifndef __NO_FORTIFY
79
+#define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */
80
+#endif
81
+
82
+#else
83
+#define __no_sanitize_prefix_strfunc(x) x
84
+#endif /* defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) */
5585
5686 void *__memset16(uint16_t *s, uint16_t v, size_t count);
5787 void *__memset32(uint32_t *s, uint32_t v, size_t count);
....@@ -74,6 +104,7 @@
74104
75105 #if !defined(IN_ARCH_STRING_C) && (!defined(CONFIG_FORTIFY_SOURCE) || defined(__NO_FORTIFY))
76106
107
+#ifdef __HAVE_ARCH_MEMCHR
77108 static inline void *memchr(const void * s, int c, size_t n)
78109 {
79110 register int r0 asm("0") = (char) c;
....@@ -88,7 +119,9 @@
88119 : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
89120 return (void *) ret;
90121 }
122
+#endif
91123
124
+#ifdef __HAVE_ARCH_MEMSCAN
92125 static inline void *memscan(void *s, int c, size_t n)
93126 {
94127 register int r0 asm("0") = (char) c;
....@@ -100,7 +133,9 @@
100133 : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
101134 return (void *) ret;
102135 }
136
+#endif
103137
138
+#ifdef __HAVE_ARCH_STRCAT
104139 static inline char *strcat(char *dst, const char *src)
105140 {
106141 register int r0 asm("0") = 0;
....@@ -116,7 +151,9 @@
116151 : "d" (r0), "0" (0) : "cc", "memory" );
117152 return ret;
118153 }
154
+#endif
119155
156
+#ifdef __HAVE_ARCH_STRCPY
120157 static inline char *strcpy(char *dst, const char *src)
121158 {
122159 register int r0 asm("0") = 0;
....@@ -129,8 +166,10 @@
129166 : "cc", "memory");
130167 return ret;
131168 }
169
+#endif
132170
133
-static inline size_t strlen(const char *s)
171
+#if defined(__HAVE_ARCH_STRLEN) || (defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__))
172
+static inline size_t __no_sanitize_prefix_strfunc(strlen)(const char *s)
134173 {
135174 register unsigned long r0 asm("0") = 0;
136175 const char *tmp = s;
....@@ -141,7 +180,9 @@
141180 : "+d" (r0), "+a" (tmp) : : "cc", "memory");
142181 return r0 - (unsigned long) s;
143182 }
183
+#endif
144184
185
+#ifdef __HAVE_ARCH_STRNLEN
145186 static inline size_t strnlen(const char * s, size_t n)
146187 {
147188 register int r0 asm("0") = 0;
....@@ -154,6 +195,7 @@
154195 : "+a" (end), "+a" (tmp) : "d" (r0) : "cc", "memory");
155196 return end - s;
156197 }
198
+#endif
157199 #else /* IN_ARCH_STRING_C */
158200 void *memchr(const void * s, int c, size_t n);
159201 void *memscan(void *s, int c, size_t n);