mirror of https://gitee.com/openkylin/linux.git
MIPS: Fix mips_atomic_set() with EVA
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 Cc: <stable@vger.kernel.org> # 3.15.x- Patchwork: https://patchwork.linux-mips.org/patch/16151/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
49955d84cd
commit
4915e1b043
|
@ -29,6 +29,7 @@
|
|||
#include <linux/sched/task_stack.h>
|
||||
|
||||
#include <asm/asm.h>
|
||||
#include <asm/asm-eva.h>
|
||||
#include <asm/branch.h>
|
||||
#include <asm/cachectl.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
@ -131,9 +132,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"
|
||||
|
|
Loading…
Reference in New Issue