arm64: fix SWP instruction emulation
authorRich Wiley <rwiley@nvidia.com>
Mon, 10 Mar 2014 21:01:06 +0000 (14:01 -0700)
committerGreg Hackmann <ghackmann@google.com>
Sat, 13 Sep 2014 00:29:56 +0000 (17:29 -0700)
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>
arch/arm64/kernel/swp_emulate.c

index b1a176bdede39304aeb8275669ea7cd8022b915c..508fd2edb8ab640308c180bd796d782f70ad4f6b 100644 (file)
@@ -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);