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