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

Commit 569ffcc0 authored by Rich Wiley's avatar Rich Wiley Committed by Ruchi Kandoi
Browse files

arm64: fix SWP instruction emulation



initial variable values may get overwritten
if they're listed as an output in ASM, even if
they're not explicitly written to.

Change-Id: I2a239e1819850a2a7005a46e83d82deac4ca303b
Signed-off-by: default avatarRich Wiley <rwiley@nvidia.com>
Reviewed-on: http://git-master/r/379646


Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: default avatarLi Li (SW-TEGRA) <lli5@nvidia.com>
Tested-by: default avatarLi Li (SW-TEGRA) <lli5@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: default avatarAlexander Van Brunt <avanbrunt@nvidia.com>
parent 4bdf4d31
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -40,12 +40,13 @@ static int swpb(u8 in, u8 *out, u8 *addr)
{
	u8 _out;
	int res;
	int err = 0;
	int err;

	do {
		__asm__ __volatile__(
		"0:	ldxrb	%w1, %4\n"
		"1:	stxrb	%w0, %w3, %4\n"
		"	mov	%w2, #0\n"
		"2:\n"
		"	.section	 .fixup,\"ax\"\n"
		"	.align		2\n"
@@ -58,7 +59,7 @@ static int swpb(u8 in, u8 *out, u8 *addr)
		"	.quad		1b, 3b\n"
		"	.previous"
		: "=&r" (res), "=r" (_out), "=r" (err)
		: "r" (in), "Q" (addr), "i" (-EFAULT)
		: "r" (in), "Q" (*addr), "i" (-EFAULT)
		: "cc", "memory");
	} while (err == 0 && res != 0);

@@ -77,6 +78,7 @@ static int swp(u32 in, u32 *out, u32 *addr)
		__asm__ __volatile__(
		"0:	ldxr	%w1, %4\n"
		"1:	stxr	%w0, %w3, %4\n"
		"	mov	%w2, #0\n"
		"2:\n"
		"	.section	 .fixup,\"ax\"\n"
		"	.align		2\n"
@@ -89,7 +91,7 @@ static int swp(u32 in, u32 *out, u32 *addr)
		"	.quad		1b, 3b\n"
		"	.previous"
		: "=&r" (res), "=r" (_out), "=r" (err)
		: "r" (in), "Q" (addr), "i" (-EFAULT)
		: "r" (in), "Q" (*addr), "i" (-EFAULT)
		: "cc", "memory");
	} while (err == 0 && res != 0);