]> granicus.if.org Git - strace/blob - signal.c
Automated removal of non-Linux code
[strace] / signal.c
1 /*
2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3  * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
6  * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
7  *                     Linux for s390 port by D.J. Barrow
8  *                    <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  *      $Id$
34  */
35
36 #include "defs.h"
37
38 #include <stdint.h>
39 #include <signal.h>
40 #include <sys/user.h>
41 #include <fcntl.h>
42
43
44 #ifdef HAVE_SYS_REG_H
45 # include <sys/reg.h>
46 #ifndef PTRACE_PEEKUSR
47 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
48 #endif
49 #ifndef PTRACE_POKEUSR
50 # define PTRACE_POKEUSR PTRACE_POKEUSER
51 #endif
52 #elif defined(HAVE_LINUX_PTRACE_H)
53 #undef PTRACE_SYSCALL
54 # ifdef HAVE_STRUCT_IA64_FPREG
55 #  define ia64_fpreg XXX_ia64_fpreg
56 # endif
57 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
58 #  define pt_all_user_regs XXX_pt_all_user_regs
59 # endif
60 #include <linux/ptrace.h>
61 # undef ia64_fpreg
62 # undef pt_all_user_regs
63 #endif
64
65
66
67 #ifdef IA64
68 # include <asm/ptrace_offsets.h>
69 #endif
70
71 #if defined (LINUX) && defined (SPARC64)
72 # undef PTRACE_GETREGS
73 # define PTRACE_GETREGS PTRACE_GETREGS64
74 # undef PTRACE_SETREGS
75 # define PTRACE_SETREGS PTRACE_SETREGS64
76 #endif /* LINUX && SPARC64 */
77
78 #if defined (SPARC) || defined (SPARC64) || defined (MIPS)
79 typedef struct {
80         struct pt_regs          si_regs;
81         int                     si_mask;
82 } m_siginfo_t;
83 #elif defined HAVE_ASM_SIGCONTEXT_H
84 #if !defined(IA64) && !defined(X86_64)
85 #include <asm/sigcontext.h>
86 #endif /* !IA64 && !X86_64 */
87 #else /* !HAVE_ASM_SIGCONTEXT_H */
88 #if defined I386 && !defined HAVE_STRUCT_SIGCONTEXT_STRUCT
89 struct sigcontext_struct {
90         unsigned short gs, __gsh;
91         unsigned short fs, __fsh;
92         unsigned short es, __esh;
93         unsigned short ds, __dsh;
94         unsigned long edi;
95         unsigned long esi;
96         unsigned long ebp;
97         unsigned long esp;
98         unsigned long ebx;
99         unsigned long edx;
100         unsigned long ecx;
101         unsigned long eax;
102         unsigned long trapno;
103         unsigned long err;
104         unsigned long eip;
105         unsigned short cs, __csh;
106         unsigned long eflags;
107         unsigned long esp_at_signal;
108         unsigned short ss, __ssh;
109         unsigned long i387;
110         unsigned long oldmask;
111         unsigned long cr2;
112 };
113 #else /* !I386 */
114 #if defined M68K && !defined HAVE_STRUCT_SIGCONTEXT
115 struct sigcontext
116 {
117         unsigned long sc_mask;
118         unsigned long sc_usp;
119         unsigned long sc_d0;
120         unsigned long sc_d1;
121         unsigned long sc_a0;
122         unsigned long sc_a1;
123         unsigned short sc_sr;
124         unsigned long sc_pc;
125         unsigned short sc_formatvec;
126 };
127 #endif /* M68K */
128 #endif /* !I386 */
129 #endif /* !HAVE_ASM_SIGCONTEXT_H */
130
131 #ifndef NSIG
132 #warning: NSIG is not defined, using 32
133 #define NSIG 32
134 #endif
135 #ifdef ARM
136 /* Ugh. Is this really correct? ARM has no RT signals?! */
137 #undef NSIG
138 #define NSIG 32
139 #endif
140
141
142
143 #ifdef HAVE_SIGACTION
144
145 #if defined LINUX && (defined I386 || defined X86_64)
146 /* The libc headers do not define this constant since it should only be
147    used by the implementation.  So we define it here.  */
148 # ifndef SA_RESTORER
149 #  define SA_RESTORER 0x04000000
150 # endif
151 #endif
152
153 static const struct xlat sigact_flags[] = {
154 #ifdef SA_RESTORER
155         { SA_RESTORER,  "SA_RESTORER"   },
156 #endif
157 #ifdef SA_STACK
158         { SA_STACK,     "SA_STACK"      },
159 #endif
160 #ifdef SA_RESTART
161         { SA_RESTART,   "SA_RESTART"    },
162 #endif
163 #ifdef SA_INTERRUPT
164         { SA_INTERRUPT, "SA_INTERRUPT"  },
165 #endif
166 #ifdef SA_NODEFER
167         { SA_NODEFER,   "SA_NODEFER"    },
168 #endif
169 #if defined SA_NOMASK && SA_NODEFER != SA_NOMASK
170         { SA_NOMASK,    "SA_NOMASK"     },
171 #endif
172 #ifdef SA_RESETHAND
173         { SA_RESETHAND, "SA_RESETHAND"  },
174 #endif
175 #if defined SA_ONESHOT && SA_ONESHOT != SA_RESETHAND
176         { SA_ONESHOT,   "SA_ONESHOT"    },
177 #endif
178 #ifdef SA_SIGINFO
179         { SA_SIGINFO,   "SA_SIGINFO"    },
180 #endif
181 #ifdef SA_RESETHAND
182         { SA_RESETHAND, "SA_RESETHAND"  },
183 #endif
184 #ifdef SA_ONSTACK
185         { SA_ONSTACK,   "SA_ONSTACK"    },
186 #endif
187 #ifdef SA_NODEFER
188         { SA_NODEFER,   "SA_NODEFER"    },
189 #endif
190 #ifdef SA_NOCLDSTOP
191         { SA_NOCLDSTOP, "SA_NOCLDSTOP"  },
192 #endif
193 #ifdef SA_NOCLDWAIT
194         { SA_NOCLDWAIT, "SA_NOCLDWAIT"  },
195 #endif
196 #ifdef _SA_BSDCALL
197         { _SA_BSDCALL,  "_SA_BSDCALL"   },
198 #endif
199 #ifdef SA_NOPTRACE
200         { SA_NOPTRACE,  "SA_NOPTRACE"   },
201 #endif
202         { 0,            NULL            },
203 };
204
205 static const struct xlat sigprocmaskcmds[] = {
206         { SIG_BLOCK,    "SIG_BLOCK"     },
207         { SIG_UNBLOCK,  "SIG_UNBLOCK"   },
208         { SIG_SETMASK,  "SIG_SETMASK"   },
209 #ifdef SIG_SETMASK32
210         { SIG_SETMASK32,"SIG_SETMASK32" },
211 #endif
212         { 0,            NULL            },
213 };
214
215 #endif /* HAVE_SIGACTION */
216
217 /* Anonymous realtime signals. */
218 /* Under glibc 2.1, SIGRTMIN et al are functions, but __SIGRTMIN is a
219    constant.  This is what we want.  Otherwise, just use SIGRTMIN. */
220 #ifdef SIGRTMIN
221 #ifndef __SIGRTMIN
222 #define __SIGRTMIN SIGRTMIN
223 #define __SIGRTMAX SIGRTMAX /* likewise */
224 #endif
225 #endif
226
227 /* Note on the size of sigset_t:
228  *
229  * In glibc, sigset_t is an array with space for 1024 bits (!),
230  * even though all arches supported by Linux have only 64 signals
231  * except MIPS, which has 128. IOW, it is 128 bytes long.
232  *
233  * In-kernel sigset_t is sized correctly (it is either 64 or 128 bit long).
234  * However, some old syscall return only 32 lower bits (one word).
235  * Example: sys_sigpending vs sys_rt_sigpending.
236  *
237  * Be aware of this fact when you try to
238  *     memcpy(&tcp->u_arg[1], &something, sizeof(sigset_t))
239  * - sizeof(sigset_t) is much bigger than you think,
240  * it may overflow tcp->u_arg[] array, and it may try to copy more data
241  * than is really available in <something>.
242  * Similarly,
243  *     umoven(tcp, addr, sizeof(sigset_t), &sigset)
244  * may be a bad idea: it'll try to read much more data than needed
245  * to fetch a sigset_t.
246  * Use (NSIG / 8) as a size instead.
247  */
248
249 const char *
250 signame(int sig)
251 {
252         static char buf[sizeof("SIGRT_%d") + sizeof(int)*3];
253
254         if (sig >= 0 && sig < nsignals)
255                 return signalent[sig];
256 #ifdef SIGRTMIN
257         if (sig >= __SIGRTMIN && sig <= __SIGRTMAX) {
258                 sprintf(buf, "SIGRT_%d", (int)(sig - __SIGRTMIN));
259                 return buf;
260         }
261 #endif
262         sprintf(buf, "%d", sig);
263         return buf;
264 }
265
266 static void
267 long_to_sigset(long l, sigset_t *s)
268 {
269         sigemptyset(s);
270         *(long *)s = l;
271 }
272
273 static int
274 copy_sigset_len(struct tcb *tcp, long addr, sigset_t *s, int len)
275 {
276         if (len > sizeof(*s))
277                 len = sizeof(*s);
278         sigemptyset(s);
279         if (umoven(tcp, addr, len, (char *)s) < 0)
280                 return -1;
281         return 0;
282 }
283
284 /* Original sigset is unsigned long */
285 #define copy_sigset(tcp, addr, s) copy_sigset_len(tcp, addr, s, sizeof(long))
286
287 static const char *
288 sprintsigmask(const char *str, sigset_t *mask, int rt)
289 /* set might include realtime sigs */
290 {
291         /* Was [8 * sizeof(sigset_t) * 8], but
292          * glibc sigset_t is huge (1024 bits = 128 *bytes*),
293          * and we were ending up with 8k (!) buffer here.
294          *
295          * No Unix system can have sig > 255
296          * (waitpid API won't be able to indicate death from one)
297          * and sig 0 doesn't exist either.
298          * Therefore max possible no of sigs is 255: 1..255
299          */
300         static char outstr[8 * (255 * 2 / 3)];
301
302         int i, nsigs;
303         int maxsigs;
304         int show_members;
305         char sep;
306         char *s;
307
308         maxsigs = nsignals;
309 #ifdef __SIGRTMAX
310         if (rt)
311                 maxsigs = __SIGRTMAX; /* instead */
312 #endif
313         s = stpcpy(outstr, str);
314         nsigs = 0;
315         for (i = 1; i < maxsigs; i++) {
316                 if (sigismember(mask, i) == 1)
317                         nsigs++;
318         }
319
320         /* 1: show mask members, 0: show those which are NOT in mask */
321         show_members = (nsigs < nsignals * 2 / 3);
322         if (!show_members)
323                 *s++ = '~';
324
325         sep = '[';
326         for (i = 1; i < maxsigs; i++) {
327                 if (sigismember(mask, i) == show_members) {
328                         /* real-time signals on solaris don't have
329                          * signalent entries
330                          */
331                         char tsig[40];
332                         *s++ = sep;
333                         if (i < nsignals) {
334                                 s = stpcpy(s, signalent[i] + 3);
335                         }
336 #ifdef SIGRTMIN
337                         else if (i >= __SIGRTMIN && i <= __SIGRTMAX) {
338                                 sprintf(tsig, "RT_%u", i - __SIGRTMIN);
339                                 s = stpcpy(s, tsig);
340                         }
341 #endif /* SIGRTMIN */
342                         else {
343                                 sprintf(tsig, "%u", i);
344                                 s = stpcpy(s, tsig);
345                         }
346                         sep = ' ';
347                 }
348         }
349         if (sep == '[')
350                 *s++ = sep;
351         *s++ = ']';
352         *s = '\0';
353         return outstr;
354 }
355
356 static void
357 printsigmask(sigset_t *mask, int rt)
358 {
359         tprints(sprintsigmask("", mask, rt));
360 }
361
362 void
363 printsignal(int nr)
364 {
365         tprints(signame(nr));
366 }
367
368 void
369 print_sigset(struct tcb *tcp, long addr, int rt)
370 {
371         sigset_t ss;
372
373         if (!addr)
374                 tprints("NULL");
375         else if (copy_sigset(tcp, addr, &ss) < 0)
376                 tprintf("%#lx", addr);
377         else
378                 printsigmask(&ss, rt);
379 }
380
381
382 #ifndef ILL_ILLOPC
383 #define ILL_ILLOPC      1       /* illegal opcode */
384 #define ILL_ILLOPN      2       /* illegal operand */
385 #define ILL_ILLADR      3       /* illegal addressing mode */
386 #define ILL_ILLTRP      4       /* illegal trap */
387 #define ILL_PRVOPC      5       /* privileged opcode */
388 #define ILL_PRVREG      6       /* privileged register */
389 #define ILL_COPROC      7       /* coprocessor error */
390 #define ILL_BADSTK      8       /* internal stack error */
391 #define FPE_INTDIV      1       /* integer divide by zero */
392 #define FPE_INTOVF      2       /* integer overflow */
393 #define FPE_FLTDIV      3       /* floating point divide by zero */
394 #define FPE_FLTOVF      4       /* floating point overflow */
395 #define FPE_FLTUND      5       /* floating point underflow */
396 #define FPE_FLTRES      6       /* floating point inexact result */
397 #define FPE_FLTINV      7       /* floating point invalid operation */
398 #define FPE_FLTSUB      8       /* subscript out of range */
399 #define SEGV_MAPERR     1       /* address not mapped to object */
400 #define SEGV_ACCERR     2       /* invalid permissions for mapped object */
401 #define BUS_ADRALN      1       /* invalid address alignment */
402 #define BUS_ADRERR      2       /* non-existant physical address */
403 #define BUS_OBJERR      3       /* object specific hardware error */
404 #define TRAP_BRKPT      1       /* process breakpoint */
405 #define TRAP_TRACE      2       /* process trace trap */
406 #define CLD_EXITED      1       /* child has exited */
407 #define CLD_KILLED      2       /* child was killed */
408 #define CLD_DUMPED      3       /* child terminated abnormally */
409 #define CLD_TRAPPED     4       /* traced child has trapped */
410 #define CLD_STOPPED     5       /* child has stopped */
411 #define CLD_CONTINUED   6       /* stopped child has continued */
412 #define POLL_IN         1       /* data input available */
413 #define POLL_OUT        2       /* output buffers available */
414 #define POLL_MSG        3       /* input message available */
415 #define POLL_ERR        4       /* i/o error */
416 #define POLL_PRI        5       /* high priority input available */
417 #define POLL_HUP        6       /* device disconnected */
418 #define SI_KERNEL       0x80    /* sent by kernel */
419 #define SI_USER         0       /* sent by kill, sigsend, raise */
420 #define SI_QUEUE        -1      /* sent by sigqueue */
421 #define SI_TIMER        -2      /* sent by timer expiration */
422 #define SI_MESGQ        -3      /* sent by real time mesq state change */
423 #define SI_ASYNCIO      -4      /* sent by AIO completion */
424 #define SI_SIGIO        -5      /* sent by SIGIO */
425 #define SI_TKILL        -6      /* sent by tkill */
426 #define SI_ASYNCNL      -60     /* sent by asynch name lookup completion */
427
428 #define SI_FROMUSER(sip)        ((sip)->si_code <= 0)
429
430 #endif /* LINUX */
431
432 #if __GLIBC_MINOR__ < 1
433 /* Type for data associated with a signal.  */
434 typedef union sigval
435 {
436         int sival_int;
437         void *sival_ptr;
438 } sigval_t;
439
440 # define __SI_MAX_SIZE     128
441 # define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof(int)) - 3)
442
443 typedef struct siginfo
444 {
445         int si_signo;               /* Signal number.  */
446         int si_errno;               /* If non-zero, an errno value associated with
447                                                                    this signal, as defined in <errno.h>.  */
448         int si_code;                /* Signal code.  */
449
450         union
451         {
452                 int _pad[__SI_PAD_SIZE];
453
454                 /* kill().  */
455                 struct
456                 {
457                         __pid_t si_pid;     /* Sending process ID.  */
458                         __uid_t si_uid;     /* Real user ID of sending process.  */
459                 } _kill;
460
461                 /* POSIX.1b timers.  */
462                 struct
463                 {
464                         unsigned int _timer1;
465                         unsigned int _timer2;
466                 } _timer;
467
468                 /* POSIX.1b signals.  */
469                 struct
470                 {
471                         __pid_t si_pid;     /* Sending process ID.  */
472                         __uid_t si_uid;     /* Real user ID of sending process.  */
473                         sigval_t si_sigval; /* Signal value.  */
474                 } _rt;
475
476                 /* SIGCHLD.  */
477                 struct
478                 {
479                         __pid_t si_pid;     /* Which child.  */
480                         int si_status;      /* Exit value or signal.  */
481                         __clock_t si_utime;
482                         __clock_t si_stime;
483                 } _sigchld;
484
485                 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
486                 struct
487                 {
488                         void *si_addr;      /* Faulting insn/memory ref.  */
489                 } _sigfault;
490
491                 /* SIGPOLL.  */
492                 struct
493                 {
494                         int si_band;        /* Band event for SIGPOLL.  */
495                         int si_fd;
496                 } _sigpoll;
497         } _sifields;
498 } siginfo_t;
499
500 #define si_pid          _sifields._kill.si_pid
501 #define si_uid          _sifields._kill.si_uid
502 #define si_status       _sifields._sigchld.si_status
503 #define si_utime        _sifields._sigchld.si_utime
504 #define si_stime        _sifields._sigchld.si_stime
505 #define si_value        _sifields._rt.si_sigval
506 #define si_int          _sifields._rt.si_sigval.sival_int
507 #define si_ptr          _sifields._rt.si_sigval.sival_ptr
508 #define si_addr         _sifields._sigfault.si_addr
509 #define si_band         _sifields._sigpoll.si_band
510 #define si_fd           _sifields._sigpoll.si_fd
511
512 #endif
513
514
515
516 static const struct xlat siginfo_codes[] = {
517 #ifdef SI_KERNEL
518         { SI_KERNEL,    "SI_KERNEL"     },
519 #endif
520 #ifdef SI_USER
521         { SI_USER,      "SI_USER"       },
522 #endif
523 #ifdef SI_QUEUE
524         { SI_QUEUE,     "SI_QUEUE"      },
525 #endif
526 #ifdef SI_TIMER
527         { SI_TIMER,     "SI_TIMER"      },
528 #endif
529 #ifdef SI_MESGQ
530         { SI_MESGQ,     "SI_MESGQ"      },
531 #endif
532 #ifdef SI_ASYNCIO
533         { SI_ASYNCIO,   "SI_ASYNCIO"    },
534 #endif
535 #ifdef SI_SIGIO
536         { SI_SIGIO,     "SI_SIGIO"      },
537 #endif
538 #ifdef SI_TKILL
539         { SI_TKILL,     "SI_TKILL"      },
540 #endif
541 #ifdef SI_ASYNCNL
542         { SI_ASYNCNL,   "SI_ASYNCNL"    },
543 #endif
544 #ifdef SI_NOINFO
545         { SI_NOINFO,    "SI_NOINFO"     },
546 #endif
547 #ifdef SI_LWP
548         { SI_LWP,       "SI_LWP"        },
549 #endif
550         { 0,            NULL            },
551 };
552
553 static const struct xlat sigill_codes[] = {
554         { ILL_ILLOPC,   "ILL_ILLOPC"    },
555         { ILL_ILLOPN,   "ILL_ILLOPN"    },
556         { ILL_ILLADR,   "ILL_ILLADR"    },
557         { ILL_ILLTRP,   "ILL_ILLTRP"    },
558         { ILL_PRVOPC,   "ILL_PRVOPC"    },
559         { ILL_PRVREG,   "ILL_PRVREG"    },
560         { ILL_COPROC,   "ILL_COPROC"    },
561         { ILL_BADSTK,   "ILL_BADSTK"    },
562         { 0,            NULL            },
563 };
564
565 static const struct xlat sigfpe_codes[] = {
566         { FPE_INTDIV,   "FPE_INTDIV"    },
567         { FPE_INTOVF,   "FPE_INTOVF"    },
568         { FPE_FLTDIV,   "FPE_FLTDIV"    },
569         { FPE_FLTOVF,   "FPE_FLTOVF"    },
570         { FPE_FLTUND,   "FPE_FLTUND"    },
571         { FPE_FLTRES,   "FPE_FLTRES"    },
572         { FPE_FLTINV,   "FPE_FLTINV"    },
573         { FPE_FLTSUB,   "FPE_FLTSUB"    },
574         { 0,            NULL            },
575 };
576
577 static const struct xlat sigtrap_codes[] = {
578         { TRAP_BRKPT,   "TRAP_BRKPT"    },
579         { TRAP_TRACE,   "TRAP_TRACE"    },
580         { 0,            NULL            },
581 };
582
583 static const struct xlat sigchld_codes[] = {
584         { CLD_EXITED,   "CLD_EXITED"    },
585         { CLD_KILLED,   "CLD_KILLED"    },
586         { CLD_DUMPED,   "CLD_DUMPED"    },
587         { CLD_TRAPPED,  "CLD_TRAPPED"   },
588         { CLD_STOPPED,  "CLD_STOPPED"   },
589         { CLD_CONTINUED,"CLD_CONTINUED" },
590         { 0,            NULL            },
591 };
592
593 static const struct xlat sigpoll_codes[] = {
594         { POLL_IN,      "POLL_IN"       },
595         { POLL_OUT,     "POLL_OUT"      },
596         { POLL_MSG,     "POLL_MSG"      },
597         { POLL_ERR,     "POLL_ERR"      },
598         { POLL_PRI,     "POLL_PRI"      },
599         { POLL_HUP,     "POLL_HUP"      },
600         { 0,            NULL            },
601 };
602
603 static const struct xlat sigprof_codes[] = {
604 #ifdef PROF_SIG
605         { PROF_SIG,     "PROF_SIG"      },
606 #endif
607         { 0,            NULL            },
608 };
609
610 #ifdef SIGEMT
611 static const struct xlat sigemt_codes[] = {
612 #ifdef EMT_TAGOVF
613         { EMT_TAGOVF,   "EMT_TAGOVF"    },
614 #endif
615         { 0,            NULL            },
616 };
617 #endif
618
619 static const struct xlat sigsegv_codes[] = {
620         { SEGV_MAPERR,  "SEGV_MAPERR"   },
621         { SEGV_ACCERR,  "SEGV_ACCERR"   },
622         { 0,            NULL            },
623 };
624
625 static const struct xlat sigbus_codes[] = {
626         { BUS_ADRALN,   "BUS_ADRALN"    },
627         { BUS_ADRERR,   "BUS_ADRERR"    },
628         { BUS_OBJERR,   "BUS_OBJERR"    },
629         { 0,            NULL            },
630 };
631
632 void
633 printsiginfo(siginfo_t *sip, int verbose)
634 {
635         const char *code;
636
637         if (sip->si_signo == 0) {
638                 tprints("{}");
639                 return;
640         }
641         tprints("{si_signo=");
642         printsignal(sip->si_signo);
643         code = xlookup(siginfo_codes, sip->si_code);
644         if (!code) {
645                 switch (sip->si_signo) {
646                 case SIGTRAP:
647                         code = xlookup(sigtrap_codes, sip->si_code);
648                         break;
649                 case SIGCHLD:
650                         code = xlookup(sigchld_codes, sip->si_code);
651                         break;
652                 case SIGPOLL:
653                         code = xlookup(sigpoll_codes, sip->si_code);
654                         break;
655                 case SIGPROF:
656                         code = xlookup(sigprof_codes, sip->si_code);
657                         break;
658                 case SIGILL:
659                         code = xlookup(sigill_codes, sip->si_code);
660                         break;
661 #ifdef SIGEMT
662                 case SIGEMT:
663                         code = xlookup(sigemt_codes, sip->si_code);
664                         break;
665 #endif
666                 case SIGFPE:
667                         code = xlookup(sigfpe_codes, sip->si_code);
668                         break;
669                 case SIGSEGV:
670                         code = xlookup(sigsegv_codes, sip->si_code);
671                         break;
672                 case SIGBUS:
673                         code = xlookup(sigbus_codes, sip->si_code);
674                         break;
675                 }
676         }
677         if (code)
678                 tprintf(", si_code=%s", code);
679         else
680                 tprintf(", si_code=%#x", sip->si_code);
681 #ifdef SI_NOINFO
682         if (sip->si_code != SI_NOINFO)
683 #endif
684         {
685                 if (sip->si_errno) {
686                         if (sip->si_errno < 0 || sip->si_errno >= nerrnos)
687                                 tprintf(", si_errno=%d", sip->si_errno);
688                         else
689                                 tprintf(", si_errno=%s",
690                                         errnoent[sip->si_errno]);
691                 }
692 #ifdef SI_FROMUSER
693                 if (SI_FROMUSER(sip)) {
694                         tprintf(", si_pid=%lu, si_uid=%lu",
695                                 (unsigned long) sip->si_pid,
696                                 (unsigned long) sip->si_uid);
697                         switch (sip->si_code) {
698 #ifdef SI_USER
699                         case SI_USER:
700                                 break;
701 #endif
702 #ifdef SI_TKILL
703                         case SI_TKILL:
704                                 break;
705 #endif
706 #ifdef SI_TIMER
707                         case SI_TIMER:
708                                 tprintf(", si_value=%d", sip->si_int);
709                                 break;
710 #endif
711                         default:
712                                 if (!sip->si_ptr)
713                                         break;
714                                 if (!verbose)
715                                         tprints(", ...");
716                                 else
717                                         tprintf(", si_value={int=%u, ptr=%#lx}",
718                                                 sip->si_int,
719                                                 (unsigned long) sip->si_ptr);
720                                 break;
721                         }
722                 }
723                 else
724 #endif /* SI_FROMUSER */
725                 {
726                         switch (sip->si_signo) {
727                         case SIGCHLD:
728                                 tprintf(", si_pid=%ld, si_status=",
729                                         (long) sip->si_pid);
730                                 if (sip->si_code == CLD_EXITED)
731                                         tprintf("%d", sip->si_status);
732                                 else
733                                         printsignal(sip->si_status);
734                                 if (!verbose)
735                                         tprints(", ...");
736                                 else
737                                         tprintf(", si_utime=%lu, si_stime=%lu",
738                                                 sip->si_utime,
739                                                 sip->si_stime);
740                                 break;
741                         case SIGILL: case SIGFPE:
742                         case SIGSEGV: case SIGBUS:
743                                 tprintf(", si_addr=%#lx",
744                                         (unsigned long) sip->si_addr);
745                                 break;
746                         case SIGPOLL:
747                                 switch (sip->si_code) {
748                                 case POLL_IN: case POLL_OUT: case POLL_MSG:
749                                         tprintf(", si_band=%ld",
750                                                 (long) sip->si_band);
751                                         break;
752                                 }
753                                 break;
754                         default:
755                                 if (sip->si_pid || sip->si_uid)
756                                         tprintf(", si_pid=%lu, si_uid=%lu",
757                                                 (unsigned long) sip->si_pid,
758                                                 (unsigned long) sip->si_uid);
759                                 if (!sip->si_ptr)
760                                         break;
761                                 if (!verbose)
762                                         tprints(", ...");
763                                 else {
764                                         tprintf(", si_value={int=%u, ptr=%#lx}",
765                                                 sip->si_int,
766                                                 (unsigned long) sip->si_ptr);
767                                 }
768
769                         }
770                 }
771         }
772         tprints("}");
773 }
774
775
776
777
778 int
779 sys_sigsetmask(struct tcb *tcp)
780 {
781         if (entering(tcp)) {
782                 sigset_t sigm;
783                 long_to_sigset(tcp->u_arg[0], &sigm);
784                 printsigmask(&sigm, 0);
785         }
786         else if (!syserror(tcp)) {
787                 sigset_t sigm;
788                 long_to_sigset(tcp->u_rval, &sigm);
789                 tcp->auxstr = sprintsigmask("old mask ", &sigm, 0);
790
791                 return RVAL_HEX | RVAL_STR;
792         }
793         return 0;
794 }
795
796
797
798 #ifdef HAVE_SIGACTION
799
800 struct old_sigaction {
801         __sighandler_t __sa_handler;
802         unsigned long sa_mask;
803         unsigned long sa_flags;
804         void (*sa_restorer)(void);
805 };
806 #define SA_HANDLER __sa_handler
807
808 #ifndef SA_HANDLER
809 #define SA_HANDLER sa_handler
810 #endif
811
812 int
813 sys_sigaction(struct tcb *tcp)
814 {
815         long addr;
816         sigset_t sigset;
817         struct old_sigaction sa;
818
819
820         if (entering(tcp)) {
821                 printsignal(tcp->u_arg[0]);
822                 tprints(", ");
823                 addr = tcp->u_arg[1];
824         } else
825                 addr = tcp->u_arg[2];
826         if (addr == 0)
827                 tprints("NULL");
828         else if (!verbose(tcp))
829                 tprintf("%#lx", addr);
830         else if (umove(tcp, addr, &sa) < 0)
831                 tprints("{...}");
832         else {
833                 /* Architectures using function pointers, like
834                  * hppa, may need to manipulate the function pointer
835                  * to compute the result of a comparison. However,
836                  * the SA_HANDLER function pointer exists only in
837                  * the address space of the traced process, and can't
838                  * be manipulated by strace. In order to prevent the
839                  * compiler from generating code to manipulate
840                  * SA_HANDLER we cast the function pointers to long. */
841                 if ((long)sa.SA_HANDLER == (long)SIG_ERR)
842                         tprints("{SIG_ERR, ");
843                 else if ((long)sa.SA_HANDLER == (long)SIG_DFL)
844                         tprints("{SIG_DFL, ");
845                 else if ((long)sa.SA_HANDLER == (long)SIG_IGN)
846                         tprints("{SIG_IGN, ");
847                 else
848                         tprintf("{%#lx, ", (long) sa.SA_HANDLER);
849                 long_to_sigset(sa.sa_mask, &sigset);
850                 printsigmask(&sigset, 0);
851                 tprints(", ");
852                 printflags(sigact_flags, sa.sa_flags, "SA_???");
853 #ifdef SA_RESTORER
854                 if (sa.sa_flags & SA_RESTORER)
855                         tprintf(", %p", sa.sa_restorer);
856 #endif
857                 tprints("}");
858         }
859         if (entering(tcp))
860                 tprints(", ");
861         else
862                 tprintf(", %#lx", (unsigned long) sa.sa_restorer);
863         return 0;
864 }
865
866 int
867 sys_signal(struct tcb *tcp)
868 {
869         if (entering(tcp)) {
870                 printsignal(tcp->u_arg[0]);
871                 tprints(", ");
872                 switch (tcp->u_arg[1]) {
873                 case (long) SIG_ERR:
874                         tprints("SIG_ERR");
875                         break;
876                 case (long) SIG_DFL:
877                         tprints("SIG_DFL");
878                         break;
879                 case (long) SIG_IGN:
880                         tprints("SIG_IGN");
881                         break;
882                 default:
883                         tprintf("%#lx", tcp->u_arg[1]);
884                 }
885                 return 0;
886         }
887         else if (!syserror(tcp)) {
888                 switch (tcp->u_rval) {
889                     case (long) SIG_ERR:
890                         tcp->auxstr = "SIG_ERR"; break;
891                     case (long) SIG_DFL:
892                         tcp->auxstr = "SIG_DFL"; break;
893                     case (long) SIG_IGN:
894                         tcp->auxstr = "SIG_IGN"; break;
895                     default:
896                         tcp->auxstr = NULL;
897                 }
898                 return RVAL_HEX | RVAL_STR;
899         }
900         return 0;
901 }
902
903
904 #endif /* HAVE_SIGACTION */
905
906
907 int
908 sys_sigreturn(struct tcb *tcp)
909 {
910 #if defined(ARM)
911         if (entering(tcp)) {
912                 struct pt_regs regs;
913                 struct sigcontext_struct sc;
914                 sigset_t sigm;
915                 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)&regs) == -1)
916                         return 0;
917                 if (umove(tcp, regs.ARM_sp, &sc) < 0)
918                         return 0;
919                 long_to_sigset(sc.oldmask, &sigm);
920                 tprints(sprintsigmask(") (mask ", &sigm, 0));
921         }
922         return 0;
923 #elif defined(S390) || defined(S390X)
924         if (entering(tcp)) {
925                 long usp;
926                 struct sigcontext_struct sc;
927                 if (upeek(tcp, PT_GPR15, &usp) < 0)
928                         return 0;
929                 if (umove(tcp, usp + __SIGNAL_FRAMESIZE, &sc) < 0)
930                         return 0;
931                 tprints(sprintsigmask(") (mask ", (sigset_t *)&sc.oldmask[0], 0));
932         }
933         return 0;
934 #elif defined(I386)
935         if (entering(tcp)) {
936                 struct sigcontext_struct sc;
937                 /* Note: on i386, sc is followed on stack by struct fpstate
938                  * and after it an additional u32 extramask[1] which holds
939                  * upper half of the mask. We can fetch it there
940                  * if/when we'd want to display the full mask...
941                  */
942                 sigset_t sigm;
943                 if (umove(tcp, i386_regs.esp, &sc) < 0)
944                         return 0;
945                 long_to_sigset(sc.oldmask, &sigm);
946                 tprints(sprintsigmask(") (mask ", &sigm, 0));
947         }
948         return 0;
949 #elif defined(IA64)
950         if (entering(tcp)) {
951                 struct sigcontext sc;
952                 long sp;
953                 sigset_t sigm;
954                 /* offset of sigcontext in the kernel's sigframe structure: */
955 #               define SIGFRAME_SC_OFFSET       0x90
956                 if (upeek(tcp, PT_R12, &sp) < 0)
957                         return 0;
958                 if (umove(tcp, sp + 16 + SIGFRAME_SC_OFFSET, &sc) < 0)
959                         return 0;
960                 sigemptyset(&sigm);
961                 memcpy(&sigm, &sc.sc_mask, NSIG / 8);
962                 tprints(sprintsigmask(") (mask ", &sigm, 0));
963         }
964         return 0;
965 #elif defined(POWERPC)
966         if (entering(tcp)) {
967                 long esp;
968                 struct sigcontext_struct sc;
969                 sigset_t sigm;
970                 if (upeek(tcp, sizeof(unsigned long) * PT_R1, &esp) < 0)
971                         return 0;
972                 /* Skip dummy stack frame. */
973 #ifdef POWERPC64
974                 if (current_personality == 0)
975                         esp += 128;
976                 else
977                         esp += 64;
978 #else
979                 esp += 64;
980 #endif
981                 if (umove(tcp, esp, &sc) < 0)
982                         return 0;
983                 long_to_sigset(sc.oldmask, &sigm);
984                 tprints(sprintsigmask(") (mask ", &sigm, 0));
985         }
986         return 0;
987 #elif defined(M68K)
988         if (entering(tcp)) {
989                 long usp;
990                 struct sigcontext sc;
991                 sigset_t sigm;
992                 if (upeek(tcp, 4*PT_USP, &usp) < 0)
993                         return 0;
994                 if (umove(tcp, usp, &sc) < 0)
995                         return 0;
996                 long_to_sigset(sc.sc_mask, &sigm);
997                 tprints(sprintsigmask(") (mask ", &sigm, 0));
998         }
999         return 0;
1000 #elif defined(ALPHA)
1001         if (entering(tcp)) {
1002                 long fp;
1003                 struct sigcontext_struct sc;
1004                 sigset_t sigm;
1005                 if (upeek(tcp, REG_FP, &fp) < 0)
1006                         return 0;
1007                 if (umove(tcp, fp, &sc) < 0)
1008                         return 0;
1009                 long_to_sigset(sc.sc_mask, &sigm);
1010                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1011         }
1012         return 0;
1013 #elif defined (SPARC) || defined (SPARC64)
1014         if (entering(tcp)) {
1015                 long i1;
1016                 struct pt_regs regs;
1017                 m_siginfo_t si;
1018                 sigset_t sigm;
1019                 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {
1020                         perror("sigreturn: PTRACE_GETREGS");
1021                         return 0;
1022                 }
1023                 i1 = regs.u_regs[U_REG_O1];
1024                 if (umove(tcp, i1, &si) < 0) {
1025                         perror("sigreturn: umove");
1026                         return 0;
1027                 }
1028                 long_to_sigset(si.si_mask, &sigm);
1029                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1030         }
1031         return 0;
1032 #elif defined (LINUX_MIPSN32) || defined (LINUX_MIPSN64)
1033         /* This decodes rt_sigreturn.  The 64-bit ABIs do not have
1034            sigreturn.  */
1035         if (entering(tcp)) {
1036                 long sp;
1037                 struct ucontext uc;
1038                 sigset_t sigm;
1039                 if (upeek(tcp, REG_SP, &sp) < 0)
1040                         return 0;
1041                 /* There are six words followed by a 128-byte siginfo.  */
1042                 sp = sp + 6 * 4 + 128;
1043                 if (umove(tcp, sp, &uc) < 0)
1044                         return 0;
1045                 long_to_sigset(*(long *) &uc.uc_sigmask, &sigm);
1046                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1047         }
1048         return 0;
1049 #elif defined(MIPS)
1050         if (entering(tcp)) {
1051                 long sp;
1052                 struct pt_regs regs;
1053                 m_siginfo_t si;
1054                 sigset_t sigm;
1055                 if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {
1056                         perror("sigreturn: PTRACE_GETREGS");
1057                         return 0;
1058                 }
1059                 sp = regs.regs[29];
1060                 if (umove(tcp, sp, &si) < 0)
1061                         return 0;
1062                 long_to_sigset(si.si_mask, &sigm);
1063                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1064         }
1065         return 0;
1066 #elif defined(CRISV10) || defined(CRISV32)
1067         if (entering(tcp)) {
1068                 struct sigcontext sc;
1069                 long regs[PT_MAX+1];
1070                 sigset_t sigm;
1071                 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
1072                         perror("sigreturn: PTRACE_GETREGS");
1073                         return 0;
1074                 }
1075                 if (umove(tcp, regs[PT_USP], &sc) < 0)
1076                         return 0;
1077                 long_to_sigset(sc.oldmask, &sigm);
1078                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1079         }
1080         return 0;
1081 #elif defined(TILE)
1082         if (entering(tcp)) {
1083                 struct ucontext uc;
1084                 long sp;
1085                 sigset_t sigm;
1086
1087                 /* offset of ucontext in the kernel's sigframe structure */
1088 #               define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(struct siginfo)
1089                 if (upeek(tcp, PTREGS_OFFSET_SP, &sp) < 0)
1090                         return 0;
1091                 if (umove(tcp, sp + SIGFRAME_UC_OFFSET, &uc) < 0)
1092                         return 0;
1093                 sigemptyset(&sigm);
1094                 memcpy(&sigm, &uc.uc_sigmask, NSIG / 8);
1095                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1096         }
1097         return 0;
1098 #elif defined(MICROBLAZE)
1099         /* TODO: Verify that this is correct...  */
1100         if (entering(tcp)) {
1101                 struct sigcontext sc;
1102                 long sp;
1103                 sigset_t sigm;
1104                 /* Read r1, the stack pointer.  */
1105                 if (upeek(tcp, 1 * 4, &sp) < 0)
1106                         return 0;
1107                 if (umove(tcp, sp, &sc) < 0)
1108                         return 0;
1109                 long_to_sigset(sc.oldmask, &sigm);
1110                 tprints(sprintsigmask(") (mask ", &sigm, 0));
1111         }
1112         return 0;
1113 #else
1114 #warning No sys_sigreturn() for this architecture
1115 #warning         (no problem, just a reminder :-)
1116         return 0;
1117 #endif
1118 }
1119
1120 int
1121 sys_siggetmask(struct tcb *tcp)
1122 {
1123         if (exiting(tcp)) {
1124                 sigset_t sigm;
1125                 long_to_sigset(tcp->u_rval, &sigm);
1126                 tcp->auxstr = sprintsigmask("mask ", &sigm, 0);
1127         }
1128         return RVAL_HEX | RVAL_STR;
1129 }
1130
1131 int
1132 sys_sigsuspend(struct tcb *tcp)
1133 {
1134         if (entering(tcp)) {
1135                 sigset_t sigm;
1136                 long_to_sigset(tcp->u_arg[2], &sigm);
1137                 printsigmask(&sigm, 0);
1138         }
1139         return 0;
1140 }
1141
1142
1143
1144 #if defined LINUX && !defined SS_ONSTACK
1145 #define SS_ONSTACK      1
1146 #define SS_DISABLE      2
1147 #if __GLIBC_MINOR__ == 0
1148 typedef struct
1149 {
1150         __ptr_t ss_sp;
1151         int ss_flags;
1152         size_t ss_size;
1153 } stack_t;
1154 #endif
1155 #endif
1156
1157 static const struct xlat sigaltstack_flags[] = {
1158         { SS_ONSTACK,   "SS_ONSTACK"    },
1159         { SS_DISABLE,   "SS_DISABLE"    },
1160         { 0,            NULL            },
1161 };
1162
1163
1164
1165 static int
1166 print_stack_t(struct tcb *tcp, unsigned long addr)
1167 {
1168         stack_t ss;
1169         if (umove(tcp, addr, &ss) < 0)
1170                 return -1;
1171         tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp);
1172         printflags(sigaltstack_flags, ss.ss_flags, "SS_???");
1173         tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size);
1174         return 0;
1175 }
1176
1177 int
1178 sys_sigaltstack(struct tcb *tcp)
1179 {
1180         if (entering(tcp)) {
1181                 if (tcp->u_arg[0] == 0)
1182                         tprints("NULL");
1183                 else if (print_stack_t(tcp, tcp->u_arg[0]) < 0)
1184                         return -1;
1185         }
1186         else {
1187                 tprints(", ");
1188                 if (tcp->u_arg[1] == 0)
1189                         tprints("NULL");
1190                 else if (print_stack_t(tcp, tcp->u_arg[1]) < 0)
1191                         return -1;
1192         }
1193         return 0;
1194 }
1195
1196 #ifdef HAVE_SIGACTION
1197
1198 int
1199 sys_sigprocmask(struct tcb *tcp)
1200 {
1201 #ifdef ALPHA
1202         if (entering(tcp)) {
1203                 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
1204                 tprints(", ");
1205                 printsigmask(tcp->u_arg[1], 0);
1206         }
1207         else if (!syserror(tcp)) {
1208                 tcp->auxstr = sprintsigmask("old mask ", tcp->u_rval, 0);
1209                 return RVAL_HEX | RVAL_STR;
1210         }
1211 #else /* !ALPHA */
1212         if (entering(tcp)) {
1213                 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
1214                 tprints(", ");
1215                 print_sigset(tcp, tcp->u_arg[1], 0);
1216                 tprints(", ");
1217         }
1218         else {
1219                 if (!tcp->u_arg[2])
1220                         tprints("NULL");
1221                 else if (syserror(tcp))
1222                         tprintf("%#lx", tcp->u_arg[2]);
1223                 else
1224                         print_sigset(tcp, tcp->u_arg[2], 0);
1225         }
1226 #endif /* !ALPHA */
1227         return 0;
1228 }
1229
1230 #endif /* HAVE_SIGACTION */
1231
1232 int
1233 sys_kill(struct tcb *tcp)
1234 {
1235         if (entering(tcp)) {
1236                 long pid = tcp->u_arg[0];
1237 #if SUPPORTED_PERSONALITIES > 1
1238                 /* Sign-extend a 32-bit value when that's what it is. */
1239                 if (personality_wordsize[current_personality] < sizeof pid)
1240                         pid = (long) (int) pid;
1241 #endif
1242                 tprintf("%ld, %s", pid, signame(tcp->u_arg[1]));
1243         }
1244         return 0;
1245 }
1246
1247
1248 int
1249 sys_tgkill(struct tcb *tcp)
1250 {
1251         if (entering(tcp)) {
1252                 tprintf("%ld, %ld, %s",
1253                         tcp->u_arg[0], tcp->u_arg[1], signame(tcp->u_arg[2]));
1254         }
1255         return 0;
1256 }
1257
1258 int
1259 sys_sigpending(struct tcb *tcp)
1260 {
1261         sigset_t sigset;
1262
1263         if (exiting(tcp)) {
1264                 if (syserror(tcp))
1265                         tprintf("%#lx", tcp->u_arg[0]);
1266                 else if (copy_sigset(tcp, tcp->u_arg[0], &sigset) < 0)
1267                         tprints("[?]");
1268                 else
1269                         printsigmask(&sigset, 0);
1270         }
1271         return 0;
1272 }
1273
1274
1275
1276 int
1277 sys_rt_sigprocmask(struct tcb *tcp)
1278 {
1279         sigset_t sigset;
1280
1281         /* Note: arg[3] is the length of the sigset. */
1282         if (entering(tcp)) {
1283                 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
1284                 tprints(", ");
1285                 if (!tcp->u_arg[1])
1286                         tprints("NULL, ");
1287                 else if (copy_sigset_len(tcp, tcp->u_arg[1], &sigset, tcp->u_arg[3]) < 0)
1288                         tprintf("%#lx, ", tcp->u_arg[1]);
1289                 else {
1290                         printsigmask(&sigset, 1);
1291                         tprints(", ");
1292                 }
1293         }
1294         else {
1295                 if (!tcp->u_arg[2])
1296                         tprints("NULL");
1297                 else if (syserror(tcp))
1298                         tprintf("%#lx", tcp->u_arg[2]);
1299                 else if (copy_sigset_len(tcp, tcp->u_arg[2], &sigset, tcp->u_arg[3]) < 0)
1300                         tprints("[?]");
1301                 else
1302                         printsigmask(&sigset, 1);
1303                 tprintf(", %lu", tcp->u_arg[3]);
1304         }
1305         return 0;
1306 }
1307
1308
1309 /* Structure describing the action to be taken when a signal arrives.  */
1310 struct new_sigaction
1311 {
1312         __sighandler_t __sa_handler;
1313         unsigned long sa_flags;
1314         void (*sa_restorer) (void);
1315         /* Kernel treats sa_mask as an array of longs. */
1316         unsigned long sa_mask[NSIG / sizeof(long) ? NSIG / sizeof(long) : 1];
1317 };
1318 /* Same for i386-on-x86_64 and similar cases */
1319 struct new_sigaction32
1320 {
1321         uint32_t __sa_handler;
1322         uint32_t sa_flags;
1323         uint32_t sa_restorer;
1324         uint32_t sa_mask[2 * (NSIG / sizeof(long) ? NSIG / sizeof(long) : 1)];
1325 };
1326
1327
1328 int
1329 sys_rt_sigaction(struct tcb *tcp)
1330 {
1331         struct new_sigaction sa;
1332         sigset_t sigset;
1333         long addr;
1334         int r;
1335
1336         if (entering(tcp)) {
1337                 printsignal(tcp->u_arg[0]);
1338                 tprints(", ");
1339                 addr = tcp->u_arg[1];
1340         } else
1341                 addr = tcp->u_arg[2];
1342
1343         if (addr == 0) {
1344                 tprints("NULL");
1345                 goto after_sa;
1346         }
1347         if (!verbose(tcp)) {
1348                 tprintf("%#lx", addr);
1349                 goto after_sa;
1350         }
1351 #if SUPPORTED_PERSONALITIES > 1
1352         if (personality_wordsize[current_personality] != sizeof(sa.sa_flags)
1353          && personality_wordsize[current_personality] == 4
1354         ) {
1355                 struct new_sigaction32 sa32;
1356                 r = umove(tcp, addr, &sa32);
1357                 if (r >= 0) {
1358                         memset(&sa, 0, sizeof(sa));
1359                         sa.__sa_handler = (void*)(unsigned long)sa32.__sa_handler;
1360                         sa.sa_flags     = sa32.sa_flags;
1361                         sa.sa_restorer  = (void*)(unsigned long)sa32.sa_restorer;
1362                         /* Kernel treats sa_mask as an array of longs.
1363                          * For 32-bit process, "long" is uint32_t, thus, for example,
1364                          * 32th bit in sa_mask will end up as bit 0 in sa_mask[1].
1365                          * But for (64-bit) kernel, 32th bit in sa_mask is
1366                          * 32th bit in 0th (64-bit) long!
1367                          * For little-endian, it's the same.
1368                          * For big-endian, we swap 32-bit words.
1369                          */
1370                         sa.sa_mask[0] = sa32.sa_mask[0] + ((long)(sa32.sa_mask[1]) << 32);
1371                 }
1372         } else
1373 #endif
1374         {
1375                 r = umove(tcp, addr, &sa);
1376         }
1377         if (r < 0) {
1378                 tprints("{...}");
1379                 goto after_sa;
1380         }
1381         /* Architectures using function pointers, like
1382          * hppa, may need to manipulate the function pointer
1383          * to compute the result of a comparison. However,
1384          * the SA_HANDLER function pointer exists only in
1385          * the address space of the traced process, and can't
1386          * be manipulated by strace. In order to prevent the
1387          * compiler from generating code to manipulate
1388          * SA_HANDLER we cast the function pointers to long. */
1389         if ((long)sa.__sa_handler == (long)SIG_ERR)
1390                 tprints("{SIG_ERR, ");
1391         else if ((long)sa.__sa_handler == (long)SIG_DFL)
1392                 tprints("{SIG_DFL, ");
1393         else if ((long)sa.__sa_handler == (long)SIG_IGN)
1394                 tprints("{SIG_IGN, ");
1395         else
1396                 tprintf("{%#lx, ", (long) sa.__sa_handler);
1397         /* Questionable code below.
1398          * Kernel won't handle sys_rt_sigaction
1399          * with wrong sigset size (just returns EINVAL)
1400          * therefore tcp->u_arg[3(4)] _must_ be NSIG / 8 here,
1401          * and we always use smaller memcpy. */
1402         sigemptyset(&sigset);
1403 #ifdef LINUXSPARC
1404         if (tcp->u_arg[4] <= sizeof(sigset))
1405                 memcpy(&sigset, &sa.sa_mask, tcp->u_arg[4]);
1406 #else
1407         if (tcp->u_arg[3] <= sizeof(sigset))
1408                 memcpy(&sigset, &sa.sa_mask, tcp->u_arg[3]);
1409 #endif
1410         else
1411                 memcpy(&sigset, &sa.sa_mask, sizeof(sigset));
1412         printsigmask(&sigset, 1);
1413         tprints(", ");
1414         printflags(sigact_flags, sa.sa_flags, "SA_???");
1415 #ifdef SA_RESTORER
1416         if (sa.sa_flags & SA_RESTORER)
1417                 tprintf(", %p", sa.sa_restorer);
1418 #endif
1419         tprints("}");
1420
1421  after_sa:
1422         if (entering(tcp))
1423                 tprints(", ");
1424         else
1425 #ifdef LINUXSPARC
1426                 tprintf(", %#lx, %lu", tcp->u_arg[3], tcp->u_arg[4]);
1427 #elif defined(ALPHA)
1428                 tprintf(", %lu, %#lx", tcp->u_arg[3], tcp->u_arg[4]);
1429 #else
1430                 tprintf(", %lu", tcp->u_arg[3]);
1431 #endif
1432         return 0;
1433 }
1434
1435 int
1436 sys_rt_sigpending(struct tcb *tcp)
1437 {
1438         sigset_t sigset;
1439
1440         if (exiting(tcp)) {
1441                 if (syserror(tcp))
1442                         tprintf("%#lx", tcp->u_arg[0]);
1443                 else if (copy_sigset_len(tcp, tcp->u_arg[0],
1444                                          &sigset, tcp->u_arg[1]) < 0)
1445                         tprints("[?]");
1446                 else
1447                         printsigmask(&sigset, 1);
1448         }
1449         return 0;
1450 }
1451
1452 int
1453 sys_rt_sigsuspend(struct tcb *tcp)
1454 {
1455         if (entering(tcp)) {
1456                 sigset_t sigm;
1457                 if (copy_sigset_len(tcp, tcp->u_arg[0], &sigm, tcp->u_arg[1]) < 0)
1458                         tprints("[?]");
1459                 else
1460                         printsigmask(&sigm, 1);
1461         }
1462         return 0;
1463 }
1464
1465 int
1466 sys_rt_sigqueueinfo(struct tcb *tcp)
1467 {
1468         if (entering(tcp)) {
1469                 siginfo_t si;
1470                 tprintf("%lu, ", tcp->u_arg[0]);
1471                 printsignal(tcp->u_arg[1]);
1472                 tprints(", ");
1473                 if (umove(tcp, tcp->u_arg[2], &si) < 0)
1474                         tprintf("%#lx", tcp->u_arg[2]);
1475                 else
1476                         printsiginfo(&si, verbose(tcp));
1477         }
1478         return 0;
1479 }
1480
1481 int sys_rt_sigtimedwait(struct tcb *tcp)
1482 {
1483         if (entering(tcp)) {
1484                 sigset_t sigset;
1485
1486                 if (copy_sigset_len(tcp, tcp->u_arg[0],
1487                                     &sigset, tcp->u_arg[3]) < 0)
1488                         tprints("[?]");
1489                 else
1490                         printsigmask(&sigset, 1);
1491                 tprints(", ");
1492                 /* This is the only "return" parameter, */
1493                 if (tcp->u_arg[1] != 0)
1494                         return 0;
1495                 /* ... if it's NULL, can decode all on entry */
1496                 tprints("NULL, ");
1497         }
1498         else if (tcp->u_arg[1] != 0) {
1499                 /* syscall exit, and u_arg[1] wasn't NULL */
1500                 if (syserror(tcp))
1501                         tprintf("%#lx, ", tcp->u_arg[1]);
1502                 else {
1503                         siginfo_t si;
1504                         if (umove(tcp, tcp->u_arg[1], &si) < 0)
1505                                 tprintf("%#lx, ", tcp->u_arg[1]);
1506                         else {
1507                                 printsiginfo(&si, verbose(tcp));
1508                                 tprints(", ");
1509                         }
1510                 }
1511         }
1512         else {
1513                 /* syscall exit, and u_arg[1] was NULL */
1514                 return 0;
1515         }
1516         print_timespec(tcp, tcp->u_arg[2]);
1517         tprintf(", %d", (int) tcp->u_arg[3]);
1518         return 0;
1519 };
1520
1521 int
1522 sys_restart_syscall(struct tcb *tcp)
1523 {
1524         if (entering(tcp))
1525                 tprints("<... resuming interrupted call ...>");
1526         return 0;
1527 }
1528
1529 static int
1530 do_signalfd(struct tcb *tcp, int flags_arg)
1531 {
1532         if (entering(tcp)) {
1533                 printfd(tcp, tcp->u_arg[0]);
1534                 tprints(", ");
1535                 print_sigset(tcp, tcp->u_arg[1], 1);
1536                 tprintf(", %lu", tcp->u_arg[2]);
1537                 if (flags_arg >= 0) {
1538                         tprints(", ");
1539                         printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
1540                 }
1541         }
1542         return 0;
1543 }
1544
1545 int
1546 sys_signalfd(struct tcb *tcp)
1547 {
1548         return do_signalfd(tcp, -1);
1549 }
1550
1551 int
1552 sys_signalfd4(struct tcb *tcp)
1553 {
1554         return do_signalfd(tcp, 3);
1555 }