MIPS: Fix mips_atomic_set() with EVA
authorJames Hogan <james.hogan@imgtec.com>
Wed, 31 May 2017 15:19:49 +0000 (16:19 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 27 Jul 2017 22:06:07 +0000 (15:06 -0700)
commit 4915e1b043d6286928207b1f6968197b50407294 upstream.

EVA linked loads (LLE) and conditional stores (SCE) should be used on
EVA kernels for the MIPS_ATOMIC_SET operation of the sysmips system
call, or else the atomic set will apply to the kernel view of the
virtual address space (potentially unmapped on EVA kernels) rather than
the user view (TLB mapped).

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/16151/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/mips/kernel/syscall.c

index 876c5a56931fb0033043d805dc97d2e490a29838..8c222d390c487e3474aa05170ef6d376dc91ea68 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/elf.h>
 
 #include <asm/asm.h>
+#include <asm/asm-eva.h>
 #include <asm/branch.h>
 #include <asm/cachectl.h>
 #include <asm/cacheflush.h>
@@ -138,9 +139,11 @@ static inline int mips_atomic_set(unsigned long addr, unsigned long new)
                __asm__ __volatile__ (
                "       .set    "MIPS_ISA_ARCH_LEVEL"                   \n"
                "       li      %[err], 0                               \n"
-               "1:     ll      %[old], (%[addr])                       \n"
+               "1:                                                     \n"
+               user_ll("%[old]", "(%[addr])")
                "       move    %[tmp], %[new]                          \n"
-               "2:     sc      %[tmp], (%[addr])                       \n"
+               "2:                                                     \n"
+               user_sc("%[tmp]", "(%[addr])")
                "       beqz    %[tmp], 4f                              \n"
                "3:                                                     \n"
                "       .insn                                           \n"