mirror of https://gitee.com/openkylin/linux.git
[MIPS] Maintain si_code field properly for FP exceptions
The appended patch adds code to update siginfo_t's si_code field. It fixes e.g. a floating point overflow regression in the SBCL testsuite. Signed-off-By: Thiemo Seufer <ths@linux-mips.org> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
parent
34412c7231
commit
948a34cf39
|
@ -606,6 +606,8 @@ asmlinkage void do_ov(struct pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
|
asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
|
||||||
{
|
{
|
||||||
|
siginfo_t info;
|
||||||
|
|
||||||
die_if_kernel("FP exception in kernel code", regs);
|
die_if_kernel("FP exception in kernel code", regs);
|
||||||
|
|
||||||
if (fcr31 & FPU_CSR_UNI_X) {
|
if (fcr31 & FPU_CSR_UNI_X) {
|
||||||
|
@ -641,9 +643,22 @@ asmlinkage void do_fpe(struct pt_regs *regs, unsigned long fcr31)
|
||||||
force_sig(sig, current);
|
force_sig(sig, current);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
} else if (fcr31 & FPU_CSR_INV_X)
|
||||||
|
info.si_code = FPE_FLTINV;
|
||||||
force_sig(SIGFPE, current);
|
else if (fcr31 & FPU_CSR_DIV_X)
|
||||||
|
info.si_code = FPE_FLTDIV;
|
||||||
|
else if (fcr31 & FPU_CSR_OVF_X)
|
||||||
|
info.si_code = FPE_FLTOVF;
|
||||||
|
else if (fcr31 & FPU_CSR_UDF_X)
|
||||||
|
info.si_code = FPE_FLTUND;
|
||||||
|
else if (fcr31 & FPU_CSR_INE_X)
|
||||||
|
info.si_code = FPE_FLTRES;
|
||||||
|
else
|
||||||
|
info.si_code = __SI_FAULT;
|
||||||
|
info.si_signo = SIGFPE;
|
||||||
|
info.si_errno = 0;
|
||||||
|
info.si_addr = (void __user *) regs->cp0_epc;
|
||||||
|
force_sig_info(SIGFPE, &info, current);
|
||||||
}
|
}
|
||||||
|
|
||||||
asmlinkage void do_bp(struct pt_regs *regs)
|
asmlinkage void do_bp(struct pt_regs *regs)
|
||||||
|
|
Loading…
Reference in New Issue