tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: e4cf7c25bae5c3b5089a3c23a897f450149caef2 commit: e240e53ae0abb0896e0f399bdfef41c69cec3123 mm, slub: add CONFIG_SLUB_TINY date: 5 weeks ago config: x86_64-randconfig-a013-20230102 compiler: clang version 14.0.6 (https://github.com/llvm/llvm-project f28c006a5895fc0e329fe15fead81e37457cb1d1) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e240e53ae0abb0896e0f399bdfef41c69cec3123 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout e240e53ae0abb0896e0f399bdfef41c69cec3123 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash mm/kmsan/ If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot All warnings (new ones prefixed by >>): >> mm/kmsan/instrumentation.c:41:26: warning: no previous prototype for function '__msan_metadata_ptr_for_load_n' [-Wmissing-prototypes] struct shadow_origin_ptr __msan_metadata_ptr_for_load_n(void *addr, ^ mm/kmsan/instrumentation.c:41:1: note: declare 'static' if the function is not intended to be used outside of this translation unit struct shadow_origin_ptr __msan_metadata_ptr_for_load_n(void *addr, ^ static >> mm/kmsan/instrumentation.c:49:26: warning: no previous prototype for function '__msan_metadata_ptr_for_store_n' [-Wmissing-prototypes] struct shadow_origin_ptr __msan_metadata_ptr_for_store_n(void *addr, ^ mm/kmsan/instrumentation.c:49:1: note: declare 'static' if the function is not intended to be used outside of this translation unit struct shadow_origin_ptr __msan_metadata_ptr_for_store_n(void *addr, ^ static >> mm/kmsan/instrumentation.c:74:1: warning: no previous prototype for function '__msan_metadata_ptr_for_load_1' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(1); ^ mm/kmsan/instrumentation.c:61:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ :43:1: note: expanded from here __msan_metadata_ptr_for_load_1 ^ mm/kmsan/instrumentation.c:74:1: note: declare 'static' if the function is not intended to be used outside of this translation unit DECLARE_METADATA_PTR_GETTER(1); ^ static mm/kmsan/instrumentation.c:61:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ >> mm/kmsan/instrumentation.c:74:1: warning: no previous prototype for function '__msan_metadata_ptr_for_store_1' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(1); ^ mm/kmsan/instrumentation.c:67:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ :59:1: note: expanded from here __msan_metadata_ptr_for_store_1 ^ mm/kmsan/instrumentation.c:74:1: note: declare 'static' if the function is not intended to be used outside of this translation unit mm/kmsan/instrumentation.c:67:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ >> mm/kmsan/instrumentation.c:75:1: warning: no previous prototype for function '__msan_metadata_ptr_for_load_2' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(2); ^ mm/kmsan/instrumentation.c:61:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ :75:1: note: expanded from here __msan_metadata_ptr_for_load_2 ^ mm/kmsan/instrumentation.c:75:1: note: declare 'static' if the function is not intended to be used outside of this translation unit DECLARE_METADATA_PTR_GETTER(2); ^ static mm/kmsan/instrumentation.c:61:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ >> mm/kmsan/instrumentation.c:75:1: warning: no previous prototype for function '__msan_metadata_ptr_for_store_2' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(2); ^ mm/kmsan/instrumentation.c:67:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ :91:1: note: expanded from here __msan_metadata_ptr_for_store_2 ^ mm/kmsan/instrumentation.c:75:1: note: declare 'static' if the function is not intended to be used outside of this translation unit mm/kmsan/instrumentation.c:67:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ >> mm/kmsan/instrumentation.c:76:1: warning: no previous prototype for function '__msan_metadata_ptr_for_load_4' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(4); ^ mm/kmsan/instrumentation.c:61:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ :107:1: note: expanded from here __msan_metadata_ptr_for_load_4 ^ mm/kmsan/instrumentation.c:76:1: note: declare 'static' if the function is not intended to be used outside of this translation unit DECLARE_METADATA_PTR_GETTER(4); ^ static mm/kmsan/instrumentation.c:61:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ >> mm/kmsan/instrumentation.c:76:1: warning: no previous prototype for function '__msan_metadata_ptr_for_store_4' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(4); ^ mm/kmsan/instrumentation.c:67:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ :8:1: note: expanded from here __msan_metadata_ptr_for_store_4 ^ mm/kmsan/instrumentation.c:76:1: note: declare 'static' if the function is not intended to be used outside of this translation unit mm/kmsan/instrumentation.c:67:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ >> mm/kmsan/instrumentation.c:77:1: warning: no previous prototype for function '__msan_metadata_ptr_for_load_8' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(8); ^ mm/kmsan/instrumentation.c:61:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ :24:1: note: expanded from here __msan_metadata_ptr_for_load_8 ^ mm/kmsan/instrumentation.c:77:1: note: declare 'static' if the function is not intended to be used outside of this translation unit DECLARE_METADATA_PTR_GETTER(8); ^ static mm/kmsan/instrumentation.c:61:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ ^ >> mm/kmsan/instrumentation.c:77:1: warning: no previous prototype for function '__msan_metadata_ptr_for_store_8' [-Wmissing-prototypes] DECLARE_METADATA_PTR_GETTER(8); ^ mm/kmsan/instrumentation.c:67:27: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ :40:1: note: expanded from here __msan_metadata_ptr_for_store_8 ^ mm/kmsan/instrumentation.c:77:1: note: declare 'static' if the function is not intended to be used outside of this translation unit mm/kmsan/instrumentation.c:67:2: note: expanded from macro 'DECLARE_METADATA_PTR_GETTER' struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ ^ >> mm/kmsan/instrumentation.c:84:6: warning: no previous prototype for function '__msan_instrument_asm_store' [-Wmissing-prototypes] void __msan_instrument_asm_store(void *addr, uintptr_t size) ^ mm/kmsan/instrumentation.c:84:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void __msan_instrument_asm_store(void *addr, uintptr_t size) ^ static mm/kmsan/instrumentation.c:138:7: warning: no previous prototype for function '__msan_memmove' [-Wmissing-prototypes] void *__msan_memmove(void *dst, const void *src, uintptr_t n) ^ mm/kmsan/instrumentation.c:138:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void *__msan_memmove(void *dst, const void *src, uintptr_t n) ^ static mm/kmsan/instrumentation.c:162:7: warning: no previous prototype for function '__msan_memcpy' [-Wmissing-prototypes] void *__msan_memcpy(void *dst, const void *src, uintptr_t n) ^ mm/kmsan/instrumentation.c:162:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void *__msan_memcpy(void *dst, const void *src, uintptr_t n) ^ static mm/kmsan/instrumentation.c:188:7: warning: no previous prototype for function '__msan_memset' [-Wmissing-prototypes] void *__msan_memset(void *dst, int c, uintptr_t n) ^ mm/kmsan/instrumentation.c:188:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void *__msan_memset(void *dst, int c, uintptr_t n) ^ static >> mm/kmsan/instrumentation.c:217:22: warning: no previous prototype for function '__msan_chain_origin' [-Wmissing-prototypes] depot_stack_handle_t __msan_chain_origin(depot_stack_handle_t origin) ^ mm/kmsan/instrumentation.c:217:1: note: declare 'static' if the function is not intended to be used outside of this translation unit depot_stack_handle_t __msan_chain_origin(depot_stack_handle_t origin) ^ static >> mm/kmsan/instrumentation.c:237:6: warning: no previous prototype for function '__msan_poison_alloca' [-Wmissing-prototypes] void __msan_poison_alloca(void *address, uintptr_t size, char *descr) ^ mm/kmsan/instrumentation.c:237:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void __msan_poison_alloca(void *address, uintptr_t size, char *descr) ^ static >> mm/kmsan/instrumentation.c:272:6: warning: no previous prototype for function '__msan_unpoison_alloca' [-Wmissing-prototypes] void __msan_unpoison_alloca(void *address, uintptr_t size) ^ mm/kmsan/instrumentation.c:272:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void __msan_unpoison_alloca(void *address, uintptr_t size) ^ static >> mm/kmsan/instrumentation.c:287:6: warning: no previous prototype for function '__msan_warning' [-Wmissing-prototypes] void __msan_warning(u32 origin) ^ mm/kmsan/instrumentation.c:287:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void __msan_warning(u32 origin) ^ static >> mm/kmsan/instrumentation.c:303:29: warning: no previous prototype for function '__msan_get_context_state' [-Wmissing-prototypes] struct kmsan_context_state *__msan_get_context_state(void) ^ mm/kmsan/instrumentation.c:303:1: note: declare 'static' if the function is not intended to be used outside of this translation unit struct kmsan_context_state *__msan_get_context_state(void) ^ static 19 warnings generated. vim +/__msan_metadata_ptr_for_load_n +41 mm/kmsan/instrumentation.c f80be4571b19b9 Alexander Potapenko 2022-09-15 39 f80be4571b19b9 Alexander Potapenko 2022-09-15 40 /* Get shadow and origin pointers for a memory load with non-standard size. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 @41 struct shadow_origin_ptr __msan_metadata_ptr_for_load_n(void *addr, f80be4571b19b9 Alexander Potapenko 2022-09-15 42 uintptr_t size) f80be4571b19b9 Alexander Potapenko 2022-09-15 43 { f80be4571b19b9 Alexander Potapenko 2022-09-15 44 return get_shadow_origin_ptr(addr, size, /*store*/ false); f80be4571b19b9 Alexander Potapenko 2022-09-15 45 } f80be4571b19b9 Alexander Potapenko 2022-09-15 46 EXPORT_SYMBOL(__msan_metadata_ptr_for_load_n); f80be4571b19b9 Alexander Potapenko 2022-09-15 47 f80be4571b19b9 Alexander Potapenko 2022-09-15 48 /* Get shadow and origin pointers for a memory store with non-standard size. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 @49 struct shadow_origin_ptr __msan_metadata_ptr_for_store_n(void *addr, f80be4571b19b9 Alexander Potapenko 2022-09-15 50 uintptr_t size) f80be4571b19b9 Alexander Potapenko 2022-09-15 51 { f80be4571b19b9 Alexander Potapenko 2022-09-15 52 return get_shadow_origin_ptr(addr, size, /*store*/ true); f80be4571b19b9 Alexander Potapenko 2022-09-15 53 } f80be4571b19b9 Alexander Potapenko 2022-09-15 54 EXPORT_SYMBOL(__msan_metadata_ptr_for_store_n); f80be4571b19b9 Alexander Potapenko 2022-09-15 55 f80be4571b19b9 Alexander Potapenko 2022-09-15 56 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 57 * Declare functions that obtain shadow/origin pointers for loads and stores f80be4571b19b9 Alexander Potapenko 2022-09-15 58 * with fixed size. f80be4571b19b9 Alexander Potapenko 2022-09-15 59 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 60 #define DECLARE_METADATA_PTR_GETTER(size) \ f80be4571b19b9 Alexander Potapenko 2022-09-15 61 struct shadow_origin_ptr __msan_metadata_ptr_for_load_##size( \ f80be4571b19b9 Alexander Potapenko 2022-09-15 62 void *addr) \ f80be4571b19b9 Alexander Potapenko 2022-09-15 63 { \ f80be4571b19b9 Alexander Potapenko 2022-09-15 64 return get_shadow_origin_ptr(addr, size, /*store*/ false); \ f80be4571b19b9 Alexander Potapenko 2022-09-15 65 } \ f80be4571b19b9 Alexander Potapenko 2022-09-15 66 EXPORT_SYMBOL(__msan_metadata_ptr_for_load_##size); \ f80be4571b19b9 Alexander Potapenko 2022-09-15 67 struct shadow_origin_ptr __msan_metadata_ptr_for_store_##size( \ f80be4571b19b9 Alexander Potapenko 2022-09-15 68 void *addr) \ f80be4571b19b9 Alexander Potapenko 2022-09-15 69 { \ f80be4571b19b9 Alexander Potapenko 2022-09-15 70 return get_shadow_origin_ptr(addr, size, /*store*/ true); \ f80be4571b19b9 Alexander Potapenko 2022-09-15 71 } \ f80be4571b19b9 Alexander Potapenko 2022-09-15 72 EXPORT_SYMBOL(__msan_metadata_ptr_for_store_##size) f80be4571b19b9 Alexander Potapenko 2022-09-15 73 f80be4571b19b9 Alexander Potapenko 2022-09-15 @74 DECLARE_METADATA_PTR_GETTER(1); f80be4571b19b9 Alexander Potapenko 2022-09-15 @75 DECLARE_METADATA_PTR_GETTER(2); f80be4571b19b9 Alexander Potapenko 2022-09-15 @76 DECLARE_METADATA_PTR_GETTER(4); f80be4571b19b9 Alexander Potapenko 2022-09-15 @77 DECLARE_METADATA_PTR_GETTER(8); f80be4571b19b9 Alexander Potapenko 2022-09-15 78 f80be4571b19b9 Alexander Potapenko 2022-09-15 79 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 80 * Handle a memory store performed by inline assembly. KMSAN conservatively f80be4571b19b9 Alexander Potapenko 2022-09-15 81 * attempts to unpoison the outputs of asm() directives to prevent false f80be4571b19b9 Alexander Potapenko 2022-09-15 82 * positives caused by missed stores. f80be4571b19b9 Alexander Potapenko 2022-09-15 83 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 @84 void __msan_instrument_asm_store(void *addr, uintptr_t size) f80be4571b19b9 Alexander Potapenko 2022-09-15 85 { f80be4571b19b9 Alexander Potapenko 2022-09-15 86 unsigned long ua_flags; f80be4571b19b9 Alexander Potapenko 2022-09-15 87 f80be4571b19b9 Alexander Potapenko 2022-09-15 88 if (!kmsan_enabled || kmsan_in_runtime()) f80be4571b19b9 Alexander Potapenko 2022-09-15 89 return; f80be4571b19b9 Alexander Potapenko 2022-09-15 90 f80be4571b19b9 Alexander Potapenko 2022-09-15 91 ua_flags = user_access_save(); f80be4571b19b9 Alexander Potapenko 2022-09-15 92 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 93 * Most of the accesses are below 32 bytes. The two exceptions so far f80be4571b19b9 Alexander Potapenko 2022-09-15 94 * are clwb() (64 bytes) and FPU state (512 bytes). f80be4571b19b9 Alexander Potapenko 2022-09-15 95 * It's unlikely that the assembly will touch more than 512 bytes. f80be4571b19b9 Alexander Potapenko 2022-09-15 96 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 97 if (size > 512) { f80be4571b19b9 Alexander Potapenko 2022-09-15 98 WARN_ONCE(1, "assembly store size too big: %ld\n", size); f80be4571b19b9 Alexander Potapenko 2022-09-15 99 size = 8; f80be4571b19b9 Alexander Potapenko 2022-09-15 100 } f80be4571b19b9 Alexander Potapenko 2022-09-15 101 if (is_bad_asm_addr(addr, size, /*is_store*/ true)) { f80be4571b19b9 Alexander Potapenko 2022-09-15 102 user_access_restore(ua_flags); f80be4571b19b9 Alexander Potapenko 2022-09-15 103 return; f80be4571b19b9 Alexander Potapenko 2022-09-15 104 } f80be4571b19b9 Alexander Potapenko 2022-09-15 105 kmsan_enter_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 106 /* Unpoisoning the memory on best effort. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 107 kmsan_internal_unpoison_memory(addr, size, /*checked*/ false); f80be4571b19b9 Alexander Potapenko 2022-09-15 108 kmsan_leave_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 109 user_access_restore(ua_flags); f80be4571b19b9 Alexander Potapenko 2022-09-15 110 } f80be4571b19b9 Alexander Potapenko 2022-09-15 111 EXPORT_SYMBOL(__msan_instrument_asm_store); f80be4571b19b9 Alexander Potapenko 2022-09-15 112 f80be4571b19b9 Alexander Potapenko 2022-09-15 113 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 114 * KMSAN instrumentation pass replaces LLVM memcpy, memmove and memset f80be4571b19b9 Alexander Potapenko 2022-09-15 115 * intrinsics with calls to respective __msan_ functions. We use f80be4571b19b9 Alexander Potapenko 2022-09-15 116 * get_param0_metadata() and set_retval_metadata() to store the shadow/origin f80be4571b19b9 Alexander Potapenko 2022-09-15 117 * values for the destination argument of these functions and use them for the f80be4571b19b9 Alexander Potapenko 2022-09-15 118 * functions' return values. f80be4571b19b9 Alexander Potapenko 2022-09-15 119 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 120 static inline void get_param0_metadata(u64 *shadow, f80be4571b19b9 Alexander Potapenko 2022-09-15 121 depot_stack_handle_t *origin) f80be4571b19b9 Alexander Potapenko 2022-09-15 122 { f80be4571b19b9 Alexander Potapenko 2022-09-15 123 struct kmsan_ctx *ctx = kmsan_get_context(); f80be4571b19b9 Alexander Potapenko 2022-09-15 124 f80be4571b19b9 Alexander Potapenko 2022-09-15 125 *shadow = *(u64 *)(ctx->cstate.param_tls); f80be4571b19b9 Alexander Potapenko 2022-09-15 126 *origin = ctx->cstate.param_origin_tls[0]; f80be4571b19b9 Alexander Potapenko 2022-09-15 127 } f80be4571b19b9 Alexander Potapenko 2022-09-15 128 f80be4571b19b9 Alexander Potapenko 2022-09-15 129 static inline void set_retval_metadata(u64 shadow, depot_stack_handle_t origin) f80be4571b19b9 Alexander Potapenko 2022-09-15 130 { f80be4571b19b9 Alexander Potapenko 2022-09-15 131 struct kmsan_ctx *ctx = kmsan_get_context(); f80be4571b19b9 Alexander Potapenko 2022-09-15 132 f80be4571b19b9 Alexander Potapenko 2022-09-15 133 *(u64 *)(ctx->cstate.retval_tls) = shadow; f80be4571b19b9 Alexander Potapenko 2022-09-15 134 ctx->cstate.retval_origin_tls = origin; f80be4571b19b9 Alexander Potapenko 2022-09-15 135 } f80be4571b19b9 Alexander Potapenko 2022-09-15 136 f80be4571b19b9 Alexander Potapenko 2022-09-15 137 /* Handle llvm.memmove intrinsic. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 138 void *__msan_memmove(void *dst, const void *src, uintptr_t n) f80be4571b19b9 Alexander Potapenko 2022-09-15 139 { f80be4571b19b9 Alexander Potapenko 2022-09-15 140 depot_stack_handle_t origin; f80be4571b19b9 Alexander Potapenko 2022-09-15 141 void *result; f80be4571b19b9 Alexander Potapenko 2022-09-15 142 u64 shadow; f80be4571b19b9 Alexander Potapenko 2022-09-15 143 f80be4571b19b9 Alexander Potapenko 2022-09-15 144 get_param0_metadata(&shadow, &origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 145 result = __memmove(dst, src, n); f80be4571b19b9 Alexander Potapenko 2022-09-15 146 if (!n) f80be4571b19b9 Alexander Potapenko 2022-09-15 147 /* Some people call memmove() with zero length. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 148 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 149 if (!kmsan_enabled || kmsan_in_runtime()) f80be4571b19b9 Alexander Potapenko 2022-09-15 150 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 151 f80be4571b19b9 Alexander Potapenko 2022-09-15 152 kmsan_enter_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 153 kmsan_internal_memmove_metadata(dst, (void *)src, n); f80be4571b19b9 Alexander Potapenko 2022-09-15 154 kmsan_leave_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 155 f80be4571b19b9 Alexander Potapenko 2022-09-15 156 set_retval_metadata(shadow, origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 157 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 158 } f80be4571b19b9 Alexander Potapenko 2022-09-15 159 EXPORT_SYMBOL(__msan_memmove); f80be4571b19b9 Alexander Potapenko 2022-09-15 160 f80be4571b19b9 Alexander Potapenko 2022-09-15 161 /* Handle llvm.memcpy intrinsic. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 162 void *__msan_memcpy(void *dst, const void *src, uintptr_t n) f80be4571b19b9 Alexander Potapenko 2022-09-15 163 { f80be4571b19b9 Alexander Potapenko 2022-09-15 164 depot_stack_handle_t origin; f80be4571b19b9 Alexander Potapenko 2022-09-15 165 void *result; f80be4571b19b9 Alexander Potapenko 2022-09-15 166 u64 shadow; f80be4571b19b9 Alexander Potapenko 2022-09-15 167 f80be4571b19b9 Alexander Potapenko 2022-09-15 168 get_param0_metadata(&shadow, &origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 169 result = __memcpy(dst, src, n); f80be4571b19b9 Alexander Potapenko 2022-09-15 170 if (!n) f80be4571b19b9 Alexander Potapenko 2022-09-15 171 /* Some people call memcpy() with zero length. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 172 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 173 f80be4571b19b9 Alexander Potapenko 2022-09-15 174 if (!kmsan_enabled || kmsan_in_runtime()) f80be4571b19b9 Alexander Potapenko 2022-09-15 175 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 176 f80be4571b19b9 Alexander Potapenko 2022-09-15 177 kmsan_enter_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 178 /* Using memmove instead of memcpy doesn't affect correctness. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 179 kmsan_internal_memmove_metadata(dst, (void *)src, n); f80be4571b19b9 Alexander Potapenko 2022-09-15 180 kmsan_leave_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 181 f80be4571b19b9 Alexander Potapenko 2022-09-15 182 set_retval_metadata(shadow, origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 183 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 184 } f80be4571b19b9 Alexander Potapenko 2022-09-15 185 EXPORT_SYMBOL(__msan_memcpy); f80be4571b19b9 Alexander Potapenko 2022-09-15 186 f80be4571b19b9 Alexander Potapenko 2022-09-15 187 /* Handle llvm.memset intrinsic. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 @188 void *__msan_memset(void *dst, int c, uintptr_t n) f80be4571b19b9 Alexander Potapenko 2022-09-15 189 { f80be4571b19b9 Alexander Potapenko 2022-09-15 190 depot_stack_handle_t origin; f80be4571b19b9 Alexander Potapenko 2022-09-15 191 void *result; f80be4571b19b9 Alexander Potapenko 2022-09-15 192 u64 shadow; f80be4571b19b9 Alexander Potapenko 2022-09-15 193 f80be4571b19b9 Alexander Potapenko 2022-09-15 194 get_param0_metadata(&shadow, &origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 195 result = __memset(dst, c, n); f80be4571b19b9 Alexander Potapenko 2022-09-15 196 if (!kmsan_enabled || kmsan_in_runtime()) f80be4571b19b9 Alexander Potapenko 2022-09-15 197 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 198 f80be4571b19b9 Alexander Potapenko 2022-09-15 199 kmsan_enter_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 200 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 201 * Clang doesn't pass parameter metadata here, so it is impossible to f80be4571b19b9 Alexander Potapenko 2022-09-15 202 * use shadow of @c to set up the shadow for @dst. f80be4571b19b9 Alexander Potapenko 2022-09-15 203 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 204 kmsan_internal_unpoison_memory(dst, n, /*checked*/ false); f80be4571b19b9 Alexander Potapenko 2022-09-15 205 kmsan_leave_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 206 f80be4571b19b9 Alexander Potapenko 2022-09-15 207 set_retval_metadata(shadow, origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 208 return result; f80be4571b19b9 Alexander Potapenko 2022-09-15 209 } f80be4571b19b9 Alexander Potapenko 2022-09-15 210 EXPORT_SYMBOL(__msan_memset); f80be4571b19b9 Alexander Potapenko 2022-09-15 211 f80be4571b19b9 Alexander Potapenko 2022-09-15 212 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 213 * Create a new origin from an old one. This is done when storing an f80be4571b19b9 Alexander Potapenko 2022-09-15 214 * uninitialized value to memory. When reporting an error, KMSAN unrolls and f80be4571b19b9 Alexander Potapenko 2022-09-15 215 * prints the whole chain of stores that preceded the use of this value. f80be4571b19b9 Alexander Potapenko 2022-09-15 216 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 @217 depot_stack_handle_t __msan_chain_origin(depot_stack_handle_t origin) f80be4571b19b9 Alexander Potapenko 2022-09-15 218 { f80be4571b19b9 Alexander Potapenko 2022-09-15 219 depot_stack_handle_t ret = 0; f80be4571b19b9 Alexander Potapenko 2022-09-15 220 unsigned long ua_flags; f80be4571b19b9 Alexander Potapenko 2022-09-15 221 f80be4571b19b9 Alexander Potapenko 2022-09-15 222 if (!kmsan_enabled || kmsan_in_runtime()) f80be4571b19b9 Alexander Potapenko 2022-09-15 223 return ret; f80be4571b19b9 Alexander Potapenko 2022-09-15 224 f80be4571b19b9 Alexander Potapenko 2022-09-15 225 ua_flags = user_access_save(); f80be4571b19b9 Alexander Potapenko 2022-09-15 226 f80be4571b19b9 Alexander Potapenko 2022-09-15 227 /* Creating new origins may allocate memory. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 228 kmsan_enter_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 229 ret = kmsan_internal_chain_origin(origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 230 kmsan_leave_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 231 user_access_restore(ua_flags); f80be4571b19b9 Alexander Potapenko 2022-09-15 232 return ret; f80be4571b19b9 Alexander Potapenko 2022-09-15 233 } f80be4571b19b9 Alexander Potapenko 2022-09-15 234 EXPORT_SYMBOL(__msan_chain_origin); f80be4571b19b9 Alexander Potapenko 2022-09-15 235 f80be4571b19b9 Alexander Potapenko 2022-09-15 236 /* Poison a local variable when entering a function. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 @237 void __msan_poison_alloca(void *address, uintptr_t size, char *descr) f80be4571b19b9 Alexander Potapenko 2022-09-15 238 { f80be4571b19b9 Alexander Potapenko 2022-09-15 239 depot_stack_handle_t handle; f80be4571b19b9 Alexander Potapenko 2022-09-15 240 unsigned long entries[4]; f80be4571b19b9 Alexander Potapenko 2022-09-15 241 unsigned long ua_flags; f80be4571b19b9 Alexander Potapenko 2022-09-15 242 f80be4571b19b9 Alexander Potapenko 2022-09-15 243 if (!kmsan_enabled || kmsan_in_runtime()) f80be4571b19b9 Alexander Potapenko 2022-09-15 244 return; f80be4571b19b9 Alexander Potapenko 2022-09-15 245 f80be4571b19b9 Alexander Potapenko 2022-09-15 246 ua_flags = user_access_save(); f80be4571b19b9 Alexander Potapenko 2022-09-15 247 entries[0] = KMSAN_ALLOCA_MAGIC_ORIGIN; f80be4571b19b9 Alexander Potapenko 2022-09-15 248 entries[1] = (u64)descr; f80be4571b19b9 Alexander Potapenko 2022-09-15 249 entries[2] = (u64)__builtin_return_address(0); f80be4571b19b9 Alexander Potapenko 2022-09-15 250 /* f80be4571b19b9 Alexander Potapenko 2022-09-15 251 * With frame pointers enabled, it is possible to quickly fetch the f80be4571b19b9 Alexander Potapenko 2022-09-15 252 * second frame of the caller stack without calling the unwinder. f80be4571b19b9 Alexander Potapenko 2022-09-15 253 * Without them, simply do not bother. f80be4571b19b9 Alexander Potapenko 2022-09-15 254 */ f80be4571b19b9 Alexander Potapenko 2022-09-15 255 if (IS_ENABLED(CONFIG_UNWINDER_FRAME_POINTER)) f80be4571b19b9 Alexander Potapenko 2022-09-15 256 entries[3] = (u64)__builtin_return_address(1); f80be4571b19b9 Alexander Potapenko 2022-09-15 257 else f80be4571b19b9 Alexander Potapenko 2022-09-15 258 entries[3] = 0; f80be4571b19b9 Alexander Potapenko 2022-09-15 259 f80be4571b19b9 Alexander Potapenko 2022-09-15 260 /* stack_depot_save() may allocate memory. */ f80be4571b19b9 Alexander Potapenko 2022-09-15 261 kmsan_enter_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 262 handle = stack_depot_save(entries, ARRAY_SIZE(entries), GFP_ATOMIC); f80be4571b19b9 Alexander Potapenko 2022-09-15 263 kmsan_leave_runtime(); f80be4571b19b9 Alexander Potapenko 2022-09-15 264 f80be4571b19b9 Alexander Potapenko 2022-09-15 265 kmsan_internal_set_shadow_origin(address, size, -1, handle, f80be4571b19b9 Alexander Potapenko 2022-09-15 266 /*checked*/ true); f80be4571b19b9 Alexander Potapenko 2022-09-15 267 user_access_restore(ua_flags); f80be4571b19b9 Alexander Potapenko 2022-09-15 268 } f80be4571b19b9 Alexander Potapenko 2022-09-15 269 EXPORT_SYMBOL(__msan_poison_alloca); f80be4571b19b9 Alexander Potapenko 2022-09-15 270 :::::: The code at line 41 was first introduced by commit :::::: f80be4571b19b9fd8dd1528cd2a2f123aff51f70 kmsan: add KMSAN runtime core :::::: TO: Alexander Potapenko :::::: CC: Andrew Morton -- 0-DAY CI Kernel Test Service https://01.org/lkp