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