1caab277bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 24a899227SCatalin Marinas /* 34a899227SCatalin Marinas * Copyright (C) 2013 ARM Ltd. 44a899227SCatalin Marinas */ 54a899227SCatalin Marinas #ifndef __ASM_STRING_H 64a899227SCatalin Marinas #define __ASM_STRING_H 74a899227SCatalin Marinas 8*0fea6e9aSAndrey Konovalov #if !(defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) 92b8cac81SCatalin Marinas #define __HAVE_ARCH_STRRCHR 102b8cac81SCatalin Marinas extern char *strrchr(const char *, int c); 112b8cac81SCatalin Marinas 122b8cac81SCatalin Marinas #define __HAVE_ARCH_STRCHR 132b8cac81SCatalin Marinas extern char *strchr(const char *, int c); 142b8cac81SCatalin Marinas 15192c4d90Szhichang.yuan #define __HAVE_ARCH_STRCMP 16192c4d90Szhichang.yuan extern int strcmp(const char *, const char *); 17192c4d90Szhichang.yuan 18192c4d90Szhichang.yuan #define __HAVE_ARCH_STRNCMP 19192c4d90Szhichang.yuan extern int strncmp(const char *, const char *, __kernel_size_t); 20192c4d90Szhichang.yuan 210a42cb0aSzhichang.yuan #define __HAVE_ARCH_STRLEN 220a42cb0aSzhichang.yuan extern __kernel_size_t strlen(const char *); 230a42cb0aSzhichang.yuan 240a42cb0aSzhichang.yuan #define __HAVE_ARCH_STRNLEN 250a42cb0aSzhichang.yuan extern __kernel_size_t strnlen(const char *, __kernel_size_t); 260a42cb0aSzhichang.yuan 2719a2ca0fSAndrey Ryabinin #define __HAVE_ARCH_MEMCMP 2819a2ca0fSAndrey Ryabinin extern int memcmp(const void *, const void *, size_t); 2919a2ca0fSAndrey Ryabinin 3019a2ca0fSAndrey Ryabinin #define __HAVE_ARCH_MEMCHR 3119a2ca0fSAndrey Ryabinin extern void *memchr(const void *, int, __kernel_size_t); 3219a2ca0fSAndrey Ryabinin #endif 3319a2ca0fSAndrey Ryabinin 344a899227SCatalin Marinas #define __HAVE_ARCH_MEMCPY 354a899227SCatalin Marinas extern void *memcpy(void *, const void *, __kernel_size_t); 3639d114ddSAndrey Ryabinin extern void *__memcpy(void *, const void *, __kernel_size_t); 374a899227SCatalin Marinas 384a899227SCatalin Marinas #define __HAVE_ARCH_MEMMOVE 394a899227SCatalin Marinas extern void *memmove(void *, const void *, __kernel_size_t); 4039d114ddSAndrey Ryabinin extern void *__memmove(void *, const void *, __kernel_size_t); 414a899227SCatalin Marinas 424a899227SCatalin Marinas #define __HAVE_ARCH_MEMSET 434a899227SCatalin Marinas extern void *memset(void *, int, __kernel_size_t); 4439d114ddSAndrey Ryabinin extern void *__memset(void *, int, __kernel_size_t); 454a899227SCatalin Marinas 465d7bdeb1SRobin Murphy #ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE 475d7bdeb1SRobin Murphy #define __HAVE_ARCH_MEMCPY_FLUSHCACHE 485d7bdeb1SRobin Murphy void memcpy_flushcache(void *dst, const void *src, size_t cnt); 495d7bdeb1SRobin Murphy #endif 5039d114ddSAndrey Ryabinin 51*0fea6e9aSAndrey Konovalov #if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ 52*0fea6e9aSAndrey Konovalov !defined(__SANITIZE_ADDRESS__) 5339d114ddSAndrey Ryabinin 5439d114ddSAndrey Ryabinin /* 5539d114ddSAndrey Ryabinin * For files that are not instrumented (e.g. mm/slub.c) we 5639d114ddSAndrey Ryabinin * should use not instrumented version of mem* functions. 5739d114ddSAndrey Ryabinin */ 5839d114ddSAndrey Ryabinin 5939d114ddSAndrey Ryabinin #define memcpy(dst, src, len) __memcpy(dst, src, len) 6039d114ddSAndrey Ryabinin #define memmove(dst, src, len) __memmove(dst, src, len) 6139d114ddSAndrey Ryabinin #define memset(s, c, n) __memset(s, c, n) 626974f0c4SDaniel Micay 636974f0c4SDaniel Micay #ifndef __NO_FORTIFY 646974f0c4SDaniel Micay #define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */ 656974f0c4SDaniel Micay #endif 666974f0c4SDaniel Micay 6739d114ddSAndrey Ryabinin #endif 6839d114ddSAndrey Ryabinin 694a899227SCatalin Marinas #endif 70