Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl>
      6  * Copyright (c) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
      7  *                     Linux for s390 port by D.J. Barrow
      8  *                    <barrow_dj (at) mail.yahoo.com,djbarrow (at) 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 
     34 #include "defs.h"
     35 #include <signal.h>
     36 
     37 #ifndef NSIG
     38 # warning NSIG is not defined, using 32
     39 # define NSIG 32
     40 #elif NSIG < 32
     41 # error NSIG < 32
     42 #endif
     43 
     44 /* The libc headers do not define this constant since it should only be
     45    used by the implementation.  So we define it here.  */
     46 #ifndef SA_RESTORER
     47 # ifdef ASM_SA_RESTORER
     48 #  define SA_RESTORER ASM_SA_RESTORER
     49 # endif
     50 #endif
     51 
     52 /*
     53  * Some architectures define SA_RESTORER in their headers,
     54  * but do not actually have sa_restorer.
     55  *
     56  * Some architectures, otherwise, do not define SA_RESTORER in their headers,
     57  * but actually have sa_restorer.
     58  */
     59 #ifdef SA_RESTORER
     60 # if defined HPPA || defined IA64
     61 #  define HAVE_SA_RESTORER 0
     62 # else
     63 #  define HAVE_SA_RESTORER 1
     64 # endif
     65 #else /* !SA_RESTORER */
     66 # if defined SPARC || defined SPARC64 || defined M68K
     67 #  define HAVE_SA_RESTORER 1
     68 # else
     69 #  define HAVE_SA_RESTORER 0
     70 # endif
     71 #endif
     72 
     73 #include "xlat/sigact_flags.h"
     74 #include "xlat/sigprocmaskcmds.h"
     75 
     76 /* Anonymous realtime signals. */
     77 #ifndef ASM_SIGRTMIN
     78 /* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */
     79 # define ASM_SIGRTMIN 32
     80 #endif
     81 #ifndef ASM_SIGRTMAX
     82 /* Under glibc 2.1, SIGRTMAX et al are functions, but __SIGRTMAX is a
     83    constant.  This is what we want.  Otherwise, just use SIGRTMAX. */
     84 # ifdef SIGRTMAX
     85 #  ifndef __SIGRTMAX
     86 #   define __SIGRTMAX SIGRTMAX
     87 #  endif
     88 # endif
     89 # ifdef __SIGRTMAX
     90 #  define ASM_SIGRTMAX __SIGRTMAX
     91 # endif
     92 #endif
     93 
     94 /* Note on the size of sigset_t:
     95  *
     96  * In glibc, sigset_t is an array with space for 1024 bits (!),
     97  * even though all arches supported by Linux have only 64 signals
     98  * except MIPS, which has 128. IOW, it is 128 bytes long.
     99  *
    100  * In-kernel sigset_t is sized correctly (it is either 64 or 128 bit long).
    101  * However, some old syscall return only 32 lower bits (one word).
    102  * Example: sys_sigpending vs sys_rt_sigpending.
    103  *
    104  * Be aware of this fact when you try to
    105  *     memcpy(&tcp->u_arg[1], &something, sizeof(sigset_t))
    106  * - sizeof(sigset_t) is much bigger than you think,
    107  * it may overflow tcp->u_arg[] array, and it may try to copy more data
    108  * than is really available in <something>.
    109  * Similarly,
    110  *     umoven(tcp, addr, sizeof(sigset_t), &sigset)
    111  * may be a bad idea: it'll try to read much more data than needed
    112  * to fetch a sigset_t.
    113  * Use (NSIG / 8) as a size instead.
    114  */
    115 
    116 const char *
    117 signame(const int sig)
    118 {
    119 	static char buf[sizeof("SIGRT_%u") + sizeof(int)*3];
    120 
    121 	if (sig >= 0) {
    122 		const unsigned int s = sig;
    123 
    124 		if (s < nsignals)
    125 			return signalent[s];
    126 #ifdef ASM_SIGRTMAX
    127 		if (s >= ASM_SIGRTMIN && s <= ASM_SIGRTMAX) {
    128 			sprintf(buf, "SIGRT_%u", s - ASM_SIGRTMIN);
    129 			return buf;
    130 		}
    131 #endif
    132 	}
    133 	sprintf(buf, "%d", sig);
    134 	return buf;
    135 }
    136 
    137 static unsigned int
    138 popcount32(const uint32_t *a, unsigned int size)
    139 {
    140 	unsigned int count = 0;
    141 
    142 	for (; size; ++a, --size) {
    143 		uint32_t x = *a;
    144 
    145 #ifdef HAVE___BUILTIN_POPCOUNT
    146 		count += __builtin_popcount(x);
    147 #else
    148 		for (; x; ++count)
    149 			x &= x - 1;
    150 #endif
    151 	}
    152 
    153 	return count;
    154 }
    155 
    156 const char *
    157 sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes)
    158 {
    159 	/*
    160 	 * The maximum number of signal names to be printed is NSIG * 2 / 3.
    161 	 * Most of signal names have length 7,
    162 	 * average length of signal names is less than 7.
    163 	 * The length of prefix string does not exceed 16.
    164 	 */
    165 	static char outstr[128 + 8 * (NSIG * 2 / 3)];
    166 
    167 	char *s;
    168 	const uint32_t *mask;
    169 	uint32_t inverted_mask[NSIG / 32];
    170 	unsigned int size;
    171 	int i;
    172 	char sep;
    173 
    174 	s = stpcpy(outstr, prefix);
    175 
    176 	mask = sig_mask;
    177 	/* length of signal mask in 4-byte words */
    178 	size = (bytes >= NSIG / 8) ? NSIG / 32 : (bytes + 3) / 4;
    179 
    180 	/* check whether 2/3 or more bits are set */
    181 	if (popcount32(mask, size) >= size * 32 * 2 / 3) {
    182 		/* show those signals that are NOT in the mask */
    183 		unsigned int j;
    184 		for (j = 0; j < size; ++j)
    185 			inverted_mask[j] = ~mask[j];
    186 		mask = inverted_mask;
    187 		*s++ = '~';
    188 	}
    189 
    190 	sep = '[';
    191 	for (i = 0; (i = next_set_bit(mask, i, size * 32)) >= 0; ) {
    192 		++i;
    193 		*s++ = sep;
    194 		if ((unsigned) i < nsignals) {
    195 			s = stpcpy(s, signalent[i] + 3);
    196 		}
    197 #ifdef ASM_SIGRTMAX
    198 		else if (i >= ASM_SIGRTMIN && i <= ASM_SIGRTMAX) {
    199 			s += sprintf(s, "RT_%u", i - ASM_SIGRTMIN);
    200 		}
    201 #endif
    202 		else {
    203 			s += sprintf(s, "%u", i);
    204 		}
    205 		sep = ' ';
    206 	}
    207 	if (sep == '[')
    208 		*s++ = sep;
    209 	*s++ = ']';
    210 	*s = '\0';
    211 	return outstr;
    212 }
    213 
    214 #define sprintsigmask_val(prefix, mask) \
    215 	sprintsigmask_n((prefix), &(mask), sizeof(mask))
    216 
    217 #define tprintsigmask_val(prefix, mask) \
    218 	tprints(sprintsigmask_n((prefix), &(mask), sizeof(mask)))
    219 
    220 void
    221 printsignal(int nr)
    222 {
    223 	tprints(signame(nr));
    224 }
    225 
    226 void
    227 print_sigset_addr_len(struct tcb *tcp, long addr, long len)
    228 {
    229 	char mask[NSIG / 8];
    230 
    231 	/* Here len is usually equals NSIG / 8 or current_wordsize.
    232 	 * But we code this defensively:
    233 	 */
    234 	if (len < 0) {
    235 		printaddr(addr);
    236 		return;
    237 	}
    238 	if (len >= NSIG / 8)
    239 		len = NSIG / 8;
    240 	else
    241 		len = (len + 3) & ~3;
    242 
    243 	if (umoven_or_printaddr(tcp, addr, len, mask))
    244 		return;
    245 	tprints(sprintsigmask_n("", mask, len));
    246 }
    247 
    248 SYS_FUNC(sigsetmask)
    249 {
    250 	if (entering(tcp)) {
    251 		tprintsigmask_val("", tcp->u_arg[0]);
    252 	}
    253 	else if (!syserror(tcp)) {
    254 		tcp->auxstr = sprintsigmask_val("old mask ", tcp->u_rval);
    255 		return RVAL_HEX | RVAL_STR;
    256 	}
    257 	return 0;
    258 }
    259 
    260 #ifdef HAVE_SIGACTION
    261 
    262 struct old_sigaction {
    263 	/* sa_handler may be a libc #define, need to use other name: */
    264 #ifdef MIPS
    265 	unsigned int sa_flags;
    266 	void (*__sa_handler)(int);
    267 	/* Kernel treats sa_mask as an array of longs. */
    268 	unsigned long sa_mask[NSIG / sizeof(long) ? NSIG / sizeof(long) : 1];
    269 #else
    270 	void (*__sa_handler)(int);
    271 	unsigned long sa_mask;
    272 	unsigned long sa_flags;
    273 #endif /* !MIPS */
    274 #if HAVE_SA_RESTORER
    275 	void (*sa_restorer)(void);
    276 #endif
    277 };
    278 
    279 struct old_sigaction32 {
    280 	/* sa_handler may be a libc #define, need to use other name: */
    281 	uint32_t __sa_handler;
    282 	uint32_t sa_mask;
    283 	uint32_t sa_flags;
    284 #if HAVE_SA_RESTORER
    285 	uint32_t sa_restorer;
    286 #endif
    287 };
    288 
    289 static void
    290 decode_old_sigaction(struct tcb *tcp, long addr)
    291 {
    292 	struct old_sigaction sa;
    293 
    294 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    295 	if (current_wordsize != sizeof(sa.__sa_handler) && current_wordsize == 4) {
    296 		struct old_sigaction32 sa32;
    297 
    298 		if (umove_or_printaddr(tcp, addr, &sa32))
    299 			return;
    300 
    301 		memset(&sa, 0, sizeof(sa));
    302 		sa.__sa_handler = (void*)(uintptr_t)sa32.__sa_handler;
    303 		sa.sa_flags = sa32.sa_flags;
    304 #if HAVE_SA_RESTORER && defined SA_RESTORER
    305 		sa.sa_restorer = (void*)(uintptr_t)sa32.sa_restorer;
    306 #endif
    307 		sa.sa_mask = sa32.sa_mask;
    308 	} else
    309 #endif
    310 	if (umove_or_printaddr(tcp, addr, &sa))
    311 		return;
    312 
    313 	/* Architectures using function pointers, like
    314 	 * hppa, may need to manipulate the function pointer
    315 	 * to compute the result of a comparison. However,
    316 	 * the __sa_handler function pointer exists only in
    317 	 * the address space of the traced process, and can't
    318 	 * be manipulated by strace. In order to prevent the
    319 	 * compiler from generating code to manipulate
    320 	 * __sa_handler we cast the function pointers to long. */
    321 	tprints("{");
    322 	if ((long)sa.__sa_handler == (long)SIG_ERR)
    323 		tprints("SIG_ERR");
    324 	else if ((long)sa.__sa_handler == (long)SIG_DFL)
    325 		tprints("SIG_DFL");
    326 	else if ((long)sa.__sa_handler == (long)SIG_IGN)
    327 		tprints("SIG_IGN");
    328 	else
    329 		printaddr((long) sa.__sa_handler);
    330 	tprints(", ");
    331 #ifdef MIPS
    332 	tprintsigmask_addr("", sa.sa_mask);
    333 #else
    334 	tprintsigmask_val("", sa.sa_mask);
    335 #endif
    336 	tprints(", ");
    337 	printflags(sigact_flags, sa.sa_flags, "SA_???");
    338 #if HAVE_SA_RESTORER && defined SA_RESTORER
    339 	if (sa.sa_flags & SA_RESTORER)
    340 		tprintf(", %p", sa.sa_restorer);
    341 #endif
    342 	tprints("}");
    343 }
    344 
    345 SYS_FUNC(sigaction)
    346 {
    347 	if (entering(tcp)) {
    348 		printsignal(tcp->u_arg[0]);
    349 		tprints(", ");
    350 		decode_old_sigaction(tcp, tcp->u_arg[1]);
    351 		tprints(", ");
    352 	} else
    353 		decode_old_sigaction(tcp, tcp->u_arg[2]);
    354 	return 0;
    355 }
    356 
    357 SYS_FUNC(signal)
    358 {
    359 	if (entering(tcp)) {
    360 		printsignal(tcp->u_arg[0]);
    361 		tprints(", ");
    362 		switch (tcp->u_arg[1]) {
    363 		case (long) SIG_ERR:
    364 			tprints("SIG_ERR");
    365 			break;
    366 		case (long) SIG_DFL:
    367 			tprints("SIG_DFL");
    368 			break;
    369 		case (long) SIG_IGN:
    370 			tprints("SIG_IGN");
    371 			break;
    372 		default:
    373 			printaddr(tcp->u_arg[1]);
    374 		}
    375 		return 0;
    376 	}
    377 	else if (!syserror(tcp)) {
    378 		switch (tcp->u_rval) {
    379 		case (long) SIG_ERR:
    380 			tcp->auxstr = "SIG_ERR"; break;
    381 		case (long) SIG_DFL:
    382 			tcp->auxstr = "SIG_DFL"; break;
    383 		case (long) SIG_IGN:
    384 			tcp->auxstr = "SIG_IGN"; break;
    385 		default:
    386 			tcp->auxstr = NULL;
    387 		}
    388 		return RVAL_HEX | RVAL_STR;
    389 	}
    390 	return 0;
    391 }
    392 
    393 #endif /* HAVE_SIGACTION */
    394 
    395 SYS_FUNC(siggetmask)
    396 {
    397 	if (exiting(tcp)) {
    398 		tcp->auxstr = sprintsigmask_val("mask ", tcp->u_rval);
    399 	}
    400 	return RVAL_HEX | RVAL_STR;
    401 }
    402 
    403 SYS_FUNC(sigsuspend)
    404 {
    405 	tprintsigmask_val("", tcp->u_arg[2]);
    406 
    407 	return RVAL_DECODED;
    408 }
    409 
    410 #ifdef HAVE_SIGACTION
    411 
    412 /* "Old" sigprocmask, which operates with word-sized signal masks */
    413 SYS_FUNC(sigprocmask)
    414 {
    415 # ifdef ALPHA
    416 	if (entering(tcp)) {
    417 		/*
    418 		 * Alpha/OSF is different: it doesn't pass in two pointers,
    419 		 * but rather passes in the new bitmask as an argument and
    420 		 * then returns the old bitmask.  This "works" because we
    421 		 * only have 64 signals to worry about.  If you want more,
    422 		 * use of the rt_sigprocmask syscall is required.
    423 		 * Alpha:
    424 		 *	old = osf_sigprocmask(how, new);
    425 		 * Everyone else:
    426 		 *	ret = sigprocmask(how, &new, &old, ...);
    427 		 */
    428 		printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
    429 		tprintsigmask_val(", ", tcp->u_arg[1]);
    430 	}
    431 	else if (!syserror(tcp)) {
    432 		tcp->auxstr = sprintsigmask_val("old mask ", tcp->u_rval);
    433 		return RVAL_HEX | RVAL_STR;
    434 	}
    435 # else /* !ALPHA */
    436 	if (entering(tcp)) {
    437 		printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
    438 		tprints(", ");
    439 		print_sigset_addr_len(tcp, tcp->u_arg[1], current_wordsize);
    440 		tprints(", ");
    441 	}
    442 	else {
    443 		print_sigset_addr_len(tcp, tcp->u_arg[2], current_wordsize);
    444 	}
    445 # endif /* !ALPHA */
    446 	return 0;
    447 }
    448 
    449 #endif /* HAVE_SIGACTION */
    450 
    451 SYS_FUNC(kill)
    452 {
    453 	tprintf("%ld, %s",
    454 		widen_to_long(tcp->u_arg[0]),
    455 		signame(tcp->u_arg[1]));
    456 
    457 	return RVAL_DECODED;
    458 }
    459 
    460 SYS_FUNC(tgkill)
    461 {
    462 	tprintf("%ld, %ld, %s",
    463 		widen_to_long(tcp->u_arg[0]),
    464 		widen_to_long(tcp->u_arg[1]),
    465 		signame(tcp->u_arg[2]));
    466 
    467 	return RVAL_DECODED;
    468 }
    469 
    470 SYS_FUNC(sigpending)
    471 {
    472 	if (exiting(tcp))
    473 		print_sigset_addr_len(tcp, tcp->u_arg[0], current_wordsize);
    474 	return 0;
    475 }
    476 
    477 SYS_FUNC(rt_sigprocmask)
    478 {
    479 	/* Note: arg[3] is the length of the sigset. Kernel requires NSIG / 8 */
    480 	if (entering(tcp)) {
    481 		printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???");
    482 		tprints(", ");
    483 		print_sigset_addr_len(tcp, tcp->u_arg[1], tcp->u_arg[3]);
    484 		tprints(", ");
    485 	}
    486 	else {
    487 		print_sigset_addr_len(tcp, tcp->u_arg[2], tcp->u_arg[3]);
    488 		tprintf(", %lu", tcp->u_arg[3]);
    489 	}
    490 	return 0;
    491 }
    492 
    493 /* Structure describing the action to be taken when a signal arrives.  */
    494 struct new_sigaction
    495 {
    496 	/* sa_handler may be a libc #define, need to use other name: */
    497 #ifdef MIPS
    498 	unsigned int sa_flags;
    499 	void (*__sa_handler)(int);
    500 #else
    501 	void (*__sa_handler)(int);
    502 	unsigned long sa_flags;
    503 #endif /* !MIPS */
    504 #if HAVE_SA_RESTORER
    505 	void (*sa_restorer)(void);
    506 #endif
    507 	/* Kernel treats sa_mask as an array of longs. */
    508 	unsigned long sa_mask[NSIG / sizeof(long) ? NSIG / sizeof(long) : 1];
    509 };
    510 /* Same for i386-on-x86_64 and similar cases */
    511 struct new_sigaction32
    512 {
    513 	uint32_t __sa_handler;
    514 	uint32_t sa_flags;
    515 #if HAVE_SA_RESTORER
    516 	uint32_t sa_restorer;
    517 #endif
    518 	uint32_t sa_mask[2 * (NSIG / sizeof(long) ? NSIG / sizeof(long) : 1)];
    519 };
    520 
    521 static void
    522 decode_new_sigaction(struct tcb *tcp, long addr)
    523 {
    524 	struct new_sigaction sa;
    525 
    526 #if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
    527 	if (current_wordsize != sizeof(sa.sa_flags) && current_wordsize == 4) {
    528 		struct new_sigaction32 sa32;
    529 
    530 		if (umove_or_printaddr(tcp, addr, &sa32))
    531 			return;
    532 
    533 		memset(&sa, 0, sizeof(sa));
    534 		sa.__sa_handler = (void*)(unsigned long)sa32.__sa_handler;
    535 		sa.sa_flags     = sa32.sa_flags;
    536 #if HAVE_SA_RESTORER && defined SA_RESTORER
    537 		sa.sa_restorer  = (void*)(unsigned long)sa32.sa_restorer;
    538 #endif
    539 		/* Kernel treats sa_mask as an array of longs.
    540 		 * For 32-bit process, "long" is uint32_t, thus, for example,
    541 		 * 32th bit in sa_mask will end up as bit 0 in sa_mask[1].
    542 		 * But for (64-bit) kernel, 32th bit in sa_mask is
    543 		 * 32th bit in 0th (64-bit) long!
    544 		 * For little-endian, it's the same.
    545 		 * For big-endian, we swap 32-bit words.
    546 		 */
    547 		sa.sa_mask[0] = sa32.sa_mask[0] + ((long)(sa32.sa_mask[1]) << 32);
    548 	} else
    549 #endif
    550 	if (umove_or_printaddr(tcp, addr, &sa))
    551 		return;
    552 
    553 	/* Architectures using function pointers, like
    554 	 * hppa, may need to manipulate the function pointer
    555 	 * to compute the result of a comparison. However,
    556 	 * the __sa_handler function pointer exists only in
    557 	 * the address space of the traced process, and can't
    558 	 * be manipulated by strace. In order to prevent the
    559 	 * compiler from generating code to manipulate
    560 	 * __sa_handler we cast the function pointers to long. */
    561 	if ((long)sa.__sa_handler == (long)SIG_ERR)
    562 		tprints("{SIG_ERR, ");
    563 	else if ((long)sa.__sa_handler == (long)SIG_DFL)
    564 		tprints("{SIG_DFL, ");
    565 	else if ((long)sa.__sa_handler == (long)SIG_IGN)
    566 		tprints("{SIG_IGN, ");
    567 	else
    568 		tprintf("{%#lx, ", (long) sa.__sa_handler);
    569 	/*
    570 	 * Sigset size is in tcp->u_arg[4] (SPARC)
    571 	 * or in tcp->u_arg[3] (all other),
    572 	 * but kernel won't handle sys_rt_sigaction
    573 	 * with wrong sigset size (just returns EINVAL instead).
    574 	 * We just fetch the right size, which is NSIG / 8.
    575 	 */
    576 	tprintsigmask_val("", sa.sa_mask);
    577 	tprints(", ");
    578 
    579 	printflags(sigact_flags, sa.sa_flags, "SA_???");
    580 #if HAVE_SA_RESTORER && defined SA_RESTORER
    581 	if (sa.sa_flags & SA_RESTORER)
    582 		tprintf(", %p", sa.sa_restorer);
    583 #endif
    584 	tprints("}");
    585 }
    586 
    587 SYS_FUNC(rt_sigaction)
    588 {
    589 	if (entering(tcp)) {
    590 		printsignal(tcp->u_arg[0]);
    591 		tprints(", ");
    592 		decode_new_sigaction(tcp, tcp->u_arg[1]);
    593 		tprints(", ");
    594 	} else {
    595 		decode_new_sigaction(tcp, tcp->u_arg[2]);
    596 #if defined(SPARC) || defined(SPARC64)
    597 		tprintf(", %#lx, %lu", tcp->u_arg[3], tcp->u_arg[4]);
    598 #elif defined(ALPHA)
    599 		tprintf(", %lu, %#lx", tcp->u_arg[3], tcp->u_arg[4]);
    600 #else
    601 		tprintf(", %lu", tcp->u_arg[3]);
    602 #endif
    603 	}
    604 	return 0;
    605 }
    606 
    607 SYS_FUNC(rt_sigpending)
    608 {
    609 	if (exiting(tcp)) {
    610 		/*
    611 		 * One of the few syscalls where sigset size (arg[1])
    612 		 * is allowed to be <= NSIG / 8, not strictly ==.
    613 		 * This allows non-rt sigpending() syscall
    614 		 * to reuse rt_sigpending() code in kernel.
    615 		 */
    616 		print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]);
    617 		tprintf(", %lu", tcp->u_arg[1]);
    618 	}
    619 	return 0;
    620 }
    621 
    622 SYS_FUNC(rt_sigsuspend)
    623 {
    624 	/* NB: kernel requires arg[1] == NSIG / 8 */
    625 	print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]);
    626 	tprintf(", %lu", tcp->u_arg[1]);
    627 
    628 	return RVAL_DECODED;
    629 }
    630 
    631 static void
    632 print_sigqueueinfo(struct tcb *tcp, int sig, unsigned long uinfo)
    633 {
    634 	printsignal(sig);
    635 	tprints(", ");
    636 	printsiginfo_at(tcp, uinfo);
    637 }
    638 
    639 SYS_FUNC(rt_sigqueueinfo)
    640 {
    641 	tprintf("%lu, ", tcp->u_arg[0]);
    642 	print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]);
    643 
    644 	return RVAL_DECODED;
    645 }
    646 
    647 SYS_FUNC(rt_tgsigqueueinfo)
    648 {
    649 	tprintf("%lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
    650 	print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]);
    651 
    652 	return RVAL_DECODED;
    653 }
    654 
    655 SYS_FUNC(rt_sigtimedwait)
    656 {
    657 	/* NB: kernel requires arg[3] == NSIG / 8 */
    658 	if (entering(tcp)) {
    659 		print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[3]);
    660 		tprints(", ");
    661 		/* This is the only "return" parameter, */
    662 		if (tcp->u_arg[1] != 0)
    663 			return 0;
    664 		/* ... if it's NULL, can decode all on entry */
    665 		tprints("NULL, ");
    666 	}
    667 	else if (tcp->u_arg[1] != 0) {
    668 		/* syscall exit, and u_arg[1] wasn't NULL */
    669 		printsiginfo_at(tcp, tcp->u_arg[1]);
    670 		tprints(", ");
    671 	}
    672 	else {
    673 		/* syscall exit, and u_arg[1] was NULL */
    674 		return 0;
    675 	}
    676 
    677 	/*
    678 	 * Since the timeout parameter is read by the kernel
    679 	 * on entering syscall, it has to be decoded the same way
    680 	 * whether the syscall has failed or not.
    681 	 */
    682 	temporarily_clear_syserror(tcp);
    683 	print_timespec(tcp, tcp->u_arg[2]);
    684 	restore_cleared_syserror(tcp);
    685 
    686 	tprintf(", %lu", tcp->u_arg[3]);
    687 	return 0;
    688 };
    689 
    690 SYS_FUNC(restart_syscall)
    691 {
    692 	tprintf("<... resuming interrupted %s ...>",
    693 		tcp->s_prev_ent ? tcp->s_prev_ent->sys_name : "system call");
    694 
    695 	return RVAL_DECODED;
    696 }
    697