]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
ea61bc46 GU |
2 | #ifndef _M68K_STRING_H_ |
3 | #define _M68K_STRING_H_ | |
4 | ||
5 | #include <linux/types.h> | |
6 | #include <linux/compiler.h> | |
7 | ||
ea61bc46 GU |
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 | ||
ea61bc46 GU |
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 | ||
ea61bc46 GU |
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 | } | |
982cd252 | 59 | #endif /* CONFIG_COLDFIRE */ |
ea61bc46 GU |
60 | |
61 | #define __HAVE_ARCH_MEMMOVE | |
62 | extern void *memmove(void *, const void *, __kernel_size_t); | |
63 | ||
ea61bc46 | 64 | #define memcmp(d, s, n) __builtin_memcmp(d, s, n) |
ea61bc46 GU |
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 | ||
ea61bc46 | 74 | #endif /* _M68K_STRING_H_ */ |