diff options
author | Markos Chandras <markos.chandras@imgtec.com> | 2014-12-03 13:37:32 +0100 |
---|---|---|
committer | Markos Chandras <markos.chandras@imgtec.com> | 2015-02-17 16:37:37 +0100 |
commit | 7c151d3d5d7a032e08dbe86ad6088622391bf13e (patch) | |
tree | 362d5ffcf8fea7c26373750efb106ca1e41c275f /arch/mips/kernel/traps.c | |
parent | MIPS: kernel: mips-r2-to-r6-emul: Add R2 emulator for MIPS R6 (diff) | |
download | linux-7c151d3d5d7a032e08dbe86ad6088622391bf13e.tar.xz linux-7c151d3d5d7a032e08dbe86ad6088622391bf13e.zip |
MIPS: Make use of the ERETNC instruction on MIPS R6
The ERETNC instruction, introduced in MIPS R5, is similar to the ERET
one, except it does not clear the LLB bit in the LLADDR register.
This feature is necessary to safely emulate R2 LL/SC instructions.
However, on context switches, we need to clear the LLAddr/LLB bit
in order to make sure that an SC instruction from the new thread
will never succeed if it happens to interrupt an LL operation on the
same address from the previous thread.
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Diffstat (limited to 'arch/mips/kernel/traps.c')
-rw-r--r-- | arch/mips/kernel/traps.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index fc157322f609..afa447e5e97f 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -1039,12 +1039,14 @@ asmlinkage void do_ri(struct pt_regs *regs) switch (status) { case 0: case SIGEMT: + task_thread_info(current)->r2_emul_return = 1; return; case SIGILL: goto no_r2_instr; default: process_fpemu_return(status, ¤t->thread.cp0_baduaddr); + task_thread_info(current)->r2_emul_return = 1; return; } } |