1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _M68K_STRING_H_ 3 #define _M68K_STRING_H_ 4 5 #include <linux/types.h> 6 #include <linux/compiler.h> 7 8 #define __HAVE_ARCH_STRNLEN 9 static inline size_t strnlen(const char *s, size_t count) 10 { 11 const char *sc = s; 12 13 asm volatile ("\n" 14 "1: subq.l #1,%1\n" 15 " jcs 2f\n" 16 " tst.b (%0)+\n" 17 " jne 1b\n" 18 " subq.l #1,%0\n" 19 "2:" 20 : "+a" (sc), "+d" (count)); 21 return sc - s; 22 } 23 24 #define __HAVE_ARCH_STRNCPY 25 static inline char *strncpy(char *dest, const char *src, size_t n) 26 { 27 char *xdest = dest; 28 29 asm volatile ("\n" 30 " jra 2f\n" 31 "1: move.b (%1),(%0)+\n" 32 " jeq 2f\n" 33 " addq.l #1,%1\n" 34 "2: subq.l #1,%2\n" 35 " jcc 1b\n" 36 : "+a" (dest), "+a" (src), "+d" (n) 37 : : "memory"); 38 return xdest; 39 } 40 41 #ifndef CONFIG_COLDFIRE 42 #define __HAVE_ARCH_STRCMP 43 static inline int strcmp(const char *cs, const char *ct) 44 { 45 char res; 46 47 asm ("\n" 48 "1: move.b (%0)+,%2\n" /* get *cs */ 49 " cmp.b (%1)+,%2\n" /* compare a byte */ 50 " jne 2f\n" /* not equal, break out */ 51 " tst.b %2\n" /* at end of cs? */ 52 " jne 1b\n" /* no, keep going */ 53 " jra 3f\n" /* strings are equal */ 54 "2: sub.b -(%1),%2\n" /* *cs - *ct */ 55 "3:" 56 : "+a" (cs), "+a" (ct), "=d" (res)); 57 return res; 58 } 59 #endif /* CONFIG_COLDFIRE */ 60 61 #define __HAVE_ARCH_MEMMOVE 62 extern void *memmove(void *, const void *, __kernel_size_t); 63 64 #define memcmp(d, s, n) __builtin_memcmp(d, s, n) 65 66 #define __HAVE_ARCH_MEMSET 67 extern void *memset(void *, int, __kernel_size_t); 68 #define memset(d, c, n) __builtin_memset(d, c, n) 69 70 #define __HAVE_ARCH_MEMCPY 71 extern void *memcpy(void *, const void *, __kernel_size_t); 72 #define memcpy(d, s, n) __builtin_memcpy(d, s, n) 73 74 #endif /* _M68K_STRING_H_ */ 75