From: Roland McGrath Date: Sun, 4 Nov 2007 00:00:00 +0000 (+0000) Subject: 2007-11-02 Thiemo Seufer X-Git-Tag: v4.5.18~104 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=576b78479862c1dd816652b21af75f457c0be30e;p=strace 2007-11-02 Thiemo Seufer * 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. --- diff --git a/signal.c b/signal.c index dc178dfe..d0c4ae7f 100644 --- 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 @@ -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 *)®s, 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;