|
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))
|