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 19#define __HAVE_ARCH_MEMCPY 20#define __HAVE_ARCH_MEMSET 21#define __HAVE_ARCH_STRCAT 22#define __HAVE_ARCH_STRCMP 23#define __HAVE_ARCH_STRCPY 24#define __HAVE_ARCH_STRLEN 25#define __HAVE_ARCH_STRNCPY 26 27#undef __HAVE_ARCH_MEMMOVE 28#undef __HAVE_ARCH_STRNICMP 29#undef __HAVE_ARCH_STRNCAT 30#undef __HAVE_ARCH_STRNCMP 31#undef __HAVE_ARCH_STRCHR 32#undef __HAVE_ARCH_STRRCHR 33#undef __HAVE_ARCH_STRNLEN 34#undef __HAVE_ARCH_STRSPN 35#undef __HAVE_ARCH_STRPBRK 36#undef __HAVE_ARCH_STRTOK 37#undef __HAVE_ARCH_BCOPY 38#undef __HAVE_ARCH_MEMCMP 39#undef __HAVE_ARCH_MEMSCAN 40#undef __HAVE_ARCH_STRSTR 41 42extern void *memset(void *, int, size_t); 43extern void *memcpy(void *, const void *, size_t); 44extern void *memmove(void *, const void *, size_t); 45extern char *strncpy(char *, const char *, size_t); 46extern int strcmp(const char *,const char *); 47 48static inline void * memchr(const void * cs,int c,size_t count) 49{ 50 void *ptr; 51 52 __asm__ __volatile__ (" lr 0,%2\n" 53 " lr 1,%1\n" 54 " la %0,0(%3,%1)\n" 55 "0: srst %0,1\n" 56 " jo 0b\n" 57 " brc 13,1f\n" 58 " slr %0,%0\n" 59 "1:" 60 : "=&a" (ptr) : "a" (cs), "d" (c), "d" (count) 61 : "cc", "0", "1" ); 62 return ptr; 63} 64 65static __inline__ char *strcpy(char *dest, const char *src) 66{ 67 char *tmp = dest; 68 69 __asm__ __volatile__ (" sr 0,0\n" 70 "0: mvst %0,%1\n" 71 " jo 0b" 72 : "+&a" (dest), "+&a" (src) : 73 : "cc", "memory", "0" ); 74 return tmp; 75} 76 77static __inline__ size_t strlen(const char *s) 78{ 79 size_t len; 80 81 __asm__ __volatile__ (" sr 0,0\n" 82 " lr %0,%1\n" 83 "0: srst 0,%0\n" 84 " jo 0b\n" 85 " lr %0,0\n" 86 " sr %0,%1" 87 : "=&a" (len) : "a" (s) 88 : "cc", "0" ); 89 return len; 90} 91 92static __inline__ char *strcat(char *dest, const char *src) 93{ 94 char *tmp = dest; 95 96 __asm__ __volatile__ (" sr 0,0\n" 97 "0: srst 0,%0\n" 98 " jo 0b\n" 99 " lr %0,0\n" 100 " sr 0,0\n" 101 "1: mvst %0,%1\n" 102 " jo 1b" 103 : "+&a" (dest), "+&a" (src) : 104 : "cc", "memory", "0" ); 105 return tmp; 106} 107 108extern void *alloca(size_t); 109 110#endif /* __KERNEL__ */ 111 112#endif /* __S390_STRING_H_ */ 113 114 115 116 117 118