Commit 7a71fd1c authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/lib: add missing memory barriers to string inline assemblies

We have a couple of inline assemblies like memchr() and strlen() that
read from memory, but tell the compiler only they need the addresses
of the strings they access.
This allows the compiler to omit the initialization of such strings
and therefore generate broken code. Add the missing memory barrier to
all string related inline assemblies to fix this potential issue. It
looks like the compiler currently does not generate broken code due to
these bugs.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 259acc5c
...@@ -62,7 +62,7 @@ static inline void *memchr(const void * s, int c, size_t n) ...@@ -62,7 +62,7 @@ static inline void *memchr(const void * s, int c, size_t n)
" jl 1f\n" " jl 1f\n"
" la %0,0\n" " la %0,0\n"
"1:" "1:"
: "+a" (ret), "+&a" (s) : "d" (r0) : "cc"); : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
return (void *) ret; return (void *) ret;
} }
...@@ -74,7 +74,7 @@ static inline void *memscan(void *s, int c, size_t n) ...@@ -74,7 +74,7 @@ static inline void *memscan(void *s, int c, size_t n)
asm volatile( asm volatile(
"0: srst %0,%1\n" "0: srst %0,%1\n"
" jo 0b\n" " jo 0b\n"
: "+a" (ret), "+&a" (s) : "d" (r0) : "cc"); : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
return (void *) ret; return (void *) ret;
} }
...@@ -115,7 +115,7 @@ static inline size_t strlen(const char *s) ...@@ -115,7 +115,7 @@ static inline size_t strlen(const char *s)
asm volatile( asm volatile(
"0: srst %0,%1\n" "0: srst %0,%1\n"
" jo 0b" " jo 0b"
: "+d" (r0), "+a" (tmp) : : "cc"); : "+d" (r0), "+a" (tmp) : : "cc", "memory");
return r0 - (unsigned long) s; return r0 - (unsigned long) s;
} }
...@@ -128,7 +128,7 @@ static inline size_t strnlen(const char * s, size_t n) ...@@ -128,7 +128,7 @@ static inline size_t strnlen(const char * s, size_t n)
asm volatile( asm volatile(
"0: srst %0,%1\n" "0: srst %0,%1\n"
" jo 0b" " jo 0b"
: "+a" (end), "+a" (tmp) : "d" (r0) : "cc"); : "+a" (end), "+a" (tmp) : "d" (r0) : "cc", "memory");
return end - s; return end - s;
} }
#else /* IN_ARCH_STRING_C */ #else /* IN_ARCH_STRING_C */
......
...@@ -20,7 +20,7 @@ static inline char *__strend(const char *s) ...@@ -20,7 +20,7 @@ static inline char *__strend(const char *s)
asm volatile ("0: srst %0,%1\n" asm volatile ("0: srst %0,%1\n"
" jo 0b" " jo 0b"
: "+d" (r0), "+a" (s) : : "cc" ); : "+d" (r0), "+a" (s) : : "cc", "memory");
return (char *) r0; return (char *) r0;
} }
...@@ -31,7 +31,7 @@ static inline char *__strnend(const char *s, size_t n) ...@@ -31,7 +31,7 @@ static inline char *__strnend(const char *s, size_t n)
asm volatile ("0: srst %0,%1\n" asm volatile ("0: srst %0,%1\n"
" jo 0b" " jo 0b"
: "+d" (p), "+a" (s) : "d" (r0) : "cc" ); : "+d" (p), "+a" (s) : "d" (r0) : "cc", "memory");
return (char *) p; return (char *) p;
} }
...@@ -213,7 +213,7 @@ int strcmp(const char *cs, const char *ct) ...@@ -213,7 +213,7 @@ int strcmp(const char *cs, const char *ct)
" sr %0,%1\n" " sr %0,%1\n"
"1:" "1:"
: "+d" (ret), "+d" (r0), "+a" (cs), "+a" (ct) : "+d" (ret), "+d" (r0), "+a" (cs), "+a" (ct)
: : "cc" ); : : "cc", "memory");
return ret; return ret;
} }
EXPORT_SYMBOL(strcmp); EXPORT_SYMBOL(strcmp);
...@@ -250,7 +250,7 @@ static inline int clcle(const char *s1, unsigned long l1, ...@@ -250,7 +250,7 @@ static inline int clcle(const char *s1, unsigned long l1,
" ipm %0\n" " ipm %0\n"
" srl %0,28" " srl %0,28"
: "=&d" (cc), "+a" (r2), "+a" (r3), : "=&d" (cc), "+a" (r2), "+a" (r3),
"+a" (r4), "+a" (r5) : : "cc"); "+a" (r4), "+a" (r5) : : "cc", "memory");
return cc; return cc;
} }
...@@ -298,7 +298,7 @@ void *memchr(const void *s, int c, size_t n) ...@@ -298,7 +298,7 @@ void *memchr(const void *s, int c, size_t n)
" jl 1f\n" " jl 1f\n"
" la %0,0\n" " la %0,0\n"
"1:" "1:"
: "+a" (ret), "+&a" (s) : "d" (r0) : "cc" ); : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
return (void *) ret; return (void *) ret;
} }
EXPORT_SYMBOL(memchr); EXPORT_SYMBOL(memchr);
...@@ -336,7 +336,7 @@ void *memscan(void *s, int c, size_t n) ...@@ -336,7 +336,7 @@ void *memscan(void *s, int c, size_t n)
asm volatile ("0: srst %0,%1\n" asm volatile ("0: srst %0,%1\n"
" jo 0b\n" " jo 0b\n"
: "+a" (ret), "+&a" (s) : "d" (r0) : "cc" ); : "+a" (ret), "+&a" (s) : "d" (r0) : "cc", "memory");
return (void *) ret; return (void *) ret;
} }
EXPORT_SYMBOL(memscan); EXPORT_SYMBOL(memscan);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment