^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * include/asm-xtensa/string.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * These trivial string functions are considered part of the public domain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * License. See the file "COPYING" in the main directory of this archive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * Copyright (C) 2001 - 2005 Tensilica Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* We should optimize these. See arch/xtensa/lib/strncpy_user.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #ifndef _XTENSA_STRING_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define _XTENSA_STRING_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define __HAVE_ARCH_STRCPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) static inline char *strcpy(char *__dest, const char *__src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) register char *__xdest = __dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) unsigned long __dummy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) __asm__ __volatile__("1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) "l8ui %2, %1, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) "s8i %2, %0, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) "addi %1, %1, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) "addi %0, %0, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) "bnez %2, 1b\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) : "=r" (__dest), "=r" (__src), "=&r" (__dummy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) : "0" (__dest), "1" (__src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) return __xdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define __HAVE_ARCH_STRNCPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) static inline char *strncpy(char *__dest, const char *__src, size_t __n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) register char *__xdest = __dest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) unsigned long __dummy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) if (__n == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) return __xdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) __asm__ __volatile__(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) "l8ui %2, %1, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) "s8i %2, %0, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) "addi %1, %1, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) "addi %0, %0, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) "beqz %2, 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) "bne %1, %5, 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) "2:"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) : "=r" (__dest), "=r" (__src), "=&r" (__dummy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) : "0" (__dest), "1" (__src), "r" ((uintptr_t)__src+__n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) : "memory");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) return __xdest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define __HAVE_ARCH_STRCMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) static inline int strcmp(const char *__cs, const char *__ct)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) register int __res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) unsigned long __dummy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) __asm__ __volatile__(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) "l8ui %3, %1, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) "addi %1, %1, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) "l8ui %2, %0, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) "addi %0, %0, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) "beqz %2, 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) "beq %2, %3, 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) "2:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) "sub %2, %2, %3"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) : "0" (__cs), "1" (__ct));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return __res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define __HAVE_ARCH_STRNCMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) register int __res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) unsigned long __dummy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) __asm__ __volatile__(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) "mov %2, %3\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) "beq %0, %6, 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) "l8ui %3, %1, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) "addi %1, %1, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) "l8ui %2, %0, 0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) "addi %0, %0, 1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) "beqz %2, 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) "beqz %3, 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) "beq %2, %3, 1b\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) "2:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) "sub %2, %2, %3"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&r" (__dummy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) : "0" (__cs), "1" (__ct), "r" ((uintptr_t)__cs+__n));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) return __res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define __HAVE_ARCH_MEMSET
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) extern void *memset(void *__s, int __c, size_t __count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) extern void *__memset(void *__s, int __c, size_t __count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define __HAVE_ARCH_MEMCPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) extern void *__memcpy(void *__to, __const__ void *__from, size_t __n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define __HAVE_ARCH_MEMMOVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) extern void *__memmove(void *__dest, __const__ void *__src, size_t __n);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* Don't build bcopy at all ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define __HAVE_ARCH_BCOPY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) * For files that are not instrumented (e.g. mm/slub.c) we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) * should use not instrumented version of mem* functions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define memcpy(dst, src, len) __memcpy(dst, src, len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define memmove(dst, src, len) __memmove(dst, src, len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define memset(s, c, n) __memset(s, c, n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #ifndef __NO_FORTIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define __NO_FORTIFY /* FORTIFY_SOURCE uses __builtin_memcpy, etc. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #endif /* _XTENSA_STRING_H */