extern Int VG_(do_syscall) ( UInt, ... );
extern Int VG_(clone) ( Int (*fn)(void *), void *stack, Int flags, void *arg,
Int *child_tid, Int *parent_tid);
+extern void VG_(sigreturn)(void);
/* ---------------------------------------------------------------------
Exports of vg_dispatch.S
/* always ask for SA_SIGINFO */
skss_flags |= VKI_SA_SIGINFO;
+ /* use our own restorer */
+ skss_flags |= VKI_SA_RESTORER;
+
/* Create SKSS entry for this signal. */
if (sig != VKI_SIGKILL && sig != VKI_SIGSTOP)
ksa.ksa_handler = vg_skss.skss_per_sig[sig].skss_handler;
ksa.ksa_flags = vg_skss.skss_per_sig[sig].skss_flags;
+ ksa.ksa_restorer = VG_(sigreturn);
+
vg_assert(ksa.ksa_flags & VKI_SA_ONSTACK);
VG_(ksigfillset)( &ksa.ksa_mask );
VG_(ksigdelset)( &ksa.ksa_mask, VKI_SIGKILL );
VG_(ksigdelset)( &ksa.ksa_mask, VKI_SIGSTOP );
- ksa.ksa_restorer = NULL;
if (VG_(clo_trace_signals))
VG_(message)(Vg_DebugMsg,
pop %edi
pop %ebx
ret
+
+.globl VG_(sigreturn)
+VG_(sigreturn):
+ movl $__NR_rt_sigreturn, %eax
+ int $0x80
##--------------------------------------------------------------------##
##--- end vg_syscall.S ---##
#define VKI_SA_NODEFER 0x40000000
#define VKI_SA_NOMASK VKI_SA_NODEFER
#define VKI_SA_NOCLDWAIT 0x00000002
+#define VKI_SA_RESTORER 0x04000000
#if 0
#define VKI_SA_INTERRUPT 0x20000000 /* dummy -- ignored */
-#define VKI_SA_RESTORER 0x04000000
#endif
/* extra wait flags */