|
From: Jeremy F. <je...@go...> - 2004-06-03 10:01:30
|
CVS commit by fitzhardinge:
Partial fix for bug 76869. This fixes the problem with returning from
a signal handler when VDSOs are turned off in FC2. Note that we don't
(yet) support VDSOs being on (use "echo 0 > /proc/sys/kernel/vdso").
M +1 -0 coregrind/vg_include.h 1.191
M +5 -1 coregrind/vg_signals.c 1.68
M +5 -0 coregrind/vg_syscall.S 1.12
M +1 -1 include/vg_kerneliface.h 1.17
--- valgrind/coregrind/vg_include.h #1.190:1.191
@@ -1668,4 +1668,5 @@ 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);
/* ---------------------------------------------------------------------
--- valgrind/coregrind/vg_syscall.S #1.11:1.12
@@ -113,4 +113,9 @@
pop %ebx
ret
+
+.globl VG_(sigreturn)
+VG_(sigreturn):
+ movl $__NR_rt_sigreturn, %eax
+ int $0x80
##--------------------------------------------------------------------##
--- valgrind/coregrind/vg_signals.c #1.67:1.68
@@ -354,4 +354,7 @@ void calculate_SKSS_from_SCSS ( SKSS* ds
skss_flags |= VKI_SA_SIGINFO;
+ /* use our own restorer */
+ skss_flags |= VKI_SA_RESTORER;
+
/* Create SKSS entry for this signal. */
@@ -411,9 +414,10 @@ void VG_(handle_SCSS_change) ( Bool forc
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))
--- valgrind/include/vg_kerneliface.h #1.16:1.17
@@ -250,7 +250,7 @@ struct vki_ucontext {
#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
|