From: <sv...@va...> - 2006-10-03 20:26:18
|
Author: sewardj Date: 2006-10-03 21:26:11 +0100 (Tue, 03 Oct 2006) New Revision: 6156 Log: AIX5 support. No changes in logic; just better factorisation of what is already here. - add AIX definitions for VG_UCONTEXT_INSTR_PTR et al - add abstractions VKI_SIGINFO_si_addr and VKI_SIGINFO_si_pid to enable the rest of the code to be uniform - track other minor changes: SysRes, VG_(am_find_nsegment)=20 constness, rearrangement of VG_(sigtimedwait). =20 Modified: branches/AIX5/coregrind/m_signals.c Modified: branches/AIX5/coregrind/m_signals.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/AIX5/coregrind/m_signals.c 2006-10-03 20:19:28 UTC (rev 6155= ) +++ branches/AIX5/coregrind/m_signals.c 2006-10-03 20:26:11 UTC (rev 6156= ) @@ -80,6 +80,8 @@ */ =20 #include "pub_core_basics.h" +#include "pub_core_vki.h" +#include "pub_core_vkiscnums.h" #include "pub_core_debuglog.h" #include "pub_core_threadstate.h" #include "pub_core_clientstate.h" @@ -103,7 +105,6 @@ #include "pub_core_syswrap.h" #include "pub_core_tooliface.h" #include "pub_core_coredump.h" -#include "vki_unistd.h" =20 =20 /* --------------------------------------------------------------------- @@ -112,7 +113,7 @@ =20 static void sync_signalhandler ( Int sigNo, vki_siginfo_t *info, struct= vki_ucontext * ); static void async_signalhandler ( Int sigNo, vki_siginfo_t *info, struct= vki_ucontext * ); -static void sigvgkill_handler ( Int sigNo, vki_siginfo_t *info, struc= t vki_ucontext * ); +static void sigvgkill_handler ( Int sigNo, vki_siginfo_t *info, struct v= ki_ucontext * ); =20 static const Char *signame(Int sigNo); =20 @@ -126,6 +127,8 @@ vki_siginfo_t sigs[N_QUEUED_SIGNALS]; } SigQueue; =20 +/* ------ Macros for pulling stuff out of ucontexts ------ */ + #if defined(VGP_x86_linux) # define VG_UCONTEXT_INSTR_PTR(uc) ((uc)->uc_mcontext.eip) # define VG_UCONTEXT_STACK_PTR(uc) ((uc)->uc_mcontext.esp) @@ -208,14 +211,6 @@ # define VG_UCONTEXT_STACK_PTR(uc) ((uc)->uc_mcontext.gp_regs[VKI= _PT_R1]) # define VG_UCONTEXT_FRAME_PTR(uc) ((uc)->uc_mcontext.gp_regs[VKI= _PT_R1]) # define VG_UCONTEXT_SYSCALL_NUM(uc) ((uc)->uc_mcontext.gp_regs[VKI= _PT_R0]) -#if 0 -# define VG_UCONTEXT_SYSCALL_SYSRES(uc) \ - /* Convert the values in uc_mcontext r3,cr into a SysRes. */ \ - VG_(mk_SysRes_ppc64_linux)( \ - (uc)->uc_mcontext.gp_regs[VKI_PT_R3], \ - (((uc)->uc_mcontext.gp_regs[VKI_PT_CCR] >> 28) & 1) \ - ) -#else /* Dubious hack: if there is an error, only consider the lowest 8 bits of r3. memcheck/tests/post-syscall shows a case where an interrupted syscall should have produced a ucontext with 0x4 @@ -230,13 +225,106 @@ if (err) r3 &=3D 0xFF; return VG_(mk_SysRes_ppc64_linux)( r3, err ); } -#endif # define VG_UCONTEXT_LINK_REG(uc) ((uc)->uc_mcontext.gp_regs[VKI= _PT_LNK])=20 =20 -#else +#elif defined(VGP_ppc32_aix5) + + /* --- !!! --- EXTERNAL HEADERS start --- !!! --- */ +# include <ucontext.h> + /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */ + static inline Addr VG_UCONTEXT_INSTR_PTR( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct mstsave* jc =3D &mc->jmp_context; + return jc->iar; + } + static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct mstsave* jc =3D &mc->jmp_context; + return jc->gpr[1]; + } + static inline Addr VG_UCONTEXT_SYSCALL_NUM( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct mstsave* jc =3D &mc->jmp_context; + return jc->gpr[2]; + } + static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct mstsave* jc =3D &mc->jmp_context; + return VG_(mk_SysRes_ppc32_aix5)( jc->gpr[3], jc->gpr[4] ); + } + static inline Addr VG_UCONTEXT_LINK_REG( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct mstsave* jc =3D &mc->jmp_context; + return jc->lr; + } + static inline Addr VG_UCONTEXT_FRAME_PTR( void* ucV ) { + return VG_UCONTEXT_STACK_PTR(ucV); + } + +#elif defined(VGP_ppc64_aix5) + + /* --- !!! --- EXTERNAL HEADERS start --- !!! --- */ +# include <ucontext.h> + /* --- !!! --- EXTERNAL HEADERS end --- !!! --- */ + static inline Addr VG_UCONTEXT_INSTR_PTR( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct __context64* jc =3D &mc->jmp_context; + return jc->iar; + } + static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct __context64* jc =3D &mc->jmp_context; + return jc->gpr[1]; + } + static inline Addr VG_UCONTEXT_SYSCALL_NUM( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct __context64* jc =3D &mc->jmp_context; + return jc->gpr[2]; + } + static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct __context64* jc =3D &mc->jmp_context; + return VG_(mk_SysRes_ppc32_aix5)( jc->gpr[3], jc->gpr[4] ); + } + static inline Addr VG_UCONTEXT_LINK_REG( void* ucV ) { + ucontext_t* uc =3D (ucontext_t*)ucV; + struct __jmpbuf* mc =3D &(uc->uc_mcontext); + struct __context64* jc =3D &mc->jmp_context; + return jc->lr; + } + static inline Addr VG_UCONTEXT_FRAME_PTR( void* ucV ) { + return VG_UCONTEXT_STACK_PTR(ucV); + } + +#else=20 # error Unknown platform #endif =20 + +/* ------ Macros for pulling stuff out of siginfos ------ */ + +/* These macros allow use of uniform names when working with + both the Linux and AIX vki definitions. */ +#if defined(VGO_linux) +# define VKI_SIGINFO_si_addr _sifields._sigfault._addr +# define VKI_SIGINFO_si_pid _sifields._kill._pid +#elif defined(VGO_aix5) +# define VKI_SIGINFO_si_addr si_addr +# define VKI_SIGINFO_si_pid si_pid +#else +# error Unknown OS +#endif + + /* --------------------------------------------------------------------- HIGH LEVEL STUFF TO DO WITH SIGNALS: POLICY (MOSTLY) ------------------------------------------------------------------ */ @@ -502,6 +590,16 @@ ".my_sigreturn:\n" \ " li 0, " #name "\n" \ " sc\n" +#elif defined(VGP_ppc32_aix5) +# define _MYSIG(name) \ + ".globl my_sigreturn\n" \ + "my_sigreturn:\n" \ + ".long 0\n" +#elif defined(VGP_ppc64_aix5) +# define _MYSIG(name) \ + ".globl my_sigreturn\n" \ + "my_sigreturn:\n" \ + ".long 0\n" #else # error Unknown platform #endif @@ -542,7 +640,8 @@ =20 ksa.ksa_handler =3D skss.skss_per_sig[sig].skss_handler; ksa.sa_flags =3D skss.skss_per_sig[sig].skss_flags; -# if !defined(VGP_ppc32_linux) +# if !defined(VGP_ppc32_linux) && !defined(VGP_ppc32_aix5) \ + && !defined(VGP_ppc64_aix5) ksa.sa_restorer =3D my_sigreturn; # endif /* Re above ifdef (also the assertion below), PaulM says: @@ -576,7 +675,8 @@ =3D=3D skss_old.skss_per_sig[sig].skss_handler); vg_assert(ksa_old.sa_flags=20 =3D=3D skss_old.skss_per_sig[sig].skss_flags); -# if !defined(VGP_ppc32_linux) +# if !defined(VGP_ppc32_linux) && !defined(VGP_ppc32_aix5) \ + && !defined(VGP_ppc64_aix5) vg_assert(ksa_old.sa_restorer=20 =3D=3D my_sigreturn); # endif @@ -694,7 +794,9 @@ old_act->ksa_handler =3D scss.scss_per_sig[signo].scss_handler; old_act->sa_flags =3D scss.scss_per_sig[signo].scss_flags; old_act->sa_mask =3D scss.scss_per_sig[signo].scss_mask; +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) old_act->sa_restorer =3D scss.scss_per_sig[signo].scss_restorer; +# endif } =20 /* And now copy new SCSS entry from new_act. */ @@ -702,7 +804,11 @@ scss.scss_per_sig[signo].scss_handler =3D new_act->ksa_handler; scss.scss_per_sig[signo].scss_flags =3D new_act->sa_flags; scss.scss_per_sig[signo].scss_mask =3D new_act->sa_mask; + + scss.scss_per_sig[signo].scss_restorer =3D 0; +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) scss.scss_per_sig[signo].scss_restorer =3D new_act->sa_restorer; +# endif =20 VG_(sigdelset)(&scss.scss_per_sig[signo].scss_mask, VKI_SIGKILL); VG_(sigdelset)(&scss.scss_per_sig[signo].scss_mask, VKI_SIGSTOP); @@ -957,39 +1063,41 @@ static Char buf[10]; =20 switch(sigNo) { -#define S(x) case VKI_##x: return #x - S(SIGHUP); - S(SIGINT); - S(SIGQUIT); - S(SIGILL); - S(SIGTRAP); - S(SIGABRT); - S(SIGBUS); - S(SIGFPE); - S(SIGKILL); - S(SIGUSR1); - S(SIGUSR2); - S(SIGSEGV); - S(SIGPIPE); - S(SIGALRM); - S(SIGTERM); - S(SIGSTKFLT); - S(SIGCHLD); - S(SIGCONT); - S(SIGSTOP); - S(SIGTSTP); - S(SIGTTIN); - S(SIGTTOU); - S(SIGURG); - S(SIGXCPU); - S(SIGXFSZ); - S(SIGVTALRM); - S(SIGPROF); - S(SIGWINCH); - S(SIGIO); - S(SIGPWR); - S(SIGUNUSED); -#undef S + case VKI_SIGHUP: return "SIGHUP"; + case VKI_SIGINT: return "SIGINT"; + case VKI_SIGQUIT: return "SIGQUIT"; + case VKI_SIGILL: return "SIGILL"; + case VKI_SIGTRAP: return "SIGTRAP"; + case VKI_SIGABRT: return "SIGABRT"; + case VKI_SIGBUS: return "SIGBUS"; + case VKI_SIGFPE: return "SIGFPE"; + case VKI_SIGKILL: return "SIGKILL"; + case VKI_SIGUSR1: return "SIGUSR1"; + case VKI_SIGUSR2: return "SIGUSR2"; + case VKI_SIGSEGV: return "SIGSEGV"; + case VKI_SIGPIPE: return "SIGPIPE"; + case VKI_SIGALRM: return "SIGALRM"; + case VKI_SIGTERM: return "SIGTERM"; +# if defined(VKI_SIGSTKFLT) + case VKI_SIGSTKFLT: return "SIGSTKFLT"; +# endif + case VKI_SIGCHLD: return "SIGCHLD"; + case VKI_SIGCONT: return "SIGCONT"; + case VKI_SIGSTOP: return "SIGSTOP"; + case VKI_SIGTSTP: return "SIGTSTP"; + case VKI_SIGTTIN: return "SIGTTIN"; + case VKI_SIGTTOU: return "SIGTTOU"; + case VKI_SIGURG: return "SIGURG"; + case VKI_SIGXCPU: return "SIGXCPU"; + case VKI_SIGXFSZ: return "SIGXFSZ"; + case VKI_SIGVTALRM: return "SIGVTALRM"; + case VKI_SIGPROF: return "SIGPROF"; + case VKI_SIGWINCH: return "SIGWINCH"; + case VKI_SIGIO: return "SIGIO"; + case VKI_SIGPWR: return "SIGPWR"; +# if defined(VKI_SIGUNUSED) + case VKI_SIGUNUSED: return "SIGUNUSED"; +# endif =20 case VKI_SIGRTMIN ... VKI_SIGRTMAX: VG_(sprintf)(buf, "SIGRT%d", sigNo-VKI_SIGRTMIN); @@ -1009,7 +1117,9 @@ =20 sa.ksa_handler =3D VKI_SIG_DFL; sa.sa_flags =3D 0; +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) sa.sa_restorer =3D 0; +# endif VG_(sigemptyset)(&sa.sa_mask); =20 VG_(sigaction)(sigNo, &sa, &origsa); @@ -1168,7 +1278,7 @@ if (event !=3D NULL) { if (haveaddr) VG_(message)(Vg_UserMsg, " %s at address %p",=20 - event, info->_sifields._sigfault._addr); + event, info->VKI_SIGINFO_si_addr); else VG_(message)(Vg_UserMsg, " %s", event); } @@ -1307,7 +1417,7 @@ =20 info.si_signo =3D VKI_SIGSEGV; info.si_code =3D si_code; - info._sifields._sigfault._addr =3D (void*)addr; + info.VKI_SIGINFO_si_addr =3D (void*)addr; =20 /* If they're trying to block the signal, force it to be delivered */ if (VG_(sigismember)(&VG_(threads)[tid].sig_mask, VKI_SIGSEGV)) @@ -1343,8 +1453,8 @@ vg_assert(VG_(threads)[tid].status =3D=3D VgTs_Runnable); =20 info.si_signo =3D VKI_SIGILL; - info.si_code =3D VKI_ILL_ILLOPC; /* jrs: no idea what this should be = */ - info._sifields._sigfault._addr =3D (void*)addr; + info.si_code =3D VKI_ILL_ILLOPC; /* jrs: no idea what this should be= */ + info.VKI_SIGINFO_si_addr =3D (void*)addr; =20 resume_scheduler(tid); deliver_signal(tid, &info); @@ -1445,7 +1555,7 @@ idx =3D (idx + 1) % N_QUEUED_SIGNALS; } while(idx !=3D sq->next); out: =20 - return ret; =20 + return ret; } =20 /*=20 @@ -1460,8 +1570,6 @@ ThreadId tid =3D VG_(get_lwp_tid)(VG_(gettid)()); ThreadState *tst =3D VG_(get_ThreadState)(tid); =20 - vg_assert(tst->status =3D=3D VgTs_WaitSys); - #ifdef VGO_linux /* The linux kernel uses the top 16 bits of si_code for it's own use and only exports the bottom 16 bits to user space - at least @@ -1474,13 +1582,15 @@ info->si_code =3D (Short)info->si_code; #endif =20 - /* The thread isn't currently running, make it so before going on */ - VG_(set_running)(tid); - if (VG_(clo_trace_signals)) VG_(message)(Vg_DebugMsg, "Async handler got signal %d for tid %d = info %d", sigNo, tid, info->si_code); =20 + vg_assert(tst->status =3D=3D VgTs_WaitSys); + + /* The thread isn't currently running, make it so before going on */ + VG_(set_running)(tid, "async_signalhandler"); + /* Update thread state properly */ VG_(fixup_guest_state_after_syscall_interrupted)( tid,=20 @@ -1517,9 +1627,11 @@ SizeT udelta; =20 /* Find the next Segment above addr */ - NSegment* seg =3D VG_(am_find_nsegment)(addr); - NSegment* seg_next =3D seg ? VG_(am_next_nsegment)( seg, True/*fwds*/= ) - : NULL; + NSegment const*const seg + =3D VG_(am_find_nsegment)(addr); + NSegment const*const seg_next=20 + =3D seg ? VG_(am_next_nsegment)( (NSegment*)seg, True/*fwds*/ ) + : NULL; =20 if (seg && seg->kind =3D=3D SkAnonC) /* addr is already mapped. Nothing to do. */ @@ -1541,7 +1653,7 @@ "extending a stack base 0x%llx down by %lld\n", (ULong)seg_next->start, (ULong)udelta); if (! VG_(am_extend_into_adjacent_reservation_client) - ( seg_next, -(SSizeT)udelta )) { + ( (NSegment*)seg_next, -(SSizeT)udelta )) { VG_(debugLog)(1, "signals", "extending a stack base: FAILED\n"); return False; } @@ -1616,7 +1728,7 @@ VG_(core_panic)("async_signalhandler returned!?\n"); } =20 - if (info->_sifields._kill._pid =3D=3D 0) { + if (info->VKI_SIGINFO_si_pid =3D=3D 0) { /* There's a per-user limit of pending siginfo signals. If you exceed this, by having more than that number of pending signals with siginfo, then new signals are @@ -1677,11 +1789,13 @@ act upon and immediately restart the faulting instruction. */ if (info->si_signo =3D=3D VKI_SIGSEGV) { - Addr fault =3D (Addr)info->_sifields._sigfault._addr; + Addr fault =3D (Addr)info->VKI_SIGINFO_si_addr; Addr esp =3D VG_(get_SP)(tid); - NSegment* seg =3D VG_(am_find_nsegment)(fault); - NSegment* seg_next =3D seg ? VG_(am_next_nsegment)( seg, True/*fwd= s*/ ) - : NULL; + NSegment const*const seg + =3D VG_(am_find_nsegment)(fault); + NSegment const*const seg_next=20 + =3D seg ? VG_(am_next_nsegment)( (NSegment*)seg, True/*fwds*/ ) + : NULL; =20 if (VG_(clo_trace_signals)) { if (seg =3D=3D NULL) @@ -1744,7 +1858,7 @@ =20 /* Check to see if someone is interested in faults. */ if (fault_catcher) { - (*fault_catcher)(sigNo, (Addr)info->_sifields._sigfault._addr); + (*fault_catcher)(sigNo, (Addr)info->VKI_SIGINFO_si_addr); =20 /* If the catcher returns, then it didn't handle the fault, so carry on panicing. */ @@ -1761,7 +1875,7 @@ =20 VG_(message)(Vg_DebugMsg,=20 "si_code=3D%x; Faulting address: %p; sp: %p", - info->si_code, info->_sifields._sigfault._addr, + info->si_code, info->VKI_SIGINFO_si_addr, VG_UCONTEXT_STACK_PTR(uc)); =20 if (0) @@ -1787,18 +1901,32 @@ */ static void sigvgkill_handler(int signo, vki_siginfo_t *si, struct vki_u= context *uc) { - ThreadId tid =3D VG_(get_lwp_tid)(VG_(gettid)()); + ThreadId tid =3D VG_(get_lwp_tid)(VG_(gettid)()); + ThreadStatus at_signal =3D VG_(threads)[tid].status; =20 if (VG_(clo_trace_signals)) - VG_(message)(Vg_DebugMsg, "sigvgkill for lwp %d tid %d", VG_(getti= d)(), tid); + VG_(message)(Vg_DebugMsg,=20 + "sigvgkill for lwp %d tid %d", VG_(gettid)(), tid); =20 + VG_(set_running)(tid, "sigvgkill_handler"); + vg_assert(signo =3D=3D VG_SIGVGKILL); vg_assert(si->si_signo =3D=3D signo); - vg_assert(VG_(threads)[tid].status =3D=3D VgTs_WaitSys); =20 - VG_(set_running)(tid); - VG_(post_syscall)(tid); + /* jrs 2006 August 3: the following assertion seems incorrect to + me, and fails on AIX. sigvgkill could be sent to a thread which + is runnable - see VG_(nuke_all_threads_except) in the scheduler. + Hence comment these out .. =20 =20 + vg_assert(VG_(threads)[tid].status =3D=3D VgTs_WaitSys); + VG_(post_syscall)(tid); + + and instead do: + */ + if (at_signal =3D=3D VgTs_WaitSys) + VG_(post_syscall)(tid); + /* jrs 2006 August 3 ends */ + resume_scheduler(tid); =20 VG_(core_panic)("sigvgkill_handler couldn't return to the scheduler\n= "); @@ -1809,7 +1937,14 @@ { Int i; VG_(printf)("pp_ksigaction: handler %p, flags 0x%x, restorer %p\n",=20 - sa->ksa_handler, (UInt)sa->sa_flags, sa->sa_restorer); + sa->ksa_handler,=20 + (UInt)sa->sa_flags,=20 +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) + sa->sa_restorer +# else + 0 +# endif + ); VG_(printf)("pp_ksigaction: { "); for (i =3D 1; i <=3D VG_(max_signal); i++) if (VG_(sigismember(&(sa->sa_mask),i))) @@ -1826,7 +1961,9 @@ =20 sa.ksa_handler =3D VKI_SIG_DFL; sa.sa_flags =3D 0; +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) sa.sa_restorer =3D 0; +# endif VG_(sigemptyset)(&sa.sa_mask); =20 VG_(do_sys_sigaction)(signo, &sa, NULL); @@ -1837,7 +1974,6 @@ */ void VG_(poll_signals)(ThreadId tid) { - static const struct vki_timespec zero =3D { 0, 0 }; vki_siginfo_t si, *sip; vki_sigset_t pollset; ThreadState *tst =3D VG_(get_ThreadState)(tid); @@ -1859,7 +1995,7 @@ sip =3D next_queued(0, &pollset); /* process-wide */ =20 /* If there was nothing queued, ask the kernel for a pending signal *= / - if (sip =3D=3D NULL && VG_(sigtimedwait)(&pollset, &si, &zero) > 0) { + if (sip =3D=3D NULL && VG_(sigtimedwait_zero)(&pollset, &si) > 0) { if (VG_(clo_trace_signals)) VG_(message)(Vg_DebugMsg, "poll_signals: got signal %d " "for thread %d", si.si_signo, tid); @@ -1914,7 +2050,9 @@ =20 tsa.ksa_handler =3D (void *)sync_signalhandler; tsa.sa_flags =3D VKI_SA_SIGINFO; +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) tsa.sa_restorer =3D 0; +# endif VG_(sigfillset)(&tsa.sa_mask); =20 /* try setting it to some arbitrary handler */ @@ -1936,7 +2074,10 @@ scss.scss_per_sig[i].scss_handler =3D sa.ksa_handler; scss.scss_per_sig[i].scss_flags =3D sa.sa_flags; scss.scss_per_sig[i].scss_mask =3D sa.sa_mask; + scss.scss_per_sig[i].scss_restorer =3D 0; +# if !defined(VGP_ppc32_aix5) && !defined(VGP_ppc64_aix5) scss.scss_per_sig[i].scss_restorer =3D sa.sa_restorer; +# endif } =20 if (VG_(clo_trace_signals)) |