• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef HAVE_ANDROID_OS
41 #include <sys/user.h>
42 #endif
43 #include <fcntl.h>
44 
45 #ifdef HAVE_ANDROID_OS
46 //FIXME use "sigprocmask" or something
47 #define sigmask(sig)    (1UL << ((sig) - 1))
48 #define sigcontext_struct sigcontext
49 #endif
50 
51 #ifdef SVR4
52 #include <sys/ucontext.h>
53 #endif /* SVR4 */
54 
55 #ifdef HAVE_SYS_REG_H
56 # include <sys/reg.h>
57 #ifndef PTRACE_PEEKUSR
58 # define PTRACE_PEEKUSR PTRACE_PEEKUSER
59 #endif
60 #ifndef PTRACE_POKEUSR
61 # define PTRACE_POKEUSR PTRACE_POKEUSER
62 #endif
63 #elif defined(HAVE_LINUX_PTRACE_H)
64 #undef PTRACE_SYSCALL
65 # ifdef HAVE_STRUCT_IA64_FPREG
66 #  define ia64_fpreg XXX_ia64_fpreg
67 # endif
68 # ifdef HAVE_STRUCT_PT_ALL_USER_REGS
69 #  define pt_all_user_regs XXX_pt_all_user_regs
70 # endif
71 #include <linux/ptrace.h>
72 # undef ia64_fpreg
73 # undef pt_all_user_regs
74 #endif
75 
76 
77 #ifdef LINUX
78 
79 #ifdef IA64
80 # include <asm/ptrace_offsets.h>
81 #endif /* !IA64 */
82 
83 #if defined (LINUX) && defined (SPARC64)
84 # undef PTRACE_GETREGS
85 # define PTRACE_GETREGS PTRACE_GETREGS64
86 # undef PTRACE_SETREGS
87 # define PTRACE_SETREGS PTRACE_SETREGS64
88 #endif /* LINUX && SPARC64 */
89 
90 #if defined (SPARC) || defined (SPARC64) || defined (MIPS)
91 typedef struct {
92 	struct pt_regs		si_regs;
93 	int			si_mask;
94 } m_siginfo_t;
95 #elif defined HAVE_ASM_SIGCONTEXT_H
96 #if !defined(IA64) && !defined(X86_64)
97 #include <asm/sigcontext.h>
98 #endif /* !IA64 && !X86_64 */
99 #else /* !HAVE_ASM_SIGCONTEXT_H */
100 #if defined I386 && !defined HAVE_STRUCT_SIGCONTEXT_STRUCT
101 struct sigcontext_struct {
102 	unsigned short gs, __gsh;
103 	unsigned short fs, __fsh;
104 	unsigned short es, __esh;
105 	unsigned short ds, __dsh;
106 	unsigned long edi;
107 	unsigned long esi;
108 	unsigned long ebp;
109 	unsigned long esp;
110 	unsigned long ebx;
111 	unsigned long edx;
112 	unsigned long ecx;
113 	unsigned long eax;
114 	unsigned long trapno;
115 	unsigned long err;
116 	unsigned long eip;
117 	unsigned short cs, __csh;
118 	unsigned long eflags;
119 	unsigned long esp_at_signal;
120 	unsigned short ss, __ssh;
121 	unsigned long i387;
122 	unsigned long oldmask;
123 	unsigned long cr2;
124 };
125 #else /* !I386 */
126 #if defined M68K && !defined HAVE_STRUCT_SIGCONTEXT
127 struct sigcontext
128 {
129 	unsigned long sc_mask;
130 	unsigned long sc_usp;
131 	unsigned long sc_d0;
132 	unsigned long sc_d1;
133 	unsigned long sc_a0;
134 	unsigned long sc_a1;
135 	unsigned short sc_sr;
136 	unsigned long sc_pc;
137 	unsigned short sc_formatvec;
138 };
139 #endif /* M68K */
140 #endif /* !I386 */
141 #endif /* !HAVE_ASM_SIGCONTEXT_H */
142 #ifndef NSIG
143 #define NSIG 32
144 #endif
145 #ifdef ARM
146 #undef NSIG
147 #define NSIG 32
148 #endif
149 #endif /* LINUX */
150 
151 const char *const signalent0[] = {
152 #include "signalent.h"
153 };
154 const int nsignals0 = sizeof signalent0 / sizeof signalent0[0];
155 
156 #if SUPPORTED_PERSONALITIES >= 2
157 const char *const signalent1[] = {
158 #include "signalent1.h"
159 };
160 const int nsignals1 = sizeof signalent1 / sizeof signalent1[0];
161 #endif /* SUPPORTED_PERSONALITIES >= 2 */
162 
163 #if SUPPORTED_PERSONALITIES >= 3
164 const char *const signalent2[] = {
165 #include "signalent2.h"
166 };
167 const int nsignals2 = sizeof signalent2 / sizeof signalent2[0];
168 #endif /* SUPPORTED_PERSONALITIES >= 3 */
169 
170 const char *const *signalent;
171 int nsignals;
172 
173 #if defined(SUNOS4) || defined(FREEBSD)
174 
175 static const struct xlat sigvec_flags[] = {
176 	{ SV_ONSTACK,	"SV_ONSTACK"	},
177 	{ SV_INTERRUPT,	"SV_INTERRUPT"	},
178 	{ SV_RESETHAND,	"SV_RESETHAND"	},
179 	{ SA_NOCLDSTOP,	"SA_NOCLDSTOP"	},
180 	{ 0,		NULL		},
181 };
182 
183 #endif /* SUNOS4 || FREEBSD */
184 
185 #ifdef HAVE_SIGACTION
186 
187 #if defined LINUX && (defined I386 || defined X86_64)
188 /* The libc headers do not define this constant since it should only be
189    used by the implementation.  So wwe define it here.  */
190 # ifndef SA_RESTORER
191 #  define SA_RESTORER 0x04000000
192 # endif
193 #endif
194 
195 static const struct xlat sigact_flags[] = {
196 #ifdef SA_RESTORER
197 	{ SA_RESTORER,	"SA_RESTORER"	},
198 #endif
199 #ifdef SA_STACK
200 	{ SA_STACK,	"SA_STACK"	},
201 #endif
202 #ifdef SA_RESTART
203 	{ SA_RESTART,	"SA_RESTART"	},
204 #endif
205 #ifdef SA_INTERRUPT
206 	{ SA_INTERRUPT,	"SA_INTERRUPT"	},
207 #endif
208 #ifdef SA_NODEFER
209 	{ SA_NODEFER,	"SA_NODEFER"	},
210 #endif
211 #if defined SA_NOMASK && SA_NODEFER != SA_NOMASK
212 	{ SA_NOMASK,	"SA_NOMASK"	},
213 #endif
214 #ifdef SA_RESETHAND
215 	{ SA_RESETHAND,	"SA_RESETHAND"	},
216 #endif
217 #if defined SA_ONESHOT && SA_ONESHOT != SA_RESETHAND
218 	{ SA_ONESHOT,	"SA_ONESHOT"	},
219 #endif
220 #ifdef SA_SIGINFO
221 	{ SA_SIGINFO,	"SA_SIGINFO"	},
222 #endif
223 #ifdef SA_RESETHAND
224 	{ SA_RESETHAND,	"SA_RESETHAND"	},
225 #endif
226 #ifdef SA_ONSTACK
227 	{ SA_ONSTACK,	"SA_ONSTACK"	},
228 #endif
229 #ifdef SA_NODEFER
230 	{ SA_NODEFER,	"SA_NODEFER"	},
231 #endif
232 #ifdef SA_NOCLDSTOP
233 	{ SA_NOCLDSTOP,	"SA_NOCLDSTOP"	},
234 #endif
235 #ifdef SA_NOCLDWAIT
236 	{ SA_NOCLDWAIT,	"SA_NOCLDWAIT"	},
237 #endif
238 #ifdef _SA_BSDCALL
239 	{ _SA_BSDCALL,	"_SA_BSDCALL"	},
240 #endif
241 #ifdef SA_NOPTRACE
242 	{ SA_NOPTRACE,	"SA_NOPTRACE"	},
243 #endif
244 	{ 0,		NULL		},
245 };
246 
247 static const struct xlat sigprocmaskcmds[] = {
248 	{ SIG_BLOCK,	"SIG_BLOCK"	},
249 	{ SIG_UNBLOCK,	"SIG_UNBLOCK"	},
250 	{ SIG_SETMASK,	"SIG_SETMASK"	},
251 #ifdef SIG_SETMASK32
252 	{ SIG_SETMASK32,"SIG_SETMASK32"	},
253 #endif
254 	{ 0,		NULL		},
255 };
256 
257 #endif /* HAVE_SIGACTION */
258 
259 /* Anonymous realtime signals. */
260 /* Under glibc 2.1, SIGRTMIN et al are functions, but __SIGRTMIN is a
261    constant.  This is what we want.  Otherwise, just use SIGRTMIN. */
262 #ifdef SIGRTMIN
263 #ifndef __SIGRTMIN
264 #define __SIGRTMIN SIGRTMIN
265 #define __SIGRTMAX SIGRTMAX /* likewise */
266 #endif
267 #endif
268 
269 const char *
signame(sig)270 signame(sig)
271 int sig;
272 {
273 	static char buf[30];
274 	if (sig >= 0 && sig < nsignals) {
275 		return signalent[sig];
276 #ifdef SIGRTMIN
277 	} else if (sig >= __SIGRTMIN && sig <= __SIGRTMAX) {
278 		sprintf(buf, "SIGRT_%ld", (long)(sig - __SIGRTMIN));
279 		return buf;
280 #endif /* SIGRTMIN */
281 	} else {
282 		sprintf(buf, "%d", sig);
283 		return buf;
284 	}
285 }
286 
287 #ifndef UNIXWARE
288 static void
long_to_sigset(l,s)289 long_to_sigset(l, s)
290 long l;
291 sigset_t *s;
292 {
293 	sigemptyset(s);
294 	*(long *)s = l;
295 }
296 #endif
297 
298 static int
copy_sigset_len(tcp,addr,s,len)299 copy_sigset_len(tcp, addr, s, len)
300 struct tcb *tcp;
301 long addr;
302 sigset_t *s;
303 int len;
304 {
305 	if (len > sizeof(*s))
306 		len = sizeof(*s);
307 	sigemptyset(s);
308 	if (umoven(tcp, addr, len, (char *)s) < 0)
309 		return -1;
310 	return 0;
311 }
312 
313 #ifdef LINUX
314 /* Original sigset is unsigned long */
315 #define copy_sigset(tcp, addr, s) copy_sigset_len(tcp, addr, s, sizeof(long))
316 #else
317 #define copy_sigset(tcp, addr, s) copy_sigset_len(tcp, addr, s, sizeof(sigset_t))
318 #endif
319 
320 static const char *
sprintsigmask(const char * str,sigset_t * mask,int rt)321 sprintsigmask(const char *str, sigset_t *mask, int rt)
322 /* set might include realtime sigs */
323 {
324 	int i, nsigs;
325 	int maxsigs;
326 	const char *format;
327 	char *s;
328 	static char outstr[8 * sizeof(sigset_t) * 8];
329 
330 	strcpy(outstr, str);
331 	s = outstr + strlen(outstr);
332 	nsigs = 0;
333 	maxsigs = nsignals;
334 #ifdef __SIGRTMAX
335 	if (rt)
336 		maxsigs = __SIGRTMAX; /* instead */
337 #endif
338 	for (i = 1; i < maxsigs; i++) {
339 		if (sigismember(mask, i) == 1)
340 			nsigs++;
341 	}
342 	if (nsigs >= nsignals * 2 / 3) {
343 		*s++ = '~';
344 		for (i = 1; i < maxsigs; i++) {
345 			switch (sigismember(mask, i)) {
346 			case 1:
347 				sigdelset(mask, i);
348 				break;
349 			case 0:
350 				sigaddset(mask, i);
351 				break;
352 			}
353 		}
354 	}
355 	format = "%s";
356 	*s++ = '[';
357 	for (i = 1; i < maxsigs; i++) {
358 		if (sigismember(mask, i) == 1) {
359 			/* real-time signals on solaris don't have
360 			 * signalent entries
361 			 */
362 			if (i < nsignals) {
363 				sprintf(s, format, signalent[i] + 3);
364 			}
365 #ifdef SIGRTMIN
366 			else if (i >= __SIGRTMIN && i <= __SIGRTMAX) {
367 				char tsig[40];
368 				sprintf(tsig, "RT_%u", i - __SIGRTMIN);
369 				sprintf(s, format, tsig);
370 			}
371 #endif /* SIGRTMIN */
372 			else {
373 				char tsig[32];
374 				sprintf(tsig, "%u", i);
375 				sprintf(s, format, tsig);
376 			}
377 			s += strlen(s);
378 			format = " %s";
379 		}
380 	}
381 	*s++ = ']';
382 	*s = '\0';
383 	return outstr;
384 }
385 
386 static void
printsigmask(mask,rt)387 printsigmask(mask, rt)
388 sigset_t *mask;
389 int rt;
390 {
391 	tprintf("%s", sprintsigmask("", mask, rt));
392 }
393 
394 void
printsignal(nr)395 printsignal(nr)
396 int nr;
397 {
398 	tprintf("%s", signame(nr));
399 }
400 
401 void
print_sigset(struct tcb * tcp,long addr,int rt)402 print_sigset(struct tcb *tcp, long addr, int rt)
403 {
404 	sigset_t ss;
405 
406 	if (!addr)
407 		tprintf("NULL");
408 	else if (copy_sigset(tcp, addr, &ss) < 0)
409 		tprintf("%#lx", addr);
410 	else
411 		printsigmask(&ss, rt);
412 }
413 
414 #ifdef LINUX
415 
416 #ifndef ILL_ILLOPC
417 #define ILL_ILLOPC      1       /* illegal opcode */
418 #define ILL_ILLOPN      2       /* illegal operand */
419 #define ILL_ILLADR      3       /* illegal addressing mode */
420 #define ILL_ILLTRP      4       /* illegal trap */
421 #define ILL_PRVOPC      5       /* privileged opcode */
422 #define ILL_PRVREG      6       /* privileged register */
423 #define ILL_COPROC      7       /* coprocessor error */
424 #define ILL_BADSTK      8       /* internal stack error */
425 #define FPE_INTDIV      1       /* integer divide by zero */
426 #define FPE_INTOVF      2       /* integer overflow */
427 #define FPE_FLTDIV      3       /* floating point divide by zero */
428 #define FPE_FLTOVF      4       /* floating point overflow */
429 #define FPE_FLTUND      5       /* floating point underflow */
430 #define FPE_FLTRES      6       /* floating point inexact result */
431 #define FPE_FLTINV      7       /* floating point invalid operation */
432 #define FPE_FLTSUB      8       /* subscript out of range */
433 #define SEGV_MAPERR     1       /* address not mapped to object */
434 #define SEGV_ACCERR     2       /* invalid permissions for mapped object */
435 #define BUS_ADRALN      1       /* invalid address alignment */
436 #define BUS_ADRERR      2       /* non-existant physical address */
437 #define BUS_OBJERR      3       /* object specific hardware error */
438 #define TRAP_BRKPT      1       /* process breakpoint */
439 #define TRAP_TRACE      2       /* process trace trap */
440 #define CLD_EXITED      1       /* child has exited */
441 #define CLD_KILLED      2       /* child was killed */
442 #define CLD_DUMPED      3       /* child terminated abnormally */
443 #define CLD_TRAPPED     4       /* traced child has trapped */
444 #define CLD_STOPPED     5       /* child has stopped */
445 #define CLD_CONTINUED   6       /* stopped child has continued */
446 #define POLL_IN         1       /* data input available */
447 #define POLL_OUT        2       /* output buffers available */
448 #define POLL_MSG        3       /* input message available */
449 #define POLL_ERR        4       /* i/o error */
450 #define POLL_PRI        5       /* high priority input available */
451 #define POLL_HUP        6       /* device disconnected */
452 #define SI_KERNEL	0x80	/* sent by kernel */
453 #define SI_USER         0       /* sent by kill, sigsend, raise */
454 #define SI_QUEUE        -1      /* sent by sigqueue */
455 #define SI_TIMER        -2      /* sent by timer expiration */
456 #define SI_MESGQ        -3      /* sent by real time mesq state change */
457 #define SI_ASYNCIO      -4      /* sent by AIO completion */
458 #define SI_SIGIO	-5	/* sent by SIGIO */
459 #define SI_TKILL	-6	/* sent by tkill */
460 #define SI_ASYNCNL	-60     /* sent by asynch name lookup completion */
461 
462 #define SI_FROMUSER(sip)	((sip)->si_code <= 0)
463 
464 #endif /* LINUX */
465 
466 #if __GLIBC_MINOR__ < 1 && !defined(HAVE_ANDROID_OS)
467 /* Type for data associated with a signal.  */
468 typedef union sigval
469 {
470 	int sival_int;
471 	void *sival_ptr;
472 } sigval_t;
473 
474 # define __SI_MAX_SIZE     128
475 # define __SI_PAD_SIZE     ((__SI_MAX_SIZE / sizeof (int)) - 3)
476 
477 typedef struct siginfo
478 {
479 	int si_signo;               /* Signal number.  */
480 	int si_errno;               /* If non-zero, an errno value associated with
481 								   this signal, as defined in <errno.h>.  */
482 	int si_code;                /* Signal code.  */
483 
484 	union
485 	{
486 		int _pad[__SI_PAD_SIZE];
487 
488 		/* kill().  */
489 		struct
490 		{
491 			__pid_t si_pid;     /* Sending process ID.  */
492 			__uid_t si_uid;     /* Real user ID of sending process.  */
493 		} _kill;
494 
495 		/* POSIX.1b timers.  */
496 		struct
497 		{
498 			unsigned int _timer1;
499 			unsigned int _timer2;
500 		} _timer;
501 
502 		/* POSIX.1b signals.  */
503 		struct
504 		{
505 			__pid_t si_pid;     /* Sending process ID.  */
506 			__uid_t si_uid;     /* Real user ID of sending process.  */
507 			sigval_t si_sigval; /* Signal value.  */
508 		} _rt;
509 
510 		/* SIGCHLD.  */
511 		struct
512 		{
513 			__pid_t si_pid;     /* Which child.  */
514 			int si_status;      /* Exit value or signal.  */
515 			__clock_t si_utime;
516 			__clock_t si_stime;
517 		} _sigchld;
518 
519 		/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
520 		struct
521 		{
522 			void *si_addr;      /* Faulting insn/memory ref.  */
523 		} _sigfault;
524 
525 		/* SIGPOLL.  */
526 		struct
527 		{
528 			int si_band;        /* Band event for SIGPOLL.  */
529 			int si_fd;
530 		} _sigpoll;
531 	} _sifields;
532 } siginfo_t;
533 
534 #define si_pid		_sifields._kill.si_pid
535 #define si_uid		_sifields._kill.si_uid
536 #define si_status	_sifields._sigchld.si_status
537 #define si_utime	_sifields._sigchld.si_utime
538 #define si_stime	_sifields._sigchld.si_stime
539 #define si_value	_sifields._rt.si_sigval
540 #define si_int		_sifields._rt.si_sigval.sival_int
541 #define si_ptr		_sifields._rt.si_sigval.sival_ptr
542 #define si_addr		_sifields._sigfault.si_addr
543 #define si_band		_sifields._sigpoll.si_band
544 #define si_fd		_sifields._sigpoll.si_fd
545 
546 #endif
547 
548 #endif
549 
550 #if defined (SVR4) || defined (LINUX)
551 
552 static const struct xlat siginfo_codes[] = {
553 #ifdef SI_KERNEL
554 	{ SI_KERNEL,	"SI_KERNEL"	},
555 #endif
556 #ifdef SI_USER
557 	{ SI_USER,	"SI_USER"	},
558 #endif
559 #ifdef SI_QUEUE
560 	{ SI_QUEUE,	"SI_QUEUE"	},
561 #endif
562 #ifdef SI_TIMER
563 	{ SI_TIMER,	"SI_TIMER"	},
564 #endif
565 #ifdef SI_MESGQ
566 	{ SI_MESGQ,	"SI_MESGQ"	},
567 #endif
568 #ifdef SI_ASYNCIO
569 	{ SI_ASYNCIO,	"SI_ASYNCIO"	},
570 #endif
571 #ifdef SI_SIGIO
572 	{ SI_SIGIO,	"SI_SIGIO"	},
573 #endif
574 #ifdef SI_TKILL
575 	{ SI_TKILL,	"SI_TKILL"	},
576 #endif
577 #ifdef SI_ASYNCNL
578 	{ SI_ASYNCNL,	"SI_ASYNCNL"	},
579 #endif
580 #ifdef SI_NOINFO
581 	{ SI_NOINFO,	"SI_NOINFO"	},
582 #endif
583 #ifdef SI_LWP
584 	{ SI_LWP,	"SI_LWP"	},
585 #endif
586 	{ 0,		NULL		},
587 };
588 
589 static const struct xlat sigill_codes[] = {
590 	{ ILL_ILLOPC,	"ILL_ILLOPC"	},
591 	{ ILL_ILLOPN,	"ILL_ILLOPN"	},
592 	{ ILL_ILLADR,	"ILL_ILLADR"	},
593 	{ ILL_ILLTRP,	"ILL_ILLTRP"	},
594 	{ ILL_PRVOPC,	"ILL_PRVOPC"	},
595 	{ ILL_PRVREG,	"ILL_PRVREG"	},
596 	{ ILL_COPROC,	"ILL_COPROC"	},
597 	{ ILL_BADSTK,	"ILL_BADSTK"	},
598 	{ 0,		NULL		},
599 };
600 
601 static const struct xlat sigfpe_codes[] = {
602 	{ FPE_INTDIV,	"FPE_INTDIV"	},
603 	{ FPE_INTOVF,	"FPE_INTOVF"	},
604 	{ FPE_FLTDIV,	"FPE_FLTDIV"	},
605 	{ FPE_FLTOVF,	"FPE_FLTOVF"	},
606 	{ FPE_FLTUND,	"FPE_FLTUND"	},
607 	{ FPE_FLTRES,	"FPE_FLTRES"	},
608 	{ FPE_FLTINV,	"FPE_FLTINV"	},
609 	{ FPE_FLTSUB,	"FPE_FLTSUB"	},
610 	{ 0,		NULL		},
611 };
612 
613 static const struct xlat sigtrap_codes[] = {
614 	{ TRAP_BRKPT,	"TRAP_BRKPT"	},
615 	{ TRAP_TRACE,	"TRAP_TRACE"	},
616 	{ 0,		NULL		},
617 };
618 
619 static const struct xlat sigchld_codes[] = {
620 	{ CLD_EXITED,	"CLD_EXITED"	},
621 	{ CLD_KILLED,	"CLD_KILLED"	},
622 	{ CLD_DUMPED,	"CLD_DUMPED"	},
623 	{ CLD_TRAPPED,	"CLD_TRAPPED"	},
624 	{ CLD_STOPPED,	"CLD_STOPPED"	},
625 	{ CLD_CONTINUED,"CLD_CONTINUED"	},
626 	{ 0,		NULL		},
627 };
628 
629 static const struct xlat sigpoll_codes[] = {
630 	{ POLL_IN,	"POLL_IN"	},
631 	{ POLL_OUT,	"POLL_OUT"	},
632 	{ POLL_MSG,	"POLL_MSG"	},
633 	{ POLL_ERR,	"POLL_ERR"	},
634 	{ POLL_PRI,	"POLL_PRI"	},
635 	{ POLL_HUP,	"POLL_HUP"	},
636 	{ 0,		NULL		},
637 };
638 
639 static const struct xlat sigprof_codes[] = {
640 #ifdef PROF_SIG
641 	{ PROF_SIG,	"PROF_SIG"	},
642 #endif
643 	{ 0,		NULL		},
644 };
645 
646 #ifdef SIGEMT
647 static const struct xlat sigemt_codes[] = {
648 #ifdef EMT_TAGOVF
649 	{ EMT_TAGOVF,	"EMT_TAGOVF"	},
650 #endif
651 	{ 0,		NULL		},
652 };
653 #endif
654 
655 static const struct xlat sigsegv_codes[] = {
656 	{ SEGV_MAPERR,	"SEGV_MAPERR"	},
657 	{ SEGV_ACCERR,	"SEGV_ACCERR"	},
658 	{ 0,		NULL		},
659 };
660 
661 static const struct xlat sigbus_codes[] = {
662 	{ BUS_ADRALN,	"BUS_ADRALN"	},
663 	{ BUS_ADRERR,	"BUS_ADRERR"	},
664 	{ BUS_OBJERR,	"BUS_OBJERR"	},
665 	{ 0,		NULL		},
666 };
667 
668 void
printsiginfo(siginfo_t * sip,int verbose)669 printsiginfo(siginfo_t *sip, int verbose)
670 {
671 	const char *code;
672 
673 	if (sip->si_signo == 0) {
674 		tprintf ("{}");
675 		return;
676 	}
677 	tprintf("{si_signo=");
678 	printsignal(sip->si_signo);
679 	code = xlookup(siginfo_codes, sip->si_code);
680 	if (!code) {
681 		switch (sip->si_signo) {
682 		case SIGTRAP:
683 			code = xlookup(sigtrap_codes, sip->si_code);
684 			break;
685 		case SIGCHLD:
686 			code = xlookup(sigchld_codes, sip->si_code);
687 			break;
688 		case SIGPOLL:
689 			code = xlookup(sigpoll_codes, sip->si_code);
690 			break;
691 		case SIGPROF:
692 			code = xlookup(sigprof_codes, sip->si_code);
693 			break;
694 		case SIGILL:
695 			code = xlookup(sigill_codes, sip->si_code);
696 			break;
697 #ifdef SIGEMT
698 		case SIGEMT:
699 			code = xlookup(sigemt_codes, sip->si_code);
700 			break;
701 #endif
702 		case SIGFPE:
703 			code = xlookup(sigfpe_codes, sip->si_code);
704 			break;
705 		case SIGSEGV:
706 			code = xlookup(sigsegv_codes, sip->si_code);
707 			break;
708 		case SIGBUS:
709 			code = xlookup(sigbus_codes, sip->si_code);
710 			break;
711 		}
712 	}
713 	if (code)
714 		tprintf(", si_code=%s", code);
715 	else
716 		tprintf(", si_code=%#x", sip->si_code);
717 #ifdef SI_NOINFO
718 	if (sip->si_code != SI_NOINFO)
719 #endif
720 	{
721 		if (sip->si_errno) {
722 			if (sip->si_errno < 0 || sip->si_errno >= nerrnos)
723 				tprintf(", si_errno=%d", sip->si_errno);
724 			else
725 				tprintf(", si_errno=%s",
726 					errnoent[sip->si_errno]);
727 		}
728 #ifdef SI_FROMUSER
729 		if (SI_FROMUSER(sip)) {
730 			tprintf(", si_pid=%lu, si_uid=%lu",
731 				(unsigned long) sip->si_pid,
732 				(unsigned long) sip->si_uid);
733 			switch (sip->si_code) {
734 #ifdef SI_USER
735 			case SI_USER:
736 				break;
737 #endif
738 #ifdef SI_TKILL
739 			case SI_TKILL:
740 				break;
741 #endif
742 #ifdef SI_TIMER
743 			case SI_TIMER:
744 				tprintf(", si_value=%d", sip->si_int);
745 				break;
746 #endif
747 #ifdef LINUX
748 			default:
749 				if (!sip->si_ptr)
750 					break;
751 				if (!verbose)
752 					tprintf(", ...");
753 				else
754 					tprintf(", si_value={int=%u, ptr=%#lx}",
755 						sip->si_int,
756 						(unsigned long) sip->si_ptr);
757 				break;
758 #endif
759 			}
760 		}
761 		else
762 #endif /* SI_FROMUSER */
763 		{
764 			switch (sip->si_signo) {
765 			case SIGCHLD:
766 				tprintf(", si_pid=%ld, si_status=",
767 					(long) sip->si_pid);
768 				if (sip->si_code == CLD_EXITED)
769 					tprintf("%d", sip->si_status);
770 				else
771 					printsignal(sip->si_status);
772 #if LINUX
773 				if (!verbose)
774 					tprintf(", ...");
775 				else
776 					tprintf(", si_utime=%lu, si_stime=%lu",
777 						sip->si_utime,
778 						sip->si_stime);
779 #endif
780 				break;
781 			case SIGILL: case SIGFPE:
782 			case SIGSEGV: case SIGBUS:
783 				tprintf(", si_addr=%#lx",
784 					(unsigned long) sip->si_addr);
785 				break;
786 			case SIGPOLL:
787 				switch (sip->si_code) {
788 				case POLL_IN: case POLL_OUT: case POLL_MSG:
789 					tprintf(", si_band=%ld",
790 						(long) sip->si_band);
791 					break;
792 				}
793 				break;
794 #ifdef LINUX
795 			default:
796 				if (sip->si_pid || sip->si_uid)
797 				        tprintf(", si_pid=%lu, si_uid=%lu",
798 						(unsigned long) sip->si_pid,
799 						(unsigned long) sip->si_uid);
800 				if (!sip->si_ptr)
801 					break;
802 				if (!verbose)
803 					tprintf(", ...");
804 				else {
805 					tprintf(", si_value={int=%u, ptr=%#lx}",
806 						sip->si_int,
807 						(unsigned long) sip->si_ptr);
808 				}
809 #endif
810 
811 			}
812 		}
813 	}
814 	tprintf("}");
815 }
816 
817 #endif /* SVR4 || LINUX */
818 
819 #ifdef LINUX
820 
821 static void
parse_sigset_t(const char * str,sigset_t * set)822 parse_sigset_t(const char *str, sigset_t *set)
823 {
824 	const char *p;
825 	unsigned int digit;
826 	int i;
827 
828 	sigemptyset(set);
829 
830 	p = strchr(str, '\n');
831 	if (p == NULL)
832 		p = strchr(str, '\0');
833 	for (i = 0; p-- > str; i += 4) {
834 		if (*p >= '0' && *p <= '9')
835 			digit = *p - '0';
836 		else if (*p >= 'a' && *p <= 'f')
837 			digit = *p - 'a' + 10;
838 		else if (*p >= 'A' && *p <= 'F')
839 			digit = *p - 'A' + 10;
840 		else
841 			break;
842 		if (digit & 1)
843 			sigaddset(set, i + 1);
844 		if (digit & 2)
845 			sigaddset(set, i + 2);
846 		if (digit & 4)
847 			sigaddset(set, i + 3);
848 		if (digit & 8)
849 			sigaddset(set, i + 4);
850 	}
851 }
852 
853 #endif
854 
855 /*
856  * Check process TCP for the disposition of signal SIG.
857  * Return 1 if the process would somehow manage to  survive signal SIG,
858  * else return 0.  This routine will never be called with SIGKILL.
859  */
860 int
sigishandled(tcp,sig)861 sigishandled(tcp, sig)
862 struct tcb *tcp;
863 int sig;
864 {
865 #ifdef LINUX
866 	int sfd;
867 	char sname[32];
868 	char buf[2048];
869 	const char *s;
870 	int i;
871 	sigset_t ignored, caught;
872 #endif
873 #ifdef SVR4
874 	/*
875 	 * Since procfs doesn't interfere with wait I think it is safe
876 	 * to punt on this question.  If not, the information is there.
877 	 */
878 	return 1;
879 #else /* !SVR4 */
880 	switch (sig) {
881 	case SIGCONT:
882 	case SIGSTOP:
883 	case SIGTSTP:
884 	case SIGTTIN:
885 	case SIGTTOU:
886 	case SIGCHLD:
887 	case SIGIO:
888 #if defined(SIGURG) && SIGURG != SIGIO
889 	case SIGURG:
890 #endif
891 	case SIGWINCH:
892 		/* Gloria Gaynor says ... */
893 		return 1;
894 	default:
895 		break;
896 	}
897 #endif /* !SVR4 */
898 #ifdef LINUX
899 
900 	/* This is incredibly costly but it's worth it. */
901 	/* NOTE: LinuxThreads internally uses SIGRTMIN, SIGRTMIN + 1 and
902 	   SIGRTMIN + 2, so we can't use the obsolete /proc/%d/stat which
903 	   doesn't handle real-time signals). */
904 	sprintf(sname, "/proc/%d/status", tcp->pid);
905 	if ((sfd = open(sname, O_RDONLY)) == -1) {
906 		perror(sname);
907 		return 1;
908 	}
909 	i = read(sfd, buf, sizeof(buf));
910 	buf[i] = '\0';
911 	close(sfd);
912 	/*
913 	 * Skip the extraneous fields. We need to skip
914 	 * command name has any spaces in it.  So be it.
915 	 */
916 	s = strstr(buf, "SigIgn:\t");
917 	if (!s)
918 	{
919 		fprintf(stderr, "/proc/pid/status format error\n");
920 		return 1;
921 	}
922 	parse_sigset_t(s + 8, &ignored);
923 
924 	s = strstr(buf, "SigCgt:\t");
925 	if (!s)
926 	{
927 		fprintf(stderr, "/proc/pid/status format error\n");
928 		return 1;
929 	}
930 	parse_sigset_t(s + 8, &caught);
931 
932 #ifdef DEBUG
933 	fprintf(stderr, "sigs: %016qx %016qx (sig=%d)\n",
934 		*(long long *) &ignored, *(long long *) &caught, sig);
935 #endif
936 	if (sigismember(&ignored, sig) || sigismember(&caught, sig))
937 		return 1;
938 #endif /* LINUX */
939 
940 #ifdef SUNOS4
941 	void (*u_signal)();
942 
943 	if (upeek(tcp, uoff(u_signal[0]) + sig*sizeof(u_signal),
944 	    (long *) &u_signal) < 0) {
945 		return 0;
946 	}
947 	if (u_signal != SIG_DFL)
948 		return 1;
949 #endif /* SUNOS4 */
950 
951 	return 0;
952 }
953 
954 #if defined(SUNOS4) || defined(FREEBSD)
955 
956 int
sys_sigvec(tcp)957 sys_sigvec(tcp)
958 struct tcb *tcp;
959 {
960 	struct sigvec sv;
961 	long addr;
962 
963 	if (entering(tcp)) {
964 		printsignal(tcp->u_arg[0]);
965 		tprintf(", ");
966 		addr = tcp->u_arg[1];
967 	} else {
968 		addr = tcp->u_arg[2];
969 	}
970 	if (addr == 0)
971 		tprintf("NULL");
972 	else if (!verbose(tcp))
973 		tprintf("%#lx", addr);
974 	else if (umove(tcp, addr, &sv) < 0)
975 		tprintf("{...}");
976 	else {
977 		switch ((int) sv.sv_handler) {
978 		case (int) SIG_ERR:
979 			tprintf("{SIG_ERR}");
980 			break;
981 		case (int) SIG_DFL:
982 			tprintf("{SIG_DFL}");
983 			break;
984 		case (int) SIG_IGN:
985 			if (tcp->u_arg[0] == SIGTRAP) {
986 				tcp->flags |= TCB_SIGTRAPPED;
987 				kill(tcp->pid, SIGSTOP);
988 			}
989 			tprintf("{SIG_IGN}");
990 			break;
991 		case (int) SIG_HOLD:
992 			if (tcp->u_arg[0] == SIGTRAP) {
993 				tcp->flags |= TCB_SIGTRAPPED;
994 				kill(tcp->pid, SIGSTOP);
995 			}
996 			tprintf("SIG_HOLD");
997 			break;
998 		default:
999 			if (tcp->u_arg[0] == SIGTRAP) {
1000 				tcp->flags |= TCB_SIGTRAPPED;
1001 				kill(tcp->pid, SIGSTOP);
1002 			}
1003 			tprintf("{%#lx, ", (unsigned long) sv.sv_handler);
1004 			printsigmask(&sv.sv_mask, 0);
1005 			tprintf(", ");
1006 			printflags(sigvec_flags, sv.sv_flags, "SV_???");
1007 			tprintf("}");
1008 		}
1009 	}
1010 	if (entering(tcp))
1011 		tprintf(", ");
1012 	return 0;
1013 }
1014 
1015 int
sys_sigpause(tcp)1016 sys_sigpause(tcp)
1017 struct tcb *tcp;
1018 {
1019 	if (entering(tcp)) {	/* WTA: UD had a bug here: he forgot the braces */
1020 		sigset_t sigm;
1021 		long_to_sigset(tcp->u_arg[0], &sigm);
1022 		printsigmask(&sigm, 0);
1023 	}
1024 	return 0;
1025 }
1026 
1027 int
sys_sigstack(tcp)1028 sys_sigstack(tcp)
1029 struct tcb *tcp;
1030 {
1031 	struct sigstack ss;
1032 	long addr;
1033 
1034 	if (entering(tcp))
1035 		addr = tcp->u_arg[0];
1036 	else
1037 		addr = tcp->u_arg[1];
1038 	if (addr == 0)
1039 		tprintf("NULL");
1040 	else if (umove(tcp, addr, &ss) < 0)
1041 		tprintf("%#lx", addr);
1042 	else {
1043 		tprintf("{ss_sp %#lx ", (unsigned long) ss.ss_sp);
1044 		tprintf("ss_onstack %s}", ss.ss_onstack ? "YES" : "NO");
1045 	}
1046 	if (entering(tcp))
1047 		tprintf(", ");
1048 	return 0;
1049 }
1050 
1051 int
sys_sigcleanup(tcp)1052 sys_sigcleanup(tcp)
1053 struct tcb *tcp;
1054 {
1055 	return 0;
1056 }
1057 
1058 #endif /* SUNOS4 || FREEBSD */
1059 
1060 #ifndef SVR4
1061 
1062 int
sys_sigsetmask(tcp)1063 sys_sigsetmask(tcp)
1064 struct tcb *tcp;
1065 {
1066 	if (entering(tcp)) {
1067 		sigset_t sigm;
1068 		long_to_sigset(tcp->u_arg[0], &sigm);
1069 		printsigmask(&sigm, 0);
1070 #ifndef USE_PROCFS
1071 		if ((tcp->u_arg[0] & sigmask(SIGTRAP))) {
1072 			/* Mark attempt to block SIGTRAP */
1073 			tcp->flags |= TCB_SIGTRAPPED;
1074 			/* Send unblockable signal */
1075 			kill(tcp->pid, SIGSTOP);
1076 		}
1077 #endif /* !USE_PROCFS */
1078 	}
1079 	else if (!syserror(tcp)) {
1080 		sigset_t sigm;
1081 		long_to_sigset(tcp->u_rval, &sigm);
1082 		tcp->auxstr = sprintsigmask("old mask ", &sigm, 0);
1083 
1084 		return RVAL_HEX | RVAL_STR;
1085 	}
1086 	return 0;
1087 }
1088 
1089 #if defined(SUNOS4) || defined(FREEBSD)
1090 int
sys_sigblock(tcp)1091 sys_sigblock(tcp)
1092 struct tcb *tcp;
1093 {
1094 	return sys_sigsetmask(tcp);
1095 }
1096 #endif /* SUNOS4 || FREEBSD */
1097 
1098 #endif /* !SVR4 */
1099 
1100 #ifdef HAVE_SIGACTION
1101 
1102 #ifdef LINUX
1103 struct old_sigaction {
1104 	__sighandler_t __sa_handler;
1105 	unsigned long sa_mask;
1106 	unsigned long sa_flags;
1107 	void (*sa_restorer)(void);
1108 };
1109 #define SA_HANDLER __sa_handler
1110 #endif /* LINUX */
1111 
1112 #ifndef SA_HANDLER
1113 #define SA_HANDLER sa_handler
1114 #endif
1115 
1116 int
sys_sigaction(tcp)1117 sys_sigaction(tcp)
1118 struct tcb *tcp;
1119 {
1120 	long addr;
1121 #ifdef LINUX
1122 	sigset_t sigset;
1123 	struct old_sigaction sa;
1124 #else
1125 	struct sigaction sa;
1126 #endif
1127 
1128 
1129 	if (entering(tcp)) {
1130 		printsignal(tcp->u_arg[0]);
1131 		tprintf(", ");
1132 		addr = tcp->u_arg[1];
1133 	} else
1134 		addr = tcp->u_arg[2];
1135 	if (addr == 0)
1136 		tprintf("NULL");
1137 	else if (!verbose(tcp))
1138 		tprintf("%#lx", addr);
1139 	else if (umove(tcp, addr, &sa) < 0)
1140 		tprintf("{...}");
1141 	else {
1142 		/* Architectures using function pointers, like
1143 		 * hppa, may need to manipulate the function pointer
1144 		 * to compute the result of a comparison. However,
1145 		 * the SA_HANDLER function pointer exists only in
1146 		 * the address space of the traced process, and can't
1147 		 * be manipulated by strace. In order to prevent the
1148 		 * compiler from generating code to manipulate
1149 		 * SA_HANDLER we cast the function pointers to long. */
1150 		if ((long)sa.SA_HANDLER == (long)SIG_ERR)
1151 			tprintf("{SIG_ERR, ");
1152 		else if ((long)sa.SA_HANDLER == (long)SIG_DFL)
1153 			tprintf("{SIG_DFL, ");
1154 		else if ((long)sa.SA_HANDLER == (long)SIG_IGN) {
1155 #ifndef USE_PROCFS
1156 			if (tcp->u_arg[0] == SIGTRAP) {
1157 				tcp->flags |= TCB_SIGTRAPPED;
1158 				kill(tcp->pid, SIGSTOP);
1159 			}
1160 #endif /* !USE_PROCFS */
1161 			tprintf("{SIG_IGN, ");
1162 		}
1163 		else {
1164 #ifndef USE_PROCFS
1165 			if (tcp->u_arg[0] == SIGTRAP) {
1166 				tcp->flags |= TCB_SIGTRAPPED;
1167 				kill(tcp->pid, SIGSTOP);
1168 			}
1169 #endif /* !USE_PROCFS */
1170 			tprintf("{%#lx, ", (long) sa.SA_HANDLER);
1171 #ifndef LINUX
1172 			printsigmask (&sa.sa_mask, 0);
1173 #else
1174 			long_to_sigset(sa.sa_mask, &sigset);
1175 			printsigmask(&sigset, 0);
1176 #endif
1177 			tprintf(", ");
1178 			printflags(sigact_flags, sa.sa_flags, "SA_???");
1179 #ifdef SA_RESTORER
1180 			if (sa.sa_flags & SA_RESTORER)
1181 				tprintf(", %p", sa.sa_restorer);
1182 #endif
1183 			tprintf("}");
1184 		}
1185 	}
1186 	if (entering(tcp))
1187 		tprintf(", ");
1188 #ifdef LINUX
1189 	else
1190 		tprintf(", %#lx", (unsigned long) sa.sa_restorer);
1191 #endif
1192 	return 0;
1193 }
1194 
1195 int
sys_signal(tcp)1196 sys_signal(tcp)
1197 struct tcb *tcp;
1198 {
1199 	if (entering(tcp)) {
1200 		printsignal(tcp->u_arg[0]);
1201 		tprintf(", ");
1202 		switch (tcp->u_arg[1]) {
1203 		case (long) SIG_ERR:
1204 			tprintf("SIG_ERR");
1205 			break;
1206 		case (long) SIG_DFL:
1207 			tprintf("SIG_DFL");
1208 			break;
1209 		case (long) SIG_IGN:
1210 #ifndef USE_PROCFS
1211 			if (tcp->u_arg[0] == SIGTRAP) {
1212 				tcp->flags |= TCB_SIGTRAPPED;
1213 				kill(tcp->pid, SIGSTOP);
1214 			}
1215 #endif /* !USE_PROCFS */
1216 			tprintf("SIG_IGN");
1217 			break;
1218 		default:
1219 #ifndef USE_PROCFS
1220 			if (tcp->u_arg[0] == SIGTRAP) {
1221 				tcp->flags |= TCB_SIGTRAPPED;
1222 				kill(tcp->pid, SIGSTOP);
1223 			}
1224 #endif /* !USE_PROCFS */
1225 			tprintf("%#lx", tcp->u_arg[1]);
1226 		}
1227 		return 0;
1228 	}
1229 	else if (!syserror(tcp)) {
1230 		switch (tcp->u_rval) {
1231 		    case (long) SIG_ERR:
1232 			tcp->auxstr = "SIG_ERR"; break;
1233 		    case (long) SIG_DFL:
1234 			tcp->auxstr = "SIG_DFL"; break;
1235 		    case (long) SIG_IGN:
1236 			tcp->auxstr = "SIG_IGN"; break;
1237 		    default:
1238 			tcp->auxstr = NULL;
1239 		}
1240 		return RVAL_HEX | RVAL_STR;
1241 	}
1242 	return 0;
1243 }
1244 
1245 #ifdef SVR4
1246 int
sys_sighold(tcp)1247 sys_sighold(tcp)
1248 struct tcb *tcp;
1249 {
1250 	if (entering(tcp)) {
1251 		printsignal(tcp->u_arg[0]);
1252 	}
1253 	return 0;
1254 }
1255 #endif /* SVR4 */
1256 
1257 #endif /* HAVE_SIGACTION */
1258 
1259 #ifdef LINUX
1260 
1261 int
sys_sigreturn(struct tcb * tcp)1262 sys_sigreturn(struct tcb *tcp)
1263 {
1264 #if defined(ARM)
1265 	struct pt_regs regs;
1266 	struct sigcontext_struct sc;
1267 
1268 	if (entering(tcp)) {
1269 		tcp->u_arg[0] = 0;
1270 
1271 		if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (void *)&regs) == -1)
1272 			return 0;
1273 
1274 		if (umove(tcp, regs.ARM_sp, &sc) < 0)
1275 			return 0;
1276 
1277 		tcp->u_arg[0] = 1;
1278 		tcp->u_arg[1] = sc.oldmask;
1279 	} else {
1280 		sigset_t sigm;
1281 		long_to_sigset(tcp->u_arg[1], &sigm);
1282 		tcp->u_rval = tcp->u_error = 0;
1283 		if (tcp->u_arg[0] == 0)
1284 			return 0;
1285 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1286 		return RVAL_NONE | RVAL_STR;
1287 	}
1288 	return 0;
1289 #elif defined(S390) || defined(S390X)
1290 	long usp;
1291 	struct sigcontext_struct sc;
1292 
1293 	if (entering(tcp)) {
1294 		tcp->u_arg[0] = 0;
1295 		if (upeek(tcp,PT_GPR15,&usp)<0)
1296 			return 0;
1297 		if (umove(tcp, usp+__SIGNAL_FRAMESIZE, &sc) < 0)
1298 			return 0;
1299 		tcp->u_arg[0] = 1;
1300 		memcpy(&tcp->u_arg[1],&sc.oldmask[0],sizeof(sigset_t));
1301 	} else {
1302 		tcp->u_rval = tcp->u_error = 0;
1303 		if (tcp->u_arg[0] == 0)
1304 			return 0;
1305 		tcp->auxstr = sprintsigmask("mask now ",(sigset_t *)&tcp->u_arg[1],0);
1306 		return RVAL_NONE | RVAL_STR;
1307 	}
1308 	return 0;
1309 #elif defined(I386)
1310 	long esp;
1311 	struct sigcontext_struct sc;
1312 
1313 	if (entering(tcp)) {
1314 		tcp->u_arg[0] = 0;
1315 		if (upeek(tcp, 4*UESP, &esp) < 0)
1316 			return 0;
1317 		if (umove(tcp, esp, &sc) < 0)
1318 			return 0;
1319 		tcp->u_arg[0] = 1;
1320 		tcp->u_arg[1] = sc.oldmask;
1321 	}
1322 	else {
1323 		sigset_t sigm;
1324 		long_to_sigset(tcp->u_arg[1], &sigm);
1325 		tcp->u_rval = tcp->u_error = 0;
1326 		if (tcp->u_arg[0] == 0)
1327 			return 0;
1328 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1329 		return RVAL_NONE | RVAL_STR;
1330 	}
1331 	return 0;
1332 #elif defined(IA64)
1333 	struct sigcontext sc;
1334 	long sp;
1335 
1336 	if (entering(tcp)) {
1337 		/* offset of sigcontext in the kernel's sigframe structure: */
1338 #		define SIGFRAME_SC_OFFSET	0x90
1339 		tcp->u_arg[0] = 0;
1340 		if (upeek(tcp, PT_R12, &sp) < 0)
1341 			return 0;
1342 		if (umove(tcp, sp + 16 + SIGFRAME_SC_OFFSET, &sc) < 0)
1343 			return 0;
1344 		tcp->u_arg[0] = 1;
1345 		memcpy(tcp->u_arg + 1, &sc.sc_mask, sizeof(sc.sc_mask));
1346 	}
1347 	else {
1348 		sigset_t sigm;
1349 
1350 		memcpy(&sigm, tcp->u_arg + 1, sizeof (sigm));
1351 		tcp->u_rval = tcp->u_error = 0;
1352 		if (tcp->u_arg[0] == 0)
1353 			return 0;
1354 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1355 		return RVAL_NONE | RVAL_STR;
1356 	}
1357 	return 0;
1358 #elif defined(POWERPC)
1359 	long esp;
1360 	struct sigcontext_struct sc;
1361 
1362 	if (entering(tcp)) {
1363 		tcp->u_arg[0] = 0;
1364 		if (upeek(tcp, sizeof(unsigned long)*PT_R1, &esp) < 0)
1365 			return 0;
1366 		/* Skip dummy stack frame. */
1367 #ifdef POWERPC64
1368 		if (current_personality == 0)
1369 			esp += 128;
1370 		else
1371 			esp += 64;
1372 #else
1373 		esp += 64;
1374 #endif
1375 		if (umove(tcp, esp, &sc) < 0)
1376 			return 0;
1377 		tcp->u_arg[0] = 1;
1378 		tcp->u_arg[1] = sc.oldmask;
1379 	}
1380 	else {
1381 		sigset_t sigm;
1382 		long_to_sigset(tcp->u_arg[1], &sigm);
1383 		tcp->u_rval = tcp->u_error = 0;
1384 		if (tcp->u_arg[0] == 0)
1385 			return 0;
1386 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1387 		return RVAL_NONE | RVAL_STR;
1388 	}
1389 	return 0;
1390 #elif defined(M68K)
1391 	long usp;
1392 	struct sigcontext sc;
1393 
1394 	if (entering(tcp)) {
1395 		tcp->u_arg[0] = 0;
1396 		if (upeek(tcp, 4*PT_USP, &usp) < 0)
1397 			return 0;
1398 		if (umove(tcp, usp, &sc) < 0)
1399 			return 0;
1400 		tcp->u_arg[0] = 1;
1401 		tcp->u_arg[1] = sc.sc_mask;
1402 	}
1403 	else {
1404 		sigset_t sigm;
1405 		long_to_sigset(tcp->u_arg[1], &sigm);
1406 		tcp->u_rval = tcp->u_error = 0;
1407 		if (tcp->u_arg[0] == 0)
1408 			return 0;
1409 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1410 		return RVAL_NONE | RVAL_STR;
1411 	}
1412 	return 0;
1413 #elif defined(ALPHA)
1414 	long fp;
1415 	struct sigcontext_struct sc;
1416 
1417 	if (entering(tcp)) {
1418 		tcp->u_arg[0] = 0;
1419 		if (upeek(tcp, REG_FP, &fp) < 0)
1420 			return 0;
1421 		if (umove(tcp, fp, &sc) < 0)
1422 			return 0;
1423 		tcp->u_arg[0] = 1;
1424 		tcp->u_arg[1] = sc.sc_mask;
1425 	}
1426 	else {
1427 		sigset_t sigm;
1428 		long_to_sigset(tcp->u_arg[1], &sigm);
1429 		tcp->u_rval = tcp->u_error = 0;
1430 		if (tcp->u_arg[0] == 0)
1431 			return 0;
1432 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1433 		return RVAL_NONE | RVAL_STR;
1434 	}
1435 	return 0;
1436 #elif defined (SPARC) || defined (SPARC64)
1437 	long i1;
1438 	struct pt_regs regs;
1439 	m_siginfo_t si;
1440 
1441 	if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {
1442 		perror("sigreturn: PTRACE_GETREGS ");
1443 		return 0;
1444 	}
1445 	if(entering(tcp)) {
1446 		tcp->u_arg[0] = 0;
1447 		i1 = regs.u_regs[U_REG_O1];
1448 		if(umove(tcp, i1, &si) < 0) {
1449 			perror("sigreturn: umove ");
1450 			return 0;
1451 		}
1452 		tcp->u_arg[0] = 1;
1453 		tcp->u_arg[1] = si.si_mask;
1454 	} else {
1455 		sigset_t sigm;
1456 		long_to_sigset(tcp->u_arg[1], &sigm);
1457 		tcp->u_rval = tcp->u_error = 0;
1458 		if(tcp->u_arg[0] == 0)
1459 			return 0;
1460 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1461 		return RVAL_NONE | RVAL_STR;
1462 	}
1463 	return 0;
1464 #elif defined (LINUX_MIPSN32) || defined (LINUX_MIPSN64)
1465 	/* This decodes rt_sigreturn.  The 64-bit ABIs do not have
1466 	   sigreturn.  */
1467 	long sp;
1468 	struct ucontext uc;
1469 
1470 	if(entering(tcp)) {
1471 		tcp->u_arg[0] = 0;
1472 		if (upeek(tcp, REG_SP, &sp) < 0)
1473 			return 0;
1474 		/* There are six words followed by a 128-byte siginfo.  */
1475 		sp = sp + 6 * 4 + 128;
1476 		if (umove(tcp, sp, &uc) < 0)
1477 			return 0;
1478 		tcp->u_arg[0] = 1;
1479 		tcp->u_arg[1] = *(long *) &uc.uc_sigmask;
1480 	} else {
1481 		sigset_t sigm;
1482 		long_to_sigset(tcp->u_arg[1], &sigm);
1483 		tcp->u_rval = tcp->u_error = 0;
1484 		if(tcp->u_arg[0] == 0)
1485 			return 0;
1486 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1487 		return RVAL_NONE | RVAL_STR;
1488 	}
1489 	return 0;
1490 #elif defined(MIPS)
1491 	long sp;
1492 	struct pt_regs regs;
1493 	m_siginfo_t si;
1494 
1495 	if(ptrace(PTRACE_GETREGS, tcp->pid, (char *)&regs, 0) < 0) {
1496 		perror("sigreturn: PTRACE_GETREGS ");
1497 		return 0;
1498 	}
1499 	if(entering(tcp)) {
1500 		tcp->u_arg[0] = 0;
1501 		sp = regs.regs[29];
1502 		if (umove(tcp, sp, &si) < 0)
1503 			return 0;
1504 		tcp->u_arg[0] = 1;
1505 		tcp->u_arg[1] = si.si_mask;
1506 	} else {
1507 		sigset_t sigm;
1508 		long_to_sigset(tcp->u_arg[1], &sigm);
1509 		tcp->u_rval = tcp->u_error = 0;
1510 		if(tcp->u_arg[0] == 0)
1511 			return 0;
1512 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1513 		return RVAL_NONE | RVAL_STR;
1514 	}
1515 	return 0;
1516 #elif defined(CRISV10) || defined(CRISV32)
1517 	struct sigcontext sc;
1518 
1519 	if (entering(tcp)) {
1520 		long regs[PT_MAX+1];
1521 
1522 		tcp->u_arg[0] = 0;
1523 
1524 		if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
1525 			perror("sigreturn: PTRACE_GETREGS");
1526 			return 0;
1527 		}
1528 		if (umove(tcp, regs[PT_USP], &sc) < 0)
1529 			return 0;
1530 		tcp->u_arg[0] = 1;
1531 		tcp->u_arg[1] = sc.oldmask;
1532 	} else {
1533 		sigset_t sigm;
1534 		long_to_sigset(tcp->u_arg[1], &sigm);
1535 		tcp->u_rval = tcp->u_error = 0;
1536 
1537 		if (tcp->u_arg[0] == 0)
1538 			return 0;
1539 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1540 		return RVAL_NONE | RVAL_STR;
1541 	}
1542 	return 0;
1543 #elif defined(TILE)
1544 	struct ucontext uc;
1545 	long sp;
1546 
1547 	/* offset of ucontext in the kernel's sigframe structure */
1548 #	define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(struct siginfo)
1549 
1550 	if (entering(tcp)) {
1551 		tcp->u_arg[0] = 0;
1552 		if (upeek(tcp, PTREGS_OFFSET_SP, &sp) < 0)
1553 			return 0;
1554 		if (umove(tcp, sp + SIGFRAME_UC_OFFSET, &uc) < 0)
1555 			return 0;
1556 		tcp->u_arg[0] = 1;
1557 		memcpy(tcp->u_arg + 1, &uc.uc_sigmask, sizeof(uc.uc_sigmask));
1558 	}
1559 	else {
1560 		sigset_t sigm;
1561 
1562 		memcpy(&sigm, tcp->u_arg + 1, sizeof (sigm));
1563 		tcp->u_rval = tcp->u_error = 0;
1564 		if (tcp->u_arg[0] == 0)
1565 			return 0;
1566 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1567 		return RVAL_NONE | RVAL_STR;
1568 	}
1569 	return 0;
1570 #elif defined(MICROBLAZE)
1571 	struct sigcontext sc;
1572 
1573 	/* TODO: Verify that this is correct...  */
1574 	if (entering(tcp)) {
1575 		long sp;
1576 
1577 		tcp->u_arg[0] = 0;
1578 
1579 		/* Read r1, the stack pointer.  */
1580 		if (upeek(tcp, 1 * 4, &sp) < 0)
1581 			return 0;
1582 		if (umove(tcp, sp, &sc) < 0)
1583 			return 0;
1584 		tcp->u_arg[0] = 1;
1585 		tcp->u_arg[1] = sc.oldmask;
1586 	} else {
1587 		sigset_t sigm;
1588 		long_to_sigset(tcp->u_arg[1], &sigm);
1589 		tcp->u_rval = tcp->u_error = 0;
1590 		if (tcp->u_arg[0] == 0)
1591 			return 0;
1592 		tcp->auxstr = sprintsigmask("mask now ", &sigm, 0);
1593 		return RVAL_NONE | RVAL_STR;
1594 	}
1595 	return 0;
1596 #else
1597 #warning No sys_sigreturn() for this architecture
1598 #warning         (no problem, just a reminder :-)
1599 	return 0;
1600 #endif
1601 }
1602 
1603 int
sys_siggetmask(tcp)1604 sys_siggetmask(tcp)
1605 struct tcb *tcp;
1606 {
1607 	if (exiting(tcp)) {
1608 		sigset_t sigm;
1609 		long_to_sigset(tcp->u_rval, &sigm);
1610 		tcp->auxstr = sprintsigmask("mask ", &sigm, 0);
1611 	}
1612 	return RVAL_HEX | RVAL_STR;
1613 }
1614 
1615 int
sys_sigsuspend(struct tcb * tcp)1616 sys_sigsuspend(struct tcb *tcp)
1617 {
1618 	if (entering(tcp)) {
1619 		sigset_t sigm;
1620 		long_to_sigset(tcp->u_arg[2], &sigm);
1621 		printsigmask(&sigm, 0);
1622 	}
1623 	return 0;
1624 }
1625 
1626 #endif /* LINUX */
1627 
1628 #if defined(SVR4) || defined(FREEBSD)
1629 
1630 int
sys_sigsuspend(tcp)1631 sys_sigsuspend(tcp)
1632 struct tcb *tcp;
1633 {
1634 	sigset_t sigset;
1635 
1636 	if (entering(tcp)) {
1637 		if (umove(tcp, tcp->u_arg[0], &sigset) < 0)
1638 			tprintf("[?]");
1639 		else
1640 			printsigmask(&sigset, 0);
1641 	}
1642 	return 0;
1643 }
1644 #ifndef FREEBSD
1645 static const struct xlat ucontext_flags[] = {
1646 	{ UC_SIGMASK,	"UC_SIGMASK"	},
1647 	{ UC_STACK,	"UC_STACK"	},
1648 	{ UC_CPU,	"UC_CPU"	},
1649 #ifdef UC_FPU
1650 	{ UC_FPU,	"UC_FPU"	},
1651 #endif
1652 #ifdef UC_INTR
1653 	{ UC_INTR,	"UC_INTR"	},
1654 #endif
1655 	{ 0,		NULL		},
1656 };
1657 #endif /* !FREEBSD */
1658 #endif /* SVR4 || FREEBSD */
1659 
1660 #if defined SVR4 || defined LINUX || defined FREEBSD
1661 #if defined LINUX && !defined SS_ONSTACK
1662 #define SS_ONSTACK      1
1663 #define SS_DISABLE      2
1664 #if __GLIBC_MINOR__ == 0
1665 typedef struct
1666 {
1667 	__ptr_t ss_sp;
1668 	int ss_flags;
1669 	size_t ss_size;
1670 } stack_t;
1671 #endif
1672 #endif
1673 #ifdef FREEBSD
1674 #define stack_t struct sigaltstack
1675 #endif
1676 
1677 static const struct xlat sigaltstack_flags[] = {
1678 	{ SS_ONSTACK,	"SS_ONSTACK"	},
1679 	{ SS_DISABLE,	"SS_DISABLE"	},
1680 	{ 0,		NULL		},
1681 };
1682 #endif
1683 
1684 #ifdef SVR4
1685 static void
printcontext(tcp,ucp)1686 printcontext(tcp, ucp)
1687 struct tcb *tcp;
1688 ucontext_t *ucp;
1689 {
1690 	tprintf("{");
1691 	if (!abbrev(tcp)) {
1692 		tprintf("uc_flags=");
1693 		printflags(ucontext_flags, ucp->uc_flags, "UC_???");
1694 		tprintf(", uc_link=%#lx, ", (unsigned long) ucp->uc_link);
1695 	}
1696 	tprintf("uc_sigmask=");
1697 	printsigmask(&ucp->uc_sigmask, 0);
1698 	if (!abbrev(tcp)) {
1699 		tprintf(", uc_stack={ss_sp=%#lx, ss_size=%d, ss_flags=",
1700 			(unsigned long) ucp->uc_stack.ss_sp,
1701 			ucp->uc_stack.ss_size);
1702 		printflags(sigaltstack_flags, ucp->uc_stack.ss_flags, "SS_???");
1703 		tprintf("}");
1704 	}
1705 	tprintf(", ...}");
1706 }
1707 
1708 int
sys_getcontext(tcp)1709 sys_getcontext(tcp)
1710 struct tcb *tcp;
1711 {
1712 	ucontext_t uc;
1713 
1714 	if (exiting(tcp)) {
1715 		if (tcp->u_error)
1716 			tprintf("%#lx", tcp->u_arg[0]);
1717 		else if (!tcp->u_arg[0])
1718 			tprintf("NULL");
1719 		else if (umove(tcp, tcp->u_arg[0], &uc) < 0)
1720 			tprintf("{...}");
1721 		else
1722 			printcontext(tcp, &uc);
1723 	}
1724 	return 0;
1725 }
1726 
1727 int
sys_setcontext(tcp)1728 sys_setcontext(tcp)
1729 struct tcb *tcp;
1730 {
1731 	ucontext_t uc;
1732 
1733 	if (entering(tcp)) {
1734 		if (!tcp->u_arg[0])
1735 			tprintf("NULL");
1736 		else if (umove(tcp, tcp->u_arg[0], &uc) < 0)
1737 			tprintf("{...}");
1738 		else
1739 			printcontext(tcp, &uc);
1740 	}
1741 	else {
1742 		tcp->u_rval = tcp->u_error = 0;
1743 		if (tcp->u_arg[0] == 0)
1744 			return 0;
1745 		return RVAL_NONE;
1746 	}
1747 	return 0;
1748 }
1749 
1750 #endif /* SVR4 */
1751 
1752 #if defined(LINUX) || defined(FREEBSD)
1753 
1754 static int
print_stack_t(tcp,addr)1755 print_stack_t(tcp, addr)
1756 struct tcb *tcp;
1757 unsigned long addr;
1758 {
1759 	stack_t ss;
1760 	if (umove(tcp, addr, &ss) < 0)
1761 		return -1;
1762 	tprintf("{ss_sp=%#lx, ss_flags=", (unsigned long) ss.ss_sp);
1763 	printflags(sigaltstack_flags, ss.ss_flags, "SS_???");
1764 	tprintf(", ss_size=%lu}", (unsigned long) ss.ss_size);
1765 	return 0;
1766 }
1767 
1768 int
sys_sigaltstack(tcp)1769 sys_sigaltstack(tcp)
1770 	struct tcb *tcp;
1771 {
1772 	if (entering(tcp)) {
1773 		if (tcp->u_arg[0] == 0)
1774 			tprintf("NULL");
1775 		else if (print_stack_t(tcp, tcp->u_arg[0]) < 0)
1776 			return -1;
1777 	}
1778 	else {
1779 		tprintf(", ");
1780 		if (tcp->u_arg[1] == 0)
1781 			tprintf("NULL");
1782 		else if (print_stack_t(tcp, tcp->u_arg[1]) < 0)
1783 			return -1;
1784 	}
1785 	return 0;
1786 }
1787 #endif
1788 
1789 #ifdef HAVE_SIGACTION
1790 
1791 int
sys_sigprocmask(tcp)1792 sys_sigprocmask(tcp)
1793 struct tcb *tcp;
1794 {
1795 #ifdef ALPHA
1796 	if (entering(tcp)) {
1797 		printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
1798 		tprintf(", ");
1799 		printsigmask(tcp->u_arg[1], 0);
1800 	}
1801 	else if (!syserror(tcp)) {
1802 		tcp->auxstr = sprintsigmask("old mask ", tcp->u_rval, 0);
1803 		return RVAL_HEX | RVAL_STR;
1804 	}
1805 #else /* !ALPHA */
1806 	if (entering(tcp)) {
1807 #ifdef SVR4
1808 		if (tcp->u_arg[0] == 0)
1809 			tprintf("0");
1810 		else
1811 #endif /* SVR4 */
1812 		printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
1813 		tprintf(", ");
1814 		print_sigset(tcp, tcp->u_arg[1], 0);
1815 		tprintf(", ");
1816 	}
1817 	else {
1818 		if (!tcp->u_arg[2])
1819 			tprintf("NULL");
1820 		else if (syserror(tcp))
1821 			tprintf("%#lx", tcp->u_arg[2]);
1822 		else
1823 			print_sigset(tcp, tcp->u_arg[2], 0);
1824 	}
1825 #endif /* !ALPHA */
1826 	return 0;
1827 }
1828 
1829 #endif /* HAVE_SIGACTION */
1830 
1831 int
sys_kill(tcp)1832 sys_kill(tcp)
1833 struct tcb *tcp;
1834 {
1835 	if (entering(tcp)) {
1836 		/*
1837 		 * Sign-extend a 32-bit value when that's what it is.
1838 		 */
1839 		long pid = tcp->u_arg[0];
1840 		if (personality_wordsize[current_personality] < sizeof pid)
1841 			pid = (long) (int) pid;
1842 		tprintf("%ld, %s", pid, signame(tcp->u_arg[1]));
1843 	}
1844 	return 0;
1845 }
1846 
1847 #if defined(FREEBSD) || defined(SUNOS4)
1848 int
sys_killpg(tcp)1849 sys_killpg(tcp)
1850 struct tcb *tcp;
1851 {
1852 	return sys_kill(tcp);
1853 }
1854 #endif /* FREEBSD || SUNOS4 */
1855 
1856 #ifdef LINUX
1857 int
sys_tgkill(tcp)1858 sys_tgkill(tcp)
1859 	struct tcb *tcp;
1860 {
1861 	if (entering(tcp)) {
1862 		tprintf("%ld, %ld, %s",
1863 			tcp->u_arg[0], tcp->u_arg[1], signame(tcp->u_arg[2]));
1864 	}
1865 	return 0;
1866 }
1867 #endif
1868 
1869 int
sys_sigpending(tcp)1870 sys_sigpending(tcp)
1871 struct tcb *tcp;
1872 {
1873 	sigset_t sigset;
1874 
1875 	if (exiting(tcp)) {
1876 		if (syserror(tcp))
1877 			tprintf("%#lx", tcp->u_arg[0]);
1878 		else if (copy_sigset(tcp, tcp->u_arg[0], &sigset) < 0)
1879 			tprintf("[?]");
1880 		else
1881 			printsigmask(&sigset, 0);
1882 	}
1883 	return 0;
1884 }
1885 
1886 #ifdef SVR4
sys_sigwait(tcp)1887 int sys_sigwait(tcp)
1888 struct tcb *tcp;
1889 {
1890 	sigset_t sigset;
1891 
1892 	if (entering(tcp)) {
1893 		if (copy_sigset(tcp, tcp->u_arg[0], &sigset) < 0)
1894 			tprintf("[?]");
1895 		else
1896 			printsigmask(&sigset, 0);
1897 	}
1898 	else {
1899 		if (!syserror(tcp)) {
1900 			tcp->auxstr = signalent[tcp->u_rval];
1901 			return RVAL_DECIMAL | RVAL_STR;
1902 		}
1903 	}
1904 	return 0;
1905 }
1906 #endif /* SVR4 */
1907 
1908 #ifdef LINUX
1909 
1910 	int
sys_rt_sigprocmask(tcp)1911 sys_rt_sigprocmask(tcp)
1912 	struct tcb *tcp;
1913 {
1914 	sigset_t sigset;
1915 
1916 	/* Note: arg[3] is the length of the sigset. */
1917 	if (entering(tcp)) {
1918 		printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
1919 		tprintf(", ");
1920 		if (!tcp->u_arg[1])
1921 			tprintf("NULL, ");
1922 		else if (copy_sigset_len(tcp, tcp->u_arg[1], &sigset, tcp->u_arg[3]) < 0)
1923 			tprintf("%#lx, ", tcp->u_arg[1]);
1924 		else {
1925 			printsigmask(&sigset, 1);
1926 			tprintf(", ");
1927 		}
1928 	}
1929 	else {
1930 		if (!tcp->u_arg[2])
1931 
1932 			tprintf("NULL");
1933 		else if (syserror(tcp))
1934 			tprintf("%#lx", tcp->u_arg[2]);
1935 		else if (copy_sigset_len(tcp, tcp->u_arg[2], &sigset, tcp->u_arg[3]) < 0)
1936 			tprintf("[?]");
1937 		else
1938 			printsigmask(&sigset, 1);
1939 		tprintf(", %lu", tcp->u_arg[3]);
1940 	}
1941 	return 0;
1942 }
1943 
1944 
1945 /* Structure describing the action to be taken when a signal arrives.  */
1946 struct new_sigaction
1947 {
1948 	__sighandler_t __sa_handler;
1949 	unsigned long sa_flags;
1950 	void (*sa_restorer) (void);
1951 	/* Kernel treats sa_mask as an array of longs. */
1952 	unsigned long sa_mask[NSIG / sizeof(long) ? NSIG / sizeof(long) : 1];
1953 };
1954 /* Same for i386-on-x86_64 and similar cases */
1955 struct new_sigaction32
1956 {
1957 	uint32_t __sa_handler;
1958 	uint32_t sa_flags;
1959 	uint32_t sa_restorer;
1960 	uint32_t sa_mask[2 * (NSIG / sizeof(long) ? NSIG / sizeof(long) : 1)];
1961 };
1962 
1963 
1964 int
sys_rt_sigaction(struct tcb * tcp)1965 sys_rt_sigaction(struct tcb *tcp)
1966 {
1967 	struct new_sigaction sa;
1968 	sigset_t sigset;
1969 	long addr;
1970 	int r;
1971 
1972 	if (entering(tcp)) {
1973 		printsignal(tcp->u_arg[0]);
1974 		tprintf(", ");
1975 		addr = tcp->u_arg[1];
1976 	} else
1977 		addr = tcp->u_arg[2];
1978 
1979 	if (addr == 0) {
1980 		tprintf("NULL");
1981 		goto after_sa;
1982 	}
1983 	if (!verbose(tcp)) {
1984 		tprintf("%#lx", addr);
1985 		goto after_sa;
1986 	}
1987 #if SUPPORTED_PERSONALITIES > 1
1988 	if (personality_wordsize[current_personality] != sizeof(sa.sa_flags)
1989 	 && personality_wordsize[current_personality] == 4
1990 	) {
1991 		struct new_sigaction32 sa32;
1992 		r = umove(tcp, addr, &sa32);
1993 		if (r >= 0) {
1994 			memset(&sa, 0, sizeof(sa));
1995 			sa.__sa_handler = (void*)(unsigned long)sa32.__sa_handler;
1996 			sa.sa_flags     = sa32.sa_flags;
1997 			sa.sa_restorer  = (void*)(unsigned long)sa32.sa_restorer;
1998 			/* Kernel treats sa_mask as an array of longs.
1999 			 * For 32-bit process, "long" is uint32_t, thus, for example,
2000 			 * 32th bit in sa_mask will end up as bit 0 in sa_mask[1].
2001 			 * But for (64-bit) kernel, 32th bit in sa_mask is
2002 			 * 32th bit in 0th (64-bit) long!
2003 			 * For little-endian, it's the same.
2004 			 * For big-endian, we swap 32-bit words.
2005 			 */
2006 			sa.sa_mask[0] = sa32.sa_mask[0] + ((long)(sa32.sa_mask[1]) << 32);
2007 		}
2008 	} else
2009 #endif
2010 	{
2011 		r = umove(tcp, addr, &sa);
2012 	}
2013 	if (r < 0) {
2014 		tprintf("{...}");
2015 		goto after_sa;
2016 	}
2017 	/* Architectures using function pointers, like
2018 	 * hppa, may need to manipulate the function pointer
2019 	 * to compute the result of a comparison. However,
2020 	 * the SA_HANDLER function pointer exists only in
2021 	 * the address space of the traced process, and can't
2022 	 * be manipulated by strace. In order to prevent the
2023 	 * compiler from generating code to manipulate
2024 	 * SA_HANDLER we cast the function pointers to long. */
2025 	if ((long)sa.__sa_handler == (long)SIG_ERR)
2026 		tprintf("{SIG_ERR, ");
2027 	else if ((long)sa.__sa_handler == (long)SIG_DFL)
2028 		tprintf("{SIG_DFL, ");
2029 	else if ((long)sa.__sa_handler == (long)SIG_IGN)
2030 		tprintf("{SIG_IGN, ");
2031 	else
2032 		tprintf("{%#lx, ", (long) sa.__sa_handler);
2033 	/* Questionable code below.
2034 	 * Kernel won't handle sys_rt_sigaction
2035 	 * with wrong sigset size (just returns EINVAL)
2036 	 * therefore tcp->u_arg[3(4)] _must_ be NSIG / 8 here,
2037 	 * and we always use smaller memcpy. */
2038 	sigemptyset(&sigset);
2039 #ifdef LINUXSPARC
2040 	if (tcp->u_arg[4] <= sizeof(sigset))
2041 		memcpy(&sigset, &sa.sa_mask, tcp->u_arg[4]);
2042 #else
2043 	if (tcp->u_arg[3] <= sizeof(sigset))
2044 		memcpy(&sigset, &sa.sa_mask, tcp->u_arg[3]);
2045 #endif
2046 	else
2047 		memcpy(&sigset, &sa.sa_mask, sizeof(sigset));
2048 	printsigmask(&sigset, 1);
2049 	tprintf(", ");
2050 	printflags(sigact_flags, sa.sa_flags, "SA_???");
2051 #ifdef SA_RESTORER
2052 	if (sa.sa_flags & SA_RESTORER)
2053 		tprintf(", %p", sa.sa_restorer);
2054 #endif
2055 	tprintf("}");
2056 
2057  after_sa:
2058 	if (entering(tcp))
2059 		tprintf(", ");
2060 	else
2061 #ifdef LINUXSPARC
2062 		tprintf(", %#lx, %lu", tcp->u_arg[3], tcp->u_arg[4]);
2063 #elif defined(ALPHA)
2064 		tprintf(", %lu, %#lx", tcp->u_arg[3], tcp->u_arg[4]);
2065 #else
2066 		tprintf(", %lu", tcp->u_arg[3]);
2067 #endif
2068 	return 0;
2069 }
2070 
2071 int
sys_rt_sigpending(struct tcb * tcp)2072 sys_rt_sigpending(struct tcb *tcp)
2073 {
2074 	sigset_t sigset;
2075 
2076 	if (exiting(tcp)) {
2077 		if (syserror(tcp))
2078 			tprintf("%#lx", tcp->u_arg[0]);
2079 		else if (copy_sigset_len(tcp, tcp->u_arg[0],
2080 					 &sigset, tcp->u_arg[1]) < 0)
2081 			tprintf("[?]");
2082 		else
2083 			printsigmask(&sigset, 1);
2084 	}
2085 	return 0;
2086 }
2087 
2088 int
sys_rt_sigsuspend(struct tcb * tcp)2089 sys_rt_sigsuspend(struct tcb *tcp)
2090 {
2091 	if (entering(tcp)) {
2092 		sigset_t sigm;
2093 		if (copy_sigset_len(tcp, tcp->u_arg[0], &sigm, tcp->u_arg[1]) < 0)
2094 			tprintf("[?]");
2095 		else
2096 			printsigmask(&sigm, 1);
2097 	}
2098 	return 0;
2099 }
2100 
2101 int
sys_rt_sigqueueinfo(struct tcb * tcp)2102 sys_rt_sigqueueinfo(struct tcb *tcp)
2103 {
2104 	if (entering(tcp)) {
2105 		siginfo_t si;
2106 		tprintf("%lu, ", tcp->u_arg[0]);
2107 		printsignal(tcp->u_arg[1]);
2108 		tprintf(", ");
2109 		if (umove(tcp, tcp->u_arg[2], &si) < 0)
2110 			tprintf("%#lx", tcp->u_arg[2]);
2111 		else
2112 			printsiginfo(&si, verbose(tcp));
2113 	}
2114 	return 0;
2115 }
2116 
sys_rt_sigtimedwait(struct tcb * tcp)2117 int sys_rt_sigtimedwait(struct tcb *tcp)
2118 {
2119 	if (entering(tcp)) {
2120 		sigset_t sigset;
2121 
2122 		if (copy_sigset_len(tcp, tcp->u_arg[0],
2123 				    &sigset, tcp->u_arg[3]) < 0)
2124 			tprintf("[?]");
2125 		else
2126 			printsigmask(&sigset, 1);
2127 		tprintf(", ");
2128 		/* This is the only "return" parameter, */
2129 		if (tcp->u_arg[1] != 0)
2130 			return 0;
2131 		/* ... if it's NULL, can decode all on entry */
2132 		tprintf("NULL, ");
2133 	}
2134 	else if (tcp->u_arg[1] != 0) {
2135 		/* syscall exit, and u_arg[1] wasn't NULL */
2136 		if (syserror(tcp))
2137 			tprintf("%#lx, ", tcp->u_arg[1]);
2138 		else {
2139 			siginfo_t si;
2140 			if (umove(tcp, tcp->u_arg[1], &si) < 0)
2141 				tprintf("%#lx, ", tcp->u_arg[1]);
2142 			else {
2143 				printsiginfo(&si, verbose(tcp));
2144 				tprintf(", ");
2145 			}
2146 		}
2147 	}
2148 	else {
2149 		/* syscall exit, and u_arg[1] was NULL */
2150 		return 0;
2151 	}
2152 	print_timespec(tcp, tcp->u_arg[2]);
2153 	tprintf(", %d", (int) tcp->u_arg[3]);
2154 	return 0;
2155 };
2156 
2157 int
sys_restart_syscall(struct tcb * tcp)2158 sys_restart_syscall(struct tcb *tcp)
2159 {
2160 	if (entering(tcp))
2161 		tprintf("<... resuming interrupted call ...>");
2162 	return 0;
2163 }
2164 
2165 static int
do_signalfd(struct tcb * tcp,int flags_arg)2166 do_signalfd(struct tcb *tcp, int flags_arg)
2167 {
2168 	if (entering(tcp)) {
2169 		printfd(tcp, tcp->u_arg[0]);
2170 		tprintf(", ");
2171 		print_sigset(tcp, tcp->u_arg[1], 1);
2172 		tprintf(", %lu", tcp->u_arg[2]);
2173 		if (flags_arg >= 0) {
2174 			tprintf(", ");
2175 			printflags(open_mode_flags, tcp->u_arg[flags_arg], "O_???");
2176 		}
2177 	}
2178 	return 0;
2179 }
2180 
2181 int
sys_signalfd(struct tcb * tcp)2182 sys_signalfd(struct tcb *tcp)
2183 {
2184 	return do_signalfd(tcp, -1);
2185 }
2186 
2187 int
sys_signalfd4(struct tcb * tcp)2188 sys_signalfd4(struct tcb *tcp)
2189 {
2190 	return do_signalfd(tcp, 3);
2191 }
2192 #endif /* LINUX */
2193