printsiginfo.c revision a528eb5b493d0c722e5a8744bd4be52aa32c9edd
1537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "defs.h" 2537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 3537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigbus_codes.h" 4537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigchld_codes.h" 5537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigfpe_codes.h" 6537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigill_codes.h" 7537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/siginfo_codes.h" 8537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigpoll_codes.h" 9537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigprof_codes.h" 10537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigsegv_codes.h" 11537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigsys_codes.h" 12537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#include "xlat/sigtrap_codes.h" 13537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 14537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#ifdef SIGEMT 15537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin# include "xlat/sigemt_codes.h" 16537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#endif 17537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 18537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#ifndef SI_FROMUSER 19537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin# define SI_FROMUSER(sip) ((sip)->si_code <= 0) 20537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#endif 21537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 22537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinstatic void 23537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinprintsigsource(const siginfo_t *sip) 24537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin{ 25537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_pid=%lu, si_uid=%lu", 26537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long) sip->si_pid, 27537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long) sip->si_uid); 28537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin} 29537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 30537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinstatic void 31537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinprintsigval(const siginfo_t *sip, bool verbose) 32537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin{ 33537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (!verbose) 34537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(", ..."); 35537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin else 36537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_value={int=%u, ptr=%#lx}", 37537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin sip->si_int, 38537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long) sip->si_ptr); 39537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin} 40537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 41537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinstatic void 42537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinprint_si_code(int si_signo, int si_code) 43537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin{ 44537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin const char *code = xlookup(siginfo_codes, si_code); 45537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 46537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (!code) { 47537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin switch (si_signo) { 48537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGTRAP: 49537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigtrap_codes, si_code); 50537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 51537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGCHLD: 52537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigchld_codes, si_code); 53537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 54537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGPOLL: 55537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigpoll_codes, si_code); 56537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 57537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGPROF: 58537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigprof_codes, si_code); 59537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 60537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGILL: 61537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigill_codes, si_code); 62537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 63537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#ifdef SIGEMT 64537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGEMT: 65537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigemt_codes, si_code); 66537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 67537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#endif 68537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGFPE: 69537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigfpe_codes, si_code); 70537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 71537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGSEGV: 72537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigsegv_codes, si_code); 73537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 74537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGBUS: 75537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigbus_codes, si_code); 76537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 77537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGSYS: 78537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin code = xlookup(sigsys_codes, si_code); 79537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 80537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 81537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 82537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 83537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (code) 84537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(code); 85537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin else 86537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf("%#x", si_code); 87537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin} 88537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 89537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinstatic void 90537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinprint_si_info(const siginfo_t *sip, bool verbose) 91537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin{ 92537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_errno) { 93537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(", si_errno="); 94537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if ((unsigned) sip->si_errno < nerrnos 95537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin && errnoent[sip->si_errno]) 96537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(errnoent[sip->si_errno]); 97537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin else 98537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf("%d", sip->si_errno); 99537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 100537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 101537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (SI_FROMUSER(sip)) { 102537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin switch (sip->si_code) { 103537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SI_USER: 104537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigsource(sip); 105537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 106537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SI_TKILL: 107537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigsource(sip); 108537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 109537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#if defined HAVE_SIGINFO_T_SI_TIMERID && defined HAVE_SIGINFO_T_SI_OVERRUN 110537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SI_TIMER: 111537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_timerid=%#x, si_overrun=%d", 112537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin sip->si_timerid, sip->si_overrun); 113537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigval(sip, verbose); 114537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 115537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#endif 116537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin default: 117537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigsource(sip); 118537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_ptr) 119537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigval(sip, verbose); 120537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 121537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 122537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } else { 123537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin switch (sip->si_signo) { 124537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGCHLD: 125537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigsource(sip); 126537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(", si_status="); 127537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_code == CLD_EXITED) 128537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf("%d", sip->si_status); 129537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin else 130537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsignal(sip->si_status); 131537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (!verbose) 132537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(", ..."); 133537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin else 134537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_utime=%llu, si_stime=%llu", 135537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long long) sip->si_utime, 136537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long long) sip->si_stime); 137537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 138537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGILL: case SIGFPE: 139537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGSEGV: case SIGBUS: 140537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_addr=%#lx", 141537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long) sip->si_addr); 142537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 143537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGPOLL: 144537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin switch (sip->si_code) { 145537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case POLL_IN: case POLL_OUT: case POLL_MSG: 146537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_band=%ld", 147537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (long) sip->si_band); 148537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 149537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 150537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 151537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#ifdef HAVE_SIGINFO_T_SI_SYSCALL 152537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin case SIGSYS: 153537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprintf(", si_call_addr=%#lx, si_syscall=%d, si_arch=%u", 154537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin (unsigned long) sip->si_call_addr, 155537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin sip->si_syscall, sip->si_arch); 156537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin break; 157537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#endif 158537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin default: 159537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_pid || sip->si_uid) 160537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigsource(sip); 161537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_ptr) 162537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsigval(sip, verbose); 163537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 164537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 165537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin} 166537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 167537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinvoid 168537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinprintsiginfo(const siginfo_t *sip, bool verbose) 169537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin{ 170537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_signo == 0) { 171537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints("{}"); 172537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin return; 173537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin } 174537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints("{si_signo="); 175537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin printsignal(sip->si_signo); 176537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 177537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints(", si_code="); 178537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin print_si_code(sip->si_signo, sip->si_code); 179537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 180537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#ifdef SI_NOINFO 181537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin if (sip->si_code != SI_NOINFO) 182537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin#endif 183537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin print_si_info(sip, verbose); 184537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 185537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin tprints("}"); 186537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin} 187537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin 188537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinvoid 189537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levinprintsiginfo_at(struct tcb *tcp, long addr) 190537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin{ 191537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin siginfo_t si; 192a528eb5b493d0c722e5a8744bd4be52aa32c9eddDmitry V. Levin 193a528eb5b493d0c722e5a8744bd4be52aa32c9eddDmitry V. Levin if (!umove_or_printaddr(tcp, addr, &si)) 194a528eb5b493d0c722e5a8744bd4be52aa32c9eddDmitry V. Levin printsiginfo(&si, verbose(tcp)); 195537c964fe9ad96b5b4c779af7a53a2b0850ade4eDmitry V. Levin} 196