--- /var/tmp/portage/libsigsegv-2.1/work/libsigsegv-2.1/configure Thu Aug 21 21:27:56 2003 +++ /var/tmp/portage/libsigsegv-2.1/work/libsigsegv-2.1/configure Mon Aug 9 19:54:50 2004 @@ -10986,9 +10986,9 @@ #include #include "$srcdir/src/fault-macos-powerpc.c" -void sigsegv_handler (int sig, int code, struct sigcontext *scp) +void sigsegv_handler (int sig, siginfo_t *sip, struct sigcontext *scp) { - void *fault_address = (void *) (get_fault_addr (scp)); + void *fault_address = (void *) (get_fault_addr (scp, sip->si_addr)); } int @@ -11037,6 +11037,7 @@ #if HAVE_SYS_SIGNAL_H # include #endif +#include #include "$srcdir/src/fault-macos-powerpc.c" #include #include @@ -11061,9 +11062,9 @@ #endif unsigned long page; int handler_called = 0; -void sigsegv_handler (int sig, int code, struct sigcontext *scp) +void sigsegv_handler (int sig, siginfo_t *sip, struct sigcontext *scp) { - void *fault_address = (void *) (get_fault_addr (scp)); + void *fault_address = (void *) (get_fault_addr (scp, sip->si_addr)); handler_called++; if (handler_called == 10) exit (4); @@ -11102,7 +11103,7 @@ sigemptyset(&action.sa_mask); action.sa_handler = (void (*) (int)) &sigsegv_handler; - action.sa_flags = 0; + action.sa_flags = SA_SIGINFO; sigaction (SIGSEGV, &action, (struct sigaction *) NULL); sigaction (SIGBUS, &action, (struct sigaction *) NULL); --- /var/tmp/portage/libsigsegv-2.1/work/libsigsegv-2.1/src/fault-macos-powerpc.c Mon Sep 30 20:46:54 2002 +++ /var/tmp/portage/libsigsegv-2.1/work/libsigsegv-2.1/src/fault-macos-powerpc.c Mon Aug 9 19:58:53 2004 @@ -31,10 +31,11 @@ #define EXTRACT_DISP(iw) ((short *) &(iw))[1] static void * -get_fault_addr (struct sigcontext *scp) +get_fault_addr (struct sigcontext *scp,unsigned int *ir) { - unsigned int instr = *((unsigned int *) scp->sc_ir); - unsigned int *regs = &((unsigned int *) scp->sc_regs)[2]; + unsigned int instr = *ir; + unsigned int *regs = & ((struct ucontext *)scp)->uc_mcontext->ss.r0 ; + int disp = 0; int tmp; unsigned int baseA = 0; @@ -42,6 +43,7 @@ unsigned int addr; unsigned int alignmask = 0xFFFFFFFF; + switch (EXTRACT_OP1 (instr)) { case 38: /* stb */ @@ -56,8 +58,10 @@ case 36: /* stw */ case 37: /* stwu */ tmp = EXTRACT_REGA (instr); + + if (tmp > 0) - baseA = regs[tmp]; + baseA = regs[tmp]; disp = EXTRACT_DISP (instr); break; case 31: @@ -120,5 +124,6 @@ addr = (baseA + baseB) + disp; addr &= alignmask; + return (void *) addr; } --- /var/tmp/portage/libsigsegv-2.1/work/libsigsegv-2.1/src/fault-macos-powerpc.h Thu Apr 3 06:56:20 2003 +++ /var/tmp/portage/libsigsegv-2.1/work/libsigsegv-2.1/src/fault-macos-powerpc.h Mon Aug 9 20:17:16 2004 @@ -15,12 +15,14 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ +#include #include "fault-macos-powerpc.c" -#define SIGSEGV_FAULT_HANDLER_ARGLIST int sig, int code, struct sigcontext *scp -#define SIGSEGV_FAULT_ADDRESS (unsigned long) get_fault_addr (scp) +#define SIGSEGV_FAULT_HANDLER_ARGLIST int sig, siginfo_t *sip, struct sigcontext *scp +#define SIGSEGV_FAULT_ADDRESS (unsigned long) get_fault_addr (scp, sip->si_addr) #define SIGSEGV_FAULT_CONTEXT scp #if 0 #define SIGSEGV_FAULT_STACKPOINTER (&((unsigned int *) scp->sc_regs)[2])[1] #endif #define SIGSEGV_FAULT_STACKPOINTER (scp->sc_regs ? ((unsigned int *) scp->sc_regs)[3] : scp->sc_sp) +#define SIGSEGV_FAULT_ADDRESS_FROM_SIGINFO