Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kasan, powerpc: don't rename memintrinsics if compiler adds prefixes

With appropriate compiler support [1], KASAN builds use __asan prefixed
meminstrinsics, and KASAN no longer overrides memcpy/memset/memmove.

If compiler support is detected (CC_HAS_KASAN_MEMINTRINSIC_PREFIX), define
memintrinsics normally (do not prefix '__').

On powerpc, KASAN is the only user of __mem functions, which are used to
define instrumented memintrinsics. Alias the normal versions for KASAN to
use in its implementation.

Link: https://lore.kernel.org/all/20230224085942.1791837-1-elver@google.com/ [1]
Link: https://lore.kernel.org/oe-kbuild-all/202302271348.U5lvmo0S-lkp@intel.com/
Link: https://lkml.kernel.org/r/20230227094726.3833247-1-elver@google.com
Signed-off-by: Marco Elver <elver@google.com>
Reported-by: kernel test robot <lkp@intel.com>
Acked-by: Michael Ellerman <mpe@ellerman.id.au> [powerpc]
Cc: Alexander Potapenko <glider@google.com>
Cc: Andrey Konovalov <andreyknvl@gmail.com>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: Daniel Axtens <dja@axtens.net>
Cc: Dmitry Vyukov <dvyukov@google.com>
Cc: Liam R. Howlett <Liam.Howlett@oracle.com>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Vincenzo Frascino <vincenzo.frascino@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Marco Elver and committed by
Andrew Morton
90db9dbe 6db504ce

+19 -7
+1 -1
arch/powerpc/include/asm/kasan.h
··· 2 2 #ifndef __ASM_KASAN_H 3 3 #define __ASM_KASAN_H 4 4 5 - #ifdef CONFIG_KASAN 5 + #if defined(CONFIG_KASAN) && !defined(CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX) 6 6 #define _GLOBAL_KASAN(fn) _GLOBAL(__##fn) 7 7 #define _GLOBAL_TOC_KASAN(fn) _GLOBAL_TOC(__##fn) 8 8 #define EXPORT_SYMBOL_KASAN(fn) EXPORT_SYMBOL(__##fn)
+11 -4
arch/powerpc/include/asm/string.h
··· 30 30 extern void * memchr(const void *,int,__kernel_size_t); 31 31 void memcpy_flushcache(void *dest, const void *src, size_t size); 32 32 33 + #ifdef CONFIG_KASAN 34 + /* __mem variants are used by KASAN to implement instrumented meminstrinsics. */ 35 + #ifdef CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX 36 + #define __memset memset 37 + #define __memcpy memcpy 38 + #define __memmove memmove 39 + #else /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */ 33 40 void *__memset(void *s, int c, __kernel_size_t count); 34 41 void *__memcpy(void *to, const void *from, __kernel_size_t n); 35 42 void *__memmove(void *to, const void *from, __kernel_size_t n); 36 - 37 - #if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) 43 + #ifndef __SANITIZE_ADDRESS__ 38 44 /* 39 45 * For files that are not instrumented (e.g. mm/slub.c) we 40 46 * should use not instrumented version of mem* functions. ··· 52 46 #ifndef __NO_FORTIFY 53 47 #define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */ 54 48 #endif 55 - 56 - #endif 49 + #endif /* !__SANITIZE_ADDRESS__ */ 50 + #endif /* CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX */ 51 + #endif /* CONFIG_KASAN */ 57 52 58 53 #ifdef CONFIG_PPC64 59 54 #ifndef CONFIG_KASAN
+7 -2
arch/powerpc/kernel/prom_init_check.sh
··· 13 13 # If you really need to reference something from prom_init.o add 14 14 # it to the list below: 15 15 16 - grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null 17 - if [ $? -eq 0 ] 16 + has_renamed_memintrinsics() 17 + { 18 + grep -q "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} && \ 19 + ! grep -q "^CONFIG_CC_HAS_KASAN_MEMINTRINSIC_PREFIX=y" ${KCONFIG_CONFIG} 20 + } 21 + 22 + if has_renamed_memintrinsics 18 23 then 19 24 MEM_FUNCS="__memcpy __memset" 20 25 else