xref: /freebsd/usr.bin/kdump/kdump.c (revision 0460d351)
19b50d902SRodney W. Grimes /*-
29b50d902SRodney W. Grimes  * Copyright (c) 1988, 1993
39b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
49b50d902SRodney W. Grimes  *
59b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
69b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
79b50d902SRodney W. Grimes  * are met:
89b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
99b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
109b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
129b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
139b50d902SRodney W. Grimes  * 3. All advertising materials mentioning features or use of this software
149b50d902SRodney W. Grimes  *    must display the following acknowledgement:
159b50d902SRodney W. Grimes  *	This product includes software developed by the University of
169b50d902SRodney W. Grimes  *	California, Berkeley and its contributors.
179b50d902SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
189b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
199b50d902SRodney W. Grimes  *    without specific prior written permission.
209b50d902SRodney W. Grimes  *
219b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
229b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
239b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
249b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
259b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
269b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
279b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
289b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
299b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
309b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
319b50d902SRodney W. Grimes  * SUCH DAMAGE.
329b50d902SRodney W. Grimes  */
339b50d902SRodney W. Grimes 
349b50d902SRodney W. Grimes #ifndef lint
3515fc002bSPhilippe Charnier static const char copyright[] =
369b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\
379b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
389b50d902SRodney W. Grimes #endif /* not lint */
399b50d902SRodney W. Grimes 
409b50d902SRodney W. Grimes #ifndef lint
4115fc002bSPhilippe Charnier #if 0
429b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
4315fc002bSPhilippe Charnier #endif
449b50d902SRodney W. Grimes #endif /* not lint */
45e026a48cSDavid E. O'Brien #include <sys/cdefs.h>
46e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$");
479b50d902SRodney W. Grimes 
48c4473420SPeter Wemm #define _KERNEL
49c1b99fe6SGeoff Rehmet extern int errno;
50c1b99fe6SGeoff Rehmet #include <sys/errno.h>
51c4473420SPeter Wemm #undef _KERNEL
529b50d902SRodney W. Grimes #include <sys/param.h>
539b50d902SRodney W. Grimes #include <sys/errno.h>
5491fbb9c1SDavid Malone #define _KERNEL
559b50d902SRodney W. Grimes #include <sys/time.h>
5691fbb9c1SDavid Malone #undef _KERNEL
579b50d902SRodney W. Grimes #include <sys/uio.h>
589b50d902SRodney W. Grimes #include <sys/ktrace.h>
599b50d902SRodney W. Grimes #include <sys/ioctl.h>
608bc31d83SCraig Rodrigues #include <sys/socket.h>
611f4b63f8SJohn Baldwin #include <dlfcn.h>
6215fc002bSPhilippe Charnier #include <err.h>
6315fc002bSPhilippe Charnier #include <locale.h>
649b50d902SRodney W. Grimes #include <stdio.h>
659b50d902SRodney W. Grimes #include <stdlib.h>
669b50d902SRodney W. Grimes #include <string.h>
6715fc002bSPhilippe Charnier #include <unistd.h>
6815fc002bSPhilippe Charnier #include <vis.h>
699b50d902SRodney W. Grimes #include "ktrace.h"
7098a68a58SAlexander Leidinger #include "kdump_subr.h"
719b50d902SRodney W. Grimes 
7291fbb9c1SDavid Malone int fread_tail(void *, int, int);
7391fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
7491fbb9c1SDavid Malone void ktrsyscall(struct ktr_syscall *);
7591fbb9c1SDavid Malone void ktrsysret(struct ktr_sysret *);
7691fbb9c1SDavid Malone void ktrnamei(char *, int);
77ec4beb5dSPeter Wemm void hexdump(char *, int, int);
78ec4beb5dSPeter Wemm void visdump(char *, int, int);
7991fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
8091fbb9c1SDavid Malone void ktrpsig(struct ktr_psig *);
8191fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
8291fbb9c1SDavid Malone void ktruser(int, unsigned char *);
8391fbb9c1SDavid Malone void usage(void);
847143dfdcSRuslan Ermilov const char *ioctlname(u_long);
8591fbb9c1SDavid Malone 
86df0c8868SRobert Watson int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata;
8791fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE;
889b50d902SRodney W. Grimes struct ktr_header ktr_header;
899b50d902SRodney W. Grimes 
909b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
919b50d902SRodney W. Grimes 
9291fbb9c1SDavid Malone int
9391fbb9c1SDavid Malone main(int argc, char *argv[])
949b50d902SRodney W. Grimes {
959b50d902SRodney W. Grimes 	int ch, ktrlen, size;
9691fbb9c1SDavid Malone 	void *m;
979b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
98db53f66bSJohn Baldwin 	int drop_logged;
99ec4beb5dSPeter Wemm 	pid_t pid = 0;
1009b50d902SRodney W. Grimes 
1015ccbfb26SAndrey A. Chernov 	(void) setlocale(LC_CTYPE, "");
1025ccbfb26SAndrey A. Chernov 
103df0c8868SRobert Watson 	while ((ch = getopt(argc,argv,"f:dElm:np:HRsTt:")) != -1)
1049b50d902SRodney W. Grimes 		switch((char)ch) {
1059b50d902SRodney W. Grimes 		case 'f':
1069b50d902SRodney W. Grimes 			tracefile = optarg;
1079b50d902SRodney W. Grimes 			break;
1089b50d902SRodney W. Grimes 		case 'd':
1099b50d902SRodney W. Grimes 			decimal = 1;
1109b50d902SRodney W. Grimes 			break;
1119b50d902SRodney W. Grimes 		case 'l':
1129b50d902SRodney W. Grimes 			tail = 1;
1139b50d902SRodney W. Grimes 			break;
1149b50d902SRodney W. Grimes 		case 'm':
1159b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
1169b50d902SRodney W. Grimes 			break;
1179b50d902SRodney W. Grimes 		case 'n':
1189b50d902SRodney W. Grimes 			fancy = 0;
1199b50d902SRodney W. Grimes 			break;
120ec4beb5dSPeter Wemm 		case 'p':
121ec4beb5dSPeter Wemm 			pid = atoi(optarg);
122ec4beb5dSPeter Wemm 			break;
123df0c8868SRobert Watson 		case 's':
124df0c8868SRobert Watson 			suppressdata = 1;
125df0c8868SRobert Watson 			break;
126ec131914SPeter Wemm 		case 'E':
127ec131914SPeter Wemm 			timestamp = 3;	/* elapsed timestamp */
128ec131914SPeter Wemm 			break;
129a9ac598bSRobert Watson 		case 'H':
130a9ac598bSRobert Watson 			threads = 1;
131a9ac598bSRobert Watson 			break;
1329b50d902SRodney W. Grimes 		case 'R':
1339b50d902SRodney W. Grimes 			timestamp = 2;	/* relative timestamp */
1349b50d902SRodney W. Grimes 			break;
1359b50d902SRodney W. Grimes 		case 'T':
1369b50d902SRodney W. Grimes 			timestamp = 1;
1379b50d902SRodney W. Grimes 			break;
1389b50d902SRodney W. Grimes 		case 't':
1399b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
14015fc002bSPhilippe Charnier 			if (trpoints < 0)
14115fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
1429b50d902SRodney W. Grimes 			break;
1439b50d902SRodney W. Grimes 		default:
1449b50d902SRodney W. Grimes 			usage();
1459b50d902SRodney W. Grimes 		}
1469b50d902SRodney W. Grimes 
14780844fd1SBill Fenner 	if (argc > optind)
1489b50d902SRodney W. Grimes 		usage();
1499b50d902SRodney W. Grimes 
1509b50d902SRodney W. Grimes 	m = (void *)malloc(size = 1025);
15115fc002bSPhilippe Charnier 	if (m == NULL)
15215fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
15315fc002bSPhilippe Charnier 	if (!freopen(tracefile, "r", stdin))
15415fc002bSPhilippe Charnier 		err(1, "%s", tracefile);
155db53f66bSJohn Baldwin 	drop_logged = 0;
1569b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
157db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
158db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
159a9ac598bSRobert Watson 			if (!drop_logged && threads) {
160a9ac598bSRobert Watson 				(void)printf("%6d %6d %-8.*s Events dropped.\n",
161a9ac598bSRobert Watson 				    ktr_header.ktr_pid, ktr_header.ktr_tid >
162a9ac598bSRobert Watson 				    0 ? ktr_header.ktr_tid : 0, MAXCOMLEN,
163a9ac598bSRobert Watson 				    ktr_header.ktr_comm);
164a9ac598bSRobert Watson 				drop_logged = 1;
165a9ac598bSRobert Watson 			} else if (!drop_logged) {
166db53f66bSJohn Baldwin 				(void)printf("%6d %-8.*s Events dropped.\n",
167db53f66bSJohn Baldwin 				    ktr_header.ktr_pid, MAXCOMLEN,
168db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
169db53f66bSJohn Baldwin 				drop_logged = 1;
170db53f66bSJohn Baldwin 			}
171db53f66bSJohn Baldwin 		}
1729b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
173ec4beb5dSPeter Wemm 			if (pid == 0 || ktr_header.ktr_pid == pid)
1749b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
17515fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
17615fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
1779b50d902SRodney W. Grimes 		if (ktrlen > size) {
1789b50d902SRodney W. Grimes 			m = (void *)realloc(m, ktrlen+1);
17915fc002bSPhilippe Charnier 			if (m == NULL)
18015fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
1819b50d902SRodney W. Grimes 			size = ktrlen;
1829b50d902SRodney W. Grimes 		}
18315fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
18415fc002bSPhilippe Charnier 			errx(1, "data too short");
185ec4beb5dSPeter Wemm 		if (pid && ktr_header.ktr_pid != pid)
186ec4beb5dSPeter Wemm 			continue;
1879b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
1889b50d902SRodney W. Grimes 			continue;
189db53f66bSJohn Baldwin 		drop_logged = 0;
1909b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
1919b50d902SRodney W. Grimes 		case KTR_SYSCALL:
1929b50d902SRodney W. Grimes 			ktrsyscall((struct ktr_syscall *)m);
1939b50d902SRodney W. Grimes 			break;
1949b50d902SRodney W. Grimes 		case KTR_SYSRET:
1959b50d902SRodney W. Grimes 			ktrsysret((struct ktr_sysret *)m);
1969b50d902SRodney W. Grimes 			break;
1979b50d902SRodney W. Grimes 		case KTR_NAMEI:
1989b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
1999b50d902SRodney W. Grimes 			break;
2009b50d902SRodney W. Grimes 		case KTR_GENIO:
2019b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
2029b50d902SRodney W. Grimes 			break;
2039b50d902SRodney W. Grimes 		case KTR_PSIG:
2049b50d902SRodney W. Grimes 			ktrpsig((struct ktr_psig *)m);
2059b50d902SRodney W. Grimes 			break;
2069b50d902SRodney W. Grimes 		case KTR_CSW:
2079b50d902SRodney W. Grimes 			ktrcsw((struct ktr_csw *)m);
2089b50d902SRodney W. Grimes 			break;
20982e2dd32SPoul-Henning Kamp 		case KTR_USER:
2103f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
21182e2dd32SPoul-Henning Kamp 			break;
212b9609ab1SJohn Baldwin 		default:
213b9609ab1SJohn Baldwin 			printf("\n");
214b9609ab1SJohn Baldwin 			break;
2159b50d902SRodney W. Grimes 		}
2169b50d902SRodney W. Grimes 		if (tail)
2179b50d902SRodney W. Grimes 			(void)fflush(stdout);
2189b50d902SRodney W. Grimes 	}
21991fbb9c1SDavid Malone 	return 0;
2209b50d902SRodney W. Grimes }
2219b50d902SRodney W. Grimes 
22291fbb9c1SDavid Malone int
22391fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
2249b50d902SRodney W. Grimes {
2259b50d902SRodney W. Grimes 	int i;
2269b50d902SRodney W. Grimes 
2279b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
2289b50d902SRodney W. Grimes 		(void)sleep(1);
2299b50d902SRodney W. Grimes 		clearerr(stdin);
2309b50d902SRodney W. Grimes 	}
2319b50d902SRodney W. Grimes 	return (i);
2329b50d902SRodney W. Grimes }
2339b50d902SRodney W. Grimes 
23491fbb9c1SDavid Malone void
23591fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
2369b50d902SRodney W. Grimes {
2379b50d902SRodney W. Grimes 	static char unknown[64];
2389b50d902SRodney W. Grimes 	static struct timeval prevtime, temp;
23991fbb9c1SDavid Malone 	const char *type;
2409b50d902SRodney W. Grimes 
2419b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
2429b50d902SRodney W. Grimes 	case KTR_SYSCALL:
2439b50d902SRodney W. Grimes 		type = "CALL";
2449b50d902SRodney W. Grimes 		break;
2459b50d902SRodney W. Grimes 	case KTR_SYSRET:
2469b50d902SRodney W. Grimes 		type = "RET ";
2479b50d902SRodney W. Grimes 		break;
2489b50d902SRodney W. Grimes 	case KTR_NAMEI:
2499b50d902SRodney W. Grimes 		type = "NAMI";
2509b50d902SRodney W. Grimes 		break;
2519b50d902SRodney W. Grimes 	case KTR_GENIO:
2529b50d902SRodney W. Grimes 		type = "GIO ";
2539b50d902SRodney W. Grimes 		break;
2549b50d902SRodney W. Grimes 	case KTR_PSIG:
2559b50d902SRodney W. Grimes 		type = "PSIG";
2569b50d902SRodney W. Grimes 		break;
2579b50d902SRodney W. Grimes 	case KTR_CSW:
2589b50d902SRodney W. Grimes 		type = "CSW ";
2599b50d902SRodney W. Grimes 		break;
26082e2dd32SPoul-Henning Kamp 	case KTR_USER:
26182e2dd32SPoul-Henning Kamp 		type = "USER";
26282e2dd32SPoul-Henning Kamp 		break;
2639b50d902SRodney W. Grimes 	default:
2649b50d902SRodney W. Grimes 		(void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
2659b50d902SRodney W. Grimes 		type = unknown;
2669b50d902SRodney W. Grimes 	}
2679b50d902SRodney W. Grimes 
268a9ac598bSRobert Watson 	/*
269a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
270a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
271a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
272a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
273a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
274a9ac598bSRobert Watson 	 * negative tid's as 0.
275a9ac598bSRobert Watson 	 */
276a9ac598bSRobert Watson 	if (threads)
277a9ac598bSRobert Watson 		(void)printf("%6d %6d %-8.*s ", kth->ktr_pid, kth->ktr_tid >
278a9ac598bSRobert Watson 		    0 ? kth->ktr_tid : 0, MAXCOMLEN, kth->ktr_comm);
279a9ac598bSRobert Watson 	else
280a9ac598bSRobert Watson 		(void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN,
281a9ac598bSRobert Watson 		    kth->ktr_comm);
2829b50d902SRodney W. Grimes 	if (timestamp) {
283ec131914SPeter Wemm 		if (timestamp == 3) {
284ec131914SPeter Wemm 			if (prevtime.tv_sec == 0)
285ec131914SPeter Wemm 				prevtime = kth->ktr_time;
286ec131914SPeter Wemm 			timevalsub(&kth->ktr_time, &prevtime);
287ec131914SPeter Wemm 		}
2889b50d902SRodney W. Grimes 		if (timestamp == 2) {
2899b50d902SRodney W. Grimes 			temp = kth->ktr_time;
2909b50d902SRodney W. Grimes 			timevalsub(&kth->ktr_time, &prevtime);
2919b50d902SRodney W. Grimes 			prevtime = temp;
2929b50d902SRodney W. Grimes 		}
2939b50d902SRodney W. Grimes 		(void)printf("%ld.%06ld ",
2949b50d902SRodney W. Grimes 		    kth->ktr_time.tv_sec, kth->ktr_time.tv_usec);
2959b50d902SRodney W. Grimes 	}
2969b50d902SRodney W. Grimes 	(void)printf("%s  ", type);
2979b50d902SRodney W. Grimes }
2989b50d902SRodney W. Grimes 
2999b50d902SRodney W. Grimes #include <sys/syscall.h>
3009b50d902SRodney W. Grimes #define KTRACE
30155229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c>
3029b50d902SRodney W. Grimes #undef KTRACE
3039b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
3049b50d902SRodney W. Grimes 
30591fbb9c1SDavid Malone void
30691fbb9c1SDavid Malone ktrsyscall(struct ktr_syscall *ktr)
3079b50d902SRodney W. Grimes {
30891fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
30991fbb9c1SDavid Malone 	register_t *ip;
3109b50d902SRodney W. Grimes 
3119b50d902SRodney W. Grimes 	if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)
3129b50d902SRodney W. Grimes 		(void)printf("[%d]", ktr->ktr_code);
3139b50d902SRodney W. Grimes 	else
3149b50d902SRodney W. Grimes 		(void)printf("%s", syscallnames[ktr->ktr_code]);
3157a6ec4cfSDmitrij Tejblum 	ip = &ktr->ktr_args[0];
3169b50d902SRodney W. Grimes 	if (narg) {
3179b50d902SRodney W. Grimes 		char c = '(';
3189b50d902SRodney W. Grimes 		if (fancy) {
31998a68a58SAlexander Leidinger 
32098a68a58SAlexander Leidinger #define print_number(i,n,c) do {                      \
32198a68a58SAlexander Leidinger 	if (decimal)                                  \
32298a68a58SAlexander Leidinger 		(void)printf("%c%ld", c, (long)*i);   \
32398a68a58SAlexander Leidinger 	else                                          \
32498a68a58SAlexander Leidinger 		(void)printf("%c%#lx", c, (long)*i);  \
32598a68a58SAlexander Leidinger 	i++;                                          \
32698a68a58SAlexander Leidinger 	n--;                                          \
32798a68a58SAlexander Leidinger 	c = ',';                                      \
32898a68a58SAlexander Leidinger 	} while (0);
32998a68a58SAlexander Leidinger 
3309b50d902SRodney W. Grimes 			if (ktr->ktr_code == SYS_ioctl) {
33191fbb9c1SDavid Malone 				const char *cp;
33298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
3339b50d902SRodney W. Grimes 				if ((cp = ioctlname(*ip)) != NULL)
3349b50d902SRodney W. Grimes 					(void)printf(",%s", cp);
3359b50d902SRodney W. Grimes 				else {
3369b50d902SRodney W. Grimes 					if (decimal)
3377a6ec4cfSDmitrij Tejblum 						(void)printf(",%ld", (long)*ip);
3389b50d902SRodney W. Grimes 					else
3397a6ec4cfSDmitrij Tejblum 						(void)printf(",%#lx ", (long)*ip);
3409b50d902SRodney W. Grimes 				}
3419b50d902SRodney W. Grimes 				c = ',';
3429b50d902SRodney W. Grimes 				ip++;
3439b50d902SRodney W. Grimes 				narg--;
3449b50d902SRodney W. Grimes 			} else if (ktr->ktr_code == SYS_ptrace) {
34524be4e62SEd Maste 				(void)putchar('(');
34624be4e62SEd Maste 				ptraceopname ((int)*ip);
3479b50d902SRodney W. Grimes 				c = ',';
3489b50d902SRodney W. Grimes 				ip++;
3499b50d902SRodney W. Grimes 				narg--;
35098a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_access ||
35198a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_eaccess) {
35298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
35398a68a58SAlexander Leidinger 				(void)putchar(',');
35498a68a58SAlexander Leidinger 				accessmodename ((int)*ip);
35598a68a58SAlexander Leidinger 				ip++;
35698a68a58SAlexander Leidinger 				narg--;
35798a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_open) {
35898a68a58SAlexander Leidinger 				int	flags;
35998a68a58SAlexander Leidinger 				int	mode;
36098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
36198a68a58SAlexander Leidinger 				flags = *ip;
36298a68a58SAlexander Leidinger 				mode = *++ip;
36398a68a58SAlexander Leidinger 				(void)putchar(',');
36498a68a58SAlexander Leidinger 				flagsandmodename (flags, mode, decimal);
36598a68a58SAlexander Leidinger 				ip++;
36698a68a58SAlexander Leidinger 				narg-=2;
36798a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_wait4) {
36898a68a58SAlexander Leidinger 				print_number(ip,narg,c);
36998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
37098a68a58SAlexander Leidinger 				(void)putchar(',');
37198a68a58SAlexander Leidinger 				wait4optname ((int)*ip);
37298a68a58SAlexander Leidinger 				ip++;
37398a68a58SAlexander Leidinger 				narg--;
37498a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_chmod ||
37598a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_fchmod ||
37698a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_lchmod) {
37798a68a58SAlexander Leidinger 				print_number(ip,narg,c);
37898a68a58SAlexander Leidinger 				(void)putchar(',');
37998a68a58SAlexander Leidinger 				modename ((int)*ip);
38098a68a58SAlexander Leidinger 				ip++;
38198a68a58SAlexander Leidinger 				narg--;
38298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_mknod) {
38398a68a58SAlexander Leidinger 				print_number(ip,narg,c);
38498a68a58SAlexander Leidinger 				(void)putchar(',');
38598a68a58SAlexander Leidinger 				modename ((int)*ip);
38698a68a58SAlexander Leidinger 				ip++;
38798a68a58SAlexander Leidinger 				narg--;
38898a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_getfsstat) {
38998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
39098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
39198a68a58SAlexander Leidinger 				(void)putchar(',');
39298a68a58SAlexander Leidinger 				getfsstatflagsname ((int)*ip);
39398a68a58SAlexander Leidinger 				ip++;
39498a68a58SAlexander Leidinger 				narg--;
39598a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_mount) {
39698a68a58SAlexander Leidinger 				print_number(ip,narg,c);
39798a68a58SAlexander Leidinger 				print_number(ip,narg,c);
39898a68a58SAlexander Leidinger 				(void)putchar(',');
39998a68a58SAlexander Leidinger 				mountflagsname ((int)*ip);
40098a68a58SAlexander Leidinger 				ip++;
40198a68a58SAlexander Leidinger 				narg--;
40298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_unmount) {
40398a68a58SAlexander Leidinger 				print_number(ip,narg,c);
40498a68a58SAlexander Leidinger 				(void)putchar(',');
40598a68a58SAlexander Leidinger 				mountflagsname ((int)*ip);
40698a68a58SAlexander Leidinger 				ip++;
40798a68a58SAlexander Leidinger 				narg--;
40898a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_recvmsg ||
40998a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_sendmsg) {
41098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
41198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
41298a68a58SAlexander Leidinger 				(void)putchar(',');
41398a68a58SAlexander Leidinger 				sendrecvflagsname ((int)*ip);
41498a68a58SAlexander Leidinger 				ip++;
41598a68a58SAlexander Leidinger 				narg--;
41698a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_recvfrom ||
41798a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_sendto) {
41898a68a58SAlexander Leidinger 				print_number(ip,narg,c);
41998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
42098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
42198a68a58SAlexander Leidinger 				(void)putchar(',');
42298a68a58SAlexander Leidinger 				sendrecvflagsname ((int)*ip);
42398a68a58SAlexander Leidinger 				ip++;
42498a68a58SAlexander Leidinger 				narg--;
42598a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_chflags ||
42698a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_fchflags ||
42798a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_lchflags) {
42898a68a58SAlexander Leidinger 				print_number(ip,narg,c);
42998a68a58SAlexander Leidinger 				(void)putchar(',');
43098a68a58SAlexander Leidinger 				modename((int)*ip);
43198a68a58SAlexander Leidinger 				ip++;
43298a68a58SAlexander Leidinger 				narg--;
43398a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_kill) {
43498a68a58SAlexander Leidinger 				print_number(ip,narg,c);
43598a68a58SAlexander Leidinger 				(void)putchar(',');
43698a68a58SAlexander Leidinger 				signame((int)*ip);
43798a68a58SAlexander Leidinger 				ip++;
43898a68a58SAlexander Leidinger 				narg--;
43998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_reboot) {
44098a68a58SAlexander Leidinger 				(void)putchar('(');
44198a68a58SAlexander Leidinger 				rebootoptname((int)*ip);
44298a68a58SAlexander Leidinger 				ip++;
44398a68a58SAlexander Leidinger 				narg--;
44498a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_umask) {
44598a68a58SAlexander Leidinger 				(void)putchar('(');
44698a68a58SAlexander Leidinger 				modename((int)*ip);
44798a68a58SAlexander Leidinger 				ip++;
44898a68a58SAlexander Leidinger 				narg--;
44998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_msync) {
45098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
45198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
45298a68a58SAlexander Leidinger 				(void)putchar(',');
45398a68a58SAlexander Leidinger 				msyncflagsname((int)*ip);
45498a68a58SAlexander Leidinger 				ip++;
45598a68a58SAlexander Leidinger 				narg--;
456cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
457cae1120aSPeter Wemm 			} else if (ktr->ktr_code == SYS_freebsd6_mmap) {
458cae1120aSPeter Wemm 				print_number(ip,narg,c);
459cae1120aSPeter Wemm 				print_number(ip,narg,c);
460cae1120aSPeter Wemm 				(void)putchar(',');
461cae1120aSPeter Wemm 				mmapprotname ((int)*ip);
462cae1120aSPeter Wemm 				(void)putchar(',');
463cae1120aSPeter Wemm 				ip++;
464cae1120aSPeter Wemm 				narg--;
465cae1120aSPeter Wemm 				mmapflagsname ((int)*ip);
466cae1120aSPeter Wemm 				ip++;
467cae1120aSPeter Wemm 				narg--;
468cae1120aSPeter Wemm #endif
46998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_mmap) {
47098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
47198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
47298a68a58SAlexander Leidinger 				(void)putchar(',');
47398a68a58SAlexander Leidinger 				mmapprotname ((int)*ip);
47498a68a58SAlexander Leidinger 				(void)putchar(',');
47598a68a58SAlexander Leidinger 				ip++;
47698a68a58SAlexander Leidinger 				narg--;
47798a68a58SAlexander Leidinger 				mmapflagsname ((int)*ip);
47898a68a58SAlexander Leidinger 				ip++;
47998a68a58SAlexander Leidinger 				narg--;
48098a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_mprotect) {
48198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
48298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
48398a68a58SAlexander Leidinger 				(void)putchar(',');
48498a68a58SAlexander Leidinger 				mmapprotname ((int)*ip);
48598a68a58SAlexander Leidinger 				ip++;
48698a68a58SAlexander Leidinger 				narg--;
48798a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_madvise) {
48898a68a58SAlexander Leidinger 				print_number(ip,narg,c);
48998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
49098a68a58SAlexander Leidinger 				(void)putchar(',');
49198a68a58SAlexander Leidinger 				madvisebehavname((int)*ip);
49298a68a58SAlexander Leidinger 				ip++;
49398a68a58SAlexander Leidinger 				narg--;
49498a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_setpriority) {
49598a68a58SAlexander Leidinger 				print_number(ip,narg,c);
49698a68a58SAlexander Leidinger 				print_number(ip,narg,c);
49798a68a58SAlexander Leidinger 				(void)putchar(',');
49898a68a58SAlexander Leidinger 				prioname((int)*ip);
49998a68a58SAlexander Leidinger 				ip++;
50098a68a58SAlexander Leidinger 				narg--;
50198a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_fcntl) {
50298a68a58SAlexander Leidinger 				int cmd;
50398a68a58SAlexander Leidinger 				int arg;
50498a68a58SAlexander Leidinger 				print_number(ip,narg,c);
50598a68a58SAlexander Leidinger 				cmd = *ip;
50698a68a58SAlexander Leidinger 				arg = *++ip;
50798a68a58SAlexander Leidinger 				(void)putchar(',');
50898a68a58SAlexander Leidinger 				fcntlcmdname(cmd, arg, decimal);
50998a68a58SAlexander Leidinger 				ip++;
51098a68a58SAlexander Leidinger 				narg-=2;
51198a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_socket) {
5128bc31d83SCraig Rodrigues 				int sockdomain;
51398a68a58SAlexander Leidinger 				(void)putchar('(');
5148bc31d83SCraig Rodrigues 				sockdomain=(int)*ip;
5158bc31d83SCraig Rodrigues 				sockdomainname(sockdomain);
51698a68a58SAlexander Leidinger 				ip++;
51798a68a58SAlexander Leidinger 				narg--;
51898a68a58SAlexander Leidinger 				(void)putchar(',');
51998a68a58SAlexander Leidinger 				socktypename((int)*ip);
52098a68a58SAlexander Leidinger 				ip++;
52198a68a58SAlexander Leidinger 				narg--;
5228bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
5238bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
5248bc31d83SCraig Rodrigues 					(void)putchar(',');
5258bc31d83SCraig Rodrigues 					sockipprotoname((int)*ip);
5268bc31d83SCraig Rodrigues 					ip++;
5278bc31d83SCraig Rodrigues 					narg--;
5288bc31d83SCraig Rodrigues 				}
52998a68a58SAlexander Leidinger 				c = ',';
53098a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_setsockopt ||
53198a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_getsockopt) {
53298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
53398a68a58SAlexander Leidinger 				(void)putchar(',');
53498a68a58SAlexander Leidinger 				sockoptlevelname((int)*ip, decimal);
5350460d351SJohn Baldwin 				if ((int)*ip == SOL_SOCKET) {
53698a68a58SAlexander Leidinger 					ip++;
53798a68a58SAlexander Leidinger 					narg--;
53898a68a58SAlexander Leidinger 					(void)putchar(',');
53998a68a58SAlexander Leidinger 					sockoptname((int)*ip);
5400460d351SJohn Baldwin 				}
54198a68a58SAlexander Leidinger 				ip++;
54298a68a58SAlexander Leidinger 				narg--;
543cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
544cae1120aSPeter Wemm 			} else if (ktr->ktr_code == SYS_freebsd6_lseek) {
54598a68a58SAlexander Leidinger 				print_number(ip,narg,c);
54698a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
54798a68a58SAlexander Leidinger 				print_number(ip,narg,c);
54898a68a58SAlexander Leidinger 				print_number(ip,narg,c);
54998a68a58SAlexander Leidinger 				(void)putchar(',');
55098a68a58SAlexander Leidinger 				whencename ((int)*ip);
55198a68a58SAlexander Leidinger 				ip++;
55298a68a58SAlexander Leidinger 				narg--;
553cae1120aSPeter Wemm #endif
554cae1120aSPeter Wemm 			} else if (ktr->ktr_code == SYS_lseek) {
555cae1120aSPeter Wemm 				print_number(ip,narg,c);
556cae1120aSPeter Wemm 				/* Hidden 'pad' argument, not in lseek(2) */
557cae1120aSPeter Wemm 				print_number(ip,narg,c);
558cae1120aSPeter Wemm 				(void)putchar(',');
559cae1120aSPeter Wemm 				whencename ((int)*ip);
560cae1120aSPeter Wemm 				ip++;
561cae1120aSPeter Wemm 				narg--;
562cae1120aSPeter Wemm 
56398a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_flock) {
56498a68a58SAlexander Leidinger 				print_number(ip,narg,c);
56598a68a58SAlexander Leidinger 				(void)putchar(',');
56698a68a58SAlexander Leidinger 				flockname((int)*ip);
56798a68a58SAlexander Leidinger 				ip++;
56898a68a58SAlexander Leidinger 				narg--;
56998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_mkfifo ||
57098a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_mkdir) {
57198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
57298a68a58SAlexander Leidinger 				(void)putchar(',');
57398a68a58SAlexander Leidinger 				modename((int)*ip);
57498a68a58SAlexander Leidinger 				ip++;
57598a68a58SAlexander Leidinger 				narg--;
57698a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_shutdown) {
57798a68a58SAlexander Leidinger 				print_number(ip,narg,c);
57898a68a58SAlexander Leidinger 				(void)putchar(',');
57998a68a58SAlexander Leidinger 				shutdownhowname((int)*ip);
58098a68a58SAlexander Leidinger 				ip++;
58198a68a58SAlexander Leidinger 				narg--;
58298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_socketpair) {
58398a68a58SAlexander Leidinger 				(void)putchar('(');
58498a68a58SAlexander Leidinger 				sockdomainname((int)*ip);
58598a68a58SAlexander Leidinger 				ip++;
58698a68a58SAlexander Leidinger 				narg--;
58798a68a58SAlexander Leidinger 				(void)putchar(',');
58898a68a58SAlexander Leidinger 				socktypename((int)*ip);
58998a68a58SAlexander Leidinger 				ip++;
59098a68a58SAlexander Leidinger 				narg--;
59198a68a58SAlexander Leidinger 				c = ',';
59298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_getrlimit ||
59398a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_setrlimit) {
59498a68a58SAlexander Leidinger 				(void)putchar('(');
59598a68a58SAlexander Leidinger 				rlimitname((int)*ip);
59698a68a58SAlexander Leidinger 				ip++;
59798a68a58SAlexander Leidinger 				narg--;
59898a68a58SAlexander Leidinger 				c = ',';
59998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_quotactl) {
60098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
601b850a685SJohn Baldwin 				(void)putchar(',');
60298a68a58SAlexander Leidinger 				quotactlname((int)*ip);
60398a68a58SAlexander Leidinger 				ip++;
60498a68a58SAlexander Leidinger 				narg--;
60598a68a58SAlexander Leidinger 				c = ',';
60698a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_nfssvc) {
60798a68a58SAlexander Leidinger 				(void)putchar('(');
60898a68a58SAlexander Leidinger 				nfssvcname((int)*ip);
60998a68a58SAlexander Leidinger 				ip++;
61098a68a58SAlexander Leidinger 				narg--;
61198a68a58SAlexander Leidinger 				c = ',';
61298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_rtprio) {
61398a68a58SAlexander Leidinger 				(void)putchar('(');
61498a68a58SAlexander Leidinger 				rtprioname((int)*ip);
61598a68a58SAlexander Leidinger 				ip++;
61698a68a58SAlexander Leidinger 				narg--;
61798a68a58SAlexander Leidinger 				c = ',';
61898a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS___semctl) {
61998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
62098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
621b850a685SJohn Baldwin 				(void)putchar(',');
62298a68a58SAlexander Leidinger 				semctlname((int)*ip);
62398a68a58SAlexander Leidinger 				ip++;
62498a68a58SAlexander Leidinger 				narg--;
62598a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_semget) {
62698a68a58SAlexander Leidinger 				print_number(ip,narg,c);
62798a68a58SAlexander Leidinger 				print_number(ip,narg,c);
628b850a685SJohn Baldwin 				(void)putchar(',');
62998a68a58SAlexander Leidinger 				semgetname((int)*ip);
63098a68a58SAlexander Leidinger 				ip++;
63198a68a58SAlexander Leidinger 				narg--;
63298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_msgctl) {
63398a68a58SAlexander Leidinger 				print_number(ip,narg,c);
634b850a685SJohn Baldwin 				(void)putchar(',');
63598a68a58SAlexander Leidinger 				shmctlname((int)*ip);
63698a68a58SAlexander Leidinger 				ip++;
63798a68a58SAlexander Leidinger 				narg--;
63898a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_shmat) {
63998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
64098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
641b850a685SJohn Baldwin 				(void)putchar(',');
64298a68a58SAlexander Leidinger 				shmatname((int)*ip);
64398a68a58SAlexander Leidinger 				ip++;
64498a68a58SAlexander Leidinger 				narg--;
64598a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_shmctl) {
64698a68a58SAlexander Leidinger 				print_number(ip,narg,c);
647b850a685SJohn Baldwin 				(void)putchar(',');
64898a68a58SAlexander Leidinger 				shmctlname((int)*ip);
64998a68a58SAlexander Leidinger 				ip++;
65098a68a58SAlexander Leidinger 				narg--;
65198a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_minherit) {
65298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
65398a68a58SAlexander Leidinger 				print_number(ip,narg,c);
654b850a685SJohn Baldwin 				(void)putchar(',');
65598a68a58SAlexander Leidinger 				minheritname((int)*ip);
65698a68a58SAlexander Leidinger 				ip++;
65798a68a58SAlexander Leidinger 				narg--;
65898a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_rfork) {
65998a68a58SAlexander Leidinger 				(void)putchar('(');
66098a68a58SAlexander Leidinger 				rforkname((int)*ip);
66198a68a58SAlexander Leidinger 				ip++;
66298a68a58SAlexander Leidinger 				narg--;
66398a68a58SAlexander Leidinger 				c = ',';
66498a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_lio_listio) {
66598a68a58SAlexander Leidinger 				(void)putchar('(');
66698a68a58SAlexander Leidinger 				lio_listioname((int)*ip);
66798a68a58SAlexander Leidinger 				ip++;
66898a68a58SAlexander Leidinger 				narg--;
66998a68a58SAlexander Leidinger 				c = ',';
67098a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_mlockall) {
67198a68a58SAlexander Leidinger 				(void)putchar('(');
67298a68a58SAlexander Leidinger 				mlockallname((int)*ip);
67398a68a58SAlexander Leidinger 				ip++;
67498a68a58SAlexander Leidinger 				narg--;
67598a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_sched_setscheduler) {
67698a68a58SAlexander Leidinger 				print_number(ip,narg,c);
677b850a685SJohn Baldwin 				(void)putchar(',');
67898a68a58SAlexander Leidinger 				schedpolicyname((int)*ip);
67998a68a58SAlexander Leidinger 				ip++;
68098a68a58SAlexander Leidinger 				narg--;
68198a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_sched_get_priority_max ||
68298a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS_sched_get_priority_min) {
68398a68a58SAlexander Leidinger 				(void)putchar('(');
68498a68a58SAlexander Leidinger 				schedpolicyname((int)*ip);
68598a68a58SAlexander Leidinger 				ip++;
68698a68a58SAlexander Leidinger 				narg--;
68798a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_sendfile) {
68898a68a58SAlexander Leidinger 				print_number(ip,narg,c);
68998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
69098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
69198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
69298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
69398a68a58SAlexander Leidinger 				print_number(ip,narg,c);
694b850a685SJohn Baldwin 				(void)putchar(',');
69598a68a58SAlexander Leidinger 				sendfileflagsname((int)*ip);
69698a68a58SAlexander Leidinger 				ip++;
69798a68a58SAlexander Leidinger 				narg--;
69898a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_kldsym) {
69998a68a58SAlexander Leidinger 				print_number(ip,narg,c);
700b850a685SJohn Baldwin 				(void)putchar(',');
70198a68a58SAlexander Leidinger 				kldsymcmdname((int)*ip);
70298a68a58SAlexander Leidinger 				ip++;
70398a68a58SAlexander Leidinger 				narg--;
70498a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_sigprocmask) {
70598a68a58SAlexander Leidinger 				(void)putchar('(');
70698a68a58SAlexander Leidinger 				sigprocmaskhowname((int)*ip);
70798a68a58SAlexander Leidinger 				ip++;
70898a68a58SAlexander Leidinger 				narg--;
70998a68a58SAlexander Leidinger 				c = ',';
71098a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS___acl_get_file ||
71198a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_set_file ||
71298a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_get_fd ||
71398a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_set_fd ||
71498a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_delete_file ||
71598a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_delete_fd ||
71698a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_aclcheck_file ||
71798a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_aclcheck_fd ||
71898a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_get_link ||
71998a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_set_link ||
72098a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_delete_link ||
72198a68a58SAlexander Leidinger 				   ktr->ktr_code == SYS___acl_aclcheck_link) {
72298a68a58SAlexander Leidinger 				print_number(ip,narg,c);
723b850a685SJohn Baldwin 				(void)putchar(',');
72498a68a58SAlexander Leidinger 				acltypename((int)*ip);
72598a68a58SAlexander Leidinger 				ip++;
72698a68a58SAlexander Leidinger 				narg--;
72798a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_sigaction) {
72898a68a58SAlexander Leidinger 				(void)putchar('(');
72998a68a58SAlexander Leidinger 				signame((int)*ip);
73098a68a58SAlexander Leidinger 				ip++;
73198a68a58SAlexander Leidinger 				narg--;
73298a68a58SAlexander Leidinger 				c = ',';
73398a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_extattrctl) {
73498a68a58SAlexander Leidinger 				print_number(ip,narg,c);
735b850a685SJohn Baldwin 				(void)putchar(',');
73698a68a58SAlexander Leidinger 				extattrctlname((int)*ip);
73798a68a58SAlexander Leidinger 				ip++;
73898a68a58SAlexander Leidinger 				narg--;
73998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_nmount) {
74098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
74198a68a58SAlexander Leidinger 				print_number(ip,narg,c);
74298a68a58SAlexander Leidinger 				(void)putchar(',');
74398a68a58SAlexander Leidinger 				mountflagsname ((int)*ip);
74498a68a58SAlexander Leidinger 				ip++;
74598a68a58SAlexander Leidinger 				narg--;
74698a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_kse_thr_interrupt) {
74798a68a58SAlexander Leidinger 				print_number(ip,narg,c);
74898a68a58SAlexander Leidinger 				(void)putchar(',');
74998a68a58SAlexander Leidinger 				ksethrcmdname ((int)*ip);
75098a68a58SAlexander Leidinger 				ip++;
75198a68a58SAlexander Leidinger 				narg--;
75298a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_thr_create) {
75398a68a58SAlexander Leidinger 				print_number(ip,narg,c);
75498a68a58SAlexander Leidinger 				print_number(ip,narg,c);
75598a68a58SAlexander Leidinger 				(void)putchar(',');
75698a68a58SAlexander Leidinger 				thrcreateflagsname ((int)*ip);
75798a68a58SAlexander Leidinger 				ip++;
75898a68a58SAlexander Leidinger 				narg--;
75998a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_thr_kill) {
76098a68a58SAlexander Leidinger 				print_number(ip,narg,c);
76198a68a58SAlexander Leidinger 				(void)putchar(',');
76298a68a58SAlexander Leidinger 				signame ((int)*ip);
76398a68a58SAlexander Leidinger 				ip++;
76498a68a58SAlexander Leidinger 				narg--;
76598a68a58SAlexander Leidinger 			} else if (ktr->ktr_code == SYS_kldunloadf) {
76698a68a58SAlexander Leidinger 				print_number(ip,narg,c);
76798a68a58SAlexander Leidinger 				(void)putchar(',');
76898a68a58SAlexander Leidinger 				kldunloadfflagsname ((int)*ip);
76998a68a58SAlexander Leidinger 				ip++;
77098a68a58SAlexander Leidinger 				narg--;
7719b50d902SRodney W. Grimes 			}
7729b50d902SRodney W. Grimes 		}
7739b50d902SRodney W. Grimes 		while (narg) {
77498a68a58SAlexander Leidinger 			print_number(ip,narg,c);
7759b50d902SRodney W. Grimes 		}
7769b50d902SRodney W. Grimes 		(void)putchar(')');
7779b50d902SRodney W. Grimes 	}
7789b50d902SRodney W. Grimes 	(void)putchar('\n');
7799b50d902SRodney W. Grimes }
7809b50d902SRodney W. Grimes 
78191fbb9c1SDavid Malone void
78291fbb9c1SDavid Malone ktrsysret(struct ktr_sysret *ktr)
7839b50d902SRodney W. Grimes {
78491fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
78591fbb9c1SDavid Malone 	int error = ktr->ktr_error;
78691fbb9c1SDavid Malone 	int code = ktr->ktr_code;
7879b50d902SRodney W. Grimes 
7889b50d902SRodney W. Grimes 	if (code >= nsyscalls || code < 0)
7899b50d902SRodney W. Grimes 		(void)printf("[%d] ", code);
7909b50d902SRodney W. Grimes 	else
7919b50d902SRodney W. Grimes 		(void)printf("%s ", syscallnames[code]);
7929b50d902SRodney W. Grimes 
7939b50d902SRodney W. Grimes 	if (error == 0) {
7949b50d902SRodney W. Grimes 		if (fancy) {
7959b50d902SRodney W. Grimes 			(void)printf("%d", ret);
7969b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
7977a6ec4cfSDmitrij Tejblum 				(void)printf("/%#lx", (long)ret);
7989b50d902SRodney W. Grimes 		} else {
7999b50d902SRodney W. Grimes 			if (decimal)
8007a6ec4cfSDmitrij Tejblum 				(void)printf("%ld", (long)ret);
8019b50d902SRodney W. Grimes 			else
8027a6ec4cfSDmitrij Tejblum 				(void)printf("%#lx", (long)ret);
8039b50d902SRodney W. Grimes 		}
8049b50d902SRodney W. Grimes 	} else if (error == ERESTART)
8059b50d902SRodney W. Grimes 		(void)printf("RESTART");
8069b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
8079b50d902SRodney W. Grimes 		(void)printf("JUSTRETURN");
8089b50d902SRodney W. Grimes 	else {
8099b50d902SRodney W. Grimes 		(void)printf("-1 errno %d", ktr->ktr_error);
8109b50d902SRodney W. Grimes 		if (fancy)
8119b50d902SRodney W. Grimes 			(void)printf(" %s", strerror(ktr->ktr_error));
8129b50d902SRodney W. Grimes 	}
8139b50d902SRodney W. Grimes 	(void)putchar('\n');
8149b50d902SRodney W. Grimes }
8159b50d902SRodney W. Grimes 
81691fbb9c1SDavid Malone void
81791fbb9c1SDavid Malone ktrnamei(char *cp, int len)
8189b50d902SRodney W. Grimes {
8199b50d902SRodney W. Grimes 	(void)printf("\"%.*s\"\n", len, cp);
8209b50d902SRodney W. Grimes }
8219b50d902SRodney W. Grimes 
82291fbb9c1SDavid Malone void
823ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
8249b50d902SRodney W. Grimes {
825ec4beb5dSPeter Wemm 	int n, i;
826ec4beb5dSPeter Wemm 	int width;
827ec4beb5dSPeter Wemm 
828ec4beb5dSPeter Wemm 	width = 0;
829ec4beb5dSPeter Wemm 	do {
830ec4beb5dSPeter Wemm 		width += 2;
831ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
832ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
833ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
834ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
835ec4beb5dSPeter Wemm 		i += width;		/* each byte */
836ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
837ec4beb5dSPeter Wemm 	} while (i < screenwidth);
838ec4beb5dSPeter Wemm 	width -= 2;
839ec4beb5dSPeter Wemm 
840ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
841ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
842ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
843ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
844ec4beb5dSPeter Wemm 			}
845ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
846ec4beb5dSPeter Wemm 				printf(" ");
847ec4beb5dSPeter Wemm 			}
848ec4beb5dSPeter Wemm 			if (i < len)
849ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
850ec4beb5dSPeter Wemm 			else
851ec4beb5dSPeter Wemm 				printf("  ");
852ec4beb5dSPeter Wemm 		}
853ec4beb5dSPeter Wemm 		printf("  |");
854ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
855ec4beb5dSPeter Wemm 			if (i >= len)
856ec4beb5dSPeter Wemm 				break;
857ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
858ec4beb5dSPeter Wemm 				printf("%c", p[i]);
859ec4beb5dSPeter Wemm 			else
860ec4beb5dSPeter Wemm 				printf(".");
861ec4beb5dSPeter Wemm 		}
862ec4beb5dSPeter Wemm 		printf("|\n");
863ec4beb5dSPeter Wemm 	}
864ec4beb5dSPeter Wemm 	if ((i % width) != 0)
865ec4beb5dSPeter Wemm 		printf("\n");
866ec4beb5dSPeter Wemm }
867ec4beb5dSPeter Wemm 
868ec4beb5dSPeter Wemm void
869ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
870ec4beb5dSPeter Wemm {
87191fbb9c1SDavid Malone 	int col = 0;
872ec4beb5dSPeter Wemm 	char *cp;
87391fbb9c1SDavid Malone 	int width;
8749b50d902SRodney W. Grimes 	char visbuf[5];
8759b50d902SRodney W. Grimes 
8769b50d902SRodney W. Grimes 	(void)printf("       \"");
8779b50d902SRodney W. Grimes 	col = 8;
8789b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
8799b50d902SRodney W. Grimes 		(void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
8809b50d902SRodney W. Grimes 		cp = visbuf;
8819b50d902SRodney W. Grimes 		/*
8829b50d902SRodney W. Grimes 		 * Keep track of printables and
8839b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
8849b50d902SRodney W. Grimes 		 */
8859b50d902SRodney W. Grimes 		if (col == 0) {
8869b50d902SRodney W. Grimes 			(void)putchar('\t');
8879b50d902SRodney W. Grimes 			col = 8;
8889b50d902SRodney W. Grimes 		}
8899b50d902SRodney W. Grimes 		switch(*cp) {
8909b50d902SRodney W. Grimes 		case '\n':
8919b50d902SRodney W. Grimes 			col = 0;
8929b50d902SRodney W. Grimes 			(void)putchar('\n');
8939b50d902SRodney W. Grimes 			continue;
8949b50d902SRodney W. Grimes 		case '\t':
8959b50d902SRodney W. Grimes 			width = 8 - (col&07);
8969b50d902SRodney W. Grimes 			break;
8979b50d902SRodney W. Grimes 		default:
8989b50d902SRodney W. Grimes 			width = strlen(cp);
8999b50d902SRodney W. Grimes 		}
9009b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
9019b50d902SRodney W. Grimes 			(void)printf("\\\n\t");
9029b50d902SRodney W. Grimes 			col = 8;
9039b50d902SRodney W. Grimes 		}
9049b50d902SRodney W. Grimes 		col += width;
9059b50d902SRodney W. Grimes 		do {
9069b50d902SRodney W. Grimes 			(void)putchar(*cp++);
9079b50d902SRodney W. Grimes 		} while (*cp);
9089b50d902SRodney W. Grimes 	}
9099b50d902SRodney W. Grimes 	if (col == 0)
9109b50d902SRodney W. Grimes 		(void)printf("       ");
9119b50d902SRodney W. Grimes 	(void)printf("\"\n");
9129b50d902SRodney W. Grimes }
9139b50d902SRodney W. Grimes 
914ec4beb5dSPeter Wemm void
915ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
916ec4beb5dSPeter Wemm {
917ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
918ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
919ec4beb5dSPeter Wemm 	static int screenwidth = 0;
920ec4beb5dSPeter Wemm 	int i, binary;
921ec4beb5dSPeter Wemm 
922ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
923ec4beb5dSPeter Wemm 		struct winsize ws;
924ec4beb5dSPeter Wemm 
925ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
926ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
927ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
928ec4beb5dSPeter Wemm 		else
929ec4beb5dSPeter Wemm 			screenwidth = 80;
930ec4beb5dSPeter Wemm 	}
931ec4beb5dSPeter Wemm 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
932ec4beb5dSPeter Wemm 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
933ec4beb5dSPeter Wemm 		datalen == 1 ? "" : "s");
934df0c8868SRobert Watson 	if (suppressdata)
935df0c8868SRobert Watson 		return;
936ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
937ec4beb5dSPeter Wemm 		datalen = maxdata;
938ec4beb5dSPeter Wemm 
939ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
940ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
941ec4beb5dSPeter Wemm 			continue;
942ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
943ec4beb5dSPeter Wemm 			continue;
944ec4beb5dSPeter Wemm 		binary = 1;
945ec4beb5dSPeter Wemm 	}
946ec4beb5dSPeter Wemm 	if (binary)
947ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
948ec4beb5dSPeter Wemm 	else
949ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
950ec4beb5dSPeter Wemm }
951ec4beb5dSPeter Wemm 
95291fbb9c1SDavid Malone const char *signames[] = {
9539b50d902SRodney W. Grimes 	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
9549b50d902SRodney W. Grimes 	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
9559b50d902SRodney W. Grimes 	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
9569b50d902SRodney W. Grimes 	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
9579b50d902SRodney W. Grimes 	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
9589b50d902SRodney W. Grimes 	"USR2", NULL,						/* 31 - 32 */
9599b50d902SRodney W. Grimes };
9609b50d902SRodney W. Grimes 
96191fbb9c1SDavid Malone void
96291fbb9c1SDavid Malone ktrpsig(struct ktr_psig *psig)
9639b50d902SRodney W. Grimes {
964fd6afe79SKonstantin Belousov 	if (psig->signo > 0 && psig->signo < NSIG)
9659b50d902SRodney W. Grimes 		(void)printf("SIG%s ", signames[psig->signo]);
966fd6afe79SKonstantin Belousov 	else
9675a3e0a1bSMaxim Konovalov 		(void)printf("SIG %d ", psig->signo);
9689b50d902SRodney W. Grimes 	if (psig->action == SIG_DFL)
9699b50d902SRodney W. Grimes 		(void)printf("SIG_DFL\n");
97091fbb9c1SDavid Malone 	else {
9717a6ec4cfSDmitrij Tejblum 		(void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n",
97291fbb9c1SDavid Malone 		    (u_long)psig->action, psig->mask.__bits[0], psig->code);
97391fbb9c1SDavid Malone 	}
9749b50d902SRodney W. Grimes }
9759b50d902SRodney W. Grimes 
97691fbb9c1SDavid Malone void
97791fbb9c1SDavid Malone ktrcsw(struct ktr_csw *cs)
9789b50d902SRodney W. Grimes {
9799b50d902SRodney W. Grimes 	(void)printf("%s %s\n", cs->out ? "stop" : "resume",
9809b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
9819b50d902SRodney W. Grimes }
9829b50d902SRodney W. Grimes 
9831f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_START		1
9841f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_STOP		2
9851f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_START		3
9861f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_STOP		4
9871f4b63f8SJohn Baldwin #define	UTRACE_LOAD_OBJECT		5
9881f4b63f8SJohn Baldwin #define	UTRACE_UNLOAD_OBJECT		6
9891f4b63f8SJohn Baldwin #define	UTRACE_ADD_RUNDEP		7
9901f4b63f8SJohn Baldwin #define	UTRACE_PRELOAD_FINISHED		8
9911f4b63f8SJohn Baldwin #define	UTRACE_INIT_CALL		9
9921f4b63f8SJohn Baldwin #define	UTRACE_FINI_CALL		10
9931f4b63f8SJohn Baldwin 
9941f4b63f8SJohn Baldwin struct utrace_rtld {
9951f4b63f8SJohn Baldwin 	char sig[4];				/* 'RTLD' */
9961f4b63f8SJohn Baldwin 	int event;
9971f4b63f8SJohn Baldwin 	void *handle;
9981f4b63f8SJohn Baldwin 	void *mapbase;
9991f4b63f8SJohn Baldwin 	size_t mapsize;
10001f4b63f8SJohn Baldwin 	int refcnt;
10011f4b63f8SJohn Baldwin 	char name[MAXPATHLEN];
10021f4b63f8SJohn Baldwin };
10031f4b63f8SJohn Baldwin 
10041f4b63f8SJohn Baldwin void
10051f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p)
10061f4b63f8SJohn Baldwin {
10071f4b63f8SJohn Baldwin 	struct utrace_rtld *ut = (struct utrace_rtld *)p;
10081f4b63f8SJohn Baldwin 	void *parent;
10091f4b63f8SJohn Baldwin 	int mode;
10101f4b63f8SJohn Baldwin 
10111f4b63f8SJohn Baldwin 	switch (ut->event) {
10121f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_START:
10131f4b63f8SJohn Baldwin 		mode = ut->refcnt;
10141f4b63f8SJohn Baldwin 		printf("dlopen(%s, ", ut->name);
10151f4b63f8SJohn Baldwin 		switch (mode & RTLD_MODEMASK) {
10161f4b63f8SJohn Baldwin 		case RTLD_NOW:
10171f4b63f8SJohn Baldwin 			printf("RTLD_NOW");
10181f4b63f8SJohn Baldwin 			break;
10191f4b63f8SJohn Baldwin 		case RTLD_LAZY:
10201f4b63f8SJohn Baldwin 			printf("RTLD_LAZY");
10211f4b63f8SJohn Baldwin 			break;
10221f4b63f8SJohn Baldwin 		default:
10231f4b63f8SJohn Baldwin 			printf("%#x", mode & RTLD_MODEMASK);
10241f4b63f8SJohn Baldwin 		}
10251f4b63f8SJohn Baldwin 		if (mode & RTLD_GLOBAL)
10261f4b63f8SJohn Baldwin 			printf(" | RTLD_GLOBAL");
10271f4b63f8SJohn Baldwin 		if (mode & RTLD_TRACE)
10281f4b63f8SJohn Baldwin 			printf(" | RTLD_TRACE");
10291f4b63f8SJohn Baldwin 		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
10301f4b63f8SJohn Baldwin 			printf(" | %#x", mode &
10311f4b63f8SJohn Baldwin 			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
10321f4b63f8SJohn Baldwin 		printf(")\n");
10331f4b63f8SJohn Baldwin 		break;
10341f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_STOP:
10351f4b63f8SJohn Baldwin 		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
10361f4b63f8SJohn Baldwin 		    ut->refcnt);
10371f4b63f8SJohn Baldwin 		break;
10381f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_START:
10391f4b63f8SJohn Baldwin 		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
10401f4b63f8SJohn Baldwin 		    ut->refcnt);
10411f4b63f8SJohn Baldwin 		break;
10421f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_STOP:
10431f4b63f8SJohn Baldwin 		printf("dlclose(%p) finished\n", ut->handle);
10441f4b63f8SJohn Baldwin 		break;
10451f4b63f8SJohn Baldwin 	case UTRACE_LOAD_OBJECT:
10461f4b63f8SJohn Baldwin 		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
10471f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
10481f4b63f8SJohn Baldwin 		    ut->name);
10491f4b63f8SJohn Baldwin 		break;
10501f4b63f8SJohn Baldwin 	case UTRACE_UNLOAD_OBJECT:
10511f4b63f8SJohn Baldwin 		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
10521f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
10531f4b63f8SJohn Baldwin 		    ut->name);
10541f4b63f8SJohn Baldwin 		break;
10551f4b63f8SJohn Baldwin 	case UTRACE_ADD_RUNDEP:
10561f4b63f8SJohn Baldwin 		parent = ut->mapbase;
10571f4b63f8SJohn Baldwin 		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
10581f4b63f8SJohn Baldwin 		    ut->handle, ut->name, ut->refcnt);
10591f4b63f8SJohn Baldwin 		break;
10601f4b63f8SJohn Baldwin 	case UTRACE_PRELOAD_FINISHED:
10611f4b63f8SJohn Baldwin 		printf("RTLD: LD_PRELOAD finished\n");
10621f4b63f8SJohn Baldwin 		break;
10631f4b63f8SJohn Baldwin 	case UTRACE_INIT_CALL:
10641f4b63f8SJohn Baldwin 		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
10651f4b63f8SJohn Baldwin 		    ut->name);
10661f4b63f8SJohn Baldwin 		break;
10671f4b63f8SJohn Baldwin 	case UTRACE_FINI_CALL:
10681f4b63f8SJohn Baldwin 		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
10691f4b63f8SJohn Baldwin 		    ut->name);
10701f4b63f8SJohn Baldwin 		break;
10711f4b63f8SJohn Baldwin 	default:
10721f4b63f8SJohn Baldwin 		p += 4;
10731f4b63f8SJohn Baldwin 		len -= 4;
10741f4b63f8SJohn Baldwin 		printf("RTLD: %d ", len);
10751f4b63f8SJohn Baldwin 		while (len--)
10761f4b63f8SJohn Baldwin 			if (decimal)
10771f4b63f8SJohn Baldwin 				printf(" %d", *p++);
10781f4b63f8SJohn Baldwin 			else
10791f4b63f8SJohn Baldwin 				printf(" %02x", *p++);
10801f4b63f8SJohn Baldwin 		printf("\n");
10811f4b63f8SJohn Baldwin 	}
10821f4b63f8SJohn Baldwin }
10831f4b63f8SJohn Baldwin 
1084670b9e9fSJohn Baldwin struct utrace_malloc {
1085670b9e9fSJohn Baldwin 	void *p;
1086670b9e9fSJohn Baldwin 	size_t s;
1087670b9e9fSJohn Baldwin 	void *r;
1088670b9e9fSJohn Baldwin };
1089670b9e9fSJohn Baldwin 
1090670b9e9fSJohn Baldwin void
1091670b9e9fSJohn Baldwin ktruser_malloc(int len, unsigned char *p)
1092670b9e9fSJohn Baldwin {
1093670b9e9fSJohn Baldwin 	struct utrace_malloc *ut = (struct utrace_malloc *)p;
1094670b9e9fSJohn Baldwin 
1095670b9e9fSJohn Baldwin 	if (ut->p == NULL) {
1096670b9e9fSJohn Baldwin 		if (ut->s == 0 && ut->r == NULL)
1097670b9e9fSJohn Baldwin 			printf("malloc_init()\n");
1098670b9e9fSJohn Baldwin 		else
1099670b9e9fSJohn Baldwin 			printf("%p = malloc(%zu)\n", ut->r, ut->s);
1100670b9e9fSJohn Baldwin 	} else {
1101670b9e9fSJohn Baldwin 		if (ut->s == 0)
1102670b9e9fSJohn Baldwin 			printf("free(%p)\n", ut->p);
1103670b9e9fSJohn Baldwin 		else
1104670b9e9fSJohn Baldwin 			printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1105670b9e9fSJohn Baldwin 	}
1106670b9e9fSJohn Baldwin }
1107670b9e9fSJohn Baldwin 
110891fbb9c1SDavid Malone void
110991fbb9c1SDavid Malone ktruser(int len, unsigned char *p)
111082e2dd32SPoul-Henning Kamp {
1111670b9e9fSJohn Baldwin 
11121f4b63f8SJohn Baldwin 	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
11131f4b63f8SJohn Baldwin 		ktruser_rtld(len, p);
11141f4b63f8SJohn Baldwin 		return;
11151f4b63f8SJohn Baldwin 	}
11161f4b63f8SJohn Baldwin 
1117670b9e9fSJohn Baldwin 	if (len == sizeof(struct utrace_malloc)) {
1118670b9e9fSJohn Baldwin 		ktruser_malloc(len, p);
1119670b9e9fSJohn Baldwin 		return;
1120670b9e9fSJohn Baldwin 	}
1121670b9e9fSJohn Baldwin 
11223f8ba9aeSPoul-Henning Kamp 	(void)printf("%d ", len);
11233f8ba9aeSPoul-Henning Kamp 	while (len--)
1124743f9174SPoul-Henning Kamp 		if (decimal)
1125743f9174SPoul-Henning Kamp 			(void)printf(" %d", *p++);
1126743f9174SPoul-Henning Kamp 		else
112782e2dd32SPoul-Henning Kamp 			(void)printf(" %02x", *p++);
112882e2dd32SPoul-Henning Kamp 	(void)printf("\n");
112982e2dd32SPoul-Henning Kamp }
113082e2dd32SPoul-Henning Kamp 
113191fbb9c1SDavid Malone void
113291fbb9c1SDavid Malone usage(void)
11339b50d902SRodney W. Grimes {
11349b50d902SRodney W. Grimes 	(void)fprintf(stderr,
1135df0c8868SRobert Watson   "usage: kdump [-dEnlHRsT] [-f trfile] [-m maxdata] [-p pid] [-t [cnisuw]]\n");
11369b50d902SRodney W. Grimes 	exit(1);
11379b50d902SRodney W. Grimes }
1138