Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db7f5eef authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

s390/lib: use basic blocks for inline assemblies



Use only simple inline assemblies which consist of a single basic
block if the register asm construct is being used.

Otherwise gcc would generate broken code if the compiler option
--sanitize-coverage=trace-pc would be used.

Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent dc4aace1
Loading
Loading
Loading
Loading
+26 −24
Original line number Diff line number Diff line
@@ -236,6 +236,26 @@ char * strrchr(const char * s, int c)
}
EXPORT_SYMBOL(strrchr);

static inline int clcle(const char *s1, unsigned long l1,
			const char *s2, unsigned long l2,
			int *diff)
{
	register unsigned long r2 asm("2") = (unsigned long) s1;
	register unsigned long r3 asm("3") = (unsigned long) l2;
	register unsigned long r4 asm("4") = (unsigned long) s2;
	register unsigned long r5 asm("5") = (unsigned long) l2;
	int cc;

	asm volatile ("0: clcle %1,%3,0\n"
		      "   jo    0b\n"
		      "   ipm   %0\n"
		      "   srl   %0,28"
		      : "=&d" (cc), "+a" (r2), "+a" (r3),
			"+a" (r4), "+a" (r5) : : "cc");
	*diff = *(char *)r2 - *(char *)r4;
	return cc;
}

/**
 * strstr - Find the first substring in a %NUL terminated string
 * @s1: The string to be searched
@@ -250,18 +270,9 @@ char * strstr(const char * s1,const char * s2)
		return (char *) s1;
	l1 = __strend(s1) - s1;
	while (l1-- >= l2) {
		register unsigned long r2 asm("2") = (unsigned long) s1;
		register unsigned long r3 asm("3") = (unsigned long) l2;
		register unsigned long r4 asm("4") = (unsigned long) s2;
		register unsigned long r5 asm("5") = (unsigned long) l2;
		int cc;
		int cc, dummy;

		asm volatile ("0: clcle %1,%3,0\n"
			      "   jo    0b\n"
			      "   ipm   %0\n"
			      "   srl   %0,28"
			      : "=&d" (cc), "+a" (r2), "+a" (r3),
			        "+a" (r4), "+a" (r5) : : "cc" );
		cc = clcle(s1, l1, s2, l2, &dummy);
		if (!cc)
			return (char *) s1;
		s1++;
@@ -302,20 +313,11 @@ EXPORT_SYMBOL(memchr);
 */
int memcmp(const void *cs, const void *ct, size_t n)
{
	register unsigned long r2 asm("2") = (unsigned long) cs;
	register unsigned long r3 asm("3") = (unsigned long) n;
	register unsigned long r4 asm("4") = (unsigned long) ct;
	register unsigned long r5 asm("5") = (unsigned long) n;
	int ret;
	int ret, diff;

	asm volatile ("0: clcle %1,%3,0\n"
		      "   jo    0b\n"
		      "   ipm   %0\n"
		      "   srl   %0,28"
		      : "=&d" (ret), "+a" (r2), "+a" (r3), "+a" (r4), "+a" (r5)
		      : : "cc" );
	ret = clcle(cs, n, ct, n, &diff);
	if (ret)
		ret = *(char *) r2 - *(char *) r4;
		ret = diff;
	return ret;
}
EXPORT_SYMBOL(memcmp);