diff options
-rw-r--r-- | arch/x86/boot/compressed/eboot.c | 3 | ||||
-rw-r--r-- | arch/x86/boot/compressed/misc.h | 1 | ||||
-rw-r--r-- | arch/x86/include/asm/string_64.h | 18 | ||||
-rw-r--r-- | arch/x86/kernel/x8664_ksyms_64.c | 10 | ||||
-rw-r--r-- | arch/x86/lib/memcpy_64.S | 6 | ||||
-rw-r--r-- | arch/x86/lib/memmove_64.S | 4 | ||||
-rw-r--r-- | arch/x86/lib/memset_64.S | 10 | ||||
-rw-r--r-- | drivers/firmware/efi/libstub/efistub.h | 4 | ||||
-rw-r--r-- | mm/kasan/kasan.c | 29 |
9 files changed, 74 insertions, 11 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c index 92b9a5f2aed6..ef17683484e9 100644 --- a/arch/x86/boot/compressed/eboot.c +++ b/arch/x86/boot/compressed/eboot.c | |||
@@ -13,8 +13,7 @@ | |||
13 | #include <asm/setup.h> | 13 | #include <asm/setup.h> |
14 | #include <asm/desc.h> | 14 | #include <asm/desc.h> |
15 | 15 | ||
16 | #undef memcpy /* Use memcpy from misc.c */ | 16 | #include "../string.h" |
17 | |||
18 | #include "eboot.h" | 17 | #include "eboot.h" |
19 | 18 | ||
20 | static efi_system_table_t *sys_table; | 19 | static efi_system_table_t *sys_table; |
diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h index 24e3e569a13c..04477d68403f 100644 --- a/arch/x86/boot/compressed/misc.h +++ b/arch/x86/boot/compressed/misc.h | |||
@@ -7,6 +7,7 @@ | |||
7 | * we just keep it from happening | 7 | * we just keep it from happening |
8 | */ | 8 | */ |
9 | #undef CONFIG_PARAVIRT | 9 | #undef CONFIG_PARAVIRT |
10 | #undef CONFIG_KASAN | ||
10 | #ifdef CONFIG_X86_32 | 11 | #ifdef CONFIG_X86_32 |
11 | #define _ASM_X86_DESC_H 1 | 12 | #define _ASM_X86_DESC_H 1 |
12 | #endif | 13 | #endif |
diff --git a/arch/x86/include/asm/string_64.h b/arch/x86/include/asm/string_64.h index 19e2c468fc2c..e4661196994e 100644 --- a/arch/x86/include/asm/string_64.h +++ b/arch/x86/include/asm/string_64.h | |||
@@ -27,11 +27,12 @@ static __always_inline void *__inline_memcpy(void *to, const void *from, size_t | |||
27 | function. */ | 27 | function. */ |
28 | 28 | ||
29 | #define __HAVE_ARCH_MEMCPY 1 | 29 | #define __HAVE_ARCH_MEMCPY 1 |
30 | extern void *__memcpy(void *to, const void *from, size_t len); | ||
31 | |||
30 | #ifndef CONFIG_KMEMCHECK | 32 | #ifndef CONFIG_KMEMCHECK |
31 | #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 | 33 | #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 |
32 | extern void *memcpy(void *to, const void *from, size_t len); | 34 | extern void *memcpy(void *to, const void *from, size_t len); |
33 | #else | 35 | #else |
34 | extern void *__memcpy(void *to, const void *from, size_t len); | ||
35 | #define memcpy(dst, src, len) \ | 36 | #define memcpy(dst, src, len) \ |
36 | ({ \ | 37 | ({ \ |
37 | size_t __len = (len); \ | 38 | size_t __len = (len); \ |
@@ -53,9 +54,11 @@ extern void *__memcpy(void *to, const void *from, size_t len); | |||
53 | 54 | ||
54 | #define __HAVE_ARCH_MEMSET | 55 | #define __HAVE_ARCH_MEMSET |
55 | void *memset(void *s, int c, size_t n); | 56 | void *memset(void *s, int c, size_t n); |
57 | void *__memset(void *s, int c, size_t n); | ||
56 | 58 | ||
57 | #define __HAVE_ARCH_MEMMOVE | 59 | #define __HAVE_ARCH_MEMMOVE |
58 | void *memmove(void *dest, const void *src, size_t count); | 60 | void *memmove(void *dest, const void *src, size_t count); |
61 | void *__memmove(void *dest, const void *src, size_t count); | ||
59 | 62 | ||
60 | int memcmp(const void *cs, const void *ct, size_t count); | 63 | int memcmp(const void *cs, const void *ct, size_t count); |
61 | size_t strlen(const char *s); | 64 | size_t strlen(const char *s); |
@@ -63,6 +66,19 @@ char *strcpy(char *dest, const char *src); | |||
63 | char *strcat(char *dest, const char *src); | 66 | char *strcat(char *dest, const char *src); |
64 | int strcmp(const char *cs, const char *ct); | 67 | int strcmp(const char *cs, const char *ct); |
65 | 68 | ||
69 | #if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) | ||
70 | |||
71 | /* | ||
72 | * For files that not instrumented (e.g. mm/slub.c) we | ||
73 | * should use not instrumented version of mem* functions. | ||
74 | */ | ||
75 | |||
76 | #undef memcpy | ||
77 | #define memcpy(dst, src, len) __memcpy(dst, src, len) | ||
78 | #define memmove(dst, src, len) __memmove(dst, src, len) | ||
79 | #define memset(s, c, n) __memset(s, c, n) | ||
80 | #endif | ||
81 | |||
66 | #endif /* __KERNEL__ */ | 82 | #endif /* __KERNEL__ */ |
67 | 83 | ||
68 | #endif /* _ASM_X86_STRING_64_H */ | 84 | #endif /* _ASM_X86_STRING_64_H */ |
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c index 040681928e9d..37d8fa4438f0 100644 --- a/arch/x86/kernel/x8664_ksyms_64.c +++ b/arch/x86/kernel/x8664_ksyms_64.c | |||
@@ -50,13 +50,19 @@ EXPORT_SYMBOL(csum_partial); | |||
50 | #undef memset | 50 | #undef memset |
51 | #undef memmove | 51 | #undef memmove |
52 | 52 | ||
53 | extern void *__memset(void *, int, __kernel_size_t); | ||
54 | extern void *__memcpy(void *, const void *, __kernel_size_t); | ||
55 | extern void *__memmove(void *, const void *, __kernel_size_t); | ||
53 | extern void *memset(void *, int, __kernel_size_t); | 56 | extern void *memset(void *, int, __kernel_size_t); |
54 | extern void *memcpy(void *, const void *, __kernel_size_t); | 57 | extern void *memcpy(void *, const void *, __kernel_size_t); |
55 | extern void *__memcpy(void *, const void *, __kernel_size_t); | 58 | extern void *memmove(void *, const void *, __kernel_size_t); |
59 | |||
60 | EXPORT_SYMBOL(__memset); | ||
61 | EXPORT_SYMBOL(__memcpy); | ||
62 | EXPORT_SYMBOL(__memmove); | ||
56 | 63 | ||
57 | EXPORT_SYMBOL(memset); | 64 | EXPORT_SYMBOL(memset); |
58 | EXPORT_SYMBOL(memcpy); | 65 | EXPORT_SYMBOL(memcpy); |
59 | EXPORT_SYMBOL(__memcpy); | ||
60 | EXPORT_SYMBOL(memmove); | 66 | EXPORT_SYMBOL(memmove); |
61 | 67 | ||
62 | #ifndef CONFIG_DEBUG_VIRTUAL | 68 | #ifndef CONFIG_DEBUG_VIRTUAL |
diff --git a/arch/x86/lib/memcpy_64.S b/arch/x86/lib/memcpy_64.S index 56313a326188..89b53c9968e7 100644 --- a/arch/x86/lib/memcpy_64.S +++ b/arch/x86/lib/memcpy_64.S | |||
@@ -53,6 +53,8 @@ | |||
53 | .Lmemcpy_e_e: | 53 | .Lmemcpy_e_e: |
54 | .previous | 54 | .previous |
55 | 55 | ||
56 | .weak memcpy | ||
57 | |||
56 | ENTRY(__memcpy) | 58 | ENTRY(__memcpy) |
57 | ENTRY(memcpy) | 59 | ENTRY(memcpy) |
58 | CFI_STARTPROC | 60 | CFI_STARTPROC |
@@ -199,8 +201,8 @@ ENDPROC(__memcpy) | |||
199 | * only outcome... | 201 | * only outcome... |
200 | */ | 202 | */ |
201 | .section .altinstructions, "a" | 203 | .section .altinstructions, "a" |
202 | altinstruction_entry memcpy,.Lmemcpy_c,X86_FEATURE_REP_GOOD,\ | 204 | altinstruction_entry __memcpy,.Lmemcpy_c,X86_FEATURE_REP_GOOD,\ |
203 | .Lmemcpy_e-.Lmemcpy_c,.Lmemcpy_e-.Lmemcpy_c | 205 | .Lmemcpy_e-.Lmemcpy_c,.Lmemcpy_e-.Lmemcpy_c |
204 | altinstruction_entry memcpy,.Lmemcpy_c_e,X86_FEATURE_ERMS, \ | 206 | altinstruction_entry __memcpy,.Lmemcpy_c_e,X86_FEATURE_ERMS, \ |
205 | .Lmemcpy_e_e-.Lmemcpy_c_e,.Lmemcpy_e_e-.Lmemcpy_c_e | 207 | .Lmemcpy_e_e-.Lmemcpy_c_e,.Lmemcpy_e_e-.Lmemcpy_c_e |
206 | .previous | 208 | .previous |
diff --git a/arch/x86/lib/memmove_64.S b/arch/x86/lib/memmove_64.S index 65268a6104f4..9c4b530575da 100644 --- a/arch/x86/lib/memmove_64.S +++ b/arch/x86/lib/memmove_64.S | |||
@@ -24,7 +24,10 @@ | |||
24 | * Output: | 24 | * Output: |
25 | * rax: dest | 25 | * rax: dest |
26 | */ | 26 | */ |
27 | .weak memmove | ||
28 | |||
27 | ENTRY(memmove) | 29 | ENTRY(memmove) |
30 | ENTRY(__memmove) | ||
28 | CFI_STARTPROC | 31 | CFI_STARTPROC |
29 | 32 | ||
30 | /* Handle more 32 bytes in loop */ | 33 | /* Handle more 32 bytes in loop */ |
@@ -220,4 +223,5 @@ ENTRY(memmove) | |||
220 | .Lmemmove_end_forward-.Lmemmove_begin_forward, \ | 223 | .Lmemmove_end_forward-.Lmemmove_begin_forward, \ |
221 | .Lmemmove_end_forward_efs-.Lmemmove_begin_forward_efs | 224 | .Lmemmove_end_forward_efs-.Lmemmove_begin_forward_efs |
222 | .previous | 225 | .previous |
226 | ENDPROC(__memmove) | ||
223 | ENDPROC(memmove) | 227 | ENDPROC(memmove) |
diff --git a/arch/x86/lib/memset_64.S b/arch/x86/lib/memset_64.S index 2dcb3808cbda..6f44935c6a60 100644 --- a/arch/x86/lib/memset_64.S +++ b/arch/x86/lib/memset_64.S | |||
@@ -56,6 +56,8 @@ | |||
56 | .Lmemset_e_e: | 56 | .Lmemset_e_e: |
57 | .previous | 57 | .previous |
58 | 58 | ||
59 | .weak memset | ||
60 | |||
59 | ENTRY(memset) | 61 | ENTRY(memset) |
60 | ENTRY(__memset) | 62 | ENTRY(__memset) |
61 | CFI_STARTPROC | 63 | CFI_STARTPROC |
@@ -147,8 +149,8 @@ ENDPROC(__memset) | |||
147 | * feature to implement the right patch order. | 149 | * feature to implement the right patch order. |
148 | */ | 150 | */ |
149 | .section .altinstructions,"a" | 151 | .section .altinstructions,"a" |
150 | altinstruction_entry memset,.Lmemset_c,X86_FEATURE_REP_GOOD,\ | 152 | altinstruction_entry __memset,.Lmemset_c,X86_FEATURE_REP_GOOD,\ |
151 | .Lfinal-memset,.Lmemset_e-.Lmemset_c | 153 | .Lfinal-__memset,.Lmemset_e-.Lmemset_c |
152 | altinstruction_entry memset,.Lmemset_c_e,X86_FEATURE_ERMS, \ | 154 | altinstruction_entry __memset,.Lmemset_c_e,X86_FEATURE_ERMS, \ |
153 | .Lfinal-memset,.Lmemset_e_e-.Lmemset_c_e | 155 | .Lfinal-__memset,.Lmemset_e_e-.Lmemset_c_e |
154 | .previous | 156 | .previous |
diff --git a/drivers/firmware/efi/libstub/efistub.h b/drivers/firmware/efi/libstub/efistub.h index 2be10984a67a..47437b16b186 100644 --- a/drivers/firmware/efi/libstub/efistub.h +++ b/drivers/firmware/efi/libstub/efistub.h | |||
@@ -5,6 +5,10 @@ | |||
5 | /* error code which can't be mistaken for valid address */ | 5 | /* error code which can't be mistaken for valid address */ |
6 | #define EFI_ERROR (~0UL) | 6 | #define EFI_ERROR (~0UL) |
7 | 7 | ||
8 | #undef memcpy | ||
9 | #undef memset | ||
10 | #undef memmove | ||
11 | |||
8 | void efi_char16_printk(efi_system_table_t *, efi_char16_t *); | 12 | void efi_char16_printk(efi_system_table_t *, efi_char16_t *); |
9 | 13 | ||
10 | efi_status_t efi_open_volume(efi_system_table_t *sys_table_arg, void *__image, | 14 | efi_status_t efi_open_volume(efi_system_table_t *sys_table_arg, void *__image, |
diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c index dc83f070edb6..799c52b9826c 100644 --- a/mm/kasan/kasan.c +++ b/mm/kasan/kasan.c | |||
@@ -255,6 +255,35 @@ static __always_inline void check_memory_region(unsigned long addr, | |||
255 | kasan_report(addr, size, write, _RET_IP_); | 255 | kasan_report(addr, size, write, _RET_IP_); |
256 | } | 256 | } |
257 | 257 | ||
258 | void __asan_loadN(unsigned long addr, size_t size); | ||
259 | void __asan_storeN(unsigned long addr, size_t size); | ||
260 | |||
261 | #undef memset | ||
262 | void *memset(void *addr, int c, size_t len) | ||
263 | { | ||
264 | __asan_storeN((unsigned long)addr, len); | ||
265 | |||
266 | return __memset(addr, c, len); | ||
267 | } | ||
268 | |||
269 | #undef memmove | ||
270 | void *memmove(void *dest, const void *src, size_t len) | ||
271 | { | ||
272 | __asan_loadN((unsigned long)src, len); | ||
273 | __asan_storeN((unsigned long)dest, len); | ||
274 | |||
275 | return __memmove(dest, src, len); | ||
276 | } | ||
277 | |||
278 | #undef memcpy | ||
279 | void *memcpy(void *dest, const void *src, size_t len) | ||
280 | { | ||
281 | __asan_loadN((unsigned long)src, len); | ||
282 | __asan_storeN((unsigned long)dest, len); | ||
283 | |||
284 | return __memcpy(dest, src, len); | ||
285 | } | ||
286 | |||
258 | void kasan_alloc_pages(struct page *page, unsigned int order) | 287 | void kasan_alloc_pages(struct page *page, unsigned int order) |
259 | { | 288 | { |
260 | if (likely(!PageHighMem(page))) | 289 | if (likely(!PageHighMem(page))) |