| From: James Hogan <james.hogan@imgtec.com> |
| Date: Wed, 31 May 2017 16:19:49 +0100 |
| Subject: MIPS: Fix mips_atomic_set() with EVA |
| |
| 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: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/mips/kernel/syscall.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/arch/mips/kernel/syscall.c |
| +++ b/arch/mips/kernel/syscall.c |
| @@ -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> |
| @@ -137,9 +138,11 @@ static inline int mips_atomic_set(unsign |
| __asm__ __volatile__ ( |
| " .set arch=r4000 \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" |
| " .subsection 2 \n" |