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