kdump.c revision 115759
1117610Sdes/*-
2117610Sdes * Copyright (c) 1988, 1993
3255376Sdes *	The Regents of the University of California.  All rights reserved.
4117610Sdes *
5255376Sdes * Redistribution and use in source and binary forms, with or without
6117610Sdes * modification, are permitted provided that the following conditions
7117610Sdes * are met:
8117610Sdes * 1. Redistributions of source code must retain the above copyright
9255376Sdes *    notice, this list of conditions and the following disclaimer.
10117610Sdes * 2. Redistributions in binary form must reproduce the above copyright
11117610Sdes *    notice, this list of conditions and the following disclaimer in the
12117610Sdes *    documentation and/or other materials provided with the distribution.
13117610Sdes * 3. All advertising materials mentioning features or use of this software
14117610Sdes *    must display the following acknowledgement:
15117610Sdes *	This product includes software developed by the University of
16117610Sdes *	California, Berkeley and its contributors.
17117610Sdes * 4. Neither the name of the University nor the names of its contributors
18255376Sdes *    may be used to endorse or promote products derived from this software
19117610Sdes *    without specific prior written permission.
20117610Sdes *
21117610Sdes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22117610Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23255376Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24255376Sdes * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25255376Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26117610Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27255376Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28117610Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29255376Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30255376Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31255376Sdes * SUCH DAMAGE.
32255376Sdes */
33117610Sdes
34255376Sdes#ifndef lint
35117610Sdesstatic const char copyright[] =
36117610Sdes"@(#) Copyright (c) 1988, 1993\n\
37117610Sdes	The Regents of the University of California.  All rights reserved.\n";
38117610Sdes#endif /* not lint */
39117610Sdes
40117610Sdes#ifndef lint
41117610Sdes#if 0
42117610Sdesstatic char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
43117610Sdes#endif
44117610Sdes#endif /* not lint */
45117610Sdes#include <sys/cdefs.h>
46117610Sdes__FBSDID("$FreeBSD: head/usr.bin/kdump/kdump.c 115759 2003-06-03 01:44:43Z peter $");
47117610Sdes
48117610Sdes#define _KERNEL
49117610Sdesextern int errno;
50117610Sdes#include <sys/errno.h>
51117610Sdes#undef _KERNEL
52117610Sdes#include <sys/param.h>
53255376Sdes#include <sys/errno.h>
54117610Sdes#define _KERNEL
55117610Sdes#include <sys/time.h>
56117610Sdes#undef _KERNEL
57117610Sdes#include <sys/uio.h>
58117610Sdes#include <sys/ktrace.h>
59117610Sdes#include <sys/ioctl.h>
60117610Sdes#include <sys/ptrace.h>
61117610Sdes#include <err.h>
62117610Sdes#include <locale.h>
63117610Sdes#include <stdio.h>
64117610Sdes#include <stdlib.h>
65255376Sdes#include <string.h>
66117610Sdes#include <unistd.h>
67255376Sdes#include <vis.h>
68117610Sdes#include "ktrace.h"
69255376Sdes
70117610Sdesint fread_tail(void *, int, int);
71117610Sdesvoid dumpheader(struct ktr_header *);
72117610Sdesvoid ktrsyscall(struct ktr_syscall *);
73117610Sdesvoid ktrsysret(struct ktr_sysret *);
74117610Sdesvoid ktrnamei(char *, int);
75117610Sdesvoid hexdump(char *, int, int);
76117610Sdesvoid visdump(char *, int, int);
77117610Sdesvoid ktrgenio(struct ktr_genio *, int);
78117610Sdesvoid ktrpsig(struct ktr_psig *);
79117610Sdesvoid ktrcsw(struct ktr_csw *);
80117610Sdesvoid ktruser(int, unsigned char *);
81117610Sdesvoid usage(void);
82117610Sdes
83117610Sdesint timestamp, decimal, fancy = 1, tail, maxdata;
84117610Sdesconst char *tracefile = DEF_TRACEFILE;
85117610Sdesstruct ktr_header ktr_header;
86117610Sdes
87117610Sdes#define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
88117610Sdes
89117610Sdesint
90117610Sdesmain(int argc, char *argv[])
91117610Sdes{
92117610Sdes	int ch, ktrlen, size;
93117610Sdes	void *m;
94117610Sdes	int trpoints = ALL_POINTS;
95117610Sdes	int drop_logged;
96117610Sdes	pid_t pid = 0;
97117610Sdes
98117610Sdes	(void) setlocale(LC_CTYPE, "");
99117610Sdes
100117610Sdes	while ((ch = getopt(argc,argv,"f:dlm:np:RTt:")) != -1)
101117610Sdes		switch((char)ch) {
102117610Sdes		case 'f':
103255376Sdes			tracefile = optarg;
104117610Sdes			break;
105117610Sdes		case 'd':
106117610Sdes			decimal = 1;
107117610Sdes			break;
108117610Sdes		case 'l':
109117610Sdes			tail = 1;
110117610Sdes			break;
111117610Sdes		case 'm':
112117610Sdes			maxdata = atoi(optarg);
113117610Sdes			break;
114117610Sdes		case 'n':
115117610Sdes			fancy = 0;
116117610Sdes			break;
117117610Sdes		case 'p':
118117610Sdes			pid = atoi(optarg);
119117610Sdes			break;
120117610Sdes		case 'R':
121117610Sdes			timestamp = 2;	/* relative timestamp */
122255376Sdes			break;
123117610Sdes		case 'T':
124117610Sdes			timestamp = 1;
125117610Sdes			break;
126117610Sdes		case 't':
127117610Sdes			trpoints = getpoints(optarg);
128117610Sdes			if (trpoints < 0)
129117610Sdes				errx(1, "unknown trace point in %s", optarg);
130117610Sdes			break;
131117610Sdes		default:
132117610Sdes			usage();
133117610Sdes		}
134117610Sdes
135255376Sdes	if (argc > optind)
136255376Sdes		usage();
137255376Sdes
138255376Sdes	m = (void *)malloc(size = 1025);
139255376Sdes	if (m == NULL)
140255376Sdes		errx(1, "%s", strerror(ENOMEM));
141255376Sdes	if (!freopen(tracefile, "r", stdin))
142255376Sdes		err(1, "%s", tracefile);
143255376Sdes	drop_logged = 0;
144255376Sdes	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
145255376Sdes		if (ktr_header.ktr_type & KTR_DROP) {
146255376Sdes			ktr_header.ktr_type &= ~KTR_DROP;
147255376Sdes			if (!drop_logged) {
148255376Sdes				(void)printf("%6d %-8.*s Events dropped.\n",
149255376Sdes				    ktr_header.ktr_pid, MAXCOMLEN,
150255376Sdes				    ktr_header.ktr_comm);
151255376Sdes				drop_logged = 1;
152255376Sdes			}
153255376Sdes		}
154255376Sdes		if (trpoints & (1<<ktr_header.ktr_type))
155255376Sdes			if (pid == 0 || ktr_header.ktr_pid == pid)
156117610Sdes				dumpheader(&ktr_header);
157117610Sdes		if ((ktrlen = ktr_header.ktr_len) < 0)
158117610Sdes			errx(1, "bogus length 0x%x", ktrlen);
159117610Sdes		if (ktrlen > size) {
160117610Sdes			m = (void *)realloc(m, ktrlen+1);
161255376Sdes			if (m == NULL)
162117610Sdes				errx(1, "%s", strerror(ENOMEM));
163117610Sdes			size = ktrlen;
164117610Sdes		}
165117610Sdes		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
166117610Sdes			errx(1, "data too short");
167117610Sdes		if (pid && ktr_header.ktr_pid != pid)
168117610Sdes			continue;
169117610Sdes		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
170117610Sdes			continue;
171117610Sdes		drop_logged = 0;
172117610Sdes		switch (ktr_header.ktr_type) {
173117610Sdes		case KTR_SYSCALL:
174117610Sdes			ktrsyscall((struct ktr_syscall *)m);
175117610Sdes			break;
176117610Sdes		case KTR_SYSRET:
177117610Sdes			ktrsysret((struct ktr_sysret *)m);
178255376Sdes			break;
179117610Sdes		case KTR_NAMEI:
180117610Sdes			ktrnamei(m, ktrlen);
181117610Sdes			break;
182117610Sdes		case KTR_GENIO:
183117610Sdes			ktrgenio((struct ktr_genio *)m, ktrlen);
184117610Sdes			break;
185117610Sdes		case KTR_PSIG:
186117610Sdes			ktrpsig((struct ktr_psig *)m);
187255376Sdes			break;
188117610Sdes		case KTR_CSW:
189117610Sdes			ktrcsw((struct ktr_csw *)m);
190117610Sdes			break;
191117610Sdes		case KTR_USER:
192117610Sdes			ktruser(ktrlen, m);
193117610Sdes			break;
194117610Sdes		default:
195117610Sdes			printf("\n");
196117610Sdes			break;
197255376Sdes		}
198117610Sdes		if (tail)
199117610Sdes			(void)fflush(stdout);
200117610Sdes	}
201117610Sdes	return 0;
202117610Sdes}
203117610Sdes
204117610Sdesint
205117610Sdesfread_tail(void *buf, int size, int num)
206117610Sdes{
207117610Sdes	int i;
208117610Sdes
209117610Sdes	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
210117610Sdes		(void)sleep(1);
211117610Sdes		clearerr(stdin);
212117610Sdes	}
213117610Sdes	return (i);
214117610Sdes}
215117610Sdes
216117610Sdesvoid
217255376Sdesdumpheader(struct ktr_header *kth)
218255376Sdes{
219255376Sdes	static char unknown[64];
220255376Sdes	static struct timeval prevtime, temp;
221255376Sdes	const char *type;
222117610Sdes
223255376Sdes	switch (kth->ktr_type) {
224255376Sdes	case KTR_SYSCALL:
225255376Sdes		type = "CALL";
226255376Sdes		break;
227255376Sdes	case KTR_SYSRET:
228255376Sdes		type = "RET ";
229255376Sdes		break;
230255376Sdes	case KTR_NAMEI:
231255376Sdes		type = "NAMI";
232255376Sdes		break;
233255376Sdes	case KTR_GENIO:
234255376Sdes		type = "GIO ";
235255376Sdes		break;
236255376Sdes	case KTR_PSIG:
237255376Sdes		type = "PSIG";
238117610Sdes		break;
239255376Sdes	case KTR_CSW:
240255376Sdes		type = "CSW";
241117610Sdes		break;
242255376Sdes	case KTR_USER:
243255376Sdes		type = "USER";
244255376Sdes		break;
245255376Sdes	default:
246255376Sdes		(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
247117610Sdes		type = unknown;
248117610Sdes	}
249117610Sdes
250117610Sdes	(void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, kth->ktr_comm);
251117610Sdes	if (timestamp) {
252117610Sdes		if (timestamp == 2) {
253117610Sdes			temp = kth->ktr_time;
254117610Sdes			timevalsub(&kth->ktr_time, &prevtime);
255117610Sdes			prevtime = temp;
256117610Sdes		}
257117610Sdes		(void)printf("%ld.%06ld ",
258117610Sdes		    kth->ktr_time.tv_sec, kth->ktr_time.tv_usec);
259117610Sdes	}
260117610Sdes	(void)printf("%s  ", type);
261117610Sdes}
262117610Sdes
263117610Sdes#include <sys/syscall.h>
264117610Sdes#define KTRACE
265117610Sdes#include <sys/kern/syscalls.c>
266117610Sdes#undef KTRACE
267117610Sdesint nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
268117610Sdes
269117610Sdesstatic const char *ptrace_ops[] = {
270117610Sdes	"PT_TRACE_ME",	"PT_READ_I",	"PT_READ_D",	"PT_READ_U",
271117610Sdes	"PT_WRITE_I",	"PT_WRITE_D",	"PT_WRITE_U",	"PT_CONTINUE",
272117610Sdes	"PT_KILL",	"PT_STEP",	"PT_ATTACH",	"PT_DETACH",
273117610Sdes};
274117610Sdes
275117610Sdesvoid
276117610Sdesktrsyscall(struct ktr_syscall *ktr)
277117610Sdes{
278117610Sdes	int narg = ktr->ktr_narg;
279117610Sdes	register_t *ip;
280117610Sdes	const char *ioctlname(u_long);
281117610Sdes
282117610Sdes	if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)
283117610Sdes		(void)printf("[%d]", ktr->ktr_code);
284255376Sdes	else
285117610Sdes		(void)printf("%s", syscallnames[ktr->ktr_code]);
286117610Sdes	ip = &ktr->ktr_args[0];
287117610Sdes	if (narg) {
288117610Sdes		char c = '(';
289255376Sdes		if (fancy) {
290255376Sdes			if (ktr->ktr_code == SYS_ioctl) {
291255376Sdes				const char *cp;
292255376Sdes				if (decimal)
293255376Sdes					(void)printf("(%ld", (long)*ip);
294117610Sdes				else
295117610Sdes					(void)printf("(%#lx", (long)*ip);
296117610Sdes				ip++;
297117610Sdes				narg--;
298117610Sdes				if ((cp = ioctlname(*ip)) != NULL)
299255376Sdes					(void)printf(",%s", cp);
300117610Sdes				else {
301117610Sdes					if (decimal)
302255376Sdes						(void)printf(",%ld", (long)*ip);
303117610Sdes					else
304117610Sdes						(void)printf(",%#lx ", (long)*ip);
305255376Sdes				}
306117610Sdes				c = ',';
307117610Sdes				ip++;
308255376Sdes				narg--;
309117610Sdes			} else if (ktr->ktr_code == SYS_ptrace) {
310117610Sdes				if ((size_t)*ip < sizeof(ptrace_ops) /
311255376Sdes				    sizeof(ptrace_ops[0]) && *ip >= 0)
312117610Sdes					(void)printf("(%s", ptrace_ops[*ip]);
313117610Sdes#ifdef PT_GETREGS
314255376Sdes				else if (*ip == PT_GETREGS)
315255376Sdes					(void)printf("(%s", "PT_GETREGS");
316255376Sdes#endif
317255376Sdes#ifdef PT_SETREGS
318255376Sdes				else if (*ip == PT_SETREGS)
319255376Sdes					(void)printf("(%s", "PT_SETREGS");
320255376Sdes#endif
321117610Sdes#ifdef PT_GETFPREGS
322117610Sdes				else if (*ip == PT_GETFPREGS)
323255376Sdes					(void)printf("(%s", "PT_GETFPREGS");
324255376Sdes#endif
325255376Sdes#ifdef PT_SETFPREGS
326255376Sdes				else if (*ip == PT_SETFPREGS)
327117610Sdes					(void)printf("(%s", "PT_SETFPREGS");
328117610Sdes#endif
329255376Sdes#ifdef PT_GETDBREGS
330117610Sdes				else if (*ip == PT_GETDBREGS)
331117610Sdes					(void)printf("(%s", "PT_GETDBREGS");
332117610Sdes#endif
333117610Sdes#ifdef PT_SETDBREGS
334117610Sdes				else if (*ip == PT_SETDBREGS)
335117610Sdes					(void)printf("(%s", "PT_SETDBREGS");
336117610Sdes#endif
337255376Sdes				else
338117610Sdes					(void)printf("(%ld", (long)*ip);
339117610Sdes				c = ',';
340255376Sdes				ip++;
341117610Sdes				narg--;
342117610Sdes			}
343255376Sdes		}
344255376Sdes		while (narg) {
345117610Sdes			if (decimal)
346255376Sdes				(void)printf("%c%ld", c, (long)*ip);
347117610Sdes			else
348255376Sdes				(void)printf("%c%#lx", c, (long)*ip);
349255376Sdes			c = ',';
350255376Sdes			ip++;
351117610Sdes			narg--;
352117610Sdes		}
353255376Sdes		(void)putchar(')');
354117610Sdes	}
355117610Sdes	(void)putchar('\n');
356255376Sdes}
357255376Sdes
358255376Sdesvoid
359255376Sdesktrsysret(struct ktr_sysret *ktr)
360255376Sdes{
361255376Sdes	register_t ret = ktr->ktr_retval;
362255376Sdes	int error = ktr->ktr_error;
363255376Sdes	int code = ktr->ktr_code;
364255376Sdes
365255376Sdes	if (code >= nsyscalls || code < 0)
366255376Sdes		(void)printf("[%d] ", code);
367255376Sdes	else
368255376Sdes		(void)printf("%s ", syscallnames[code]);
369255376Sdes
370255376Sdes	if (error == 0) {
371255376Sdes		if (fancy) {
372255376Sdes			(void)printf("%d", ret);
373255376Sdes			if (ret < 0 || ret > 9)
374255376Sdes				(void)printf("/%#lx", (long)ret);
375255376Sdes		} else {
376117610Sdes			if (decimal)
377117610Sdes				(void)printf("%ld", (long)ret);
378117610Sdes			else
379117610Sdes				(void)printf("%#lx", (long)ret);
380117610Sdes		}
381255376Sdes	} else if (error == ERESTART)
382117610Sdes		(void)printf("RESTART");
383117610Sdes	else if (error == EJUSTRETURN)
384117610Sdes		(void)printf("JUSTRETURN");
385117610Sdes	else {
386117610Sdes		(void)printf("-1 errno %d", ktr->ktr_error);
387117610Sdes		if (fancy)
388117610Sdes			(void)printf(" %s", strerror(ktr->ktr_error));
389117610Sdes	}
390255376Sdes	(void)putchar('\n');
391117610Sdes}
392117610Sdes
393255376Sdesvoid
394117610Sdesktrnamei(char *cp, int len)
395117610Sdes{
396117610Sdes	(void)printf("\"%.*s\"\n", len, cp);
397117610Sdes}
398117610Sdes
399117610Sdesvoid
400117610Sdeshexdump(char *p, int len, int screenwidth)
401117610Sdes{
402117610Sdes	int n, i;
403117610Sdes	int width;
404117610Sdes
405255376Sdes	width = 0;
406117610Sdes	do {
407117610Sdes		width += 2;
408255376Sdes		i = 13;			/* base offset */
409117610Sdes		i += (width / 2) + 1;	/* spaces every second byte */
410117610Sdes		i += (width * 2);	/* width of bytes */
411117610Sdes		i += 3;			/* "  |" */
412117610Sdes		i += width;		/* each byte */
413117610Sdes		i += 1;			/* "|" */
414117610Sdes	} while (i < screenwidth);
415117610Sdes	width -= 2;
416117610Sdes
417117610Sdes	for (n = 0; n < len; n += width) {
418255376Sdes		for (i = n; i < n + width; i++) {
419255376Sdes			if ((i % width) == 0) {	/* beginning of line */
420117610Sdes				printf("       0x%04x", i);
421117610Sdes			}
422255376Sdes			if ((i % 2) == 0) {
423117610Sdes				printf(" ");
424255376Sdes			}
425255376Sdes			if (i < len)
426117610Sdes				printf("%02x", p[i] & 0xff);
427255376Sdes			else
428255376Sdes				printf("  ");
429117610Sdes		}
430255376Sdes		printf("  |");
431255376Sdes		for (i = n; i < n + width; i++) {
432117610Sdes			if (i >= len)
433255376Sdes				break;
434255376Sdes			if (p[i] >= ' ' && p[i] <= '~')
435255376Sdes				printf("%c", p[i]);
436255376Sdes			else
437255376Sdes				printf(".");
438117610Sdes		}
439117610Sdes		printf("|\n");
440255376Sdes	}
441117610Sdes	if ((i % width) != 0)
442117610Sdes		printf("\n");
443255376Sdes}
444117610Sdes
445117610Sdesvoid
446255376Sdesvisdump(char *dp, int datalen, int screenwidth)
447117610Sdes{
448117610Sdes	int col = 0;
449255376Sdes	char *cp;
450117610Sdes	int width;
451117610Sdes	char visbuf[5];
452255376Sdes
453117610Sdes	(void)printf("       \"");
454117610Sdes	col = 8;
455117610Sdes	for (;datalen > 0; datalen--, dp++) {
456117610Sdes		(void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
457117610Sdes		cp = visbuf;
458117610Sdes		/*
459117610Sdes		 * Keep track of printables and
460117610Sdes		 * space chars (like fold(1)).
461117610Sdes		 */
462117610Sdes		if (col == 0) {
463117610Sdes			(void)putchar('\t');
464117610Sdes			col = 8;
465117610Sdes		}
466117610Sdes		switch(*cp) {
467117610Sdes		case '\n':
468117610Sdes			col = 0;
469117610Sdes			(void)putchar('\n');
470117610Sdes			continue;
471117610Sdes		case '\t':
472117610Sdes			width = 8 - (col&07);
473117610Sdes			break;
474117610Sdes		default:
475117610Sdes			width = strlen(cp);
476255376Sdes		}
477255376Sdes		if (col + width > (screenwidth-2)) {
478255376Sdes			(void)printf("\\\n\t");
479255376Sdes			col = 8;
480117610Sdes		}
481255376Sdes		col += width;
482117610Sdes		do {
483117610Sdes			(void)putchar(*cp++);
484255376Sdes		} while (*cp);
485117610Sdes	}
486117610Sdes	if (col == 0)
487255376Sdes		(void)printf("       ");
488117610Sdes	(void)printf("\"\n");
489117610Sdes}
490255376Sdes
491117610Sdesvoid
492117610Sdesktrgenio(struct ktr_genio *ktr, int len)
493255376Sdes{
494117610Sdes	int datalen = len - sizeof (struct ktr_genio);
495117610Sdes	char *dp = (char *)ktr + sizeof (struct ktr_genio);
496255376Sdes	static int screenwidth = 0;
497117610Sdes	int i, binary;
498117610Sdes
499255376Sdes	if (screenwidth == 0) {
500117610Sdes		struct winsize ws;
501117610Sdes
502255376Sdes		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
503117610Sdes		    ws.ws_col > 8)
504255376Sdes			screenwidth = ws.ws_col;
505255376Sdes		else
506117610Sdes			screenwidth = 80;
507117610Sdes	}
508117610Sdes	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
509117610Sdes		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
510117610Sdes		datalen == 1 ? "" : "s");
511117610Sdes	if (maxdata && datalen > maxdata)
512117610Sdes		datalen = maxdata;
513117610Sdes
514117610Sdes	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
515117610Sdes		if (dp[i] >= 32 && dp[i] < 127)
516117610Sdes			continue;
517117610Sdes		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
518255376Sdes			continue;
519117610Sdes		binary = 1;
520117610Sdes	}
521255376Sdes	if (binary)
522117610Sdes		hexdump(dp, datalen, screenwidth);
523117610Sdes	else
524117610Sdes		visdump(dp, datalen, screenwidth);
525255376Sdes}
526117610Sdes
527117610Sdesconst char *signames[] = {
528255376Sdes	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
529117610Sdes	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
530117610Sdes	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
531255376Sdes	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
532117610Sdes	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
533117610Sdes	"USR2", NULL,						/* 31 - 32 */
534255376Sdes};
535117610Sdes
536255376Sdesvoid
537255376Sdesktrpsig(struct ktr_psig *psig)
538117610Sdes{
539117610Sdes	(void)printf("SIG%s ", signames[psig->signo]);
540255376Sdes	if (psig->action == SIG_DFL)
541117610Sdes		(void)printf("SIG_DFL\n");
542117610Sdes	else {
543117610Sdes		(void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
544117610Sdes		    (u_long)psig->action, psig->mask.__bits[0], psig->code);
545117610Sdes	}
546117610Sdes}
547117610Sdes
548255376Sdesvoid
549117610Sdesktrcsw(struct ktr_csw *cs)
550117610Sdes{
551117610Sdes	(void)printf("%s %s\n", cs->out ? "stop" : "resume",
552117610Sdes		cs->user ? "user" : "kernel");
553117610Sdes}
554117610Sdes
555117610Sdesvoid
556117610Sdesktruser(int len, unsigned char *p)
557117610Sdes{
558117610Sdes	(void)printf("%d ", len);
559117610Sdes	while (len--)
560117610Sdes		(void)printf(" %02x", *p++);
561117610Sdes	(void)printf("\n");
562117610Sdes
563255376Sdes}
564255376Sdes
565255376Sdesvoid
566255376Sdesusage(void)
567255376Sdes{
568255376Sdes	(void)fprintf(stderr,
569117610Sdes	    "usage: kdump [-dnlRT] [-f trfile] [-m maxdata] [-t [cnisuw]]\n");
570117610Sdes	exit(1);
571117610Sdes}
572117610Sdes