/* * include/asm-s390/string.h * * S390 version * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), */ #ifndef _S390_STRING_H_ #define _S390_STRING_H_ #ifdef __KERNEL__ #ifndef _LINUX_TYPES_H #include #endif #define __HAVE_ARCH_MEMCHR #define __HAVE_ARCH_MEMCPY #define __HAVE_ARCH_MEMSET #define __HAVE_ARCH_STRCAT #define __HAVE_ARCH_STRCMP #define __HAVE_ARCH_STRCPY #define __HAVE_ARCH_STRLEN #define __HAVE_ARCH_STRNCPY #undef __HAVE_ARCH_MEMMOVE #undef __HAVE_ARCH_STRNICMP #undef __HAVE_ARCH_STRNCAT #undef __HAVE_ARCH_STRNCMP #undef __HAVE_ARCH_STRCHR #undef __HAVE_ARCH_STRRCHR #undef __HAVE_ARCH_STRNLEN #undef __HAVE_ARCH_STRSPN #undef __HAVE_ARCH_STRPBRK #undef __HAVE_ARCH_STRTOK #undef __HAVE_ARCH_BCOPY #undef __HAVE_ARCH_MEMCMP #undef __HAVE_ARCH_MEMSCAN #undef __HAVE_ARCH_STRSTR extern void *memset(void *, int, size_t); extern void *memcpy(void *, const void *, size_t); extern void *memmove(void *, const void *, size_t); extern char *strncpy(char *, const char *, size_t); extern int strcmp(const char *,const char *); static inline void * memchr(const void * cs,int c,size_t count) { void *ptr; __asm__ __volatile__ (" lgr 0,%2\n" " lgr 1,%1\n" " la %0,0(%3,%1)\n" "0: srst %0,1\n" " jo 0b\n" " brc 13,1f\n" " slgr %0,%0\n" "1:" : "=&a" (ptr) : "a" (cs), "d" (c), "d" (count) : "cc", "0", "1" ); return ptr; } static __inline__ char *strcpy(char *dest, const char *src) { char *tmp = dest; __asm__ __volatile__ (" slgr 0,0\n" "0: mvst %0,%1\n" " jo 0b" : "+&a" (dest), "+&a" (src) : : "cc", "memory", "0" ); return tmp; } static __inline__ size_t strlen(const char *s) { size_t len; __asm__ __volatile__ (" slgr 0,0\n" " lgr %0,%1\n" "0: srst 0,%0\n" " jo 0b\n" " lgr %0,0\n" " sgr %0,%1" : "=&a" (len) : "a" (s) : "cc", "0" ); return len; } static __inline__ char *strcat(char *dest, const char *src) { char *tmp = dest; __asm__ __volatile__ (" slgr 0,0\n" "0: srst 0,%0\n" " jo 0b\n" " lgr %0,0\n" " slgr 0,0\n" "1: mvst %0,%1\n" " jo 1b" : "+&a" (dest), "+&a" (src) : : "cc", "memory", "0" ); return tmp; } extern void *alloca(size_t); #endif /* __KERNEL__ */ #endif /* __S390_STRING_H_ */