On Wed, Sep 12, 2001 at 01:09:14PM +0900, Atsushi Nemoto wrote: > nemoto> But, does not a debugger confused by skipping the instruction > nemoto> which cause Trap or Breakpoint exception? (I do not know much > nemoto> about communication between kernel and debugger...) > > I tried same fix for Trap exception (I inserted compute_return_epc() > before force_sig(SIGTRAP, current) line in do_tr()). With this fix, > gdb did not work correctly. > > So we should take another fix (at least for Trap exception) ? Below a fix. It's not the real thing but at least solved the problem pretty reliable as normal compiler generated code will never place trap and break instructions in delay slots. The actual fix should be skipping over the faulting instruction when returning from the signal handler. Ralf Index: arch/mips64/kernel/traps.c =================================================================== RCS file: /home/pub/cvs/linux/arch/mips64/kernel/traps.c,v retrieving revision 1.21 diff -u -r1.21 traps.c --- arch/mips64/kernel/traps.c 2001/09/07 23:35:57 1.21 +++ arch/mips64/kernel/traps.c 2001/09/13 01:01:25 @@ -291,7 +291,7 @@ 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: @@ -333,7 +333,7 @@ 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: Index: arch/mips/kernel/traps.c =================================================================== RCS file: /home/pub/cvs/linux/arch/mips/kernel/traps.c,v retrieving revision 1.79 diff -u -r1.79 traps.c --- arch/mips/kernel/traps.c 2001/09/07 23:35:57 1.79 +++ arch/mips/kernel/traps.c 2001/09/13 01:01:25 @@ -424,7 +424,7 @@ 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: @@ -464,7 +464,7 @@ 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: