Hi All,
somebody made wrong assumptions about how compute_return_epc() works.
It does not return the epc but stores it in the register struct.
Return value is -EFAULT or zero.
I've speculated below how the right solution might look, but I
don't know enough about signal handling to be sure.
Thiemo
diff -BurPX /bigdisk/src/dontdiff linux-orig/arch/mips/kernel/traps.c
linux/arch/mips/kernel/traps.c
--- linux-orig/arch/mips/kernel/traps.c Sat Jul 14 18:49:46 2001
+++ linux/arch/mips/kernel/traps.c Sun Jul 22 08:44:57 2001
@@ -378,8 +378,11 @@
else
info.si_code = FPE_INTOVF;
info.si_signo = SIGFPE;
- info.si_errno = 0;
- info.si_addr = (void *)compute_return_epc(regs);
+ info.si_errno = compute_return_epc(regs);
+ if (info.si_errno)
+ info.si_addr = NULL;
+ else
+ info.si_addr = (void *)regs->cp0_epc;
force_sig_info(SIGFPE, &info, current);
break;
default:
@@ -418,8 +421,11 @@
else
info.si_code = FPE_INTOVF;
info.si_signo = SIGFPE;
- info.si_errno = 0;
- info.si_addr = (void *)compute_return_epc(regs);
+ info.si_errno = compute_return_epc(regs);
+ if (info.si_errno)
+ info.si_addr = NULL;
+ else
+ info.si_addr = (void *)regs->cp0_epc;
force_sig_info(SIGFPE, &info, current);
break;
default:
|