patch-2.4.27 linux-2.4.27/arch/sparc64/mm/fault.c
Next file: linux-2.4.27/arch/sparc64/mm/init.c
Previous file: linux-2.4.27/arch/sparc64/kernel/unaligned.c
Back to the patch index
Back to the overall index
- Lines: 42
- Date:
2004-08-07 16:26:04.624345545 -0700
- Orig file:
linux-2.4.26/arch/sparc64/mm/fault.c
- Orig date:
2002-11-28 15:53:12.000000000 -0800
diff -urN linux-2.4.26/arch/sparc64/mm/fault.c linux-2.4.27/arch/sparc64/mm/fault.c
@@ -203,14 +203,21 @@
return insn;
}
-static void do_fault_siginfo(int code, int sig, unsigned long address)
+extern unsigned long compute_effective_address(struct pt_regs *, unsigned int, unsigned int);
+
+static void do_fault_siginfo(int code, int sig, struct pt_regs *regs,
+ unsigned int insn, int fault_code)
{
siginfo_t info;
info.si_code = code;
info.si_signo = sig;
info.si_errno = 0;
- info.si_addr = (void *) address;
+ if (fault_code & FAULT_CODE_ITLB)
+ info.si_addr = (void *) regs->tpc;
+ else
+ info.si_addr = (void *)
+ compute_effective_address(regs, insn, 0);
info.si_trapno = 0;
force_sig_info(sig, &info, current);
}
@@ -291,7 +298,7 @@
/* The si_code was set to make clear whether
* this was a SEGV_MAPERR or SEGV_ACCERR fault.
*/
- do_fault_siginfo(si_code, SIGSEGV, address);
+ do_fault_siginfo(si_code, SIGSEGV, regs, insn, fault_code);
return;
}
@@ -467,7 +474,7 @@
* Send a sigbus, regardless of whether we were in kernel
* or user mode.
*/
- do_fault_siginfo(BUS_ADRERR, SIGBUS, address);
+ do_fault_siginfo(BUS_ADRERR, SIGBUS, regs, insn, fault_code);
/* Kernel mode? Handle exceptions or die */
if (regs->tstate & TSTATE_PRIV)
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)