]> granicus.if.org Git - strace/commitdiff
2007-11-02 Thiemo Seufer <ths@networkno.de>
authorRoland McGrath <roland@redhat.com>
Sun, 4 Nov 2007 00:00:00 +0000 (00:00 +0000)
committerRoland McGrath <roland@redhat.com>
Sun, 4 Nov 2007 00:00:00 +0000 (00:00 +0000)
* signal.c (m_siginfo_t): Add for MIPS.
(sys_sigreturn): struct sigcontext on MIPS has no sigset_t member,
acquire the signal mask with the same trick as on Sparc.
Fixes Debian#448802.

signal.c

index dc178dfe9e9fb6d8f5ff960234624966b9fa01a7..d0c4ae7fe846330a5e0440116ffa461995c1d1c6 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -97,6 +97,11 @@ typedef struct {
        struct regs             si_regs;
        int                     si_mask;
 } m_siginfo_t;
+#elif defined (MIPS)
+typedef struct {
+       struct pt_regs          si_regs;
+       int                     si_mask;
+} m_siginfo_t;
 #elif defined HAVE_ASM_SIGCONTEXT_H
 #if !defined(IA64) && !defined(X86_64)
 #include <asm/sigcontext.h>
@@ -1426,25 +1431,26 @@ struct tcb *tcp;
 #else
 #ifdef MIPS
        long sp;
-       struct sigcontext sc;
+       struct pt_regs regs;
+       m_siginfo_t si;
 
+       if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {
+               perror("sigreturn: PTRACE_GETREGS ");
+               return 0;
+       }
        if(entering(tcp)) {
                tcp->u_arg[0] = 0;
-               if (upeek(tcp->pid, REG_SP, &sp) < 0)
-                       return 0;
-               if (umove(tcp, sp, &sc) < 0)
-                       return 0;
+               sp = regs.regs[29];
+               if (umove(tcp, sp, &si) < 0)
                tcp->u_arg[0] = 1;
-# ifdef HAVE_STRUCT_SIGCONTEXT_SC_HI2
-               tcp->u_arg[1] = sc.sc_hi2;
-# else
-               tcp->u_arg[1] = sc.sc_sigset;
-# endif
+               tcp->u_arg[1] = si.si_mask;
        } else {
+               sigset_t sigm;
+               long_to_sigset(tcp->u_arg[1], &sigm);
                tcp->u_rval = tcp->u_error = 0;
                if(tcp->u_arg[0] == 0)
-                       return 0;
-               tcp->auxstr = sprintsigmask("mask now ", tcp->u_arg[1], 0);
+                       return 0;
+               tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
                return RVAL_NONE | RVAL_STR;
        }
        return 0;