On Tue, 24 Jul 2001, Thiemo Seufer wrote: > somebody made wrong assumptions about how compute_return_epc() works. It was me, I admit... Thanks for pointing it out. > I've speculated below how the right solution might look, but I > don't know enough about signal handling to be sure. I think the following fix is sufficient -- let's just pass EPC and let the userland handle it. You don't normally want a "break" in a branch delay slot -- such a sequence is of questionable utility. But if it is to be handled, the KISS approach gives the userland a chance to handle an exception gracefully. One may want to emulate overflows somehow, for example. Also the code is shorter. Ralf, please apply it. Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + patch-mips-2.4.5-20010730-break-1 diff -up --recursive --new-file linux.macro/arch/mips/kernel/traps.c linux/arch/mips/kernel/traps.c --- linux.macro/arch/mips/kernel/traps.c Tue Jul 24 04:26:34 2001 +++ linux/arch/mips/kernel/traps.c Mon Jul 30 18:26:03 2001 @@ -378,7 +378,7 @@ asmlinkage void do_bp(struct pt_regs *re info.si_code = FPE_INTOVF; info.si_signo = SIGFPE; info.si_errno = 0; - info.si_addr = (void *)compute_return_epc(regs); + info.si_addr = (void *)regs->cp0_epc; force_sig_info(SIGFPE, &info, current); break; default: @@ -418,7 +418,7 @@ asmlinkage void do_tr(struct pt_regs *re info.si_code = FPE_INTOVF; info.si_signo = SIGFPE; info.si_errno = 0; - info.si_addr = (void *)compute_return_epc(regs); + info.si_addr = (void *)regs->cp0_epc; force_sig_info(SIGFPE, &info, current); break; default: