]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Partial fix for bug 76869. This fixes the problem with returning from
authorJeremy Fitzhardinge <jeremy@valgrind.org>
Thu, 3 Jun 2004 10:00:42 +0000 (10:00 +0000)
committerJeremy Fitzhardinge <jeremy@valgrind.org>
Thu, 3 Jun 2004 10:00:42 +0000 (10:00 +0000)
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").

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2400

coregrind/vg_include.h
coregrind/vg_signals.c
coregrind/vg_syscall.S
include/vg_kerneliface.h

index 4f206717b5b68cc3057a31422379f563c77dcc52..50f486d7353a146d7f45068cb9f199d468a712a7 100644 (file)
@@ -1667,6 +1667,7 @@ extern Addr VG_(search_transtab) ( Addr original_addr );
 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
index b178bebc7b4207fef6dd2da6994255fc38e9988e..27fb16c082b37c747a16120dd908852c2628e9c2 100644 (file)
@@ -353,6 +353,9 @@ void calculate_SKSS_from_SCSS ( SKSS* dst )
       /* 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)
@@ -410,11 +413,12 @@ void VG_(handle_SCSS_change) ( Bool force_update )
 
       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, 
index 34ccc8fe40e5ae9071593714cf6d09f9b387a259..d7efec06f2495d4057bddb766e6efe829ac40e7c 100644 (file)
@@ -112,6 +112,11 @@ VG_(clone):
        pop     %edi
        pop     %ebx
        ret
+
+.globl VG_(sigreturn)
+VG_(sigreturn):
+       movl    $__NR_rt_sigreturn, %eax
+       int     $0x80
        
 ##--------------------------------------------------------------------##
 ##--- end                                             vg_syscall.S ---##
index 89c0998cbabe5f5eaf51530b028d828f54f8f690..186355cbdc830ca4e03c753abb5aa851d29dd314 100644 (file)
@@ -249,9 +249,9 @@ struct vki_ucontext {
 #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 */