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

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

s390/sysinfo: use basic block for stsi inline assembly



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 80a60f6e
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -20,13 +20,7 @@

int topology_max_mnest;

/*
 * stsi - store system information
 *
 * Returns the current configuration level if function code 0 was specified.
 * Otherwise returns 0 on success or a negative value on error.
 */
int stsi(void *sysinfo, int fc, int sel1, int sel2)
static inline int __stsi(void *sysinfo, int fc, int sel1, int sel2, int *lvl)
{
	register int r0 asm("0") = (fc << 28) | sel1;
	register int r1 asm("1") = sel2;
@@ -41,9 +35,24 @@ int stsi(void *sysinfo, int fc, int sel1, int sel2)
		: "+d" (r0), "+d" (rc)
		: "d" (r1), "a" (sysinfo), "K" (-EOPNOTSUPP)
		: "cc", "memory");
	*lvl = ((unsigned int) r0) >> 28;
	return rc;
}

/*
 * stsi - store system information
 *
 * Returns the current configuration level if function code 0 was specified.
 * Otherwise returns 0 on success or a negative value on error.
 */
int stsi(void *sysinfo, int fc, int sel1, int sel2)
{
	int lvl, rc;

	rc = __stsi(sysinfo, fc, sel1, sel2, &lvl);
	if (rc)
		return rc;
	return fc ? 0 : ((unsigned int) r0) >> 28;
	return fc ? 0 : lvl;
}
EXPORT_SYMBOL(stsi);