projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
MIPS: Always clear FCSR cause bits after emulation
[firefly-linux-kernel-4.4.55.git]
/
arch
/
mips
/
kernel
/
traps.c
diff --git
a/arch/mips/kernel/traps.c
b/arch/mips/kernel/traps.c
index dbfa47cdc8c1a8e04fbfd9a5243dcea265d7aade..4a0552dbcf4a7a756522e37f1cdac0f8c91a47bc 100644
(file)
--- a/
arch/mips/kernel/traps.c
+++ b/
arch/mips/kernel/traps.c
@@
-761,6
+761,12
@@
static int simulate_fp(struct pt_regs *regs, unsigned int opcode,
sig = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
&fault_addr);
sig = fpu_emulator_cop1Handler(regs, ¤t->thread.fpu, 1,
&fault_addr);
+ /*
+ * We can't allow the emulated instruction to leave any of
+ * the cause bits set in $fcr31.
+ */
+ current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
+
/* If something went wrong, signal */
process_fpemu_return(sig, fault_addr);
/* If something went wrong, signal */
process_fpemu_return(sig, fault_addr);
@@
-807,7
+813,7
@@
asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
/*
* We can't allow the emulated instruction to leave any of
/*
* We can't allow the emulated instruction to leave any of
- * the cause bit set in $fcr31.
+ * the cause bit
s
set in $fcr31.
*/
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
*/
current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
@@
-1384,6
+1390,13
@@
asmlinkage void do_cpu(struct pt_regs *regs)
sig = fpu_emulator_cop1Handler(regs,
¤t->thread.fpu,
0, &fault_addr);
sig = fpu_emulator_cop1Handler(regs,
¤t->thread.fpu,
0, &fault_addr);
+
+ /*
+ * We can't allow the emulated instruction to leave
+ * any of the cause bits set in $fcr31.
+ */
+ current->thread.fpu.fcr31 &= ~FPU_CSR_ALL_X;
+
if (!process_fpemu_return(sig, fault_addr) && !err)
mt_ase_fp_affinity();
}
if (!process_fpemu_return(sig, fault_addr) && !err)
mt_ase_fp_affinity();
}