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