Index: i386/i386/machdep.c =================================================================== RCS file: /usr/cvs/src/sys/i386/i386/machdep.c,v retrieving revision 1.616.2.8 diff -u -r1.616.2.8 machdep.c --- i386/i386/machdep.c 11 Sep 2006 18:41:31 -0000 1.616.2.8 +++ i386/i386/machdep.c 25 Jun 2007 21:15:49 -0000 @@ -319,7 +319,7 @@ } else { /* Old FreeBSD-style arguments. */ sf.sf_arg2 = code; - sf.sf_addr = regs->tf_err; + sf.sf_addr = td->td_md.md_fault_addr; sf.sf_ahu.sf_handler = catcher; } mtx_unlock(&psp->ps_mtx); @@ -458,11 +458,11 @@ /* Fill in POSIX parts */ sf.sf_si.si_signo = sig; sf.sf_si.si_code = code; - sf.sf_si.si_addr = (void *)regs->tf_err; + sf.sf_si.si_addr = (void *)td->td_md.md_fault_addr; } else { /* Old FreeBSD-style arguments. */ sf.sf_siginfo = code; - sf.sf_addr = regs->tf_err; + sf.sf_addr = td->td_md.md_fault_addr; sf.sf_ahu.sf_handler = catcher; } mtx_unlock(&psp->ps_mtx); @@ -597,11 +597,11 @@ /* Fill in POSIX parts */ sf.sf_si.si_signo = sig; sf.sf_si.si_code = code; - sf.sf_si.si_addr = (void *)regs->tf_err; + sf.sf_si.si_addr = (void *)td->td_md.md_fault_addr; } else { /* Old FreeBSD-style arguments. */ sf.sf_siginfo = code; - sf.sf_addr = regs->tf_err; + sf.sf_addr = td->td_md.md_fault_addr; sf.sf_ahu.sf_handler = catcher; } mtx_unlock(&psp->ps_mtx); @@ -675,7 +675,7 @@ bzero(si, sizeof(*si)); si->si_signo = sig; si->si_code = code; - si->si_addr = (void *)td->td_frame->tf_err; + si->si_addr = (void *)td->td_md.md_fault_addr; /* XXXKSE fill other fields */ } Index: i386/i386/trap.c =================================================================== RCS file: /usr/cvs/src/sys/i386/i386/trap.c,v retrieving revision 1.277.2.4 diff -u -r1.277.2.4 trap.c --- i386/i386/trap.c 2 Sep 2006 17:12:46 -0000 1.277.2.4 +++ i386/i386/trap.c 25 Jun 2007 21:16:20 -0000 @@ -747,7 +747,7 @@ } /* kludge to pass faulting virtual address to sendsig */ - frame->tf_err = eva; + td->td_md.md_fault_addr = eva; return((rv == KERN_PROTECTION_FAILURE) ? SIGBUS : SIGSEGV); } Index: i386/include/proc.h =================================================================== RCS file: /usr/cvs/src/sys/i386/include/proc.h,v retrieving revision 1.25 diff -u -r1.25 proc.h --- i386/include/proc.h 4 Apr 2005 21:53:54 -0000 1.25 +++ i386/include/proc.h 25 Jun 2007 21:14:00 -0000 @@ -49,6 +49,7 @@ struct mdthread { int md_spinlock_count; /* (k) */ register_t md_saved_flags; /* (k) */ + register_t md_fault_addr; /* (k) */ }; struct mdproc { Index: i386/linux/linux_sysvec.c =================================================================== RCS file: /usr/cvs/src/sys/i386/linux/linux_sysvec.c,v retrieving revision 1.137.2.2 diff -u -r1.137.2.2 linux_sysvec.c --- i386/linux/linux_sysvec.c 15 Jun 2006 15:52:04 -0000 1.137.2.2 +++ i386/linux/linux_sysvec.c 25 Jun 2007 21:16:33 -0000 @@ -319,7 +319,7 @@ /* Fill in POSIX parts */ frame.sf_si.lsi_signo = sig; frame.sf_si.lsi_code = code; - frame.sf_si.lsi_addr = (void *)regs->tf_err; + frame.sf_si.lsi_addr = (void *)td->td_md.md_fault_addr; /* * Build the signal context to be used by sigreturn.