mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 04:10:18 +09:00
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: Rich Wiley <rwiley@nvidia.com> Reviewed-on: http://git-master/r/379646 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Li Li (SW-TEGRA) <lli5@nvidia.com> Tested-by: Li Li (SW-TEGRA) <lli5@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Alexander Van Brunt <avanbrunt@nvidia.com>
This commit is contained in:
committed by
Greg Hackmann
parent
70f16b592e
commit
ff5878c391
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user