root/arch/s390/include/asm/string.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. memset16
  2. memset32
  3. memset64
  4. memchr
  5. memscan
  6. strcat
  7. strcpy
  8. __no_sanitize_prefix_strfunc
  9. strnlen

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /*
   3  *  S390 version
   4  *    Copyright IBM Corp. 1999
   5  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com),
   6  */
   7 
   8 #ifndef _S390_STRING_H_
   9 #define _S390_STRING_H_
  10 
  11 #ifndef _LINUX_TYPES_H
  12 #include <linux/types.h>
  13 #endif
  14 
  15 #define __HAVE_ARCH_MEMCPY      /* gcc builtin & arch function */
  16 #define __HAVE_ARCH_MEMMOVE     /* gcc builtin & arch function */
  17 #define __HAVE_ARCH_MEMSET      /* gcc builtin & arch function */
  18 #define __HAVE_ARCH_MEMSET16    /* arch function */
  19 #define __HAVE_ARCH_MEMSET32    /* arch function */
  20 #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 */
  30 #define __HAVE_ARCH_STRCAT      /* inline & arch function */
  31 #define __HAVE_ARCH_STRCMP      /* arch function */
  32 #define __HAVE_ARCH_STRCPY      /* inline & arch function */
  33 #define __HAVE_ARCH_STRLCAT     /* arch function */
  34 #define __HAVE_ARCH_STRLCPY     /* arch function */
  35 #define __HAVE_ARCH_STRLEN      /* inline & arch function */
  36 #define __HAVE_ARCH_STRNCAT     /* arch function */
  37 #define __HAVE_ARCH_STRNCPY     /* arch function */
  38 #define __HAVE_ARCH_STRNLEN     /* inline & arch function */
  39 #define __HAVE_ARCH_STRRCHR     /* arch function */
  40 #define __HAVE_ARCH_STRSTR      /* arch function */
  41 
  42 /* Prototypes for non-inlined arch strings functions. */
  43 int memcmp(const void *s1, const void *s2, size_t n);
  44 int strcmp(const char *s1, const char *s2);
  45 size_t strlcat(char *dest, const char *src, size_t n);
  46 size_t strlcpy(char *dest, const char *src, size_t size);
  47 char *strncat(char *dest, const char *src, size_t n);
  48 char *strncpy(char *dest, const char *src, size_t n);
  49 char *strrchr(const char *s, int c);
  50 char *strstr(const char *s1, const char *s2);
  51 #endif /* !CONFIG_KASAN */
  52 
  53 #undef __HAVE_ARCH_STRCHR
  54 #undef __HAVE_ARCH_STRNCHR
  55 #undef __HAVE_ARCH_STRNCMP
  56 #undef __HAVE_ARCH_STRPBRK
  57 #undef __HAVE_ARCH_STRSEP
  58 #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__) */
  85 
  86 void *__memset16(uint16_t *s, uint16_t v, size_t count);
  87 void *__memset32(uint32_t *s, uint32_t v, size_t count);
  88 void *__memset64(uint64_t *s, uint64_t v, size_t count);
  89 
  90 static inline void *memset16(uint16_t *s, uint16_t v, size_t count)
  91 {
  92         return __memset16(s, v, count * sizeof(v));
  93 }
  94 
  95 static inline void *memset32(uint32_t *s, uint32_t v, size_t count)
  96 {
  97         return __memset32(s, v, count * sizeof(v));
  98 }
  99 
 100 static inline void *memset64(uint64_t *s, uint64_t v, size_t count)
 101 {
 102         return __memset64(s, v, count * sizeof(v));
 103 }
 104 
 105 #if !defined(IN_ARCH_STRING_C) && (!defined(CONFIG_FORTIFY_SOURCE) || defined(__NO_FORTIFY))
 106 
 107 #ifdef __HAVE_ARCH_MEMCHR
 108 static inline void *memchr(const void * s, int c, size_t n)
 109 {
 110         register int r0 asm("0") = (char) c;
 111         const void *ret = s + n;
 112 
 113         asm volatile(
 114                 "0:     srst    %0,%1\n"
 115                 "       jo      0b\n"
 116                 "       jl      1f\n"
 117                 "       la      %0,0\n"
 118                 "1:"
 119                 : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
 120         return (void *) ret;
 121 }
 122 #endif
 123 
 124 #ifdef __HAVE_ARCH_MEMSCAN
 125 static inline void *memscan(void *s, int c, size_t n)
 126 {
 127         register int r0 asm("0") = (char) c;
 128         const void *ret = s + n;
 129 
 130         asm volatile(
 131                 "0:     srst    %0,%1\n"
 132                 "       jo      0b\n"
 133                 : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
 134         return (void *) ret;
 135 }
 136 #endif
 137 
 138 #ifdef __HAVE_ARCH_STRCAT
 139 static inline char *strcat(char *dst, const char *src)
 140 {
 141         register int r0 asm("0") = 0;
 142         unsigned long dummy;
 143         char *ret = dst;
 144 
 145         asm volatile(
 146                 "0:     srst    %0,%1\n"
 147                 "       jo      0b\n"
 148                 "1:     mvst    %0,%2\n"
 149                 "       jo      1b"
 150                 : "=&a" (dummy), "+a" (dst), "+a" (src)
 151                 : "d" (r0), "0" (0) : "cc", "memory" );
 152         return ret;
 153 }
 154 #endif
 155 
 156 #ifdef __HAVE_ARCH_STRCPY
 157 static inline char *strcpy(char *dst, const char *src)
 158 {
 159         register int r0 asm("0") = 0;
 160         char *ret = dst;
 161 
 162         asm volatile(
 163                 "0:     mvst    %0,%1\n"
 164                 "       jo      0b"
 165                 : "+&a" (dst), "+&a" (src) : "d" (r0)
 166                 : "cc", "memory");
 167         return ret;
 168 }
 169 #endif
 170 
 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)
 173 {
 174         register unsigned long r0 asm("0") = 0;
 175         const char *tmp = s;
 176 
 177         asm volatile(
 178                 "0:     srst    %0,%1\n"
 179                 "       jo      0b"
 180                 : "+d" (r0), "+a" (tmp) :  : "cc", "memory");
 181         return r0 - (unsigned long) s;
 182 }
 183 #endif
 184 
 185 #ifdef __HAVE_ARCH_STRNLEN
 186 static inline size_t strnlen(const char * s, size_t n)
 187 {
 188         register int r0 asm("0") = 0;
 189         const char *tmp = s;
 190         const char *end = s + n;
 191 
 192         asm volatile(
 193                 "0:     srst    %0,%1\n"
 194                 "       jo      0b"
 195                 : "+a" (end), "+a" (tmp) : "d" (r0)  : "cc", "memory");
 196         return end - s;
 197 }
 198 #endif
 199 #else /* IN_ARCH_STRING_C */
 200 void *memchr(const void * s, int c, size_t n);
 201 void *memscan(void *s, int c, size_t n);
 202 char *strcat(char *dst, const char *src);
 203 char *strcpy(char *dst, const char *src);
 204 size_t strlen(const char *s);
 205 size_t strnlen(const char * s, size_t n);
 206 #endif /* !IN_ARCH_STRING_C */
 207 
 208 #endif /* __S390_STRING_H_ */

/* [<][>][^][v][top][bottom][index][help] */