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