|
@@ -788,6 +788,11 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
|
|
|
if (notify_die(DIE_FP, "FP exception", regs, 0, regs_to_trapnr(regs),
|
|
|
SIGFPE) == NOTIFY_STOP)
|
|
|
goto out;
|
|
|
+
|
|
|
+ /* Clear FCSR.Cause before enabling interrupts */
|
|
|
+ write_32bit_cp1_register(CP1_STATUS, fcr31 & ~FPU_CSR_ALL_X);
|
|
|
+ local_irq_enable();
|
|
|
+
|
|
|
die_if_kernel("FP exception in kernel code", regs);
|
|
|
|
|
|
if (fcr31 & FPU_CSR_UNI_X) {
|
|
@@ -1393,13 +1398,22 @@ out:
|
|
|
exception_exit(prev_state);
|
|
|
}
|
|
|
|
|
|
-asmlinkage void do_msa_fpe(struct pt_regs *regs)
|
|
|
+asmlinkage void do_msa_fpe(struct pt_regs *regs, unsigned int msacsr)
|
|
|
{
|
|
|
enum ctx_state prev_state;
|
|
|
|
|
|
prev_state = exception_enter();
|
|
|
+ if (notify_die(DIE_MSAFP, "MSA FP exception", regs, 0,
|
|
|
+ regs_to_trapnr(regs), SIGFPE) == NOTIFY_STOP)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ /* Clear MSACSR.Cause before enabling interrupts */
|
|
|
+ write_msa_csr(msacsr & ~MSA_CSR_CAUSEF);
|
|
|
+ local_irq_enable();
|
|
|
+
|
|
|
die_if_kernel("do_msa_fpe invoked from kernel context!", regs);
|
|
|
force_sig(SIGFPE, current);
|
|
|
+out:
|
|
|
exception_exit(prev_state);
|
|
|
}
|
|
|
|