kdump.c revision 284954
1/*-
2 * Copyright (c) 1988, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef lint
31static const char copyright[] =
32"@(#) Copyright (c) 1988, 1993\n\
33	The Regents of the University of California.  All rights reserved.\n";
34#endif /* not lint */
35
36#ifndef lint
37#if 0
38static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
39#endif
40#endif /* not lint */
41#include <sys/cdefs.h>
42__FBSDID("$FreeBSD: stable/10/usr.bin/kdump/kdump.c 284954 2015-06-30 14:17:02Z des $");
43
44#define _KERNEL
45extern int errno;
46#include <sys/errno.h>
47#undef _KERNEL
48#include <sys/param.h>
49#include <sys/capsicum.h>
50#include <sys/errno.h>
51#define _KERNEL
52#include <sys/time.h>
53#undef _KERNEL
54#include <sys/uio.h>
55#include <sys/ktrace.h>
56#include <sys/ioctl.h>
57#include <sys/socket.h>
58#include <sys/stat.h>
59#include <sys/sysent.h>
60#include <sys/umtx.h>
61#include <sys/un.h>
62#include <sys/queue.h>
63#include <sys/wait.h>
64#ifdef IPX
65#include <sys/types.h>
66#include <netipx/ipx.h>
67#endif
68#ifdef NETATALK
69#include <netatalk/at.h>
70#endif
71#include <arpa/inet.h>
72#include <netinet/in.h>
73#include <ctype.h>
74#include <dlfcn.h>
75#include <err.h>
76#include <grp.h>
77#include <inttypes.h>
78#include <locale.h>
79#include <netdb.h>
80#include <nl_types.h>
81#include <pwd.h>
82#include <stdio.h>
83#include <stdlib.h>
84#include <string.h>
85#include <termios.h>
86#include <time.h>
87#include <unistd.h>
88#include <vis.h>
89#include "ktrace.h"
90#include "kdump_subr.h"
91
92u_int abidump(struct ktr_header *);
93int fetchprocinfo(struct ktr_header *, u_int *);
94int fread_tail(void *, int, int);
95void dumpheader(struct ktr_header *);
96void ktrsyscall(struct ktr_syscall *, u_int);
97void ktrsysret(struct ktr_sysret *, u_int);
98void ktrnamei(char *, int);
99void hexdump(char *, int, int);
100void visdump(char *, int, int);
101void ktrgenio(struct ktr_genio *, int);
102void ktrpsig(struct ktr_psig *);
103void ktrcsw(struct ktr_csw *);
104void ktrcsw_old(struct ktr_csw_old *);
105void ktruser_malloc(void *);
106void ktruser_rtld(int, void *);
107void ktruser(int, void *);
108void ktrcaprights(cap_rights_t *);
109void ktrsockaddr(struct sockaddr *);
110void ktrstat(struct stat *);
111void ktrstruct(char *, size_t);
112void ktrcapfail(struct ktr_cap_fail *);
113void ktrfault(struct ktr_fault *);
114void ktrfaultend(struct ktr_faultend *);
115void limitfd(int fd);
116void usage(void);
117void ioctlname(unsigned long, int);
118
119extern const char *signames[], *syscallnames[];
120extern int nsyscalls;
121
122static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
123    resolv = 0, abiflag = 0, syscallno = 0;
124static const char *tracefile = DEF_TRACEFILE;
125static struct ktr_header ktr_header;
126
127#define TIME_FORMAT	"%b %e %T %Y"
128#define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
129
130#define print_number(i,n,c) do {					\
131	if (decimal)							\
132		printf("%c%jd", c, (intmax_t)*i);			\
133	else								\
134		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
135	i++;								\
136	n--;								\
137	c = ',';							\
138} while (0)
139
140#if defined(__amd64__) || defined(__i386__)
141
142void linux_ktrsyscall(struct ktr_syscall *);
143void linux_ktrsysret(struct ktr_sysret *);
144extern const char *linux_syscallnames[];
145
146#include <linux_syscalls.c>
147static int nlinux_syscalls = sizeof(linux_syscallnames) / \
148				sizeof(linux_syscallnames[0]);
149
150/*
151 * from linux.h
152 * Linux syscalls return negative errno's, we do positive and map them
153 */
154static int bsd_to_linux_errno[ELAST + 1] = {
155	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
156	-10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
157	-20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
158	-30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
159	-90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
160	-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
161	-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
162	-116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
163	-6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
164	-72, -67, -71
165};
166#endif
167
168struct proc_info
169{
170	TAILQ_ENTRY(proc_info)	info;
171	u_int			sv_flags;
172	pid_t			pid;
173};
174
175static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
176
177static void
178strerror_init(void)
179{
180
181	/*
182	 * Cache NLS data before entering capability mode.
183	 * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
184	 */
185	(void)catopen("libc", NL_CAT_LOCALE);
186}
187
188static void
189localtime_init(void)
190{
191	time_t ltime;
192
193	/*
194	 * Allow localtime(3) to cache /etc/localtime content before entering
195	 * capability mode.
196	 * XXXPJD: There should be localtime_init() in libc.
197	 */
198	(void)time(&ltime);
199	(void)localtime(&ltime);
200}
201
202int
203main(int argc, char *argv[])
204{
205	int ch, ktrlen, size;
206	void *m;
207	int trpoints = ALL_POINTS;
208	int drop_logged;
209	pid_t pid = 0;
210	u_int sv_flags;
211
212	setlocale(LC_CTYPE, "");
213
214	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
215		switch (ch) {
216		case 'A':
217			abiflag = 1;
218			break;
219		case 'f':
220			tracefile = optarg;
221			break;
222		case 'd':
223			decimal = 1;
224			break;
225		case 'l':
226			tail = 1;
227			break;
228		case 'm':
229			maxdata = atoi(optarg);
230			break;
231		case 'n':
232			fancy = 0;
233			break;
234		case 'p':
235			pid = atoi(optarg);
236			break;
237		case 'r':
238			resolv = 1;
239			break;
240		case 'S':
241			syscallno = 1;
242			break;
243		case 's':
244			suppressdata = 1;
245			break;
246		case 'E':
247			timestamp = 3;	/* elapsed timestamp */
248			break;
249		case 'H':
250			threads = 1;
251			break;
252		case 'R':
253			timestamp = 2;	/* relative timestamp */
254			break;
255		case 'T':
256			timestamp = 1;
257			break;
258		case 't':
259			trpoints = getpoints(optarg);
260			if (trpoints < 0)
261				errx(1, "unknown trace point in %s", optarg);
262			break;
263		default:
264			usage();
265		}
266
267	if (argc > optind)
268		usage();
269
270	m = malloc(size = 1025);
271	if (m == NULL)
272		errx(1, "%s", strerror(ENOMEM));
273	if (!freopen(tracefile, "r", stdin))
274		err(1, "%s", tracefile);
275
276	strerror_init();
277	localtime_init();
278
279	if (resolv == 0) {
280		if (cap_enter() < 0 && errno != ENOSYS)
281			err(1, "unable to enter capability mode");
282	}
283	limitfd(STDIN_FILENO);
284	limitfd(STDOUT_FILENO);
285	limitfd(STDERR_FILENO);
286
287	TAILQ_INIT(&trace_procs);
288	drop_logged = 0;
289	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
290		if (ktr_header.ktr_type & KTR_DROP) {
291			ktr_header.ktr_type &= ~KTR_DROP;
292			if (!drop_logged && threads) {
293				printf(
294				    "%6jd %6jd %-8.*s Events dropped.\n",
295				    (intmax_t)ktr_header.ktr_pid,
296				    ktr_header.ktr_tid > 0 ?
297				    (intmax_t)ktr_header.ktr_tid : 0,
298				    MAXCOMLEN, ktr_header.ktr_comm);
299				drop_logged = 1;
300			} else if (!drop_logged) {
301				printf("%6jd %-8.*s Events dropped.\n",
302				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
303				    ktr_header.ktr_comm);
304				drop_logged = 1;
305			}
306		}
307		if (trpoints & (1<<ktr_header.ktr_type))
308			if (pid == 0 || ktr_header.ktr_pid == pid ||
309			    ktr_header.ktr_tid == pid)
310				dumpheader(&ktr_header);
311		if ((ktrlen = ktr_header.ktr_len) < 0)
312			errx(1, "bogus length 0x%x", ktrlen);
313		if (ktrlen > size) {
314			m = realloc(m, ktrlen+1);
315			if (m == NULL)
316				errx(1, "%s", strerror(ENOMEM));
317			size = ktrlen;
318		}
319		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
320			errx(1, "data too short");
321		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
322			continue;
323		sv_flags = abidump(&ktr_header);
324		if (pid && ktr_header.ktr_pid != pid &&
325		    ktr_header.ktr_tid != pid)
326			continue;
327		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
328			continue;
329		drop_logged = 0;
330		switch (ktr_header.ktr_type) {
331		case KTR_SYSCALL:
332#if defined(__amd64__) || defined(__i386__)
333			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
334				linux_ktrsyscall((struct ktr_syscall *)m);
335			else
336#endif
337				ktrsyscall((struct ktr_syscall *)m, sv_flags);
338			break;
339		case KTR_SYSRET:
340#if defined(__amd64__) || defined(__i386__)
341			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
342				linux_ktrsysret((struct ktr_sysret *)m);
343			else
344#endif
345				ktrsysret((struct ktr_sysret *)m, sv_flags);
346			break;
347		case KTR_NAMEI:
348		case KTR_SYSCTL:
349			ktrnamei(m, ktrlen);
350			break;
351		case KTR_GENIO:
352			ktrgenio((struct ktr_genio *)m, ktrlen);
353			break;
354		case KTR_PSIG:
355			ktrpsig((struct ktr_psig *)m);
356			break;
357		case KTR_CSW:
358			if (ktrlen == sizeof(struct ktr_csw_old))
359				ktrcsw_old((struct ktr_csw_old *)m);
360			else
361				ktrcsw((struct ktr_csw *)m);
362			break;
363		case KTR_USER:
364			ktruser(ktrlen, m);
365			break;
366		case KTR_STRUCT:
367			ktrstruct(m, ktrlen);
368			break;
369		case KTR_CAPFAIL:
370			ktrcapfail((struct ktr_cap_fail *)m);
371			break;
372		case KTR_FAULT:
373			ktrfault((struct ktr_fault *)m);
374			break;
375		case KTR_FAULTEND:
376			ktrfaultend((struct ktr_faultend *)m);
377			break;
378		default:
379			printf("\n");
380			break;
381		}
382		if (tail)
383			fflush(stdout);
384	}
385	return 0;
386}
387
388void
389limitfd(int fd)
390{
391	cap_rights_t rights;
392	unsigned long cmd;
393
394	cap_rights_init(&rights, CAP_FSTAT);
395	cmd = 0;
396
397	switch (fd) {
398	case STDIN_FILENO:
399		cap_rights_set(&rights, CAP_READ);
400		break;
401	case STDOUT_FILENO:
402		cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE);
403		cmd = TIOCGETA;	/* required by isatty(3) in printf(3) */
404		break;
405	case STDERR_FILENO:
406		cap_rights_set(&rights, CAP_WRITE);
407		if (!suppressdata) {
408			cap_rights_set(&rights, CAP_IOCTL);
409			cmd = TIOCGWINSZ;
410		}
411		break;
412	default:
413		abort();
414	}
415
416	if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
417		err(1, "unable to limit rights for descriptor %d", fd);
418	if (cmd != 0 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
419		err(1, "unable to limit ioctls for descriptor %d", fd);
420}
421
422int
423fread_tail(void *buf, int size, int num)
424{
425	int i;
426
427	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
428		sleep(1);
429		clearerr(stdin);
430	}
431	return (i);
432}
433
434int
435fetchprocinfo(struct ktr_header *kth, u_int *flags)
436{
437	struct proc_info *pi;
438
439	switch (kth->ktr_type) {
440	case KTR_PROCCTOR:
441		TAILQ_FOREACH(pi, &trace_procs, info) {
442			if (pi->pid == kth->ktr_pid) {
443				TAILQ_REMOVE(&trace_procs, pi, info);
444				break;
445			}
446		}
447		pi = malloc(sizeof(struct proc_info));
448		if (pi == NULL)
449			errx(1, "%s", strerror(ENOMEM));
450		pi->sv_flags = *flags;
451		pi->pid = kth->ktr_pid;
452		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
453		return (1);
454
455	case KTR_PROCDTOR:
456		TAILQ_FOREACH(pi, &trace_procs, info) {
457			if (pi->pid == kth->ktr_pid) {
458				TAILQ_REMOVE(&trace_procs, pi, info);
459				free(pi);
460				break;
461			}
462		}
463		return (1);
464	}
465
466	return (0);
467}
468
469u_int
470abidump(struct ktr_header *kth)
471{
472	struct proc_info *pi;
473	const char *abi;
474	const char *arch;
475	u_int flags = 0;
476
477	TAILQ_FOREACH(pi, &trace_procs, info) {
478		if (pi->pid == kth->ktr_pid) {
479			flags = pi->sv_flags;
480			break;
481		}
482	}
483
484	if (abiflag == 0)
485		return (flags);
486
487	switch (flags & SV_ABI_MASK) {
488	case SV_ABI_LINUX:
489		abi = "L";
490		break;
491	case SV_ABI_FREEBSD:
492		abi = "F";
493		break;
494	default:
495		abi = "U";
496		break;
497	}
498
499	if (flags != 0) {
500		if (flags & SV_LP64)
501			arch = "64";
502		else
503			arch = "32";
504	} else
505		arch = "00";
506
507	printf("%s%s  ", abi, arch);
508
509	return (flags);
510}
511
512void
513dumpheader(struct ktr_header *kth)
514{
515	static char unknown[64];
516	static struct timeval prevtime, temp;
517	const char *type;
518
519	switch (kth->ktr_type) {
520	case KTR_SYSCALL:
521		type = "CALL";
522		break;
523	case KTR_SYSRET:
524		type = "RET ";
525		break;
526	case KTR_NAMEI:
527		type = "NAMI";
528		break;
529	case KTR_GENIO:
530		type = "GIO ";
531		break;
532	case KTR_PSIG:
533		type = "PSIG";
534		break;
535	case KTR_CSW:
536		type = "CSW ";
537		break;
538	case KTR_USER:
539		type = "USER";
540		break;
541	case KTR_STRUCT:
542		type = "STRU";
543		break;
544	case KTR_SYSCTL:
545		type = "SCTL";
546		break;
547	case KTR_PROCCTOR:
548		/* FALLTHROUGH */
549	case KTR_PROCDTOR:
550		return;
551	case KTR_CAPFAIL:
552		type = "CAP ";
553		break;
554	case KTR_FAULT:
555		type = "PFLT";
556		break;
557	case KTR_FAULTEND:
558		type = "PRET";
559		break;
560	default:
561		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
562		type = unknown;
563	}
564
565	/*
566	 * The ktr_tid field was previously the ktr_buffer field, which held
567	 * the kernel pointer value for the buffer associated with data
568	 * following the record header.  It now holds a threadid, but only
569	 * for trace files after the change.  Older trace files still contain
570	 * kernel pointers.  Detect this and suppress the results by printing
571	 * negative tid's as 0.
572	 */
573	if (threads)
574		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
575		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
576		    MAXCOMLEN, kth->ktr_comm);
577	else
578		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
579		    kth->ktr_comm);
580	if (timestamp) {
581		if (timestamp == 3) {
582			if (prevtime.tv_sec == 0)
583				prevtime = kth->ktr_time;
584			timevalsub(&kth->ktr_time, &prevtime);
585		}
586		if (timestamp == 2) {
587			temp = kth->ktr_time;
588			timevalsub(&kth->ktr_time, &prevtime);
589			prevtime = temp;
590		}
591		printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
592		    kth->ktr_time.tv_usec);
593	}
594	printf("%s  ", type);
595}
596
597#include <sys/syscall.h>
598#define KTRACE
599#include <sys/kern/syscalls.c>
600#undef KTRACE
601int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
602
603void
604ktrsyscall(struct ktr_syscall *ktr, u_int flags)
605{
606	int narg = ktr->ktr_narg;
607	register_t *ip;
608	intmax_t arg;
609
610	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
611	    (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
612		printf("[%d]", ktr->ktr_code);
613	else {
614		printf("%s", syscallnames[ktr->ktr_code]);
615		if (syscallno)
616			printf("[%d]", ktr->ktr_code);
617	}
618	ip = &ktr->ktr_args[0];
619	if (narg) {
620		char c = '(';
621		if (fancy &&
622		    (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
623			switch (ktr->ktr_code) {
624			case SYS_bindat:
625			case SYS_connectat:
626			case SYS_faccessat:
627			case SYS_fchmodat:
628			case SYS_fchownat:
629			case SYS_fstatat:
630			case SYS_futimesat:
631			case SYS_linkat:
632			case SYS_mkdirat:
633			case SYS_mkfifoat:
634			case SYS_mknodat:
635			case SYS_openat:
636			case SYS_readlinkat:
637			case SYS_renameat:
638			case SYS_unlinkat:
639				putchar('(');
640				atfdname(*ip, decimal);
641				c = ',';
642				ip++;
643				narg--;
644				break;
645			}
646			switch (ktr->ktr_code) {
647			case SYS_ioctl: {
648				print_number(ip, narg, c);
649				putchar(c);
650				ioctlname(*ip, decimal);
651				c = ',';
652				ip++;
653				narg--;
654				break;
655			}
656			case SYS_ptrace:
657				putchar('(');
658				ptraceopname(*ip);
659				c = ',';
660				ip++;
661				narg--;
662				break;
663			case SYS_access:
664			case SYS_eaccess:
665			case SYS_faccessat:
666				print_number(ip, narg, c);
667				putchar(',');
668				accessmodename(*ip);
669				ip++;
670				narg--;
671				break;
672			case SYS_open:
673			case SYS_openat:
674				print_number(ip, narg, c);
675				putchar(',');
676				flagsandmodename(ip[0], ip[1], decimal);
677				ip += 2;
678				narg -= 2;
679				break;
680			case SYS_wait4:
681				print_number(ip, narg, c);
682				print_number(ip, narg, c);
683				/*
684				 * A flags value of zero is valid for
685				 * wait4() but not for wait6(), so
686				 * handle zero special here.
687				 */
688				if (*ip == 0) {
689					print_number(ip, narg, c);
690				} else {
691					putchar(',');
692					wait6optname(*ip);
693					ip++;
694					narg--;
695				}
696				break;
697			case SYS_wait6:
698				putchar('(');
699				idtypename(*ip, decimal);
700				c = ',';
701				ip++;
702				narg--;
703				print_number(ip, narg, c);
704				print_number(ip, narg, c);
705				putchar(',');
706				wait6optname(*ip);
707				ip++;
708				narg--;
709				break;
710			case SYS_chmod:
711			case SYS_fchmod:
712			case SYS_lchmod:
713				print_number(ip, narg, c);
714				putchar(',');
715				modename(*ip);
716				ip++;
717				narg--;
718				break;
719			case SYS_mknod:
720			case SYS_mknodat:
721				print_number(ip, narg, c);
722				putchar(',');
723				modename(*ip);
724				ip++;
725				narg--;
726				break;
727			case SYS_getfsstat:
728				print_number(ip, narg, c);
729				print_number(ip, narg, c);
730				putchar(',');
731				getfsstatflagsname(*ip);
732				ip++;
733				narg--;
734				break;
735			case SYS_mount:
736				print_number(ip, narg, c);
737				print_number(ip, narg, c);
738				putchar(',');
739				mountflagsname(*ip);
740				ip++;
741				narg--;
742				break;
743			case SYS_unmount:
744				print_number(ip, narg, c);
745				putchar(',');
746				mountflagsname(*ip);
747				ip++;
748				narg--;
749				break;
750			case SYS_recvmsg:
751			case SYS_sendmsg:
752				print_number(ip, narg, c);
753				print_number(ip, narg, c);
754				putchar(',');
755				sendrecvflagsname(*ip);
756				ip++;
757				narg--;
758				break;
759			case SYS_recvfrom:
760			case SYS_sendto:
761				print_number(ip, narg, c);
762				print_number(ip, narg, c);
763				print_number(ip, narg, c);
764				putchar(',');
765				sendrecvflagsname(*ip);
766				ip++;
767				narg--;
768				break;
769			case SYS_chflags:
770			case SYS_fchflags:
771			case SYS_lchflags:
772				print_number(ip, narg, c);
773				putchar(',');
774				modename(*ip);
775				ip++;
776				narg--;
777				break;
778			case SYS_kill:
779				print_number(ip, narg, c);
780				putchar(',');
781				signame(*ip);
782				ip++;
783				narg--;
784				break;
785			case SYS_reboot:
786				putchar('(');
787				rebootoptname(*ip);
788				ip++;
789				narg--;
790				break;
791			case SYS_umask:
792				putchar('(');
793				modename(*ip);
794				ip++;
795				narg--;
796				break;
797			case SYS_msync:
798				print_number(ip, narg, c);
799				print_number(ip, narg, c);
800				putchar(',');
801				msyncflagsname(*ip);
802				ip++;
803				narg--;
804				break;
805#ifdef SYS_freebsd6_mmap
806			case SYS_freebsd6_mmap:
807				print_number(ip, narg, c);
808				print_number(ip, narg, c);
809				putchar(',');
810				mmapprotname(*ip);
811				putchar(',');
812				ip++;
813				narg--;
814				mmapflagsname(*ip);
815				ip++;
816				narg--;
817				break;
818#endif
819			case SYS_mmap:
820				print_number(ip, narg, c);
821				print_number(ip, narg, c);
822				putchar(',');
823				mmapprotname(*ip);
824				putchar(',');
825				ip++;
826				narg--;
827				mmapflagsname(*ip);
828				ip++;
829				narg--;
830				break;
831			case SYS_mprotect:
832				print_number(ip, narg, c);
833				print_number(ip, narg, c);
834				putchar(',');
835				mmapprotname(*ip);
836				ip++;
837				narg--;
838				break;
839			case SYS_madvise:
840				print_number(ip, narg, c);
841				print_number(ip, narg, c);
842				putchar(',');
843				madvisebehavname(*ip);
844				ip++;
845				narg--;
846				break;
847			case SYS_setpriority:
848				print_number(ip, narg, c);
849				print_number(ip, narg, c);
850				putchar(',');
851				prioname(*ip);
852				ip++;
853				narg--;
854				break;
855			case SYS_fcntl:
856				print_number(ip, narg, c);
857				putchar(',');
858				fcntlcmdname(ip[0], ip[1], decimal);
859				ip += 2;
860				narg -= 2;
861				break;
862			case SYS_socket: {
863				int sockdomain;
864				putchar('(');
865				sockdomain = *ip;
866				sockdomainname(sockdomain);
867				ip++;
868				narg--;
869				putchar(',');
870				socktypenamewithflags(*ip);
871				ip++;
872				narg--;
873				if (sockdomain == PF_INET ||
874				    sockdomain == PF_INET6) {
875					putchar(',');
876					sockipprotoname(*ip);
877					ip++;
878					narg--;
879				}
880				c = ',';
881				break;
882			}
883			case SYS_setsockopt:
884			case SYS_getsockopt:
885				print_number(ip, narg, c);
886				putchar(',');
887				sockoptlevelname(*ip, decimal);
888				if (*ip == SOL_SOCKET) {
889					ip++;
890					narg--;
891					putchar(',');
892					sockoptname(*ip);
893				}
894				ip++;
895				narg--;
896				break;
897#ifdef SYS_freebsd6_lseek
898			case SYS_freebsd6_lseek:
899				print_number(ip, narg, c);
900				/* Hidden 'pad' argument, not in lseek(2) */
901				print_number(ip, narg, c);
902				print_number(ip, narg, c);
903				putchar(',');
904				whencename(*ip);
905				ip++;
906				narg--;
907				break;
908#endif
909			case SYS_lseek:
910				print_number(ip, narg, c);
911				/* Hidden 'pad' argument, not in lseek(2) */
912				print_number(ip, narg, c);
913				putchar(',');
914				whencename(*ip);
915				ip++;
916				narg--;
917				break;
918			case SYS_flock:
919				print_number(ip, narg, c);
920				putchar(',');
921				flockname(*ip);
922				ip++;
923				narg--;
924				break;
925			case SYS_mkfifo:
926			case SYS_mkfifoat:
927			case SYS_mkdir:
928			case SYS_mkdirat:
929				print_number(ip, narg, c);
930				putchar(',');
931				modename(*ip);
932				ip++;
933				narg--;
934				break;
935			case SYS_shutdown:
936				print_number(ip, narg, c);
937				putchar(',');
938				shutdownhowname(*ip);
939				ip++;
940				narg--;
941				break;
942			case SYS_socketpair:
943				putchar('(');
944				sockdomainname(*ip);
945				ip++;
946				narg--;
947				putchar(',');
948				socktypenamewithflags(*ip);
949				ip++;
950				narg--;
951				c = ',';
952				break;
953			case SYS_getrlimit:
954			case SYS_setrlimit:
955				putchar('(');
956				rlimitname(*ip);
957				ip++;
958				narg--;
959				c = ',';
960				break;
961			case SYS_quotactl:
962				print_number(ip, narg, c);
963				putchar(',');
964				quotactlname(*ip);
965				ip++;
966				narg--;
967				c = ',';
968				break;
969			case SYS_nfssvc:
970				putchar('(');
971				nfssvcname(*ip);
972				ip++;
973				narg--;
974				c = ',';
975				break;
976			case SYS_rtprio:
977				putchar('(');
978				rtprioname(*ip);
979				ip++;
980				narg--;
981				c = ',';
982				break;
983			case SYS___semctl:
984				print_number(ip, narg, c);
985				print_number(ip, narg, c);
986				putchar(',');
987				semctlname(*ip);
988				ip++;
989				narg--;
990				break;
991			case SYS_semget:
992				print_number(ip, narg, c);
993				print_number(ip, narg, c);
994				putchar(',');
995				semgetname(*ip);
996				ip++;
997				narg--;
998				break;
999			case SYS_msgctl:
1000				print_number(ip, narg, c);
1001				putchar(',');
1002				shmctlname(*ip);
1003				ip++;
1004				narg--;
1005				break;
1006			case SYS_shmat:
1007				print_number(ip, narg, c);
1008				print_number(ip, narg, c);
1009				putchar(',');
1010				shmatname(*ip);
1011				ip++;
1012				narg--;
1013				break;
1014			case SYS_shmctl:
1015				print_number(ip, narg, c);
1016				putchar(',');
1017				shmctlname(*ip);
1018				ip++;
1019				narg--;
1020				break;
1021			case SYS_shm_open:
1022				print_number(ip, narg, c);
1023				putchar(',');
1024				flagsname(ip[0]);
1025				printf(",0%o", (unsigned int)ip[1]);
1026				ip += 3;
1027				narg -= 3;
1028				break;
1029			case SYS_minherit:
1030				print_number(ip, narg, c);
1031				print_number(ip, narg, c);
1032				putchar(',');
1033				minheritname(*ip);
1034				ip++;
1035				narg--;
1036				break;
1037			case SYS_rfork:
1038				putchar('(');
1039				rforkname(*ip);
1040				ip++;
1041				narg--;
1042				c = ',';
1043				break;
1044			case SYS_lio_listio:
1045				putchar('(');
1046				lio_listioname(*ip);
1047				ip++;
1048				narg--;
1049				c = ',';
1050				break;
1051			case SYS_mlockall:
1052				putchar('(');
1053				mlockallname(*ip);
1054				ip++;
1055				narg--;
1056				break;
1057			case SYS_sched_setscheduler:
1058				print_number(ip, narg, c);
1059				putchar(',');
1060				schedpolicyname(*ip);
1061				ip++;
1062				narg--;
1063				break;
1064			case SYS_sched_get_priority_max:
1065			case SYS_sched_get_priority_min:
1066				putchar('(');
1067				schedpolicyname(*ip);
1068				ip++;
1069				narg--;
1070				break;
1071			case SYS_sendfile:
1072				print_number(ip, narg, c);
1073				print_number(ip, narg, c);
1074				print_number(ip, narg, c);
1075				print_number(ip, narg, c);
1076				print_number(ip, narg, c);
1077				print_number(ip, narg, c);
1078				putchar(',');
1079				sendfileflagsname(*(int *)ip);
1080				ip++;
1081				narg--;
1082				break;
1083			case SYS_kldsym:
1084				print_number(ip, narg, c);
1085				putchar(',');
1086				kldsymcmdname(*ip);
1087				ip++;
1088				narg--;
1089				break;
1090			case SYS_sigprocmask:
1091				putchar('(');
1092				sigprocmaskhowname(*ip);
1093				ip++;
1094				narg--;
1095				c = ',';
1096				break;
1097			case SYS___acl_get_file:
1098			case SYS___acl_set_file:
1099			case SYS___acl_get_fd:
1100			case SYS___acl_set_fd:
1101			case SYS___acl_delete_file:
1102			case SYS___acl_delete_fd:
1103			case SYS___acl_aclcheck_file:
1104			case SYS___acl_aclcheck_fd:
1105			case SYS___acl_get_link:
1106			case SYS___acl_set_link:
1107			case SYS___acl_delete_link:
1108			case SYS___acl_aclcheck_link:
1109				print_number(ip, narg, c);
1110				putchar(',');
1111				acltypename(*ip);
1112				ip++;
1113				narg--;
1114				break;
1115			case SYS_sigaction:
1116				putchar('(');
1117				signame(*ip);
1118				ip++;
1119				narg--;
1120				c = ',';
1121				break;
1122			case SYS_extattrctl:
1123				print_number(ip, narg, c);
1124				putchar(',');
1125				extattrctlname(*ip);
1126				ip++;
1127				narg--;
1128				break;
1129			case SYS_nmount:
1130				print_number(ip, narg, c);
1131				print_number(ip, narg, c);
1132				putchar(',');
1133				mountflagsname(*ip);
1134				ip++;
1135				narg--;
1136				break;
1137			case SYS_thr_create:
1138				print_number(ip, narg, c);
1139				print_number(ip, narg, c);
1140				putchar(',');
1141				thrcreateflagsname(*ip);
1142				ip++;
1143				narg--;
1144				break;
1145			case SYS_thr_kill:
1146				print_number(ip, narg, c);
1147				putchar(',');
1148				signame(*ip);
1149				ip++;
1150				narg--;
1151				break;
1152			case SYS_kldunloadf:
1153				print_number(ip, narg, c);
1154				putchar(',');
1155				kldunloadfflagsname(*ip);
1156				ip++;
1157				narg--;
1158				break;
1159			case SYS_linkat:
1160			case SYS_renameat:
1161			case SYS_symlinkat:
1162				print_number(ip, narg, c);
1163				putchar(',');
1164				atfdname(*ip, decimal);
1165				ip++;
1166				narg--;
1167				break;
1168			case SYS_cap_fcntls_limit:
1169				print_number(ip, narg, c);
1170				putchar(',');
1171				arg = *ip;
1172				ip++;
1173				narg--;
1174				capfcntlname(arg);
1175				break;
1176			case SYS_posix_fadvise:
1177				print_number(ip, narg, c);
1178				print_number(ip, narg, c);
1179				print_number(ip, narg, c);
1180				(void)putchar(',');
1181				fadvisebehavname((int)*ip);
1182				ip++;
1183				narg--;
1184				break;
1185			case SYS_procctl:
1186				putchar('(');
1187				idtypename(*ip, decimal);
1188				c = ',';
1189				ip++;
1190				narg--;
1191				print_number(ip, narg, c);
1192				putchar(',');
1193				procctlcmdname(*ip);
1194				ip++;
1195				narg--;
1196				break;
1197			case SYS__umtx_op:
1198				print_number(ip, narg, c);
1199				putchar(',');
1200				umtxopname(*ip);
1201				switch (*ip) {
1202				case UMTX_OP_CV_WAIT:
1203					ip++;
1204					narg--;
1205					putchar(',');
1206					umtxcvwaitflags(*ip);
1207					break;
1208				case UMTX_OP_RW_RDLOCK:
1209					ip++;
1210					narg--;
1211					putchar(',');
1212					umtxrwlockflags(*ip);
1213					break;
1214				}
1215				ip++;
1216				narg--;
1217			}
1218		}
1219		while (narg > 0) {
1220			print_number(ip, narg, c);
1221		}
1222		putchar(')');
1223	}
1224	putchar('\n');
1225}
1226
1227void
1228ktrsysret(struct ktr_sysret *ktr, u_int flags)
1229{
1230	register_t ret = ktr->ktr_retval;
1231	int error = ktr->ktr_error;
1232	int code = ktr->ktr_code;
1233
1234	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
1235	    (code >= nsyscalls || code < 0))
1236		printf("[%d] ", code);
1237	else {
1238		printf("%s", syscallnames[code]);
1239		if (syscallno)
1240			printf("[%d]", code);
1241		printf(" ");
1242	}
1243
1244	if (error == 0) {
1245		if (fancy) {
1246			printf("%ld", (long)ret);
1247			if (ret < 0 || ret > 9)
1248				printf("/%#lx", (unsigned long)ret);
1249		} else {
1250			if (decimal)
1251				printf("%ld", (long)ret);
1252			else
1253				printf("%#lx", (unsigned long)ret);
1254		}
1255	} else if (error == ERESTART)
1256		printf("RESTART");
1257	else if (error == EJUSTRETURN)
1258		printf("JUSTRETURN");
1259	else {
1260		printf("-1 errno %d", ktr->ktr_error);
1261		if (fancy)
1262			printf(" %s", strerror(ktr->ktr_error));
1263	}
1264	putchar('\n');
1265}
1266
1267void
1268ktrnamei(char *cp, int len)
1269{
1270	printf("\"%.*s\"\n", len, cp);
1271}
1272
1273void
1274hexdump(char *p, int len, int screenwidth)
1275{
1276	int n, i;
1277	int width;
1278
1279	width = 0;
1280	do {
1281		width += 2;
1282		i = 13;			/* base offset */
1283		i += (width / 2) + 1;	/* spaces every second byte */
1284		i += (width * 2);	/* width of bytes */
1285		i += 3;			/* "  |" */
1286		i += width;		/* each byte */
1287		i += 1;			/* "|" */
1288	} while (i < screenwidth);
1289	width -= 2;
1290
1291	for (n = 0; n < len; n += width) {
1292		for (i = n; i < n + width; i++) {
1293			if ((i % width) == 0) {	/* beginning of line */
1294				printf("       0x%04x", i);
1295			}
1296			if ((i % 2) == 0) {
1297				printf(" ");
1298			}
1299			if (i < len)
1300				printf("%02x", p[i] & 0xff);
1301			else
1302				printf("  ");
1303		}
1304		printf("  |");
1305		for (i = n; i < n + width; i++) {
1306			if (i >= len)
1307				break;
1308			if (p[i] >= ' ' && p[i] <= '~')
1309				printf("%c", p[i]);
1310			else
1311				printf(".");
1312		}
1313		printf("|\n");
1314	}
1315	if ((i % width) != 0)
1316		printf("\n");
1317}
1318
1319void
1320visdump(char *dp, int datalen, int screenwidth)
1321{
1322	int col = 0;
1323	char *cp;
1324	int width;
1325	char visbuf[5];
1326
1327	printf("       \"");
1328	col = 8;
1329	for (;datalen > 0; datalen--, dp++) {
1330		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
1331		cp = visbuf;
1332		/*
1333		 * Keep track of printables and
1334		 * space chars (like fold(1)).
1335		 */
1336		if (col == 0) {
1337			putchar('\t');
1338			col = 8;
1339		}
1340		switch(*cp) {
1341		case '\n':
1342			col = 0;
1343			putchar('\n');
1344			continue;
1345		case '\t':
1346			width = 8 - (col&07);
1347			break;
1348		default:
1349			width = strlen(cp);
1350		}
1351		if (col + width > (screenwidth-2)) {
1352			printf("\\\n\t");
1353			col = 8;
1354		}
1355		col += width;
1356		do {
1357			putchar(*cp++);
1358		} while (*cp);
1359	}
1360	if (col == 0)
1361		printf("       ");
1362	printf("\"\n");
1363}
1364
1365void
1366ktrgenio(struct ktr_genio *ktr, int len)
1367{
1368	int datalen = len - sizeof (struct ktr_genio);
1369	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1370	static int screenwidth = 0;
1371	int i, binary;
1372
1373	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
1374		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
1375		datalen == 1 ? "" : "s");
1376	if (suppressdata)
1377		return;
1378	if (screenwidth == 0) {
1379		struct winsize ws;
1380
1381		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1382		    ws.ws_col > 8)
1383			screenwidth = ws.ws_col;
1384		else
1385			screenwidth = 80;
1386	}
1387	if (maxdata && datalen > maxdata)
1388		datalen = maxdata;
1389
1390	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1391		if (dp[i] >= 32 && dp[i] < 127)
1392			continue;
1393		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1394			continue;
1395		binary = 1;
1396	}
1397	if (binary)
1398		hexdump(dp, datalen, screenwidth);
1399	else
1400		visdump(dp, datalen, screenwidth);
1401}
1402
1403const char *signames[] = {
1404	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
1405	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
1406	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
1407	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
1408	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
1409	"USR2", NULL,						/* 31 - 32 */
1410};
1411
1412void
1413ktrpsig(struct ktr_psig *psig)
1414{
1415	if (psig->signo > 0 && psig->signo < NSIG)
1416		printf("SIG%s ", signames[psig->signo]);
1417	else
1418		printf("SIG %d ", psig->signo);
1419	if (psig->action == SIG_DFL) {
1420		printf("SIG_DFL code=");
1421		sigcodename(psig->signo, psig->code);
1422		putchar('\n');
1423	} else {
1424		printf("caught handler=0x%lx mask=0x%x code=",
1425		    (u_long)psig->action, psig->mask.__bits[0]);
1426		sigcodename(psig->signo, psig->code);
1427		putchar('\n');
1428	}
1429}
1430
1431void
1432ktrcsw_old(struct ktr_csw_old *cs)
1433{
1434	printf("%s %s\n", cs->out ? "stop" : "resume",
1435		cs->user ? "user" : "kernel");
1436}
1437
1438void
1439ktrcsw(struct ktr_csw *cs)
1440{
1441	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
1442	    cs->user ? "user" : "kernel", cs->wmesg);
1443}
1444
1445#define	UTRACE_DLOPEN_START		1
1446#define	UTRACE_DLOPEN_STOP		2
1447#define	UTRACE_DLCLOSE_START		3
1448#define	UTRACE_DLCLOSE_STOP		4
1449#define	UTRACE_LOAD_OBJECT		5
1450#define	UTRACE_UNLOAD_OBJECT		6
1451#define	UTRACE_ADD_RUNDEP		7
1452#define	UTRACE_PRELOAD_FINISHED		8
1453#define	UTRACE_INIT_CALL		9
1454#define	UTRACE_FINI_CALL		10
1455#define	UTRACE_DLSYM_START		11
1456#define	UTRACE_DLSYM_STOP		12
1457
1458struct utrace_rtld {
1459	char sig[4];				/* 'RTLD' */
1460	int event;
1461	void *handle;
1462	void *mapbase;
1463	size_t mapsize;
1464	int refcnt;
1465	char name[MAXPATHLEN];
1466};
1467
1468void
1469ktruser_rtld(int len, void *p)
1470{
1471	struct utrace_rtld *ut = p;
1472	unsigned char *cp;
1473	void *parent;
1474	int mode;
1475
1476	switch (ut->event) {
1477	case UTRACE_DLOPEN_START:
1478		mode = ut->refcnt;
1479		printf("dlopen(%s, ", ut->name);
1480		switch (mode & RTLD_MODEMASK) {
1481		case RTLD_NOW:
1482			printf("RTLD_NOW");
1483			break;
1484		case RTLD_LAZY:
1485			printf("RTLD_LAZY");
1486			break;
1487		default:
1488			printf("%#x", mode & RTLD_MODEMASK);
1489		}
1490		if (mode & RTLD_GLOBAL)
1491			printf(" | RTLD_GLOBAL");
1492		if (mode & RTLD_TRACE)
1493			printf(" | RTLD_TRACE");
1494		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
1495			printf(" | %#x", mode &
1496			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
1497		printf(")\n");
1498		break;
1499	case UTRACE_DLOPEN_STOP:
1500		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
1501		    ut->refcnt);
1502		break;
1503	case UTRACE_DLCLOSE_START:
1504		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
1505		    ut->refcnt);
1506		break;
1507	case UTRACE_DLCLOSE_STOP:
1508		printf("dlclose(%p) finished\n", ut->handle);
1509		break;
1510	case UTRACE_LOAD_OBJECT:
1511		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
1512		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
1513		    ut->name);
1514		break;
1515	case UTRACE_UNLOAD_OBJECT:
1516		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
1517		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
1518		    ut->name);
1519		break;
1520	case UTRACE_ADD_RUNDEP:
1521		parent = ut->mapbase;
1522		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
1523		    ut->handle, ut->name, ut->refcnt);
1524		break;
1525	case UTRACE_PRELOAD_FINISHED:
1526		printf("RTLD: LD_PRELOAD finished\n");
1527		break;
1528	case UTRACE_INIT_CALL:
1529		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
1530		    ut->name);
1531		break;
1532	case UTRACE_FINI_CALL:
1533		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
1534		    ut->name);
1535		break;
1536	case UTRACE_DLSYM_START:
1537		printf("RTLD: dlsym(%p, %s)\n", ut->handle, ut->name);
1538		break;
1539	case UTRACE_DLSYM_STOP:
1540		printf("RTLD: %p = dlsym(%p, %s)\n", ut->mapbase, ut->handle,
1541		    ut->name);
1542		break;
1543	default:
1544		cp = p;
1545		cp += 4;
1546		len -= 4;
1547		printf("RTLD: %d ", len);
1548		while (len--)
1549			if (decimal)
1550				printf(" %d", *cp++);
1551			else
1552				printf(" %02x", *cp++);
1553		printf("\n");
1554	}
1555}
1556
1557struct utrace_malloc {
1558	void *p;
1559	size_t s;
1560	void *r;
1561};
1562
1563void
1564ktruser_malloc(void *p)
1565{
1566	struct utrace_malloc *ut = p;
1567
1568	if (ut->p == (void *)(intptr_t)(-1))
1569		printf("malloc_init()\n");
1570	else if (ut->s == 0)
1571		printf("free(%p)\n", ut->p);
1572	else if (ut->p == NULL)
1573		printf("%p = malloc(%zu)\n", ut->r, ut->s);
1574	else
1575		printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1576}
1577
1578void
1579ktruser(int len, void *p)
1580{
1581	unsigned char *cp;
1582
1583	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
1584		ktruser_rtld(len, p);
1585		return;
1586	}
1587
1588	if (len == sizeof(struct utrace_malloc)) {
1589		ktruser_malloc(p);
1590		return;
1591	}
1592
1593	printf("%d ", len);
1594	cp = p;
1595	while (len--)
1596		if (decimal)
1597			printf(" %d", *cp++);
1598		else
1599			printf(" %02x", *cp++);
1600	printf("\n");
1601}
1602
1603void
1604ktrcaprights(cap_rights_t *rightsp)
1605{
1606
1607	printf("cap_rights_t ");
1608	capname(rightsp);
1609	printf("\n");
1610}
1611
1612void
1613ktrsockaddr(struct sockaddr *sa)
1614{
1615/*
1616 TODO: Support additional address families
1617	#include <netnatm/natm.h>
1618	struct sockaddr_natm	*natm;
1619	#include <netsmb/netbios.h>
1620	struct sockaddr_nb	*nb;
1621*/
1622	char addr[64];
1623
1624	/*
1625	 * note: ktrstruct() has already verified that sa points to a
1626	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
1627	 * sa->sa_len bytes long.
1628	 */
1629	printf("struct sockaddr { ");
1630	sockfamilyname(sa->sa_family);
1631	printf(", ");
1632
1633#define check_sockaddr_len(n)					\
1634	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
1635		printf("invalid");				\
1636		break;						\
1637	}
1638
1639	switch(sa->sa_family) {
1640	case AF_INET: {
1641		struct sockaddr_in sa_in;
1642
1643		memset(&sa_in, 0, sizeof(sa_in));
1644		memcpy(&sa_in, sa, sa->sa_len);
1645		check_sockaddr_len(in);
1646		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
1647		printf("%s:%u", addr, ntohs(sa_in.sin_port));
1648		break;
1649	}
1650#ifdef NETATALK
1651	case AF_APPLETALK: {
1652		struct sockaddr_at	sa_at;
1653		struct netrange		*nr;
1654
1655		memset(&sa_at, 0, sizeof(sa_at));
1656		memcpy(&sa_at, sa, sa->sa_len);
1657		check_sockaddr_len(at);
1658		nr = &sa_at.sat_range.r_netrange;
1659		printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net),
1660			sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet),
1661			ntohs(nr->nr_lastnet), nr->nr_phase);
1662		break;
1663	}
1664#endif
1665	case AF_INET6: {
1666		struct sockaddr_in6 sa_in6;
1667
1668		memset(&sa_in6, 0, sizeof(sa_in6));
1669		memcpy(&sa_in6, sa, sa->sa_len);
1670		check_sockaddr_len(in6);
1671		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1672		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
1673		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
1674		break;
1675	}
1676#ifdef IPX
1677	case AF_IPX: {
1678		struct sockaddr_ipx sa_ipx;
1679
1680		memset(&sa_ipx, 0, sizeof(sa_ipx));
1681		memcpy(&sa_ipx, sa, sa->sa_len);
1682		check_sockaddr_len(ipx);
1683		/* XXX wish we had ipx_ntop */
1684		printf("%s", ipx_ntoa(sa_ipx.sipx_addr));
1685		free(sa_ipx);
1686		break;
1687	}
1688#endif
1689	case AF_UNIX: {
1690		struct sockaddr_un sa_un;
1691
1692		memset(&sa_un, 0, sizeof(sa_un));
1693		memcpy(&sa_un, sa, sa->sa_len);
1694		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
1695		break;
1696	}
1697	default:
1698		printf("unknown address family");
1699	}
1700	printf(" }\n");
1701}
1702
1703void
1704ktrstat(struct stat *statp)
1705{
1706	char mode[12], timestr[PATH_MAX + 4];
1707	struct passwd *pwd;
1708	struct group  *grp;
1709	struct tm *tm;
1710
1711	/*
1712	 * note: ktrstruct() has already verified that statp points to a
1713	 * buffer exactly sizeof(struct stat) bytes long.
1714	 */
1715	printf("struct stat {");
1716	printf("dev=%ju, ino=%ju, ",
1717		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
1718	if (resolv == 0)
1719		printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
1720	else {
1721		strmode(statp->st_mode, mode);
1722		printf("mode=%s, ", mode);
1723	}
1724	printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
1725	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
1726		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
1727	else
1728		printf("uid=\"%s\", ", pwd->pw_name);
1729	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
1730		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
1731	else
1732		printf("gid=\"%s\", ", grp->gr_name);
1733	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
1734	printf("atime=");
1735	if (resolv == 0)
1736		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
1737	else {
1738		tm = localtime(&statp->st_atim.tv_sec);
1739		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1740		printf("\"%s\"", timestr);
1741	}
1742	if (statp->st_atim.tv_nsec != 0)
1743		printf(".%09ld, ", statp->st_atim.tv_nsec);
1744	else
1745		printf(", ");
1746	printf("stime=");
1747	if (resolv == 0)
1748		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
1749	else {
1750		tm = localtime(&statp->st_mtim.tv_sec);
1751		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1752		printf("\"%s\"", timestr);
1753	}
1754	if (statp->st_mtim.tv_nsec != 0)
1755		printf(".%09ld, ", statp->st_mtim.tv_nsec);
1756	else
1757		printf(", ");
1758	printf("ctime=");
1759	if (resolv == 0)
1760		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
1761	else {
1762		tm = localtime(&statp->st_ctim.tv_sec);
1763		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1764		printf("\"%s\"", timestr);
1765	}
1766	if (statp->st_ctim.tv_nsec != 0)
1767		printf(".%09ld, ", statp->st_ctim.tv_nsec);
1768	else
1769		printf(", ");
1770	printf("birthtime=");
1771	if (resolv == 0)
1772		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
1773	else {
1774		tm = localtime(&statp->st_birthtim.tv_sec);
1775		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1776		printf("\"%s\"", timestr);
1777	}
1778	if (statp->st_birthtim.tv_nsec != 0)
1779		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
1780	else
1781		printf(", ");
1782	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
1783		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
1784		(intmax_t)statp->st_blocks, statp->st_flags);
1785	printf(" }\n");
1786}
1787
1788void
1789ktrstruct(char *buf, size_t buflen)
1790{
1791	char *name, *data;
1792	size_t namelen, datalen;
1793	int i;
1794	cap_rights_t rights;
1795	struct stat sb;
1796	struct sockaddr_storage ss;
1797
1798	for (name = buf, namelen = 0;
1799	     namelen < buflen && name[namelen] != '\0';
1800	     ++namelen)
1801		/* nothing */;
1802	if (namelen == buflen)
1803		goto invalid;
1804	if (name[namelen] != '\0')
1805		goto invalid;
1806	data = buf + namelen + 1;
1807	datalen = buflen - namelen - 1;
1808	if (datalen == 0)
1809		goto invalid;
1810	/* sanity check */
1811	for (i = 0; i < (int)namelen; ++i)
1812		if (!isalpha(name[i]))
1813			goto invalid;
1814	if (strcmp(name, "caprights") == 0) {
1815		if (datalen != sizeof(cap_rights_t))
1816			goto invalid;
1817		memcpy(&rights, data, datalen);
1818		ktrcaprights(&rights);
1819	} else if (strcmp(name, "stat") == 0) {
1820		if (datalen != sizeof(struct stat))
1821			goto invalid;
1822		memcpy(&sb, data, datalen);
1823		ktrstat(&sb);
1824	} else if (strcmp(name, "sockaddr") == 0) {
1825		if (datalen > sizeof(ss))
1826			goto invalid;
1827		memcpy(&ss, data, datalen);
1828		if (datalen != ss.ss_len)
1829			goto invalid;
1830		ktrsockaddr((struct sockaddr *)&ss);
1831	} else {
1832		printf("unknown structure\n");
1833	}
1834	return;
1835invalid:
1836	printf("invalid record\n");
1837}
1838
1839void
1840ktrcapfail(struct ktr_cap_fail *ktr)
1841{
1842	switch (ktr->cap_type) {
1843	case CAPFAIL_NOTCAPABLE:
1844		/* operation on fd with insufficient capabilities */
1845		printf("operation requires ");
1846		capname(&ktr->cap_needed);
1847		printf(", process holds ");
1848		capname(&ktr->cap_held);
1849		break;
1850	case CAPFAIL_INCREASE:
1851		/* requested more capabilities than fd already has */
1852		printf("attempt to increase capabilities from ");
1853		capname(&ktr->cap_held);
1854		printf(" to ");
1855		capname(&ktr->cap_needed);
1856		break;
1857	case CAPFAIL_SYSCALL:
1858		/* called restricted syscall */
1859		printf("disallowed system call");
1860		break;
1861	case CAPFAIL_LOOKUP:
1862		/* used ".." in strict-relative mode */
1863		printf("restricted VFS lookup");
1864		break;
1865	default:
1866		printf("unknown capability failure: ");
1867		capname(&ktr->cap_needed);
1868		printf(" ");
1869		capname(&ktr->cap_held);
1870		break;
1871	}
1872	printf("\n");
1873}
1874
1875void
1876ktrfault(struct ktr_fault *ktr)
1877{
1878
1879	printf("0x%jx ", (uintmax_t)ktr->vaddr);
1880	vmprotname(ktr->type);
1881	printf("\n");
1882}
1883
1884void
1885ktrfaultend(struct ktr_faultend *ktr)
1886{
1887
1888	vmresultname(ktr->result);
1889	printf("\n");
1890}
1891
1892#if defined(__amd64__) || defined(__i386__)
1893void
1894linux_ktrsyscall(struct ktr_syscall *ktr)
1895{
1896	int narg = ktr->ktr_narg;
1897	register_t *ip;
1898
1899	if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
1900		printf("[%d]", ktr->ktr_code);
1901	else {
1902		printf("%s", linux_syscallnames[ktr->ktr_code]);
1903		if (syscallno)
1904			printf("[%d]", ktr->ktr_code);
1905	}
1906	ip = &ktr->ktr_args[0];
1907	if (narg) {
1908		char c = '(';
1909		while (narg > 0)
1910			print_number(ip, narg, c);
1911		putchar(')');
1912	}
1913	putchar('\n');
1914}
1915
1916void
1917linux_ktrsysret(struct ktr_sysret *ktr)
1918{
1919	register_t ret = ktr->ktr_retval;
1920	int error = ktr->ktr_error;
1921	int code = ktr->ktr_code;
1922
1923	if (code >= nlinux_syscalls || code < 0)
1924		printf("[%d] ", code);
1925	else {
1926		printf("%s", linux_syscallnames[code]);
1927		if (syscallno)
1928			printf("[%d]", code);
1929		printf(" ");
1930	}
1931
1932	if (error == 0) {
1933		if (fancy) {
1934			printf("%ld", (long)ret);
1935			if (ret < 0 || ret > 9)
1936				printf("/%#lx", (unsigned long)ret);
1937		} else {
1938			if (decimal)
1939				printf("%ld", (long)ret);
1940			else
1941				printf("%#lx", (unsigned long)ret);
1942		}
1943	} else if (error == ERESTART)
1944		printf("RESTART");
1945	else if (error == EJUSTRETURN)
1946		printf("JUSTRETURN");
1947	else {
1948		if (ktr->ktr_error <= ELAST + 1)
1949			error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1950		else
1951			error = 999;
1952		printf("-1 errno %d", error);
1953		if (fancy)
1954			printf(" %s", strerror(ktr->ktr_error));
1955	}
1956	putchar('\n');
1957}
1958#endif
1959
1960void
1961usage(void)
1962{
1963	fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
1964	    "[-m maxdata] [-p pid] [-t trstr]\n");
1965	exit(1);
1966}
1967