diff options
Diffstat (limited to 'include/asm-s390/string.h')
-rw-r--r-- | include/asm-s390/string.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/include/asm-s390/string.h b/include/asm-s390/string.h new file mode 100644 index 000000000000..23a4c390489f --- /dev/null +++ b/include/asm-s390/string.h | |||
@@ -0,0 +1,137 @@ | |||
1 | /* | ||
2 | * include/asm-s390/string.h | ||
3 | * | ||
4 | * S390 version | ||
5 | * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | ||
7 | */ | ||
8 | |||
9 | #ifndef _S390_STRING_H_ | ||
10 | #define _S390_STRING_H_ | ||
11 | |||
12 | #ifdef __KERNEL__ | ||
13 | |||
14 | #ifndef _LINUX_TYPES_H | ||
15 | #include <linux/types.h> | ||
16 | #endif | ||
17 | |||
18 | #define __HAVE_ARCH_MEMCHR /* inline & arch function */ | ||
19 | #define __HAVE_ARCH_MEMCMP /* arch function */ | ||
20 | #define __HAVE_ARCH_MEMCPY /* gcc builtin & arch function */ | ||
21 | #define __HAVE_ARCH_MEMSCAN /* inline & arch function */ | ||
22 | #define __HAVE_ARCH_MEMSET /* gcc builtin & arch function */ | ||
23 | #define __HAVE_ARCH_STRCAT /* inline & arch function */ | ||
24 | #define __HAVE_ARCH_STRCMP /* arch function */ | ||
25 | #define __HAVE_ARCH_STRCPY /* inline & arch function */ | ||
26 | #define __HAVE_ARCH_STRLCAT /* arch function */ | ||
27 | #define __HAVE_ARCH_STRLCPY /* arch function */ | ||
28 | #define __HAVE_ARCH_STRLEN /* inline & arch function */ | ||
29 | #define __HAVE_ARCH_STRNCAT /* arch function */ | ||
30 | #define __HAVE_ARCH_STRNCPY /* arch function */ | ||
31 | #define __HAVE_ARCH_STRNLEN /* inline & arch function */ | ||
32 | #define __HAVE_ARCH_STRRCHR /* arch function */ | ||
33 | #define __HAVE_ARCH_STRSTR /* arch function */ | ||
34 | |||
35 | /* Prototypes for non-inlined arch strings functions. */ | ||
36 | extern int memcmp(const void *, const void *, size_t); | ||
37 | extern void *memcpy(void *, const void *, size_t); | ||
38 | extern void *memset(void *, int, size_t); | ||
39 | extern int strcmp(const char *,const char *); | ||
40 | extern size_t strlcat(char *, const char *, size_t); | ||
41 | extern size_t strlcpy(char *, const char *, size_t); | ||
42 | extern char *strncat(char *, const char *, size_t); | ||
43 | extern char *strncpy(char *, const char *, size_t); | ||
44 | extern char *strrchr(const char *, int); | ||
45 | extern char *strstr(const char *, const char *); | ||
46 | |||
47 | #undef __HAVE_ARCH_MEMMOVE | ||
48 | #undef __HAVE_ARCH_STRCHR | ||
49 | #undef __HAVE_ARCH_STRNCHR | ||
50 | #undef __HAVE_ARCH_STRNCMP | ||
51 | #undef __HAVE_ARCH_STRNICMP | ||
52 | #undef __HAVE_ARCH_STRPBRK | ||
53 | #undef __HAVE_ARCH_STRSEP | ||
54 | #undef __HAVE_ARCH_STRSPN | ||
55 | |||
56 | #if !defined(IN_ARCH_STRING_C) | ||
57 | |||
58 | static inline void *memchr(const void * s, int c, size_t n) | ||
59 | { | ||
60 | register int r0 asm("0") = (char) c; | ||
61 | const void *ret = s + n; | ||
62 | |||
63 | asm volatile ("0: srst %0,%1\n" | ||
64 | " jo 0b\n" | ||
65 | " jl 1f\n" | ||
66 | " la %0,0\n" | ||
67 | "1:" | ||
68 | : "+a" (ret), "+&a" (s) : "d" (r0) : "cc" ); | ||
69 | return (void *) ret; | ||
70 | } | ||
71 | |||
72 | static inline void *memscan(void *s, int c, size_t n) | ||
73 | { | ||
74 | register int r0 asm("0") = (char) c; | ||
75 | const void *ret = s + n; | ||
76 | |||
77 | asm volatile ("0: srst %0,%1\n" | ||
78 | " jo 0b\n" | ||
79 | : "+a" (ret), "+&a" (s) : "d" (r0) : "cc" ); | ||
80 | return (void *) ret; | ||
81 | } | ||
82 | |||
83 | static inline char *strcat(char *dst, const char *src) | ||
84 | { | ||
85 | register int r0 asm("0") = 0; | ||
86 | unsigned long dummy; | ||
87 | char *ret = dst; | ||
88 | |||
89 | asm volatile ("0: srst %0,%1\n" | ||
90 | " jo 0b\n" | ||
91 | "1: mvst %0,%2\n" | ||
92 | " jo 1b" | ||
93 | : "=&a" (dummy), "+a" (dst), "+a" (src) | ||
94 | : "d" (r0), "0" (0) : "cc", "memory" ); | ||
95 | return ret; | ||
96 | } | ||
97 | |||
98 | static inline char *strcpy(char *dst, const char *src) | ||
99 | { | ||
100 | register int r0 asm("0") = 0; | ||
101 | char *ret = dst; | ||
102 | |||
103 | asm volatile ("0: mvst %0,%1\n" | ||
104 | " jo 0b" | ||
105 | : "+&a" (dst), "+&a" (src) : "d" (r0) | ||
106 | : "cc", "memory" ); | ||
107 | return ret; | ||
108 | } | ||
109 | |||
110 | static inline size_t strlen(const char *s) | ||
111 | { | ||
112 | register unsigned long r0 asm("0") = 0; | ||
113 | const char *tmp = s; | ||
114 | |||
115 | asm volatile ("0: srst %0,%1\n" | ||
116 | " jo 0b" | ||
117 | : "+d" (r0), "+a" (tmp) : : "cc" ); | ||
118 | return r0 - (unsigned long) s; | ||
119 | } | ||
120 | |||
121 | static inline size_t strnlen(const char * s, size_t n) | ||
122 | { | ||
123 | register int r0 asm("0") = 0; | ||
124 | const char *tmp = s; | ||
125 | const char *end = s + n; | ||
126 | |||
127 | asm volatile ("0: srst %0,%1\n" | ||
128 | " jo 0b" | ||
129 | : "+a" (end), "+a" (tmp) : "d" (r0) : "cc" ); | ||
130 | return end - s; | ||
131 | } | ||
132 | |||
133 | #endif /* !IN_ARCH_STRING_C */ | ||
134 | |||
135 | #endif /* __KERNEL__ */ | ||
136 | |||
137 | #endif /* __S390_STRING_H_ */ | ||