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 * Copyright (c) 2001-2018 The strace developers. 10 * All rights reserved. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. The name of the author may not be used to endorse or promote products 21 * derived from this software without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include "defs.h" 36 #include "nsig.h" 37 #include "xstring.h" 38 39 /* The libc headers do not define this constant since it should only be 40 used by the implementation. So we define it here. */ 41 #ifndef SA_RESTORER 42 # ifdef ASM_SA_RESTORER 43 # define SA_RESTORER ASM_SA_RESTORER 44 # endif 45 #endif 46 47 /* 48 * Some architectures define SA_RESTORER in their headers, 49 * but do not actually have sa_restorer. 50 * 51 * Some architectures, otherwise, do not define SA_RESTORER in their headers, 52 * but actually have sa_restorer. 53 */ 54 #ifdef HAVE_ARCH_SA_RESTORER 55 # define HAVE_SA_RESTORER HAVE_ARCH_SA_RESTORER 56 #else /* !HAVE_ARCH_SA_RESTORER */ 57 # ifdef SA_RESTORER 58 # define HAVE_SA_RESTORER 1 59 # else 60 # define HAVE_SA_RESTORER 0 61 # endif 62 #endif /* HAVE_ARCH_SA_RESTORER */ 63 64 #include "xlat/sa_handler_values.h" 65 #include "xlat/sigact_flags.h" 66 #include "xlat/sigprocmaskcmds.h" 67 68 /* Anonymous realtime signals. */ 69 #ifndef ASM_SIGRTMIN 70 /* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */ 71 # define ASM_SIGRTMIN 32 72 #endif 73 #ifndef ASM_SIGRTMAX 74 /* Under glibc 2.1, SIGRTMAX et al are functions, but __SIGRTMAX is a 75 constant. This is what we want. Otherwise, just use SIGRTMAX. */ 76 # ifdef SIGRTMAX 77 # ifndef __SIGRTMAX 78 # define __SIGRTMAX SIGRTMAX 79 # endif 80 # endif 81 # ifdef __SIGRTMAX 82 # define ASM_SIGRTMAX __SIGRTMAX 83 # endif 84 #endif 85 86 /* Note on the size of sigset_t: 87 * 88 * In glibc, sigset_t is an array with space for 1024 bits (!), 89 * even though all arches supported by Linux have only 64 signals 90 * except MIPS, which has 128. IOW, it is 128 bytes long. 91 * 92 * In-kernel sigset_t is sized correctly (it is either 64 or 128 bit long). 93 * However, some old syscall return only 32 lower bits (one word). 94 * Example: sys_sigpending vs sys_rt_sigpending. 95 * 96 * Be aware of this fact when you try to 97 * memcpy(&tcp->u_arg[1], &something, sizeof(sigset_t)) 98 * - sizeof(sigset_t) is much bigger than you think, 99 * it may overflow tcp->u_arg[] array, and it may try to copy more data 100 * than is really available in <something>. 101 * Similarly, 102 * umoven(tcp, addr, sizeof(sigset_t), &sigset) 103 * may be a bad idea: it'll try to read much more data than needed 104 * to fetch a sigset_t. 105 * Use NSIG_BYTES as a size instead. 106 */ 107 108 static const char * 109 get_sa_handler_str(kernel_ulong_t handler) 110 { 111 return xlookup(sa_handler_values, handler); 112 } 113 114 static void 115 print_sa_handler(kernel_ulong_t handler) 116 { 117 const char *sa_handler_str = get_sa_handler_str(handler); 118 119 if (sa_handler_str) 120 tprints(sa_handler_str); 121 else 122 printaddr(handler); 123 } 124 125 const char * 126 signame(const int sig) 127 { 128 static char buf[sizeof("SIGRT_%u") + sizeof(int)*3]; 129 130 if (sig >= 0) { 131 const unsigned int s = sig; 132 133 if (s < nsignals) 134 return signalent[s]; 135 #ifdef ASM_SIGRTMAX 136 if (s >= ASM_SIGRTMIN && s <= (unsigned int) ASM_SIGRTMAX) { 137 xsprintf(buf, "SIGRT_%u", s - ASM_SIGRTMIN); 138 return buf; 139 } 140 #endif 141 } 142 xsprintf(buf, "%d", sig); 143 return buf; 144 } 145 146 static unsigned int 147 popcount32(const uint32_t *a, unsigned int size) 148 { 149 unsigned int count = 0; 150 151 for (; size; ++a, --size) { 152 uint32_t x = *a; 153 154 #ifdef HAVE___BUILTIN_POPCOUNT 155 count += __builtin_popcount(x); 156 #else 157 for (; x; ++count) 158 x &= x - 1; 159 #endif 160 } 161 162 return count; 163 } 164 165 const char * 166 sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes) 167 { 168 /* 169 * The maximum number of signal names to be printed 170 * is NSIG_BYTES * 8 * 2 / 3. 171 * Most of signal names have length 7, 172 * average length of signal names is less than 7. 173 * The length of prefix string does not exceed 16. 174 */ 175 static char outstr[128 + 8 * (NSIG_BYTES * 8 * 2 / 3)]; 176 177 char *s; 178 const uint32_t *mask; 179 uint32_t inverted_mask[NSIG_BYTES / 4]; 180 unsigned int size; 181 int i; 182 char sep; 183 184 s = stpcpy(outstr, prefix); 185 186 mask = sig_mask; 187 /* length of signal mask in 4-byte words */ 188 size = (bytes >= NSIG_BYTES) ? NSIG_BYTES / 4 : (bytes + 3) / 4; 189 190 /* check whether 2/3 or more bits are set */ 191 if (popcount32(mask, size) >= size * (4 * 8) * 2 / 3) { 192 /* show those signals that are NOT in the mask */ 193 unsigned int j; 194 for (j = 0; j < size; ++j) 195 inverted_mask[j] = ~mask[j]; 196 mask = inverted_mask; 197 *s++ = '~'; 198 } 199 200 sep = '['; 201 for (i = 0; (i = next_set_bit(mask, i, size * (4 * 8))) >= 0; ) { 202 ++i; 203 *s++ = sep; 204 if ((unsigned) i < nsignals) { 205 s = stpcpy(s, signalent[i] + 3); 206 } 207 #ifdef ASM_SIGRTMAX 208 else if (i >= ASM_SIGRTMIN && i <= ASM_SIGRTMAX) { 209 s = xappendstr(outstr, s, "RT_%u", i - ASM_SIGRTMIN); 210 } 211 #endif 212 else { 213 s = xappendstr(outstr, s, "%u", i); 214 } 215 sep = ' '; 216 } 217 if (sep == '[') 218 *s++ = sep; 219 *s++ = ']'; 220 *s = '\0'; 221 return outstr; 222 } 223 224 #define sprintsigmask_val(prefix, mask) \ 225 sprintsigmask_n((prefix), &(mask), sizeof(mask)) 226 227 #define tprintsigmask_val(prefix, mask) \ 228 tprints(sprintsigmask_n((prefix), &(mask), sizeof(mask))) 229 230 static const char * 231 sprint_old_sigmask_val(const char *const prefix, const unsigned long mask) 232 { 233 #if defined(current_wordsize) || !defined(WORDS_BIGENDIAN) 234 return sprintsigmask_n(prefix, &mask, current_wordsize); 235 #else /* !current_wordsize && WORDS_BIGENDIAN */ 236 if (current_wordsize == sizeof(mask)) { 237 return sprintsigmask_val(prefix, mask); 238 } else { 239 uint32_t mask32 = mask; 240 return sprintsigmask_val(prefix, mask32); 241 } 242 #endif 243 } 244 245 #define tprint_old_sigmask_val(prefix, mask) \ 246 tprints(sprint_old_sigmask_val((prefix), (mask))) 247 248 void 249 printsignal(int nr) 250 { 251 tprints(signame(nr)); 252 } 253 254 static void 255 print_sigset_addr_len_limit(struct tcb *const tcp, const kernel_ulong_t addr, 256 const kernel_ulong_t len, const unsigned int min_len) 257 { 258 /* 259 * Here len is usually equal to NSIG_BYTES or current_wordsize. 260 * But we code this defensively: 261 */ 262 if (len < min_len || len > NSIG_BYTES) { 263 printaddr(addr); 264 return; 265 } 266 int mask[NSIG_BYTES / sizeof(int)] = {}; 267 if (umoven_or_printaddr(tcp, addr, len, mask)) 268 return; 269 tprints(sprintsigmask_n("", mask, len)); 270 } 271 272 void 273 print_sigset_addr_len(struct tcb *const tcp, const kernel_ulong_t addr, 274 const kernel_ulong_t len) 275 { 276 print_sigset_addr_len_limit(tcp, addr, len, current_wordsize); 277 } 278 279 void 280 print_sigset_addr(struct tcb *const tcp, const kernel_ulong_t addr) 281 { 282 print_sigset_addr_len_limit(tcp, addr, NSIG_BYTES, NSIG_BYTES); 283 } 284 285 SYS_FUNC(ssetmask) 286 { 287 if (entering(tcp)) { 288 tprint_old_sigmask_val("", (unsigned) tcp->u_arg[0]); 289 } else if (!syserror(tcp)) { 290 tcp->auxstr = sprint_old_sigmask_val("old mask ", 291 (unsigned) tcp->u_rval); 292 return RVAL_HEX | RVAL_STR; 293 } 294 return 0; 295 } 296 297 struct old_sigaction { 298 /* sa_handler may be a libc #define, need to use other name: */ 299 #if defined MIPS 300 unsigned int sa_flags; 301 unsigned long sa_handler__; 302 unsigned long sa_mask; 303 #elif defined ALPHA 304 unsigned long sa_handler__; 305 unsigned long sa_mask; 306 unsigned int sa_flags; 307 #else 308 unsigned long sa_handler__; 309 unsigned long sa_mask; 310 unsigned long sa_flags; 311 unsigned long sa_restorer; 312 #endif 313 } 314 #ifdef ALPHA 315 ATTRIBUTE_PACKED 316 #endif 317 ; 318 319 static void 320 decode_old_sigaction(struct tcb *const tcp, const kernel_ulong_t addr) 321 { 322 struct old_sigaction sa; 323 324 #ifndef current_wordsize 325 if (current_wordsize < sizeof(sa.sa_handler__)) { 326 struct old_sigaction32 { 327 uint32_t sa_handler__; 328 uint32_t sa_mask; 329 uint32_t sa_flags; 330 uint32_t sa_restorer; 331 } sa32; 332 333 if (umove_or_printaddr(tcp, addr, &sa32)) 334 return; 335 336 memset(&sa, 0, sizeof(sa)); 337 sa.sa_handler__ = sa32.sa_handler__; 338 sa.sa_flags = sa32.sa_flags; 339 sa.sa_restorer = sa32.sa_restorer; 340 sa.sa_mask = sa32.sa_mask; 341 } else 342 #endif 343 if (umove_or_printaddr(tcp, addr, &sa)) 344 return; 345 346 tprints("{sa_handler="); 347 print_sa_handler(sa.sa_handler__); 348 tprints(", sa_mask="); 349 tprint_old_sigmask_val("", sa.sa_mask); 350 tprints(", sa_flags="); 351 printflags(sigact_flags, sa.sa_flags, "SA_???"); 352 #if !(defined ALPHA || defined MIPS) 353 if (sa.sa_flags & 0x04000000U) { 354 tprints(", sa_restorer="); 355 printaddr(sa.sa_restorer); 356 } 357 #endif 358 tprints("}"); 359 } 360 361 SYS_FUNC(sigaction) 362 { 363 if (entering(tcp)) { 364 int signo = tcp->u_arg[0]; 365 #if defined SPARC || defined SPARC64 366 if (signo < 0) { 367 tprints("-"); 368 signo = -signo; 369 } 370 #endif 371 printsignal(signo); 372 tprints(", "); 373 decode_old_sigaction(tcp, tcp->u_arg[1]); 374 tprints(", "); 375 } else 376 decode_old_sigaction(tcp, tcp->u_arg[2]); 377 return 0; 378 } 379 380 SYS_FUNC(signal) 381 { 382 if (entering(tcp)) { 383 printsignal(tcp->u_arg[0]); 384 tprints(", "); 385 print_sa_handler(tcp->u_arg[1]); 386 return 0; 387 } else if (!syserror(tcp)) { 388 tcp->auxstr = get_sa_handler_str(tcp->u_rval); 389 return RVAL_HEX | RVAL_STR; 390 } 391 return 0; 392 } 393 394 SYS_FUNC(sgetmask) 395 { 396 if (exiting(tcp) && !syserror(tcp)) { 397 tcp->auxstr = sprint_old_sigmask_val("mask ", tcp->u_rval); 398 return RVAL_HEX | RVAL_STR; 399 } 400 return 0; 401 } 402 403 SYS_FUNC(sigsuspend) 404 { 405 #ifdef MIPS 406 print_sigset_addr_len(tcp, tcp->u_arg[tcp->s_ent->nargs - 1], 407 current_wordsize); 408 #else 409 tprint_old_sigmask_val("", tcp->u_arg[tcp->s_ent->nargs - 1]); 410 #endif 411 412 return RVAL_DECODED; 413 } 414 415 #ifdef ALPHA 416 /* 417 * The OSF/1 sigprocmask is different: it doesn't pass in two pointers, 418 * but rather passes in the new bitmask as an argument and then returns 419 * the old bitmask. This "works" because we only have 64 signals to worry 420 * about. If you want more, use of the rt_sigprocmask syscall is required. 421 * 422 * Alpha: 423 * old = osf_sigprocmask(how, new); 424 * Everyone else: 425 * ret = sigprocmask(how, &new, &old, ...); 426 */ 427 SYS_FUNC(osf_sigprocmask) 428 { 429 if (entering(tcp)) { 430 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???"); 431 tprintsigmask_val(", ", tcp->u_arg[1]); 432 } else if (!syserror(tcp)) { 433 tcp->auxstr = sprintsigmask_val("old mask ", tcp->u_rval); 434 return RVAL_HEX | RVAL_STR; 435 } 436 return 0; 437 } 438 439 #else /* !ALPHA */ 440 441 /* "Old" sigprocmask, which operates with word-sized signal masks */ 442 SYS_FUNC(sigprocmask) 443 { 444 if (entering(tcp)) { 445 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???"); 446 tprints(", "); 447 print_sigset_addr_len(tcp, tcp->u_arg[1], current_wordsize); 448 tprints(", "); 449 } else { 450 print_sigset_addr_len(tcp, tcp->u_arg[2], current_wordsize); 451 } 452 return 0; 453 } 454 #endif /* !ALPHA */ 455 456 SYS_FUNC(kill) 457 { 458 tprintf("%d, %s", 459 (int) tcp->u_arg[0], 460 signame(tcp->u_arg[1])); 461 462 return RVAL_DECODED; 463 } 464 465 SYS_FUNC(tgkill) 466 { 467 tprintf("%d, %d, %s", 468 (int) tcp->u_arg[0], 469 (int) tcp->u_arg[1], 470 signame(tcp->u_arg[2])); 471 472 return RVAL_DECODED; 473 } 474 475 SYS_FUNC(sigpending) 476 { 477 if (exiting(tcp)) 478 print_sigset_addr_len(tcp, tcp->u_arg[0], current_wordsize); 479 return 0; 480 } 481 482 SYS_FUNC(rt_sigprocmask) 483 { 484 /* Note: arg[3] is the length of the sigset. Kernel requires NSIG_BYTES */ 485 if (entering(tcp)) { 486 printxval(sigprocmaskcmds, tcp->u_arg[0], "SIG_???"); 487 tprints(", "); 488 print_sigset_addr_len(tcp, tcp->u_arg[1], tcp->u_arg[3]); 489 tprints(", "); 490 } else { 491 print_sigset_addr_len(tcp, tcp->u_arg[2], tcp->u_arg[3]); 492 tprintf(", %" PRI_klu, tcp->u_arg[3]); 493 } 494 return 0; 495 } 496 497 /* Structure describing the action to be taken when a signal arrives. */ 498 struct new_sigaction { 499 /* sa_handler may be a libc #define, need to use other name: */ 500 #ifdef MIPS 501 unsigned int sa_flags; 502 unsigned long sa_handler__; 503 #else 504 unsigned long sa_handler__; 505 unsigned long sa_flags; 506 #endif /* !MIPS */ 507 #if HAVE_SA_RESTORER 508 unsigned long sa_restorer; 509 #endif 510 /* Kernel treats sa_mask as an array of longs. */ 511 unsigned long sa_mask[NSIG / sizeof(long)]; 512 }; 513 /* Same for i386-on-x86_64 and similar cases */ 514 struct new_sigaction32 { 515 uint32_t sa_handler__; 516 uint32_t sa_flags; 517 #if HAVE_SA_RESTORER 518 uint32_t sa_restorer; 519 #endif 520 uint32_t sa_mask[2 * (NSIG / sizeof(long))]; 521 }; 522 523 static void 524 decode_new_sigaction(struct tcb *const tcp, const kernel_ulong_t addr) 525 { 526 struct new_sigaction sa; 527 528 #ifndef current_wordsize 529 if (current_wordsize < sizeof(sa.sa_handler__)) { 530 struct new_sigaction32 sa32; 531 532 if (umove_or_printaddr(tcp, addr, &sa32)) 533 return; 534 535 memset(&sa, 0, sizeof(sa)); 536 sa.sa_handler__ = sa32.sa_handler__; 537 sa.sa_flags = sa32.sa_flags; 538 #if HAVE_SA_RESTORER && defined SA_RESTORER 539 sa.sa_restorer = sa32.sa_restorer; 540 #endif 541 /* Kernel treats sa_mask as an array of longs. 542 * For 32-bit process, "long" is uint32_t, thus, for example, 543 * 32th bit in sa_mask will end up as bit 0 in sa_mask[1]. 544 * But for (64-bit) kernel, 32th bit in sa_mask is 545 * 32th bit in 0th (64-bit) long! 546 * For little-endian, it's the same. 547 * For big-endian, we swap 32-bit words. 548 */ 549 sa.sa_mask[0] = ULONG_LONG(sa32.sa_mask[0], sa32.sa_mask[1]); 550 } else 551 #endif 552 if (umove_or_printaddr(tcp, addr, &sa)) 553 return; 554 555 tprints("{sa_handler="); 556 print_sa_handler(sa.sa_handler__); 557 tprints(", sa_mask="); 558 /* 559 * Sigset size is in tcp->u_arg[4] (SPARC) 560 * or in tcp->u_arg[3] (all other), 561 * but kernel won't handle sys_rt_sigaction 562 * with wrong sigset size (just returns EINVAL instead). 563 * We just fetch the right size, which is NSIG_BYTES. 564 */ 565 tprintsigmask_val("", sa.sa_mask); 566 tprints(", sa_flags="); 567 568 printflags(sigact_flags, sa.sa_flags, "SA_???"); 569 #if HAVE_SA_RESTORER && defined SA_RESTORER 570 if (sa.sa_flags & SA_RESTORER) { 571 tprints(", sa_restorer="); 572 printaddr(sa.sa_restorer); 573 } 574 #endif 575 tprints("}"); 576 } 577 578 SYS_FUNC(rt_sigaction) 579 { 580 if (entering(tcp)) { 581 printsignal(tcp->u_arg[0]); 582 tprints(", "); 583 decode_new_sigaction(tcp, tcp->u_arg[1]); 584 tprints(", "); 585 } else { 586 decode_new_sigaction(tcp, tcp->u_arg[2]); 587 #if defined(SPARC) || defined(SPARC64) 588 tprintf(", %#" PRI_klx ", %" PRI_klu, tcp->u_arg[3], tcp->u_arg[4]); 589 #elif defined(ALPHA) 590 tprintf(", %" PRI_klu ", %#" PRI_klx, tcp->u_arg[3], tcp->u_arg[4]); 591 #else 592 tprintf(", %" PRI_klu, tcp->u_arg[3]); 593 #endif 594 } 595 return 0; 596 } 597 598 SYS_FUNC(rt_sigpending) 599 { 600 if (exiting(tcp)) { 601 /* 602 * One of the few syscalls where sigset size (arg[1]) 603 * is allowed to be <= NSIG_BYTES, not strictly ==. 604 * This allows non-rt sigpending() syscall 605 * to reuse rt_sigpending() code in kernel. 606 */ 607 print_sigset_addr_len_limit(tcp, tcp->u_arg[0], 608 tcp->u_arg[1], 1); 609 tprintf(", %" PRI_klu, tcp->u_arg[1]); 610 } 611 return 0; 612 } 613 614 SYS_FUNC(rt_sigsuspend) 615 { 616 /* NB: kernel requires arg[1] == NSIG_BYTES */ 617 print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[1]); 618 tprintf(", %" PRI_klu, tcp->u_arg[1]); 619 620 return RVAL_DECODED; 621 } 622 623 static void 624 print_sigqueueinfo(struct tcb *const tcp, const int sig, 625 const kernel_ulong_t addr) 626 { 627 printsignal(sig); 628 tprints(", "); 629 printsiginfo_at(tcp, addr); 630 } 631 632 SYS_FUNC(rt_sigqueueinfo) 633 { 634 tprintf("%d, ", (int) tcp->u_arg[0]); 635 print_sigqueueinfo(tcp, tcp->u_arg[1], tcp->u_arg[2]); 636 637 return RVAL_DECODED; 638 } 639 640 SYS_FUNC(rt_tgsigqueueinfo) 641 { 642 tprintf("%d, %d, ", (int) tcp->u_arg[0], (int) tcp->u_arg[1]); 643 print_sigqueueinfo(tcp, tcp->u_arg[2], tcp->u_arg[3]); 644 645 return RVAL_DECODED; 646 } 647 648 SYS_FUNC(rt_sigtimedwait) 649 { 650 /* NB: kernel requires arg[3] == NSIG_BYTES */ 651 if (entering(tcp)) { 652 print_sigset_addr_len(tcp, tcp->u_arg[0], tcp->u_arg[3]); 653 tprints(", "); 654 if (!(tcp->u_arg[1] && verbose(tcp))) { 655 /* 656 * This is the only "return" parameter, 657 * if we are not going to fetch it on exit, 658 * decode all parameters on entry. 659 */ 660 printaddr(tcp->u_arg[1]); 661 tprints(", "); 662 print_timespec(tcp, tcp->u_arg[2]); 663 tprintf(", %" PRI_klu, tcp->u_arg[3]); 664 } else { 665 char *sts = xstrdup(sprint_timespec(tcp, tcp->u_arg[2])); 666 set_tcb_priv_data(tcp, sts, free); 667 } 668 } else { 669 if (tcp->u_arg[1] && verbose(tcp)) { 670 printsiginfo_at(tcp, tcp->u_arg[1]); 671 tprints(", "); 672 tprints(get_tcb_priv_data(tcp)); 673 tprintf(", %" PRI_klu, tcp->u_arg[3]); 674 } 675 676 if (!syserror(tcp) && tcp->u_rval) { 677 tcp->auxstr = signame(tcp->u_rval); 678 return RVAL_STR; 679 } 680 } 681 return 0; 682 } 683 684 SYS_FUNC(restart_syscall) 685 { 686 tprintf("<... resuming interrupted %s ...>", 687 tcp->s_prev_ent ? tcp->s_prev_ent->sys_name : "system call"); 688 689 return RVAL_DECODED; 690 } 691