1 // SPDX-License-Identifier: GPL-2.0 1 // SPDX-License-Identifier: GPL-2.0 2 /* 2 /* 3 * arch/arm/boot/compressed/string.c !! 3 * arch/mips/boot/compressed/string.c 4 * 4 * 5 * Small subset of simple string routines !! 5 * Very small subset of simple string routines 6 */ 6 */ 7 7 8 #define __NO_FORTIFY !! 8 #include <linux/compiler_attributes.h> 9 #include <linux/string.h> !! 9 #include <linux/types.h> >> 10 #include <asm/string.h> 10 11 11 /* !! 12 void *memcpy(void *dest, const void *src, size_t n) 12 * The decompressor is built without KASan but << 13 * rest of the kernel when CONFIG_KASAN is ena << 14 * to __memcpy() but since we are not linking << 15 * library in the decompressor, that will lead << 16 * << 17 * Undefine KASan's versions, define the wrapp << 18 * the right names so that when e.g. __memcpy( << 19 * still be linked to this local version of me << 20 */ << 21 #ifdef CONFIG_KASAN << 22 #undef memcpy << 23 #undef memmove << 24 #undef memset << 25 void *__memcpy(void *__dest, __const void *__s << 26 void *__memmove(void *__dest, __const void *__ << 27 void *__memset(void *s, int c, size_t count) _ << 28 #endif << 29 << 30 void *memcpy(void *__dest, __const void *__src << 31 { 13 { 32 int i = 0; !! 14 int i; 33 unsigned char *d = (unsigned char *)__ !! 15 const char *s = src; >> 16 char *d = dest; 34 17 35 for (i = __n >> 3; i > 0; i--) { !! 18 for (i = 0; i < n; i++) 36 *d++ = *s++; !! 19 d[i] = s[i]; 37 *d++ = *s++; !! 20 return dest; 38 *d++ = *s++; << 39 *d++ = *s++; << 40 *d++ = *s++; << 41 *d++ = *s++; << 42 *d++ = *s++; << 43 *d++ = *s++; << 44 } << 45 << 46 if (__n & 1 << 2) { << 47 *d++ = *s++; << 48 *d++ = *s++; << 49 *d++ = *s++; << 50 *d++ = *s++; << 51 } << 52 << 53 if (__n & 1 << 1) { << 54 *d++ = *s++; << 55 *d++ = *s++; << 56 } << 57 << 58 if (__n & 1) << 59 *d++ = *s++; << 60 << 61 return __dest; << 62 } 21 } 63 22 64 void *memmove(void *__dest, __const void *__sr !! 23 void *memset(void *s, int c, size_t n) 65 { 24 { 66 unsigned char *d = __dest; !! 25 int i; 67 const unsigned char *s = __src; !! 26 char *ss = s; 68 << 69 if (__dest == __src) << 70 return __dest; << 71 27 72 if (__dest < __src) !! 28 for (i = 0; i < n; i++) 73 return memcpy(__dest, __src, c !! 29 ss[i] = c; 74 !! 30 return s; 75 while (count--) << 76 d[count] = s[count]; << 77 return __dest; << 78 } << 79 << 80 size_t strlen(const char *s) << 81 { << 82 const char *sc = s; << 83 << 84 while (*sc != '\0') << 85 sc++; << 86 return sc - s; << 87 } << 88 << 89 size_t strnlen(const char *s, size_t count) << 90 { << 91 const char *sc; << 92 << 93 for (sc = s; count-- && *sc != '\0'; + << 94 /* nothing */; << 95 return sc - s; << 96 } 31 } 97 32 98 int memcmp(const void *cs, const void *ct, siz !! 33 void * __weak memmove(void *dest, const void *src, size_t n) 99 { 34 { 100 const unsigned char *su1 = cs, *su2 = !! 35 unsigned int i; 101 int res = 0; !! 36 const char *s = src; 102 !! 37 char *d = dest; 103 while (su1 < end) { !! 38 104 res = *su1++ - *su2++; !! 39 if ((uintptr_t)dest < (uintptr_t)src) { 105 if (res) !! 40 for (i = 0; i < n; i++) 106 break; !! 41 d[i] = s[i]; >> 42 } else { >> 43 for (i = n; i > 0; i--) >> 44 d[i - 1] = s[i - 1]; 107 } 45 } 108 return res; !! 46 return dest; 109 } << 110 << 111 int strcmp(const char *cs, const char *ct) << 112 { << 113 unsigned char c1, c2; << 114 int res = 0; << 115 << 116 do { << 117 c1 = *cs++; << 118 c2 = *ct++; << 119 res = c1 - c2; << 120 if (res) << 121 break; << 122 } while (c1); << 123 return res; << 124 } << 125 << 126 void *memchr(const void *s, int c, size_t coun << 127 { << 128 const unsigned char *p = s; << 129 << 130 while (count--) << 131 if ((unsigned char)c == *p++) << 132 return (void *)(p - 1) << 133 return NULL; << 134 } << 135 << 136 char *strchr(const char *s, int c) << 137 { << 138 while (*s != (char)c) << 139 if (*s++ == '\0') << 140 return NULL; << 141 return (char *)s; << 142 } << 143 << 144 char *strrchr(const char *s, int c) << 145 { << 146 const char *last = NULL; << 147 do { << 148 if (*s == (char)c) << 149 last = s; << 150 } while (*s++); << 151 return (char *)last; << 152 } << 153 << 154 #undef memset << 155 << 156 void *memset(void *s, int c, size_t count) << 157 { << 158 char *xs = s; << 159 while (count--) << 160 *xs++ = c; << 161 return s; << 162 } 47 } 163 48
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.