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

Commit 53a0868c authored by Michael Holzheu's avatar Michael Holzheu Committed by Martin Schwidefsky
Browse files

[S390] zcore: fix inline assembly in memcpy_real()



memcpy_real uses the mvcle instruction. This instruction alters all used
registers (source, destination and 2 x count). Therefore we have to flag
those registers as input/output registers (+d). In addition to that, we
have to specify, that we read from memory designated by "src" and write to
memory designated by "dest".

Signed-off-by: default avatarMichael Holzheu <holzheu@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent cebe0fe7
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -141,15 +141,16 @@ static int memcpy_real(void *dest, unsigned long src, size_t count)

	if (count == 0)
		return 0;
	flags = __raw_local_irq_stnsm(0xf8); /* switch to real mode */
	flags = __raw_local_irq_stnsm(0xf8UL); /* switch to real mode */
	asm volatile (
		"0:	mvcle	%1,%2,0x0\n"
		"1:	jo	0b\n"
		"	lhi	%0,0x0\n"
		"2:\n"
		EX_TABLE(1b,2b)
		: "+d" (rc)
		: "d" (_dest), "d" (_src), "d" (_len1), "d" (_len2)
		: "+d" (rc), "+d" (_dest), "+d" (_src), "+d" (_len1),
		  "+d" (_len2), "=m" (*((long*)dest))
		: "m" (*((long*)src))
		: "cc", "memory");
	__raw_local_irq_ssm(flags);