xref: /freebsd/usr.bin/kdump/kdump.c (revision 237abf0c)
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  * 4. Neither the name of the University nor the names of its contributors
149b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
159b50d902SRodney W. Grimes  *    without specific prior written permission.
169b50d902SRodney W. Grimes  *
179b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
189b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
209b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
219b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
229b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
239b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
259b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
269b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
279b50d902SRodney W. Grimes  * SUCH DAMAGE.
289b50d902SRodney W. Grimes  */
299b50d902SRodney W. Grimes 
309b50d902SRodney W. Grimes #ifndef lint
3115fc002bSPhilippe Charnier static const char copyright[] =
329b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\
339b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
349b50d902SRodney W. Grimes #endif /* not lint */
359b50d902SRodney W. Grimes 
369b50d902SRodney W. Grimes #ifndef lint
3715fc002bSPhilippe Charnier #if 0
389b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
3915fc002bSPhilippe Charnier #endif
409b50d902SRodney W. Grimes #endif /* not lint */
41e026a48cSDavid E. O'Brien #include <sys/cdefs.h>
42e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$");
439b50d902SRodney W. Grimes 
44c4473420SPeter Wemm #define _KERNEL
45c1b99fe6SGeoff Rehmet extern int errno;
46c1b99fe6SGeoff Rehmet #include <sys/errno.h>
47c4473420SPeter Wemm #undef _KERNEL
489b50d902SRodney W. Grimes #include <sys/param.h>
49f9b20fc8SPawel Jakub Dawidek #include <sys/capability.h>
509b50d902SRodney W. Grimes #include <sys/errno.h>
5191fbb9c1SDavid Malone #define _KERNEL
529b50d902SRodney W. Grimes #include <sys/time.h>
5391fbb9c1SDavid Malone #undef _KERNEL
549b50d902SRodney W. Grimes #include <sys/uio.h>
559b50d902SRodney W. Grimes #include <sys/ktrace.h>
569b50d902SRodney W. Grimes #include <sys/ioctl.h>
578bc31d83SCraig Rodrigues #include <sys/socket.h>
5860e15db9SDag-Erling Smørgrav #include <sys/stat.h>
597144d36fSDmitry Chagin #include <sys/sysent.h>
6060e15db9SDag-Erling Smørgrav #include <sys/un.h>
617144d36fSDmitry Chagin #include <sys/queue.h>
6260e15db9SDag-Erling Smørgrav #ifdef IPX
6360e15db9SDag-Erling Smørgrav #include <sys/types.h>
6460e15db9SDag-Erling Smørgrav #include <netipx/ipx.h>
6560e15db9SDag-Erling Smørgrav #endif
6660e15db9SDag-Erling Smørgrav #ifdef NETATALK
6760e15db9SDag-Erling Smørgrav #include <netatalk/at.h>
6860e15db9SDag-Erling Smørgrav #endif
691a604cfaSXin LI #include <arpa/inet.h>
7060e15db9SDag-Erling Smørgrav #include <netinet/in.h>
711a604cfaSXin LI #include <ctype.h>
721f4b63f8SJohn Baldwin #include <dlfcn.h>
7315fc002bSPhilippe Charnier #include <err.h>
7460e15db9SDag-Erling Smørgrav #include <grp.h>
7560e15db9SDag-Erling Smørgrav #include <inttypes.h>
7615fc002bSPhilippe Charnier #include <locale.h>
77b9ef8051SAndrey V. Elsukov #include <netdb.h>
78f9b20fc8SPawel Jakub Dawidek #include <nl_types.h>
7960e15db9SDag-Erling Smørgrav #include <pwd.h>
809b50d902SRodney W. Grimes #include <stdio.h>
819b50d902SRodney W. Grimes #include <stdlib.h>
829b50d902SRodney W. Grimes #include <string.h>
83f9b20fc8SPawel Jakub Dawidek #include <termios.h>
8460e15db9SDag-Erling Smørgrav #include <time.h>
8515fc002bSPhilippe Charnier #include <unistd.h>
8615fc002bSPhilippe Charnier #include <vis.h>
879b50d902SRodney W. Grimes #include "ktrace.h"
8898a68a58SAlexander Leidinger #include "kdump_subr.h"
899b50d902SRodney W. Grimes 
907144d36fSDmitry Chagin u_int abidump(struct ktr_header *);
917144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
9291fbb9c1SDavid Malone int fread_tail(void *, int, int);
9391fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
947144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
957144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9691fbb9c1SDavid Malone void ktrnamei(char *, int);
97ec4beb5dSPeter Wemm void hexdump(char *, int, int);
98ec4beb5dSPeter Wemm void visdump(char *, int, int);
9991fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
100dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10191fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10288bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
10381a31394SDag-Erling Smørgrav void ktruser_malloc(unsigned char *);
10481a31394SDag-Erling Smørgrav void ktruser_rtld(int, unsigned char *);
10591fbb9c1SDavid Malone void ktruser(int, unsigned char *);
10660e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
10760e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
10860e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
109c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11035818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11135818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
112f9b20fc8SPawel Jakub Dawidek void limitfd(int fd);
11391fbb9c1SDavid Malone void usage(void);
114d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int);
11591fbb9c1SDavid Malone 
11660e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
1177144d36fSDmitry Chagin     resolv = 0, abiflag = 0;
11891fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE;
1199b50d902SRodney W. Grimes struct ktr_header ktr_header;
1209b50d902SRodney W. Grimes 
12160e15db9SDag-Erling Smørgrav #define TIME_FORMAT	"%b %e %T %Y"
1229b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
1239b50d902SRodney W. Grimes 
12495bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do {					\
125dde5f9b9SDmitry Chagin 	if (decimal)							\
126e4bb45b1SDag-Erling Smørgrav 		printf("%c%jd", c, (intmax_t)*i);			\
127dde5f9b9SDmitry Chagin 	else								\
128661522f5SDag-Erling Smørgrav 		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
129dde5f9b9SDmitry Chagin 	i++;								\
130dde5f9b9SDmitry Chagin 	n--;								\
131dde5f9b9SDmitry Chagin 	c = ',';							\
132e4bb45b1SDag-Erling Smørgrav } while (0)
133dde5f9b9SDmitry Chagin 
134dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
135dde5f9b9SDmitry Chagin 
136dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *);
137dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *);
138dde5f9b9SDmitry Chagin extern char *linux_syscallnames[];
139dde5f9b9SDmitry Chagin extern int nlinux_syscalls;
140dde5f9b9SDmitry Chagin 
141dde5f9b9SDmitry Chagin /*
142dde5f9b9SDmitry Chagin  * from linux.h
143dde5f9b9SDmitry Chagin  * Linux syscalls return negative errno's, we do positive and map them
144dde5f9b9SDmitry Chagin  */
145dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = {
146dde5f9b9SDmitry Chagin 	-0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
147dde5f9b9SDmitry Chagin 	-10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
148dde5f9b9SDmitry Chagin 	-20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
149dde5f9b9SDmitry Chagin 	-30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
150dde5f9b9SDmitry Chagin 	-90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
151dde5f9b9SDmitry Chagin 	-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
152dde5f9b9SDmitry Chagin 	-110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
153dde5f9b9SDmitry Chagin 	-116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
154dde5f9b9SDmitry Chagin 	-6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
155dde5f9b9SDmitry Chagin 	-72, -67, -71
156dde5f9b9SDmitry Chagin };
157dde5f9b9SDmitry Chagin #endif
158dde5f9b9SDmitry Chagin 
1597144d36fSDmitry Chagin struct proc_info
1607144d36fSDmitry Chagin {
1617144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1627144d36fSDmitry Chagin 	u_int			sv_flags;
1637144d36fSDmitry Chagin 	pid_t			pid;
1647144d36fSDmitry Chagin };
1657144d36fSDmitry Chagin 
1667144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1677144d36fSDmitry Chagin 
16891fbb9c1SDavid Malone int
16991fbb9c1SDavid Malone main(int argc, char *argv[])
1709b50d902SRodney W. Grimes {
1719b50d902SRodney W. Grimes 	int ch, ktrlen, size;
17291fbb9c1SDavid Malone 	void *m;
1739b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
174db53f66bSJohn Baldwin 	int drop_logged;
175ec4beb5dSPeter Wemm 	pid_t pid = 0;
1767144d36fSDmitry Chagin 	u_int sv_flags;
1779b50d902SRodney W. Grimes 
17809307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
1795ccbfb26SAndrey A. Chernov 
1807144d36fSDmitry Chagin 	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1)
18109307b25SDag-Erling Smørgrav 		switch (ch) {
1827144d36fSDmitry Chagin 		case 'A':
1837144d36fSDmitry Chagin 			abiflag = 1;
1847144d36fSDmitry Chagin 			break;
1859b50d902SRodney W. Grimes 		case 'f':
1869b50d902SRodney W. Grimes 			tracefile = optarg;
1879b50d902SRodney W. Grimes 			break;
1889b50d902SRodney W. Grimes 		case 'd':
1899b50d902SRodney W. Grimes 			decimal = 1;
1909b50d902SRodney W. Grimes 			break;
1919b50d902SRodney W. Grimes 		case 'l':
1929b50d902SRodney W. Grimes 			tail = 1;
1939b50d902SRodney W. Grimes 			break;
1949b50d902SRodney W. Grimes 		case 'm':
1959b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
1969b50d902SRodney W. Grimes 			break;
1979b50d902SRodney W. Grimes 		case 'n':
1989b50d902SRodney W. Grimes 			fancy = 0;
1999b50d902SRodney W. Grimes 			break;
200ec4beb5dSPeter Wemm 		case 'p':
201ec4beb5dSPeter Wemm 			pid = atoi(optarg);
202ec4beb5dSPeter Wemm 			break;
20360e15db9SDag-Erling Smørgrav 		case 'r':
20460e15db9SDag-Erling Smørgrav 			resolv = 1;
20560e15db9SDag-Erling Smørgrav 			break;
206df0c8868SRobert Watson 		case 's':
207df0c8868SRobert Watson 			suppressdata = 1;
208df0c8868SRobert Watson 			break;
209ec131914SPeter Wemm 		case 'E':
210ec131914SPeter Wemm 			timestamp = 3;	/* elapsed timestamp */
211ec131914SPeter Wemm 			break;
212a9ac598bSRobert Watson 		case 'H':
213a9ac598bSRobert Watson 			threads = 1;
214a9ac598bSRobert Watson 			break;
2159b50d902SRodney W. Grimes 		case 'R':
2169b50d902SRodney W. Grimes 			timestamp = 2;	/* relative timestamp */
2179b50d902SRodney W. Grimes 			break;
2189b50d902SRodney W. Grimes 		case 'T':
2199b50d902SRodney W. Grimes 			timestamp = 1;
2209b50d902SRodney W. Grimes 			break;
2219b50d902SRodney W. Grimes 		case 't':
2229b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
22315fc002bSPhilippe Charnier 			if (trpoints < 0)
22415fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
2259b50d902SRodney W. Grimes 			break;
2269b50d902SRodney W. Grimes 		default:
2279b50d902SRodney W. Grimes 			usage();
2289b50d902SRodney W. Grimes 		}
2299b50d902SRodney W. Grimes 
23080844fd1SBill Fenner 	if (argc > optind)
2319b50d902SRodney W. Grimes 		usage();
2329b50d902SRodney W. Grimes 
23309307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
23415fc002bSPhilippe Charnier 	if (m == NULL)
23515fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
23615fc002bSPhilippe Charnier 	if (!freopen(tracefile, "r", stdin))
23715fc002bSPhilippe Charnier 		err(1, "%s", tracefile);
238f9b20fc8SPawel Jakub Dawidek 
239f9b20fc8SPawel Jakub Dawidek 	/*
240f9b20fc8SPawel Jakub Dawidek 	 * Cache NLS data before entering capability mode.
241f9b20fc8SPawel Jakub Dawidek 	 * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
242f9b20fc8SPawel Jakub Dawidek 	 */
243f9b20fc8SPawel Jakub Dawidek 	(void)catopen("libc", NL_CAT_LOCALE);
244d2c9ca44SPawel Jakub Dawidek 	if (resolv == 0) {
245f9b20fc8SPawel Jakub Dawidek 		if (cap_enter() < 0 && errno != ENOSYS)
246f9b20fc8SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
247d2c9ca44SPawel Jakub Dawidek 	}
248f9b20fc8SPawel Jakub Dawidek 	limitfd(STDIN_FILENO);
249f9b20fc8SPawel Jakub Dawidek 	limitfd(STDOUT_FILENO);
250f9b20fc8SPawel Jakub Dawidek 	limitfd(STDERR_FILENO);
251f9b20fc8SPawel Jakub Dawidek 
2527144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
253db53f66bSJohn Baldwin 	drop_logged = 0;
2549b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
255db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
256db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
257a9ac598bSRobert Watson 			if (!drop_logged && threads) {
25809307b25SDag-Erling Smørgrav 				printf(
259c065c0b8SJaakko Heinonen 				    "%6jd %6jd %-8.*s Events dropped.\n",
260c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid,
261c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
262c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_tid : 0,
263c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
264a9ac598bSRobert Watson 				drop_logged = 1;
265a9ac598bSRobert Watson 			} else if (!drop_logged) {
26609307b25SDag-Erling Smørgrav 				printf("%6jd %-8.*s Events dropped.\n",
267c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
268db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
269db53f66bSJohn Baldwin 				drop_logged = 1;
270db53f66bSJohn Baldwin 			}
271db53f66bSJohn Baldwin 		}
2729b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
27301a36e29SJohn Baldwin 			if (pid == 0 || ktr_header.ktr_pid == pid ||
27401a36e29SJohn Baldwin 			    ktr_header.ktr_tid == pid)
2759b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
27615fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
27715fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
2789b50d902SRodney W. Grimes 		if (ktrlen > size) {
27909307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
28015fc002bSPhilippe Charnier 			if (m == NULL)
28115fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
2829b50d902SRodney W. Grimes 			size = ktrlen;
2839b50d902SRodney W. Grimes 		}
28415fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
28515fc002bSPhilippe Charnier 			errx(1, "data too short");
2867144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
2877144d36fSDmitry Chagin 			continue;
2887144d36fSDmitry Chagin 		sv_flags = abidump(&ktr_header);
28901a36e29SJohn Baldwin 		if (pid && ktr_header.ktr_pid != pid &&
29001a36e29SJohn Baldwin 		    ktr_header.ktr_tid != pid)
291ec4beb5dSPeter Wemm 			continue;
2929b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
2939b50d902SRodney W. Grimes 			continue;
294db53f66bSJohn Baldwin 		drop_logged = 0;
2959b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
2969b50d902SRodney W. Grimes 		case KTR_SYSCALL:
297dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
298dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
299dde5f9b9SDmitry Chagin 				linux_ktrsyscall((struct ktr_syscall *)m);
300dde5f9b9SDmitry Chagin 			else
301dde5f9b9SDmitry Chagin #endif
3027144d36fSDmitry Chagin 				ktrsyscall((struct ktr_syscall *)m, sv_flags);
3039b50d902SRodney W. Grimes 			break;
3049b50d902SRodney W. Grimes 		case KTR_SYSRET:
305dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
306dde5f9b9SDmitry Chagin 			if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
307dde5f9b9SDmitry Chagin 				linux_ktrsysret((struct ktr_sysret *)m);
308dde5f9b9SDmitry Chagin 			else
309dde5f9b9SDmitry Chagin #endif
3107144d36fSDmitry Chagin 				ktrsysret((struct ktr_sysret *)m, sv_flags);
3119b50d902SRodney W. Grimes 			break;
3129b50d902SRodney W. Grimes 		case KTR_NAMEI:
313a56be37eSJohn Baldwin 		case KTR_SYSCTL:
3149b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
3159b50d902SRodney W. Grimes 			break;
3169b50d902SRodney W. Grimes 		case KTR_GENIO:
3179b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
3189b50d902SRodney W. Grimes 			break;
3199b50d902SRodney W. Grimes 		case KTR_PSIG:
320dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
3219b50d902SRodney W. Grimes 			break;
3229b50d902SRodney W. Grimes 		case KTR_CSW:
32388bf5036SJohn Baldwin 			if (ktrlen == sizeof(struct ktr_csw_old))
32488bf5036SJohn Baldwin 				ktrcsw_old((struct ktr_csw_old *)m);
32588bf5036SJohn Baldwin 			else
3269b50d902SRodney W. Grimes 				ktrcsw((struct ktr_csw *)m);
3279b50d902SRodney W. Grimes 			break;
32882e2dd32SPoul-Henning Kamp 		case KTR_USER:
3293f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
33082e2dd32SPoul-Henning Kamp 			break;
33160e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
33260e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
33360e15db9SDag-Erling Smørgrav 			break;
334c601ad8eSDag-Erling Smørgrav 		case KTR_CAPFAIL:
335c601ad8eSDag-Erling Smørgrav 			ktrcapfail((struct ktr_cap_fail *)m);
33635818d2eSJohn Baldwin 			break;
33735818d2eSJohn Baldwin 		case KTR_FAULT:
33835818d2eSJohn Baldwin 			ktrfault((struct ktr_fault *)m);
33935818d2eSJohn Baldwin 			break;
34035818d2eSJohn Baldwin 		case KTR_FAULTEND:
34135818d2eSJohn Baldwin 			ktrfaultend((struct ktr_faultend *)m);
34235818d2eSJohn Baldwin 			break;
343b9609ab1SJohn Baldwin 		default:
344b9609ab1SJohn Baldwin 			printf("\n");
345b9609ab1SJohn Baldwin 			break;
3469b50d902SRodney W. Grimes 		}
3479b50d902SRodney W. Grimes 		if (tail)
34809307b25SDag-Erling Smørgrav 			fflush(stdout);
3499b50d902SRodney W. Grimes 	}
35091fbb9c1SDavid Malone 	return 0;
3519b50d902SRodney W. Grimes }
3529b50d902SRodney W. Grimes 
353f9b20fc8SPawel Jakub Dawidek void
354f9b20fc8SPawel Jakub Dawidek limitfd(int fd)
355f9b20fc8SPawel Jakub Dawidek {
356f9b20fc8SPawel Jakub Dawidek 	cap_rights_t rights;
357f9b20fc8SPawel Jakub Dawidek 	unsigned long cmd;
358f9b20fc8SPawel Jakub Dawidek 
359f9b20fc8SPawel Jakub Dawidek 	rights = CAP_FSTAT;
360f9b20fc8SPawel Jakub Dawidek 	cmd = -1;
361f9b20fc8SPawel Jakub Dawidek 
362f9b20fc8SPawel Jakub Dawidek 	switch (fd) {
363f9b20fc8SPawel Jakub Dawidek 	case STDIN_FILENO:
364f9b20fc8SPawel Jakub Dawidek 		rights |= CAP_READ;
365f9b20fc8SPawel Jakub Dawidek 		break;
366f9b20fc8SPawel Jakub Dawidek 	case STDOUT_FILENO:
367f9b20fc8SPawel Jakub Dawidek 		rights |= CAP_IOCTL | CAP_WRITE;
368f9b20fc8SPawel Jakub Dawidek 		cmd = TIOCGETA;	/* required by isatty(3) in printf(3) */
369f9b20fc8SPawel Jakub Dawidek 		break;
370f9b20fc8SPawel Jakub Dawidek 	case STDERR_FILENO:
371f9b20fc8SPawel Jakub Dawidek 		rights |= CAP_WRITE;
372f9b20fc8SPawel Jakub Dawidek 		if (!suppressdata) {
373f9b20fc8SPawel Jakub Dawidek 			rights |= CAP_IOCTL;
374f9b20fc8SPawel Jakub Dawidek 			cmd = TIOCGWINSZ;
375f9b20fc8SPawel Jakub Dawidek 		}
376f9b20fc8SPawel Jakub Dawidek 		break;
377f9b20fc8SPawel Jakub Dawidek 	default:
378f9b20fc8SPawel Jakub Dawidek 		abort();
379f9b20fc8SPawel Jakub Dawidek 	}
380f9b20fc8SPawel Jakub Dawidek 
381f9b20fc8SPawel Jakub Dawidek 	if (cap_rights_limit(fd, rights) < 0 && errno != ENOSYS)
382f9b20fc8SPawel Jakub Dawidek 		err(1, "unable to limit rights for descriptor %d", fd);
383f9b20fc8SPawel Jakub Dawidek 	if (cmd != -1 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
384f9b20fc8SPawel Jakub Dawidek 		err(1, "unable to limit ioctls for descriptor %d", fd);
385f9b20fc8SPawel Jakub Dawidek }
386f9b20fc8SPawel Jakub Dawidek 
38791fbb9c1SDavid Malone int
38891fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
3899b50d902SRodney W. Grimes {
3909b50d902SRodney W. Grimes 	int i;
3919b50d902SRodney W. Grimes 
3929b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
39309307b25SDag-Erling Smørgrav 		sleep(1);
3949b50d902SRodney W. Grimes 		clearerr(stdin);
3959b50d902SRodney W. Grimes 	}
3969b50d902SRodney W. Grimes 	return (i);
3979b50d902SRodney W. Grimes }
3989b50d902SRodney W. Grimes 
3997144d36fSDmitry Chagin int
4007144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
4017144d36fSDmitry Chagin {
4027144d36fSDmitry Chagin 	struct proc_info *pi;
4037144d36fSDmitry Chagin 
4047144d36fSDmitry Chagin 	switch (kth->ktr_type) {
4057144d36fSDmitry Chagin 	case KTR_PROCCTOR:
4067144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
4077144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
4087144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
4097144d36fSDmitry Chagin 				break;
4107144d36fSDmitry Chagin 			}
4117144d36fSDmitry Chagin 		}
4127144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
4137144d36fSDmitry Chagin 		if (pi == NULL)
4147144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
4157144d36fSDmitry Chagin 		pi->sv_flags = *flags;
4167144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
4177144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
4187144d36fSDmitry Chagin 		return (1);
4197144d36fSDmitry Chagin 
4207144d36fSDmitry Chagin 	case KTR_PROCDTOR:
4217144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
4227144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
4237144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
4247144d36fSDmitry Chagin 				free(pi);
4257144d36fSDmitry Chagin 				break;
4267144d36fSDmitry Chagin 			}
4277144d36fSDmitry Chagin 		}
4287144d36fSDmitry Chagin 		return (1);
4297144d36fSDmitry Chagin 	}
4307144d36fSDmitry Chagin 
4317144d36fSDmitry Chagin 	return (0);
4327144d36fSDmitry Chagin }
4337144d36fSDmitry Chagin 
4347144d36fSDmitry Chagin u_int
4357144d36fSDmitry Chagin abidump(struct ktr_header *kth)
4367144d36fSDmitry Chagin {
4377144d36fSDmitry Chagin 	struct proc_info *pi;
4387144d36fSDmitry Chagin 	const char *abi;
4397144d36fSDmitry Chagin 	const char *arch;
4407144d36fSDmitry Chagin 	u_int flags = 0;
4417144d36fSDmitry Chagin 
4427144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
4437144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
4447144d36fSDmitry Chagin 			flags = pi->sv_flags;
4457144d36fSDmitry Chagin 			break;
4467144d36fSDmitry Chagin 		}
4477144d36fSDmitry Chagin 	}
4487144d36fSDmitry Chagin 
4497144d36fSDmitry Chagin 	if (abiflag == 0)
4507144d36fSDmitry Chagin 		return (flags);
4517144d36fSDmitry Chagin 
4527144d36fSDmitry Chagin 	switch (flags & SV_ABI_MASK) {
4537144d36fSDmitry Chagin 	case SV_ABI_LINUX:
4547144d36fSDmitry Chagin 		abi = "L";
4557144d36fSDmitry Chagin 		break;
4567144d36fSDmitry Chagin 	case SV_ABI_FREEBSD:
4577144d36fSDmitry Chagin 		abi = "F";
4587144d36fSDmitry Chagin 		break;
4597144d36fSDmitry Chagin 	default:
4607144d36fSDmitry Chagin 		abi = "U";
4617144d36fSDmitry Chagin 		break;
4627144d36fSDmitry Chagin 	}
4637144d36fSDmitry Chagin 
4647144d36fSDmitry Chagin 	if (flags != 0) {
4657144d36fSDmitry Chagin 		if (flags & SV_LP64)
4667144d36fSDmitry Chagin 			arch = "64";
4677144d36fSDmitry Chagin 		else
4687144d36fSDmitry Chagin 			arch = "32";
4697144d36fSDmitry Chagin 	} else
4707144d36fSDmitry Chagin 		arch = "00";
4717144d36fSDmitry Chagin 
4727144d36fSDmitry Chagin 	printf("%s%s  ", abi, arch);
4737144d36fSDmitry Chagin 
4747144d36fSDmitry Chagin 	return (flags);
4757144d36fSDmitry Chagin }
4767144d36fSDmitry Chagin 
47791fbb9c1SDavid Malone void
47891fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
4799b50d902SRodney W. Grimes {
4809b50d902SRodney W. Grimes 	static char unknown[64];
4819b50d902SRodney W. Grimes 	static struct timeval prevtime, temp;
48291fbb9c1SDavid Malone 	const char *type;
4839b50d902SRodney W. Grimes 
4849b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
4859b50d902SRodney W. Grimes 	case KTR_SYSCALL:
4869b50d902SRodney W. Grimes 		type = "CALL";
4879b50d902SRodney W. Grimes 		break;
4889b50d902SRodney W. Grimes 	case KTR_SYSRET:
4899b50d902SRodney W. Grimes 		type = "RET ";
4909b50d902SRodney W. Grimes 		break;
4919b50d902SRodney W. Grimes 	case KTR_NAMEI:
4929b50d902SRodney W. Grimes 		type = "NAMI";
4939b50d902SRodney W. Grimes 		break;
4949b50d902SRodney W. Grimes 	case KTR_GENIO:
4959b50d902SRodney W. Grimes 		type = "GIO ";
4969b50d902SRodney W. Grimes 		break;
4979b50d902SRodney W. Grimes 	case KTR_PSIG:
4989b50d902SRodney W. Grimes 		type = "PSIG";
4999b50d902SRodney W. Grimes 		break;
5009b50d902SRodney W. Grimes 	case KTR_CSW:
5019b50d902SRodney W. Grimes 		type = "CSW ";
5029b50d902SRodney W. Grimes 		break;
50382e2dd32SPoul-Henning Kamp 	case KTR_USER:
50482e2dd32SPoul-Henning Kamp 		type = "USER";
50582e2dd32SPoul-Henning Kamp 		break;
50660e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
50760e15db9SDag-Erling Smørgrav 		type = "STRU";
50860e15db9SDag-Erling Smørgrav 		break;
509a56be37eSJohn Baldwin 	case KTR_SYSCTL:
510a56be37eSJohn Baldwin 		type = "SCTL";
511a56be37eSJohn Baldwin 		break;
5127144d36fSDmitry Chagin 	case KTR_PROCCTOR:
5137144d36fSDmitry Chagin 		/* FALLTHROUGH */
5147144d36fSDmitry Chagin 	case KTR_PROCDTOR:
5157144d36fSDmitry Chagin 		return;
516c601ad8eSDag-Erling Smørgrav 	case KTR_CAPFAIL:
517c601ad8eSDag-Erling Smørgrav 		type = "CAP ";
518c601ad8eSDag-Erling Smørgrav 		break;
51935818d2eSJohn Baldwin 	case KTR_FAULT:
52035818d2eSJohn Baldwin 		type = "PFLT";
52135818d2eSJohn Baldwin 		break;
52235818d2eSJohn Baldwin 	case KTR_FAULTEND:
52335818d2eSJohn Baldwin 		type = "PRET";
52435818d2eSJohn Baldwin 		break;
5259b50d902SRodney W. Grimes 	default:
52609307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
5279b50d902SRodney W. Grimes 		type = unknown;
5289b50d902SRodney W. Grimes 	}
5299b50d902SRodney W. Grimes 
530a9ac598bSRobert Watson 	/*
531a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
532a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
533a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
534a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
535a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
536a9ac598bSRobert Watson 	 * negative tid's as 0.
537a9ac598bSRobert Watson 	 */
538a9ac598bSRobert Watson 	if (threads)
53909307b25SDag-Erling Smørgrav 		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
540c065c0b8SJaakko Heinonen 		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
541c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
542a9ac598bSRobert Watson 	else
54309307b25SDag-Erling Smørgrav 		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
544a9ac598bSRobert Watson 		    kth->ktr_comm);
5459b50d902SRodney W. Grimes 	if (timestamp) {
546ec131914SPeter Wemm 		if (timestamp == 3) {
547ec131914SPeter Wemm 			if (prevtime.tv_sec == 0)
548ec131914SPeter Wemm 				prevtime = kth->ktr_time;
549ec131914SPeter Wemm 			timevalsub(&kth->ktr_time, &prevtime);
550ec131914SPeter Wemm 		}
5519b50d902SRodney W. Grimes 		if (timestamp == 2) {
5529b50d902SRodney W. Grimes 			temp = kth->ktr_time;
5539b50d902SRodney W. Grimes 			timevalsub(&kth->ktr_time, &prevtime);
5549b50d902SRodney W. Grimes 			prevtime = temp;
5559b50d902SRodney W. Grimes 		}
55609307b25SDag-Erling Smørgrav 		printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
557c065c0b8SJaakko Heinonen 		    kth->ktr_time.tv_usec);
5589b50d902SRodney W. Grimes 	}
55909307b25SDag-Erling Smørgrav 	printf("%s  ", type);
5609b50d902SRodney W. Grimes }
5619b50d902SRodney W. Grimes 
5629b50d902SRodney W. Grimes #include <sys/syscall.h>
5639b50d902SRodney W. Grimes #define KTRACE
56455229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c>
5659b50d902SRodney W. Grimes #undef KTRACE
5669b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
5679b50d902SRodney W. Grimes 
56891fbb9c1SDavid Malone void
5697144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags)
5709b50d902SRodney W. Grimes {
57191fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
57291fbb9c1SDavid Malone 	register_t *ip;
573c601ad8eSDag-Erling Smørgrav 	intmax_t arg;
5749b50d902SRodney W. Grimes 
5757144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
5767144d36fSDmitry Chagin 	    (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
57709307b25SDag-Erling Smørgrav 		printf("[%d]", ktr->ktr_code);
5789b50d902SRodney W. Grimes 	else
57909307b25SDag-Erling Smørgrav 		printf("%s", syscallnames[ktr->ktr_code]);
5807a6ec4cfSDmitrij Tejblum 	ip = &ktr->ktr_args[0];
5819b50d902SRodney W. Grimes 	if (narg) {
5829b50d902SRodney W. Grimes 		char c = '(';
5837144d36fSDmitry Chagin 		if (fancy &&
5847144d36fSDmitry Chagin 		    (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
58573430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
58673430055SDag-Erling Smørgrav 			case SYS_ioctl: {
58798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
588d09e66beSDag-Erling Smørgrav 				putchar(c);
589d09e66beSDag-Erling Smørgrav 				ioctlname(*ip, decimal);
5909b50d902SRodney W. Grimes 				c = ',';
5919b50d902SRodney W. Grimes 				ip++;
5929b50d902SRodney W. Grimes 				narg--;
59373430055SDag-Erling Smørgrav 				break;
59473430055SDag-Erling Smørgrav 			}
59573430055SDag-Erling Smørgrav 			case SYS_ptrace:
59609307b25SDag-Erling Smørgrav 				putchar('(');
59795bb676aSDag-Erling Smørgrav 				ptraceopname(*ip);
5989b50d902SRodney W. Grimes 				c = ',';
5999b50d902SRodney W. Grimes 				ip++;
6009b50d902SRodney W. Grimes 				narg--;
60173430055SDag-Erling Smørgrav 				break;
60273430055SDag-Erling Smørgrav 			case SYS_access:
60373430055SDag-Erling Smørgrav 			case SYS_eaccess:
60498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
60509307b25SDag-Erling Smørgrav 				putchar(',');
60695bb676aSDag-Erling Smørgrav 				accessmodename(*ip);
60798a68a58SAlexander Leidinger 				ip++;
60898a68a58SAlexander Leidinger 				narg--;
60973430055SDag-Erling Smørgrav 				break;
61073430055SDag-Erling Smørgrav 			case SYS_open:
61198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
61209307b25SDag-Erling Smørgrav 				putchar(',');
61395bb676aSDag-Erling Smørgrav 				flagsandmodename(ip[0], ip[1], decimal);
61473430055SDag-Erling Smørgrav 				ip += 2;
61598a68a58SAlexander Leidinger 				narg -= 2;
61673430055SDag-Erling Smørgrav 				break;
61773430055SDag-Erling Smørgrav 			case SYS_wait4:
61898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
61998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
62009307b25SDag-Erling Smørgrav 				putchar(',');
62195bb676aSDag-Erling Smørgrav 				wait4optname(*ip);
62298a68a58SAlexander Leidinger 				ip++;
62398a68a58SAlexander Leidinger 				narg--;
62473430055SDag-Erling Smørgrav 				break;
62573430055SDag-Erling Smørgrav 			case SYS_chmod:
62673430055SDag-Erling Smørgrav 			case SYS_fchmod:
62773430055SDag-Erling Smørgrav 			case SYS_lchmod:
62898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
62909307b25SDag-Erling Smørgrav 				putchar(',');
63095bb676aSDag-Erling Smørgrav 				modename(*ip);
63198a68a58SAlexander Leidinger 				ip++;
63298a68a58SAlexander Leidinger 				narg--;
63373430055SDag-Erling Smørgrav 				break;
63473430055SDag-Erling Smørgrav 			case SYS_mknod:
63598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
63609307b25SDag-Erling Smørgrav 				putchar(',');
63795bb676aSDag-Erling Smørgrav 				modename(*ip);
63898a68a58SAlexander Leidinger 				ip++;
63998a68a58SAlexander Leidinger 				narg--;
64073430055SDag-Erling Smørgrav 				break;
64173430055SDag-Erling Smørgrav 			case SYS_getfsstat:
64298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
64398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
64409307b25SDag-Erling Smørgrav 				putchar(',');
64595bb676aSDag-Erling Smørgrav 				getfsstatflagsname(*ip);
64698a68a58SAlexander Leidinger 				ip++;
64798a68a58SAlexander Leidinger 				narg--;
64873430055SDag-Erling Smørgrav 				break;
64973430055SDag-Erling Smørgrav 			case SYS_mount:
65098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
65198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
65209307b25SDag-Erling Smørgrav 				putchar(',');
65395bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
65498a68a58SAlexander Leidinger 				ip++;
65598a68a58SAlexander Leidinger 				narg--;
65673430055SDag-Erling Smørgrav 				break;
65773430055SDag-Erling Smørgrav 			case SYS_unmount:
65898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
65909307b25SDag-Erling Smørgrav 				putchar(',');
66095bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
66198a68a58SAlexander Leidinger 				ip++;
66298a68a58SAlexander Leidinger 				narg--;
66373430055SDag-Erling Smørgrav 				break;
66473430055SDag-Erling Smørgrav 			case SYS_recvmsg:
66573430055SDag-Erling Smørgrav 			case SYS_sendmsg:
66698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
66798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
66809307b25SDag-Erling Smørgrav 				putchar(',');
66995bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
67098a68a58SAlexander Leidinger 				ip++;
67198a68a58SAlexander Leidinger 				narg--;
67273430055SDag-Erling Smørgrav 				break;
67373430055SDag-Erling Smørgrav 			case SYS_recvfrom:
67473430055SDag-Erling Smørgrav 			case SYS_sendto:
67598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
67698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
67798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
67809307b25SDag-Erling Smørgrav 				putchar(',');
67995bb676aSDag-Erling Smørgrav 				sendrecvflagsname(*ip);
68098a68a58SAlexander Leidinger 				ip++;
68198a68a58SAlexander Leidinger 				narg--;
68273430055SDag-Erling Smørgrav 				break;
68373430055SDag-Erling Smørgrav 			case SYS_chflags:
68473430055SDag-Erling Smørgrav 			case SYS_fchflags:
68573430055SDag-Erling Smørgrav 			case SYS_lchflags:
68698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
68709307b25SDag-Erling Smørgrav 				putchar(',');
68895bb676aSDag-Erling Smørgrav 				modename(*ip);
68998a68a58SAlexander Leidinger 				ip++;
69098a68a58SAlexander Leidinger 				narg--;
69173430055SDag-Erling Smørgrav 				break;
69273430055SDag-Erling Smørgrav 			case SYS_kill:
69398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
69409307b25SDag-Erling Smørgrav 				putchar(',');
69595bb676aSDag-Erling Smørgrav 				signame(*ip);
69698a68a58SAlexander Leidinger 				ip++;
69798a68a58SAlexander Leidinger 				narg--;
69873430055SDag-Erling Smørgrav 				break;
69973430055SDag-Erling Smørgrav 			case SYS_reboot:
70009307b25SDag-Erling Smørgrav 				putchar('(');
70195bb676aSDag-Erling Smørgrav 				rebootoptname(*ip);
70298a68a58SAlexander Leidinger 				ip++;
70398a68a58SAlexander Leidinger 				narg--;
70473430055SDag-Erling Smørgrav 				break;
70573430055SDag-Erling Smørgrav 			case SYS_umask:
70609307b25SDag-Erling Smørgrav 				putchar('(');
70795bb676aSDag-Erling Smørgrav 				modename(*ip);
70898a68a58SAlexander Leidinger 				ip++;
70998a68a58SAlexander Leidinger 				narg--;
71073430055SDag-Erling Smørgrav 				break;
71173430055SDag-Erling Smørgrav 			case SYS_msync:
71298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
71398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
71409307b25SDag-Erling Smørgrav 				putchar(',');
71595bb676aSDag-Erling Smørgrav 				msyncflagsname(*ip);
71698a68a58SAlexander Leidinger 				ip++;
71798a68a58SAlexander Leidinger 				narg--;
71873430055SDag-Erling Smørgrav 				break;
719cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
72073430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
721cae1120aSPeter Wemm 				print_number(ip, narg, c);
722cae1120aSPeter Wemm 				print_number(ip, narg, c);
72309307b25SDag-Erling Smørgrav 				putchar(',');
72495bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
72509307b25SDag-Erling Smørgrav 				putchar(',');
726cae1120aSPeter Wemm 				ip++;
727cae1120aSPeter Wemm 				narg--;
72895bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
729cae1120aSPeter Wemm 				ip++;
730cae1120aSPeter Wemm 				narg--;
73173430055SDag-Erling Smørgrav 				break;
732cae1120aSPeter Wemm #endif
73373430055SDag-Erling Smørgrav 			case SYS_mmap:
73498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
73609307b25SDag-Erling Smørgrav 				putchar(',');
73795bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
73809307b25SDag-Erling Smørgrav 				putchar(',');
73998a68a58SAlexander Leidinger 				ip++;
74098a68a58SAlexander Leidinger 				narg--;
74195bb676aSDag-Erling Smørgrav 				mmapflagsname(*ip);
74298a68a58SAlexander Leidinger 				ip++;
74398a68a58SAlexander Leidinger 				narg--;
74473430055SDag-Erling Smørgrav 				break;
74573430055SDag-Erling Smørgrav 			case SYS_mprotect:
74698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
74798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
74809307b25SDag-Erling Smørgrav 				putchar(',');
74995bb676aSDag-Erling Smørgrav 				mmapprotname(*ip);
75098a68a58SAlexander Leidinger 				ip++;
75198a68a58SAlexander Leidinger 				narg--;
75273430055SDag-Erling Smørgrav 				break;
75373430055SDag-Erling Smørgrav 			case SYS_madvise:
75498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
75609307b25SDag-Erling Smørgrav 				putchar(',');
75795bb676aSDag-Erling Smørgrav 				madvisebehavname(*ip);
75898a68a58SAlexander Leidinger 				ip++;
75998a68a58SAlexander Leidinger 				narg--;
76073430055SDag-Erling Smørgrav 				break;
76173430055SDag-Erling Smørgrav 			case SYS_setpriority:
76298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
76398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
76409307b25SDag-Erling Smørgrav 				putchar(',');
76595bb676aSDag-Erling Smørgrav 				prioname(*ip);
76698a68a58SAlexander Leidinger 				ip++;
76798a68a58SAlexander Leidinger 				narg--;
76873430055SDag-Erling Smørgrav 				break;
76973430055SDag-Erling Smørgrav 			case SYS_fcntl:
77098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
77109307b25SDag-Erling Smørgrav 				putchar(',');
77295bb676aSDag-Erling Smørgrav 				fcntlcmdname(ip[0], ip[1], decimal);
77373430055SDag-Erling Smørgrav 				ip += 2;
77498a68a58SAlexander Leidinger 				narg -= 2;
77573430055SDag-Erling Smørgrav 				break;
77673430055SDag-Erling Smørgrav 			case SYS_socket: {
7778bc31d83SCraig Rodrigues 				int sockdomain;
77809307b25SDag-Erling Smørgrav 				putchar('(');
77995bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
7808bc31d83SCraig Rodrigues 				sockdomainname(sockdomain);
78198a68a58SAlexander Leidinger 				ip++;
78298a68a58SAlexander Leidinger 				narg--;
78309307b25SDag-Erling Smørgrav 				putchar(',');
78495bb676aSDag-Erling Smørgrav 				socktypename(*ip);
78598a68a58SAlexander Leidinger 				ip++;
78698a68a58SAlexander Leidinger 				narg--;
7878bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
7888bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
78909307b25SDag-Erling Smørgrav 					putchar(',');
79095bb676aSDag-Erling Smørgrav 					sockipprotoname(*ip);
7918bc31d83SCraig Rodrigues 					ip++;
7928bc31d83SCraig Rodrigues 					narg--;
7938bc31d83SCraig Rodrigues 				}
79498a68a58SAlexander Leidinger 				c = ',';
79573430055SDag-Erling Smørgrav 				break;
79673430055SDag-Erling Smørgrav 			}
79773430055SDag-Erling Smørgrav 			case SYS_setsockopt:
79873430055SDag-Erling Smørgrav 			case SYS_getsockopt:
79998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
80009307b25SDag-Erling Smørgrav 				putchar(',');
80195bb676aSDag-Erling Smørgrav 				sockoptlevelname(*ip, decimal);
802e4bb45b1SDag-Erling Smørgrav 				if (*ip == SOL_SOCKET) {
80398a68a58SAlexander Leidinger 					ip++;
80498a68a58SAlexander Leidinger 					narg--;
80509307b25SDag-Erling Smørgrav 					putchar(',');
80695bb676aSDag-Erling Smørgrav 					sockoptname(*ip);
8070460d351SJohn Baldwin 				}
80898a68a58SAlexander Leidinger 				ip++;
80998a68a58SAlexander Leidinger 				narg--;
81073430055SDag-Erling Smørgrav 				break;
811cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
81273430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
81398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
81498a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
81598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
81698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
81709307b25SDag-Erling Smørgrav 				putchar(',');
81895bb676aSDag-Erling Smørgrav 				whencename(*ip);
81998a68a58SAlexander Leidinger 				ip++;
82098a68a58SAlexander Leidinger 				narg--;
82173430055SDag-Erling Smørgrav 				break;
822cae1120aSPeter Wemm #endif
82373430055SDag-Erling Smørgrav 			case SYS_lseek:
824cae1120aSPeter Wemm 				print_number(ip, narg, c);
825cae1120aSPeter Wemm 				/* Hidden 'pad' argument, not in lseek(2) */
826cae1120aSPeter Wemm 				print_number(ip, narg, c);
82709307b25SDag-Erling Smørgrav 				putchar(',');
82895bb676aSDag-Erling Smørgrav 				whencename(*ip);
829cae1120aSPeter Wemm 				ip++;
830cae1120aSPeter Wemm 				narg--;
83173430055SDag-Erling Smørgrav 				break;
83273430055SDag-Erling Smørgrav 			case SYS_flock:
83398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
83409307b25SDag-Erling Smørgrav 				putchar(',');
83595bb676aSDag-Erling Smørgrav 				flockname(*ip);
83698a68a58SAlexander Leidinger 				ip++;
83798a68a58SAlexander Leidinger 				narg--;
83873430055SDag-Erling Smørgrav 				break;
83973430055SDag-Erling Smørgrav 			case SYS_mkfifo:
84073430055SDag-Erling Smørgrav 			case SYS_mkdir:
84198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
84209307b25SDag-Erling Smørgrav 				putchar(',');
84395bb676aSDag-Erling Smørgrav 				modename(*ip);
84498a68a58SAlexander Leidinger 				ip++;
84598a68a58SAlexander Leidinger 				narg--;
84673430055SDag-Erling Smørgrav 				break;
84773430055SDag-Erling Smørgrav 			case SYS_shutdown:
84898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
84909307b25SDag-Erling Smørgrav 				putchar(',');
85095bb676aSDag-Erling Smørgrav 				shutdownhowname(*ip);
85198a68a58SAlexander Leidinger 				ip++;
85298a68a58SAlexander Leidinger 				narg--;
85373430055SDag-Erling Smørgrav 				break;
85473430055SDag-Erling Smørgrav 			case SYS_socketpair:
85509307b25SDag-Erling Smørgrav 				putchar('(');
85695bb676aSDag-Erling Smørgrav 				sockdomainname(*ip);
85798a68a58SAlexander Leidinger 				ip++;
85898a68a58SAlexander Leidinger 				narg--;
85909307b25SDag-Erling Smørgrav 				putchar(',');
86095bb676aSDag-Erling Smørgrav 				socktypename(*ip);
86198a68a58SAlexander Leidinger 				ip++;
86298a68a58SAlexander Leidinger 				narg--;
86398a68a58SAlexander Leidinger 				c = ',';
86473430055SDag-Erling Smørgrav 				break;
86573430055SDag-Erling Smørgrav 			case SYS_getrlimit:
86673430055SDag-Erling Smørgrav 			case SYS_setrlimit:
86709307b25SDag-Erling Smørgrav 				putchar('(');
86895bb676aSDag-Erling Smørgrav 				rlimitname(*ip);
86998a68a58SAlexander Leidinger 				ip++;
87098a68a58SAlexander Leidinger 				narg--;
87198a68a58SAlexander Leidinger 				c = ',';
87273430055SDag-Erling Smørgrav 				break;
87373430055SDag-Erling Smørgrav 			case SYS_quotactl:
87498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
87509307b25SDag-Erling Smørgrav 				putchar(',');
87695bb676aSDag-Erling Smørgrav 				quotactlname(*ip);
87798a68a58SAlexander Leidinger 				ip++;
87898a68a58SAlexander Leidinger 				narg--;
87998a68a58SAlexander Leidinger 				c = ',';
88073430055SDag-Erling Smørgrav 				break;
88173430055SDag-Erling Smørgrav 			case SYS_nfssvc:
88209307b25SDag-Erling Smørgrav 				putchar('(');
88395bb676aSDag-Erling Smørgrav 				nfssvcname(*ip);
88498a68a58SAlexander Leidinger 				ip++;
88598a68a58SAlexander Leidinger 				narg--;
88698a68a58SAlexander Leidinger 				c = ',';
88773430055SDag-Erling Smørgrav 				break;
88873430055SDag-Erling Smørgrav 			case SYS_rtprio:
88909307b25SDag-Erling Smørgrav 				putchar('(');
89095bb676aSDag-Erling Smørgrav 				rtprioname(*ip);
89198a68a58SAlexander Leidinger 				ip++;
89298a68a58SAlexander Leidinger 				narg--;
89398a68a58SAlexander Leidinger 				c = ',';
89473430055SDag-Erling Smørgrav 				break;
89573430055SDag-Erling Smørgrav 			case SYS___semctl:
89698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89809307b25SDag-Erling Smørgrav 				putchar(',');
89995bb676aSDag-Erling Smørgrav 				semctlname(*ip);
90098a68a58SAlexander Leidinger 				ip++;
90198a68a58SAlexander Leidinger 				narg--;
90273430055SDag-Erling Smørgrav 				break;
90373430055SDag-Erling Smørgrav 			case SYS_semget:
90498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90609307b25SDag-Erling Smørgrav 				putchar(',');
90795bb676aSDag-Erling Smørgrav 				semgetname(*ip);
90898a68a58SAlexander Leidinger 				ip++;
90998a68a58SAlexander Leidinger 				narg--;
91073430055SDag-Erling Smørgrav 				break;
91173430055SDag-Erling Smørgrav 			case SYS_msgctl:
91298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
91309307b25SDag-Erling Smørgrav 				putchar(',');
91495bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
91598a68a58SAlexander Leidinger 				ip++;
91698a68a58SAlexander Leidinger 				narg--;
91773430055SDag-Erling Smørgrav 				break;
91873430055SDag-Erling Smørgrav 			case SYS_shmat:
91998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92109307b25SDag-Erling Smørgrav 				putchar(',');
92295bb676aSDag-Erling Smørgrav 				shmatname(*ip);
92398a68a58SAlexander Leidinger 				ip++;
92498a68a58SAlexander Leidinger 				narg--;
92573430055SDag-Erling Smørgrav 				break;
92673430055SDag-Erling Smørgrav 			case SYS_shmctl:
92798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92809307b25SDag-Erling Smørgrav 				putchar(',');
92995bb676aSDag-Erling Smørgrav 				shmctlname(*ip);
93098a68a58SAlexander Leidinger 				ip++;
93198a68a58SAlexander Leidinger 				narg--;
93273430055SDag-Erling Smørgrav 				break;
93373430055SDag-Erling Smørgrav 			case SYS_minherit:
93498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93609307b25SDag-Erling Smørgrav 				putchar(',');
93795bb676aSDag-Erling Smørgrav 				minheritname(*ip);
93898a68a58SAlexander Leidinger 				ip++;
93998a68a58SAlexander Leidinger 				narg--;
94073430055SDag-Erling Smørgrav 				break;
94173430055SDag-Erling Smørgrav 			case SYS_rfork:
94209307b25SDag-Erling Smørgrav 				putchar('(');
94395bb676aSDag-Erling Smørgrav 				rforkname(*ip);
94498a68a58SAlexander Leidinger 				ip++;
94598a68a58SAlexander Leidinger 				narg--;
94698a68a58SAlexander Leidinger 				c = ',';
94773430055SDag-Erling Smørgrav 				break;
94873430055SDag-Erling Smørgrav 			case SYS_lio_listio:
94909307b25SDag-Erling Smørgrav 				putchar('(');
95095bb676aSDag-Erling Smørgrav 				lio_listioname(*ip);
95198a68a58SAlexander Leidinger 				ip++;
95298a68a58SAlexander Leidinger 				narg--;
95398a68a58SAlexander Leidinger 				c = ',';
95473430055SDag-Erling Smørgrav 				break;
95573430055SDag-Erling Smørgrav 			case SYS_mlockall:
95609307b25SDag-Erling Smørgrav 				putchar('(');
95795bb676aSDag-Erling Smørgrav 				mlockallname(*ip);
95898a68a58SAlexander Leidinger 				ip++;
95998a68a58SAlexander Leidinger 				narg--;
96073430055SDag-Erling Smørgrav 				break;
96173430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
96298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96309307b25SDag-Erling Smørgrav 				putchar(',');
96495bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
96598a68a58SAlexander Leidinger 				ip++;
96698a68a58SAlexander Leidinger 				narg--;
96773430055SDag-Erling Smørgrav 				break;
96873430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
96973430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
97009307b25SDag-Erling Smørgrav 				putchar('(');
97195bb676aSDag-Erling Smørgrav 				schedpolicyname(*ip);
97298a68a58SAlexander Leidinger 				ip++;
97398a68a58SAlexander Leidinger 				narg--;
97473430055SDag-Erling Smørgrav 				break;
97573430055SDag-Erling Smørgrav 			case SYS_sendfile:
97698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98209307b25SDag-Erling Smørgrav 				putchar(',');
98395bb676aSDag-Erling Smørgrav 				sendfileflagsname(*ip);
98498a68a58SAlexander Leidinger 				ip++;
98598a68a58SAlexander Leidinger 				narg--;
98673430055SDag-Erling Smørgrav 				break;
98773430055SDag-Erling Smørgrav 			case SYS_kldsym:
98898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98909307b25SDag-Erling Smørgrav 				putchar(',');
99095bb676aSDag-Erling Smørgrav 				kldsymcmdname(*ip);
99198a68a58SAlexander Leidinger 				ip++;
99298a68a58SAlexander Leidinger 				narg--;
99373430055SDag-Erling Smørgrav 				break;
99473430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
99509307b25SDag-Erling Smørgrav 				putchar('(');
99695bb676aSDag-Erling Smørgrav 				sigprocmaskhowname(*ip);
99798a68a58SAlexander Leidinger 				ip++;
99898a68a58SAlexander Leidinger 				narg--;
99998a68a58SAlexander Leidinger 				c = ',';
100073430055SDag-Erling Smørgrav 				break;
100173430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
100273430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
100373430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
100473430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
100573430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
100673430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
100773430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
100873430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
100973430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
101073430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
101173430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
101273430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
101398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101409307b25SDag-Erling Smørgrav 				putchar(',');
101595bb676aSDag-Erling Smørgrav 				acltypename(*ip);
101698a68a58SAlexander Leidinger 				ip++;
101798a68a58SAlexander Leidinger 				narg--;
101873430055SDag-Erling Smørgrav 				break;
101973430055SDag-Erling Smørgrav 			case SYS_sigaction:
102009307b25SDag-Erling Smørgrav 				putchar('(');
102195bb676aSDag-Erling Smørgrav 				signame(*ip);
102298a68a58SAlexander Leidinger 				ip++;
102398a68a58SAlexander Leidinger 				narg--;
102498a68a58SAlexander Leidinger 				c = ',';
102573430055SDag-Erling Smørgrav 				break;
102673430055SDag-Erling Smørgrav 			case SYS_extattrctl:
102798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
102809307b25SDag-Erling Smørgrav 				putchar(',');
102995bb676aSDag-Erling Smørgrav 				extattrctlname(*ip);
103098a68a58SAlexander Leidinger 				ip++;
103198a68a58SAlexander Leidinger 				narg--;
103273430055SDag-Erling Smørgrav 				break;
103373430055SDag-Erling Smørgrav 			case SYS_nmount:
103498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103609307b25SDag-Erling Smørgrav 				putchar(',');
103795bb676aSDag-Erling Smørgrav 				mountflagsname(*ip);
103898a68a58SAlexander Leidinger 				ip++;
103998a68a58SAlexander Leidinger 				narg--;
104073430055SDag-Erling Smørgrav 				break;
104173430055SDag-Erling Smørgrav 			case SYS_thr_create:
104298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
104398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
104409307b25SDag-Erling Smørgrav 				putchar(',');
104595bb676aSDag-Erling Smørgrav 				thrcreateflagsname(*ip);
104698a68a58SAlexander Leidinger 				ip++;
104798a68a58SAlexander Leidinger 				narg--;
104873430055SDag-Erling Smørgrav 				break;
104973430055SDag-Erling Smørgrav 			case SYS_thr_kill:
105098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105109307b25SDag-Erling Smørgrav 				putchar(',');
105295bb676aSDag-Erling Smørgrav 				signame(*ip);
105398a68a58SAlexander Leidinger 				ip++;
105498a68a58SAlexander Leidinger 				narg--;
105573430055SDag-Erling Smørgrav 				break;
105673430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
105798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105809307b25SDag-Erling Smørgrav 				putchar(',');
105995bb676aSDag-Erling Smørgrav 				kldunloadfflagsname(*ip);
106098a68a58SAlexander Leidinger 				ip++;
106198a68a58SAlexander Leidinger 				narg--;
106273430055SDag-Erling Smørgrav 				break;
1063515dfc23SDag-Erling Smørgrav 			case SYS_cap_new:
10642609222aSPawel Jakub Dawidek 			case SYS_cap_rights_limit:
1065515dfc23SDag-Erling Smørgrav 				print_number(ip, narg, c);
1066515dfc23SDag-Erling Smørgrav 				putchar(',');
1067c601ad8eSDag-Erling Smørgrav 				arg = *ip;
1068515dfc23SDag-Erling Smørgrav 				ip++;
1069515dfc23SDag-Erling Smørgrav 				narg--;
1070c601ad8eSDag-Erling Smørgrav 				/*
1071c601ad8eSDag-Erling Smørgrav 				 * Hack: the second argument is a
1072c601ad8eSDag-Erling Smørgrav 				 * cap_rights_t, which 64 bits wide, so on
1073c601ad8eSDag-Erling Smørgrav 				 * 32-bit systems, it is split between two
1074c601ad8eSDag-Erling Smørgrav 				 * registers.
1075c601ad8eSDag-Erling Smørgrav 				 *
1076c601ad8eSDag-Erling Smørgrav 				 * Since sizeof() is not evaluated by the
1077c601ad8eSDag-Erling Smørgrav 				 * preprocessor, we can't use an #ifdef,
1078c601ad8eSDag-Erling Smørgrav 				 * but the compiler will probably optimize
1079c601ad8eSDag-Erling Smørgrav 				 * the code out anyway.
1080c601ad8eSDag-Erling Smørgrav 				 */
1081c601ad8eSDag-Erling Smørgrav 				if (sizeof(cap_rights_t) > sizeof(register_t)) {
1082c601ad8eSDag-Erling Smørgrav #if _BYTE_ORDER == _LITTLE_ENDIAN
1083c601ad8eSDag-Erling Smørgrav 					arg = ((intmax_t)*ip << 32) + arg;
1084c601ad8eSDag-Erling Smørgrav #else
1085c601ad8eSDag-Erling Smørgrav 					arg = (arg << 32) + *ip;
1086c601ad8eSDag-Erling Smørgrav #endif
1087c601ad8eSDag-Erling Smørgrav 					ip++;
1088c601ad8eSDag-Erling Smørgrav 					narg--;
1089c601ad8eSDag-Erling Smørgrav 				}
1090c601ad8eSDag-Erling Smørgrav 				capname(arg);
1091515dfc23SDag-Erling Smørgrav 				break;
10922609222aSPawel Jakub Dawidek 			case SYS_cap_fcntls_limit:
10932609222aSPawel Jakub Dawidek 				print_number(ip, narg, c);
10942609222aSPawel Jakub Dawidek 				putchar(',');
10952609222aSPawel Jakub Dawidek 				arg = *ip;
10962609222aSPawel Jakub Dawidek 				ip++;
10972609222aSPawel Jakub Dawidek 				narg--;
10982609222aSPawel Jakub Dawidek 				capfcntlname(arg);
10992609222aSPawel Jakub Dawidek 				break;
1100145e6aa9SJohn Baldwin 			case SYS_posix_fadvise:
1101145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1102145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1103145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1104145e6aa9SJohn Baldwin 				(void)putchar(',');
1105145e6aa9SJohn Baldwin 				fadvisebehavname((int)*ip);
1106145e6aa9SJohn Baldwin 				ip++;
1107145e6aa9SJohn Baldwin 				narg--;
1108145e6aa9SJohn Baldwin 				break;
11099b50d902SRodney W. Grimes 			}
11109b50d902SRodney W. Grimes 		}
111148f6dd8aSAttilio Rao 		while (narg > 0) {
111298a68a58SAlexander Leidinger 			print_number(ip, narg, c);
11139b50d902SRodney W. Grimes 		}
111409307b25SDag-Erling Smørgrav 		putchar(')');
11159b50d902SRodney W. Grimes 	}
111609307b25SDag-Erling Smørgrav 	putchar('\n');
11179b50d902SRodney W. Grimes }
11189b50d902SRodney W. Grimes 
111991fbb9c1SDavid Malone void
11207144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags)
11219b50d902SRodney W. Grimes {
112291fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
112391fbb9c1SDavid Malone 	int error = ktr->ktr_error;
112491fbb9c1SDavid Malone 	int code = ktr->ktr_code;
11259b50d902SRodney W. Grimes 
11267144d36fSDmitry Chagin 	if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
11277144d36fSDmitry Chagin 	    (code >= nsyscalls || code < 0))
112809307b25SDag-Erling Smørgrav 		printf("[%d] ", code);
11299b50d902SRodney W. Grimes 	else
113009307b25SDag-Erling Smørgrav 		printf("%s ", syscallnames[code]);
11319b50d902SRodney W. Grimes 
11329b50d902SRodney W. Grimes 	if (error == 0) {
11339b50d902SRodney W. Grimes 		if (fancy) {
113409307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
11359b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
113609307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
11379b50d902SRodney W. Grimes 		} else {
11389b50d902SRodney W. Grimes 			if (decimal)
113909307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
11409b50d902SRodney W. Grimes 			else
114109307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
11429b50d902SRodney W. Grimes 		}
11439b50d902SRodney W. Grimes 	} else if (error == ERESTART)
114409307b25SDag-Erling Smørgrav 		printf("RESTART");
11459b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
114609307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
11479b50d902SRodney W. Grimes 	else {
114809307b25SDag-Erling Smørgrav 		printf("-1 errno %d", ktr->ktr_error);
11499b50d902SRodney W. Grimes 		if (fancy)
115009307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
11519b50d902SRodney W. Grimes 	}
115209307b25SDag-Erling Smørgrav 	putchar('\n');
11539b50d902SRodney W. Grimes }
11549b50d902SRodney W. Grimes 
115591fbb9c1SDavid Malone void
115691fbb9c1SDavid Malone ktrnamei(char *cp, int len)
11579b50d902SRodney W. Grimes {
115809307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
11599b50d902SRodney W. Grimes }
11609b50d902SRodney W. Grimes 
116191fbb9c1SDavid Malone void
1162ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
11639b50d902SRodney W. Grimes {
1164ec4beb5dSPeter Wemm 	int n, i;
1165ec4beb5dSPeter Wemm 	int width;
1166ec4beb5dSPeter Wemm 
1167ec4beb5dSPeter Wemm 	width = 0;
1168ec4beb5dSPeter Wemm 	do {
1169ec4beb5dSPeter Wemm 		width += 2;
1170ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1171ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1172ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1173ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1174ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1175ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1176ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1177ec4beb5dSPeter Wemm 	width -= 2;
1178ec4beb5dSPeter Wemm 
1179ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1180ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1181ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1182ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1183ec4beb5dSPeter Wemm 			}
1184ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1185ec4beb5dSPeter Wemm 				printf(" ");
1186ec4beb5dSPeter Wemm 			}
1187ec4beb5dSPeter Wemm 			if (i < len)
1188ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1189ec4beb5dSPeter Wemm 			else
1190ec4beb5dSPeter Wemm 				printf("  ");
1191ec4beb5dSPeter Wemm 		}
1192ec4beb5dSPeter Wemm 		printf("  |");
1193ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1194ec4beb5dSPeter Wemm 			if (i >= len)
1195ec4beb5dSPeter Wemm 				break;
1196ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1197ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1198ec4beb5dSPeter Wemm 			else
1199ec4beb5dSPeter Wemm 				printf(".");
1200ec4beb5dSPeter Wemm 		}
1201ec4beb5dSPeter Wemm 		printf("|\n");
1202ec4beb5dSPeter Wemm 	}
1203ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1204ec4beb5dSPeter Wemm 		printf("\n");
1205ec4beb5dSPeter Wemm }
1206ec4beb5dSPeter Wemm 
1207ec4beb5dSPeter Wemm void
1208ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1209ec4beb5dSPeter Wemm {
121091fbb9c1SDavid Malone 	int col = 0;
1211ec4beb5dSPeter Wemm 	char *cp;
121291fbb9c1SDavid Malone 	int width;
12139b50d902SRodney W. Grimes 	char visbuf[5];
12149b50d902SRodney W. Grimes 
121509307b25SDag-Erling Smørgrav 	printf("       \"");
12169b50d902SRodney W. Grimes 	col = 8;
12179b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
121809307b25SDag-Erling Smørgrav 		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
12199b50d902SRodney W. Grimes 		cp = visbuf;
12209b50d902SRodney W. Grimes 		/*
12219b50d902SRodney W. Grimes 		 * Keep track of printables and
12229b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
12239b50d902SRodney W. Grimes 		 */
12249b50d902SRodney W. Grimes 		if (col == 0) {
122509307b25SDag-Erling Smørgrav 			putchar('\t');
12269b50d902SRodney W. Grimes 			col = 8;
12279b50d902SRodney W. Grimes 		}
12289b50d902SRodney W. Grimes 		switch(*cp) {
12299b50d902SRodney W. Grimes 		case '\n':
12309b50d902SRodney W. Grimes 			col = 0;
123109307b25SDag-Erling Smørgrav 			putchar('\n');
12329b50d902SRodney W. Grimes 			continue;
12339b50d902SRodney W. Grimes 		case '\t':
12349b50d902SRodney W. Grimes 			width = 8 - (col&07);
12359b50d902SRodney W. Grimes 			break;
12369b50d902SRodney W. Grimes 		default:
12379b50d902SRodney W. Grimes 			width = strlen(cp);
12389b50d902SRodney W. Grimes 		}
12399b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
124009307b25SDag-Erling Smørgrav 			printf("\\\n\t");
12419b50d902SRodney W. Grimes 			col = 8;
12429b50d902SRodney W. Grimes 		}
12439b50d902SRodney W. Grimes 		col += width;
12449b50d902SRodney W. Grimes 		do {
124509307b25SDag-Erling Smørgrav 			putchar(*cp++);
12469b50d902SRodney W. Grimes 		} while (*cp);
12479b50d902SRodney W. Grimes 	}
12489b50d902SRodney W. Grimes 	if (col == 0)
124909307b25SDag-Erling Smørgrav 		printf("       ");
125009307b25SDag-Erling Smørgrav 	printf("\"\n");
12519b50d902SRodney W. Grimes }
12529b50d902SRodney W. Grimes 
1253ec4beb5dSPeter Wemm void
1254ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1255ec4beb5dSPeter Wemm {
1256ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1257ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1258ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1259ec4beb5dSPeter Wemm 	int i, binary;
1260ec4beb5dSPeter Wemm 
12614b0ae512SPawel Jakub Dawidek 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
12624b0ae512SPawel Jakub Dawidek 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
12634b0ae512SPawel Jakub Dawidek 		datalen == 1 ? "" : "s");
12644b0ae512SPawel Jakub Dawidek 	if (suppressdata)
12654b0ae512SPawel Jakub Dawidek 		return;
1266ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1267ec4beb5dSPeter Wemm 		struct winsize ws;
1268ec4beb5dSPeter Wemm 
1269ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1270ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1271ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1272ec4beb5dSPeter Wemm 		else
1273ec4beb5dSPeter Wemm 			screenwidth = 80;
1274ec4beb5dSPeter Wemm 	}
1275ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1276ec4beb5dSPeter Wemm 		datalen = maxdata;
1277ec4beb5dSPeter Wemm 
1278ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1279ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1280ec4beb5dSPeter Wemm 			continue;
1281ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1282ec4beb5dSPeter Wemm 			continue;
1283ec4beb5dSPeter Wemm 		binary = 1;
1284ec4beb5dSPeter Wemm 	}
1285ec4beb5dSPeter Wemm 	if (binary)
1286ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1287ec4beb5dSPeter Wemm 	else
1288ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1289ec4beb5dSPeter Wemm }
1290ec4beb5dSPeter Wemm 
129191fbb9c1SDavid Malone const char *signames[] = {
12929b50d902SRodney W. Grimes 	"NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",	/*  1 - 6  */
12939b50d902SRodney W. Grimes 	"EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",		/*  7 - 12 */
12949b50d902SRodney W. Grimes 	"PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",		/* 13 - 18 */
12959b50d902SRodney W. Grimes 	"CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",		/* 19 - 24 */
12969b50d902SRodney W. Grimes 	"XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",	/* 25 - 30 */
12979b50d902SRodney W. Grimes 	"USR2", NULL,						/* 31 - 32 */
12989b50d902SRodney W. Grimes };
12999b50d902SRodney W. Grimes 
130091fbb9c1SDavid Malone void
1301dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
13029b50d902SRodney W. Grimes {
1303dde5f9b9SDmitry Chagin 	if (psig->signo > 0 && psig->signo < NSIG)
130409307b25SDag-Erling Smørgrav 		printf("SIG%s ", signames[psig->signo]);
1305fd6afe79SKonstantin Belousov 	else
130609307b25SDag-Erling Smørgrav 		printf("SIG %d ", psig->signo);
13075677eef9SJilles Tjoelker 	if (psig->action == SIG_DFL) {
13085677eef9SJilles Tjoelker 		printf("SIG_DFL code=");
13095677eef9SJilles Tjoelker 		sigcodename(psig->signo, psig->code);
13105677eef9SJilles Tjoelker 		putchar('\n');
13115677eef9SJilles Tjoelker 	} else {
13125677eef9SJilles Tjoelker 		printf("caught handler=0x%lx mask=0x%x code=",
13135677eef9SJilles Tjoelker 		    (u_long)psig->action, psig->mask.__bits[0]);
13145677eef9SJilles Tjoelker 		sigcodename(psig->signo, psig->code);
13155677eef9SJilles Tjoelker 		putchar('\n');
131691fbb9c1SDavid Malone 	}
13179b50d902SRodney W. Grimes }
13189b50d902SRodney W. Grimes 
131991fbb9c1SDavid Malone void
132088bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
13219b50d902SRodney W. Grimes {
132209307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
13239b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
13249b50d902SRodney W. Grimes }
13259b50d902SRodney W. Grimes 
132688bf5036SJohn Baldwin void
132788bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
132888bf5036SJohn Baldwin {
132988bf5036SJohn Baldwin 	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
133088bf5036SJohn Baldwin 	    cs->user ? "user" : "kernel", cs->wmesg);
133188bf5036SJohn Baldwin }
133288bf5036SJohn Baldwin 
13331f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_START		1
13341f4b63f8SJohn Baldwin #define	UTRACE_DLOPEN_STOP		2
13351f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_START		3
13361f4b63f8SJohn Baldwin #define	UTRACE_DLCLOSE_STOP		4
13371f4b63f8SJohn Baldwin #define	UTRACE_LOAD_OBJECT		5
13381f4b63f8SJohn Baldwin #define	UTRACE_UNLOAD_OBJECT		6
13391f4b63f8SJohn Baldwin #define	UTRACE_ADD_RUNDEP		7
13401f4b63f8SJohn Baldwin #define	UTRACE_PRELOAD_FINISHED		8
13411f4b63f8SJohn Baldwin #define	UTRACE_INIT_CALL		9
13421f4b63f8SJohn Baldwin #define	UTRACE_FINI_CALL		10
13431f4b63f8SJohn Baldwin 
13441f4b63f8SJohn Baldwin struct utrace_rtld {
13451f4b63f8SJohn Baldwin 	char sig[4];				/* 'RTLD' */
13461f4b63f8SJohn Baldwin 	int event;
13471f4b63f8SJohn Baldwin 	void *handle;
13481f4b63f8SJohn Baldwin 	void *mapbase;
13491f4b63f8SJohn Baldwin 	size_t mapsize;
13501f4b63f8SJohn Baldwin 	int refcnt;
13511f4b63f8SJohn Baldwin 	char name[MAXPATHLEN];
13521f4b63f8SJohn Baldwin };
13531f4b63f8SJohn Baldwin 
13541f4b63f8SJohn Baldwin void
13551f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p)
13561f4b63f8SJohn Baldwin {
13571f4b63f8SJohn Baldwin 	struct utrace_rtld *ut = (struct utrace_rtld *)p;
13581f4b63f8SJohn Baldwin 	void *parent;
13591f4b63f8SJohn Baldwin 	int mode;
13601f4b63f8SJohn Baldwin 
13611f4b63f8SJohn Baldwin 	switch (ut->event) {
13621f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_START:
13631f4b63f8SJohn Baldwin 		mode = ut->refcnt;
13641f4b63f8SJohn Baldwin 		printf("dlopen(%s, ", ut->name);
13651f4b63f8SJohn Baldwin 		switch (mode & RTLD_MODEMASK) {
13661f4b63f8SJohn Baldwin 		case RTLD_NOW:
13671f4b63f8SJohn Baldwin 			printf("RTLD_NOW");
13681f4b63f8SJohn Baldwin 			break;
13691f4b63f8SJohn Baldwin 		case RTLD_LAZY:
13701f4b63f8SJohn Baldwin 			printf("RTLD_LAZY");
13711f4b63f8SJohn Baldwin 			break;
13721f4b63f8SJohn Baldwin 		default:
13731f4b63f8SJohn Baldwin 			printf("%#x", mode & RTLD_MODEMASK);
13741f4b63f8SJohn Baldwin 		}
13751f4b63f8SJohn Baldwin 		if (mode & RTLD_GLOBAL)
13761f4b63f8SJohn Baldwin 			printf(" | RTLD_GLOBAL");
13771f4b63f8SJohn Baldwin 		if (mode & RTLD_TRACE)
13781f4b63f8SJohn Baldwin 			printf(" | RTLD_TRACE");
13791f4b63f8SJohn Baldwin 		if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
13801f4b63f8SJohn Baldwin 			printf(" | %#x", mode &
13811f4b63f8SJohn Baldwin 			    ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
13821f4b63f8SJohn Baldwin 		printf(")\n");
13831f4b63f8SJohn Baldwin 		break;
13841f4b63f8SJohn Baldwin 	case UTRACE_DLOPEN_STOP:
13851f4b63f8SJohn Baldwin 		printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
13861f4b63f8SJohn Baldwin 		    ut->refcnt);
13871f4b63f8SJohn Baldwin 		break;
13881f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_START:
13891f4b63f8SJohn Baldwin 		printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
13901f4b63f8SJohn Baldwin 		    ut->refcnt);
13911f4b63f8SJohn Baldwin 		break;
13921f4b63f8SJohn Baldwin 	case UTRACE_DLCLOSE_STOP:
13931f4b63f8SJohn Baldwin 		printf("dlclose(%p) finished\n", ut->handle);
13941f4b63f8SJohn Baldwin 		break;
13951f4b63f8SJohn Baldwin 	case UTRACE_LOAD_OBJECT:
13961f4b63f8SJohn Baldwin 		printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
13971f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
13981f4b63f8SJohn Baldwin 		    ut->name);
13991f4b63f8SJohn Baldwin 		break;
14001f4b63f8SJohn Baldwin 	case UTRACE_UNLOAD_OBJECT:
14011f4b63f8SJohn Baldwin 		printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
14021f4b63f8SJohn Baldwin 		    ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
14031f4b63f8SJohn Baldwin 		    ut->name);
14041f4b63f8SJohn Baldwin 		break;
14051f4b63f8SJohn Baldwin 	case UTRACE_ADD_RUNDEP:
14061f4b63f8SJohn Baldwin 		parent = ut->mapbase;
14071f4b63f8SJohn Baldwin 		printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
14081f4b63f8SJohn Baldwin 		    ut->handle, ut->name, ut->refcnt);
14091f4b63f8SJohn Baldwin 		break;
14101f4b63f8SJohn Baldwin 	case UTRACE_PRELOAD_FINISHED:
14111f4b63f8SJohn Baldwin 		printf("RTLD: LD_PRELOAD finished\n");
14121f4b63f8SJohn Baldwin 		break;
14131f4b63f8SJohn Baldwin 	case UTRACE_INIT_CALL:
14141f4b63f8SJohn Baldwin 		printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
14151f4b63f8SJohn Baldwin 		    ut->name);
14161f4b63f8SJohn Baldwin 		break;
14171f4b63f8SJohn Baldwin 	case UTRACE_FINI_CALL:
14181f4b63f8SJohn Baldwin 		printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
14191f4b63f8SJohn Baldwin 		    ut->name);
14201f4b63f8SJohn Baldwin 		break;
14211f4b63f8SJohn Baldwin 	default:
14221f4b63f8SJohn Baldwin 		p += 4;
14231f4b63f8SJohn Baldwin 		len -= 4;
14241f4b63f8SJohn Baldwin 		printf("RTLD: %d ", len);
14251f4b63f8SJohn Baldwin 		while (len--)
14261f4b63f8SJohn Baldwin 			if (decimal)
14271f4b63f8SJohn Baldwin 				printf(" %d", *p++);
14281f4b63f8SJohn Baldwin 			else
14291f4b63f8SJohn Baldwin 				printf(" %02x", *p++);
14301f4b63f8SJohn Baldwin 		printf("\n");
14311f4b63f8SJohn Baldwin 	}
14321f4b63f8SJohn Baldwin }
14331f4b63f8SJohn Baldwin 
1434670b9e9fSJohn Baldwin struct utrace_malloc {
1435670b9e9fSJohn Baldwin 	void *p;
1436670b9e9fSJohn Baldwin 	size_t s;
1437670b9e9fSJohn Baldwin 	void *r;
1438670b9e9fSJohn Baldwin };
1439670b9e9fSJohn Baldwin 
1440670b9e9fSJohn Baldwin void
144181a31394SDag-Erling Smørgrav ktruser_malloc(unsigned char *p)
1442670b9e9fSJohn Baldwin {
1443670b9e9fSJohn Baldwin 	struct utrace_malloc *ut = (struct utrace_malloc *)p;
1444670b9e9fSJohn Baldwin 
144522ce05c9SColin Percival 	if (ut->p == (void *)(intptr_t)(-1))
1446670b9e9fSJohn Baldwin 		printf("malloc_init()\n");
144722ce05c9SColin Percival 	else if (ut->s == 0)
1448670b9e9fSJohn Baldwin 		printf("free(%p)\n", ut->p);
144922ce05c9SColin Percival 	else if (ut->p == NULL)
145022ce05c9SColin Percival 		printf("%p = malloc(%zu)\n", ut->r, ut->s);
1451670b9e9fSJohn Baldwin 	else
1452670b9e9fSJohn Baldwin 		printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1453670b9e9fSJohn Baldwin }
1454670b9e9fSJohn Baldwin 
145591fbb9c1SDavid Malone void
145691fbb9c1SDavid Malone ktruser(int len, unsigned char *p)
145782e2dd32SPoul-Henning Kamp {
1458670b9e9fSJohn Baldwin 
14591f4b63f8SJohn Baldwin 	if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
14601f4b63f8SJohn Baldwin 		ktruser_rtld(len, p);
14611f4b63f8SJohn Baldwin 		return;
14621f4b63f8SJohn Baldwin 	}
14631f4b63f8SJohn Baldwin 
1464670b9e9fSJohn Baldwin 	if (len == sizeof(struct utrace_malloc)) {
146581a31394SDag-Erling Smørgrav 		ktruser_malloc(p);
1466670b9e9fSJohn Baldwin 		return;
1467670b9e9fSJohn Baldwin 	}
1468670b9e9fSJohn Baldwin 
146909307b25SDag-Erling Smørgrav 	printf("%d ", len);
14703f8ba9aeSPoul-Henning Kamp 	while (len--)
1471743f9174SPoul-Henning Kamp 		if (decimal)
147209307b25SDag-Erling Smørgrav 			printf(" %d", *p++);
1473743f9174SPoul-Henning Kamp 		else
147409307b25SDag-Erling Smørgrav 			printf(" %02x", *p++);
147509307b25SDag-Erling Smørgrav 	printf("\n");
147682e2dd32SPoul-Henning Kamp }
147782e2dd32SPoul-Henning Kamp 
147891fbb9c1SDavid Malone void
147960e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
148060e15db9SDag-Erling Smørgrav {
148160e15db9SDag-Erling Smørgrav /*
148260e15db9SDag-Erling Smørgrav  TODO: Support additional address families
148360e15db9SDag-Erling Smørgrav 	#include <netnatm/natm.h>
148460e15db9SDag-Erling Smørgrav 	struct sockaddr_natm	*natm;
1485237abf0cSDavide Italiano 	#include <netsmb/netbios.h>
1486237abf0cSDavide Italiano 	struct sockaddr_nb	*nb;
148760e15db9SDag-Erling Smørgrav */
148860e15db9SDag-Erling Smørgrav 	char addr[64];
148960e15db9SDag-Erling Smørgrav 
149060e15db9SDag-Erling Smørgrav 	/*
149160e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
149260e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
149360e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
149460e15db9SDag-Erling Smørgrav 	 */
149560e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
149660e15db9SDag-Erling Smørgrav 	sockfamilyname(sa->sa_family);
149760e15db9SDag-Erling Smørgrav 	printf(", ");
149860e15db9SDag-Erling Smørgrav 
149960e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
150081a31394SDag-Erling Smørgrav 	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
150160e15db9SDag-Erling Smørgrav 		printf("invalid");				\
150260e15db9SDag-Erling Smørgrav 		break;						\
150360e15db9SDag-Erling Smørgrav 	}
150460e15db9SDag-Erling Smørgrav 
150560e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
150660e15db9SDag-Erling Smørgrav 	case AF_INET: {
150781a31394SDag-Erling Smørgrav 		struct sockaddr_in sa_in;
150860e15db9SDag-Erling Smørgrav 
150981a31394SDag-Erling Smørgrav 		memset(&sa_in, 0, sizeof(sa_in));
1510449df4ecSAndrey Zonov 		memcpy(&sa_in, sa, sa->sa_len);
151160e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
151281a31394SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
151381a31394SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in.sin_port));
151460e15db9SDag-Erling Smørgrav 		break;
151560e15db9SDag-Erling Smørgrav 	}
151660e15db9SDag-Erling Smørgrav #ifdef NETATALK
151760e15db9SDag-Erling Smørgrav 	case AF_APPLETALK: {
151881a31394SDag-Erling Smørgrav 		struct sockaddr_at	sa_at;
151960e15db9SDag-Erling Smørgrav 		struct netrange		*nr;
152060e15db9SDag-Erling Smørgrav 
152181a31394SDag-Erling Smørgrav 		memset(&sa_at, 0, sizeof(sa_at));
1522449df4ecSAndrey Zonov 		memcpy(&sa_at, sa, sa->sa_len);
152360e15db9SDag-Erling Smørgrav 		check_sockaddr_len(at);
152481a31394SDag-Erling Smørgrav 		nr = &sa_at.sat_range.r_netrange;
152581a31394SDag-Erling Smørgrav 		printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net),
152681a31394SDag-Erling Smørgrav 			sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet),
152760e15db9SDag-Erling Smørgrav 			ntohs(nr->nr_lastnet), nr->nr_phase);
152860e15db9SDag-Erling Smørgrav 		break;
152960e15db9SDag-Erling Smørgrav 	}
153060e15db9SDag-Erling Smørgrav #endif
153160e15db9SDag-Erling Smørgrav 	case AF_INET6: {
153281a31394SDag-Erling Smørgrav 		struct sockaddr_in6 sa_in6;
153360e15db9SDag-Erling Smørgrav 
153481a31394SDag-Erling Smørgrav 		memset(&sa_in6, 0, sizeof(sa_in6));
1535449df4ecSAndrey Zonov 		memcpy(&sa_in6, sa, sa->sa_len);
153660e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
1537b9ef8051SAndrey V. Elsukov 		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1538b9ef8051SAndrey V. Elsukov 		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
153981a31394SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
154060e15db9SDag-Erling Smørgrav 		break;
154160e15db9SDag-Erling Smørgrav 	}
154260e15db9SDag-Erling Smørgrav #ifdef IPX
154360e15db9SDag-Erling Smørgrav 	case AF_IPX: {
154481a31394SDag-Erling Smørgrav 		struct sockaddr_ipx sa_ipx;
154560e15db9SDag-Erling Smørgrav 
154681a31394SDag-Erling Smørgrav 		memset(&sa_ipx, 0, sizeof(sa_ipx));
1547449df4ecSAndrey Zonov 		memcpy(&sa_ipx, sa, sa->sa_len);
154860e15db9SDag-Erling Smørgrav 		check_sockaddr_len(ipx);
154960e15db9SDag-Erling Smørgrav 		/* XXX wish we had ipx_ntop */
155081a31394SDag-Erling Smørgrav 		printf("%s", ipx_ntoa(sa_ipx.sipx_addr));
155181a31394SDag-Erling Smørgrav 		free(sa_ipx);
155260e15db9SDag-Erling Smørgrav 		break;
155360e15db9SDag-Erling Smørgrav 	}
155460e15db9SDag-Erling Smørgrav #endif
155560e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
155681a31394SDag-Erling Smørgrav 		struct sockaddr_un sa_un;
155760e15db9SDag-Erling Smørgrav 
155881a31394SDag-Erling Smørgrav 		memset(&sa_un, 0, sizeof(sa_un));
1559449df4ecSAndrey Zonov 		memcpy(&sa_un, sa, sa->sa_len);
156081a31394SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
156160e15db9SDag-Erling Smørgrav 		break;
156260e15db9SDag-Erling Smørgrav 	}
156360e15db9SDag-Erling Smørgrav 	default:
156460e15db9SDag-Erling Smørgrav 		printf("unknown address family");
156560e15db9SDag-Erling Smørgrav 	}
156660e15db9SDag-Erling Smørgrav 	printf(" }\n");
156760e15db9SDag-Erling Smørgrav }
156860e15db9SDag-Erling Smørgrav 
156960e15db9SDag-Erling Smørgrav void
157060e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
157160e15db9SDag-Erling Smørgrav {
157260e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
157360e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
157460e15db9SDag-Erling Smørgrav 	struct group  *grp;
157560e15db9SDag-Erling Smørgrav 	struct tm *tm;
157660e15db9SDag-Erling Smørgrav 
157760e15db9SDag-Erling Smørgrav 	/*
157860e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
157960e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
158060e15db9SDag-Erling Smørgrav 	 */
158160e15db9SDag-Erling Smørgrav 	printf("struct stat {");
158260e15db9SDag-Erling Smørgrav 	strmode(statp->st_mode, mode);
158360e15db9SDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ",
158460e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode,
158560e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_nlink);
158660e15db9SDag-Erling Smørgrav 	if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
158760e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
158860e15db9SDag-Erling Smørgrav 	else
158960e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
159060e15db9SDag-Erling Smørgrav 	if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
159160e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
159260e15db9SDag-Erling Smørgrav 	else
159360e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
159460e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
159560e15db9SDag-Erling Smørgrav 	printf("atime=");
159660e15db9SDag-Erling Smørgrav 	if (resolv == 0)
159799742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
159860e15db9SDag-Erling Smørgrav 	else {
159999742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
160009307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
160160e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
160260e15db9SDag-Erling Smørgrav 	}
160399742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
160499742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
160560e15db9SDag-Erling Smørgrav 	else
160660e15db9SDag-Erling Smørgrav 		printf(", ");
160760e15db9SDag-Erling Smørgrav 	printf("stime=");
160860e15db9SDag-Erling Smørgrav 	if (resolv == 0)
160999742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
161060e15db9SDag-Erling Smørgrav 	else {
161199742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
161209307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
161360e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
161460e15db9SDag-Erling Smørgrav 	}
161599742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
161699742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
161760e15db9SDag-Erling Smørgrav 	else
161860e15db9SDag-Erling Smørgrav 		printf(", ");
161960e15db9SDag-Erling Smørgrav 	printf("ctime=");
162060e15db9SDag-Erling Smørgrav 	if (resolv == 0)
162199742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
162260e15db9SDag-Erling Smørgrav 	else {
162399742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
162409307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
162560e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
162660e15db9SDag-Erling Smørgrav 	}
162799742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
162899742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
162960e15db9SDag-Erling Smørgrav 	else
163060e15db9SDag-Erling Smørgrav 		printf(", ");
163160e15db9SDag-Erling Smørgrav 	printf("birthtime=");
163260e15db9SDag-Erling Smørgrav 	if (resolv == 0)
163399742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
163460e15db9SDag-Erling Smørgrav 	else {
163599742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
163609307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
163760e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
163860e15db9SDag-Erling Smørgrav 	}
163999742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
164099742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
164160e15db9SDag-Erling Smørgrav 	else
164260e15db9SDag-Erling Smørgrav 		printf(", ");
164360e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
164460e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
164560e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
164660e15db9SDag-Erling Smørgrav 	printf(" }\n");
164760e15db9SDag-Erling Smørgrav }
164860e15db9SDag-Erling Smørgrav 
164960e15db9SDag-Erling Smørgrav void
165060e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
165160e15db9SDag-Erling Smørgrav {
165260e15db9SDag-Erling Smørgrav 	char *name, *data;
165360e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
165460e15db9SDag-Erling Smørgrav 	int i;
165530c1278fSWarner Losh 	struct stat sb;
165630c1278fSWarner Losh 	struct sockaddr_storage ss;
165760e15db9SDag-Erling Smørgrav 
165860e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
165960e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
166060e15db9SDag-Erling Smørgrav 	     ++namelen)
166160e15db9SDag-Erling Smørgrav 		/* nothing */;
166260e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
166360e15db9SDag-Erling Smørgrav 		goto invalid;
166460e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
166560e15db9SDag-Erling Smørgrav 		goto invalid;
166660e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
166760e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
166860e15db9SDag-Erling Smørgrav 	if (datalen == 0)
166960e15db9SDag-Erling Smørgrav 		goto invalid;
167060e15db9SDag-Erling Smørgrav 	/* sanity check */
167181a31394SDag-Erling Smørgrav 	for (i = 0; i < (int)namelen; ++i)
167281a31394SDag-Erling Smørgrav 		if (!isalpha(name[i]))
167360e15db9SDag-Erling Smørgrav 			goto invalid;
167460e15db9SDag-Erling Smørgrav 	if (strcmp(name, "stat") == 0) {
167560e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
167660e15db9SDag-Erling Smørgrav 			goto invalid;
167730c1278fSWarner Losh 		memcpy(&sb, data, datalen);
167830c1278fSWarner Losh 		ktrstat(&sb);
167960e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
168030c1278fSWarner Losh 		if (datalen > sizeof(ss))
168160e15db9SDag-Erling Smørgrav 			goto invalid;
168230c1278fSWarner Losh 		memcpy(&ss, data, datalen);
16834b03484fSAndrey Zonov 		if (datalen != ss.ss_len)
168430c1278fSWarner Losh 			goto invalid;
168530c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
168660e15db9SDag-Erling Smørgrav 	} else {
168760e15db9SDag-Erling Smørgrav 		printf("unknown structure\n");
168860e15db9SDag-Erling Smørgrav 	}
168960e15db9SDag-Erling Smørgrav 	return;
169060e15db9SDag-Erling Smørgrav invalid:
169160e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
169260e15db9SDag-Erling Smørgrav }
169360e15db9SDag-Erling Smørgrav 
1694c601ad8eSDag-Erling Smørgrav void
1695c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
1696c601ad8eSDag-Erling Smørgrav {
1697e141be6fSDag-Erling Smørgrav 	switch (ktr->cap_type) {
1698e141be6fSDag-Erling Smørgrav 	case CAPFAIL_NOTCAPABLE:
1699e141be6fSDag-Erling Smørgrav 		/* operation on fd with insufficient capabilities */
1700e141be6fSDag-Erling Smørgrav 		printf("operation requires ");
1701c601ad8eSDag-Erling Smørgrav 		capname((intmax_t)ktr->cap_needed);
1702e141be6fSDag-Erling Smørgrav 		printf(", process holds ");
1703c601ad8eSDag-Erling Smørgrav 		capname((intmax_t)ktr->cap_held);
1704e141be6fSDag-Erling Smørgrav 		break;
1705e141be6fSDag-Erling Smørgrav 	case CAPFAIL_INCREASE:
1706e141be6fSDag-Erling Smørgrav 		/* requested more capabilities than fd already has */
1707e141be6fSDag-Erling Smørgrav 		printf("attempt to increase capabilities from ");
1708e141be6fSDag-Erling Smørgrav 		capname((intmax_t)ktr->cap_held);
170960e45df8SDag-Erling Smørgrav 		printf(" to ");
171060e45df8SDag-Erling Smørgrav 		capname((intmax_t)ktr->cap_needed);
1711e141be6fSDag-Erling Smørgrav 		break;
1712e141be6fSDag-Erling Smørgrav 	case CAPFAIL_SYSCALL:
1713e141be6fSDag-Erling Smørgrav 		/* called restricted syscall */
1714e141be6fSDag-Erling Smørgrav 		printf("disallowed system call");
1715e141be6fSDag-Erling Smørgrav 		break;
1716e141be6fSDag-Erling Smørgrav 	case CAPFAIL_LOOKUP:
1717e141be6fSDag-Erling Smørgrav 		/* used ".." in strict-relative mode */
1718e141be6fSDag-Erling Smørgrav 		printf("restricted VFS lookup");
1719e141be6fSDag-Erling Smørgrav 		break;
1720e141be6fSDag-Erling Smørgrav 	default:
1721e141be6fSDag-Erling Smørgrav 		printf("unknown capability failure: ");
1722e141be6fSDag-Erling Smørgrav 		capname((intmax_t)ktr->cap_needed);
1723e141be6fSDag-Erling Smørgrav 		printf(" ");
1724e141be6fSDag-Erling Smørgrav 		capname((intmax_t)ktr->cap_held);
1725e141be6fSDag-Erling Smørgrav 		break;
1726e141be6fSDag-Erling Smørgrav 	}
172735818d2eSJohn Baldwin 	printf("\n");
172835818d2eSJohn Baldwin }
172935818d2eSJohn Baldwin 
173035818d2eSJohn Baldwin void
173135818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
173235818d2eSJohn Baldwin {
173335818d2eSJohn Baldwin 
173435818d2eSJohn Baldwin 	printf("0x%jx ", ktr->vaddr);
173535818d2eSJohn Baldwin 	vmprotname(ktr->type);
173635818d2eSJohn Baldwin 	printf("\n");
173735818d2eSJohn Baldwin }
173835818d2eSJohn Baldwin 
173935818d2eSJohn Baldwin void
174035818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
174135818d2eSJohn Baldwin {
174235818d2eSJohn Baldwin 
174335818d2eSJohn Baldwin 	vmresultname(ktr->result);
174435818d2eSJohn Baldwin 	printf("\n");
1745c601ad8eSDag-Erling Smørgrav }
1746c601ad8eSDag-Erling Smørgrav 
1747dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__)
1748dde5f9b9SDmitry Chagin void
1749dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr)
1750dde5f9b9SDmitry Chagin {
1751dde5f9b9SDmitry Chagin 	int narg = ktr->ktr_narg;
1752dde5f9b9SDmitry Chagin 	register_t *ip;
1753dde5f9b9SDmitry Chagin 
1754dde5f9b9SDmitry Chagin 	if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
1755dde5f9b9SDmitry Chagin 		printf("[%d]", ktr->ktr_code);
1756dde5f9b9SDmitry Chagin 	else
1757dde5f9b9SDmitry Chagin 		printf("%s", linux_syscallnames[ktr->ktr_code]);
1758dde5f9b9SDmitry Chagin 	ip = &ktr->ktr_args[0];
1759dde5f9b9SDmitry Chagin 	if (narg) {
1760dde5f9b9SDmitry Chagin 		char c = '(';
1761dde5f9b9SDmitry Chagin 		while (narg > 0)
1762dde5f9b9SDmitry Chagin 			print_number(ip, narg, c);
1763dde5f9b9SDmitry Chagin 		putchar(')');
1764dde5f9b9SDmitry Chagin 	}
1765dde5f9b9SDmitry Chagin 	putchar('\n');
1766dde5f9b9SDmitry Chagin }
1767dde5f9b9SDmitry Chagin 
1768dde5f9b9SDmitry Chagin void
1769dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr)
1770dde5f9b9SDmitry Chagin {
1771dde5f9b9SDmitry Chagin 	register_t ret = ktr->ktr_retval;
1772dde5f9b9SDmitry Chagin 	int error = ktr->ktr_error;
1773dde5f9b9SDmitry Chagin 	int code = ktr->ktr_code;
1774dde5f9b9SDmitry Chagin 
1775dde5f9b9SDmitry Chagin 	if (code >= nlinux_syscalls || code < 0)
1776dde5f9b9SDmitry Chagin 		printf("[%d] ", code);
1777dde5f9b9SDmitry Chagin 	else
1778dde5f9b9SDmitry Chagin 		printf("%s ", linux_syscallnames[code]);
1779dde5f9b9SDmitry Chagin 
1780dde5f9b9SDmitry Chagin 	if (error == 0) {
1781dde5f9b9SDmitry Chagin 		if (fancy) {
1782dde5f9b9SDmitry Chagin 			printf("%ld", (long)ret);
1783dde5f9b9SDmitry Chagin 			if (ret < 0 || ret > 9)
178409307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
1785dde5f9b9SDmitry Chagin 		} else {
1786dde5f9b9SDmitry Chagin 			if (decimal)
1787dde5f9b9SDmitry Chagin 				printf("%ld", (long)ret);
1788dde5f9b9SDmitry Chagin 			else
178909307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
1790dde5f9b9SDmitry Chagin 		}
1791dde5f9b9SDmitry Chagin 	} else if (error == ERESTART)
1792dde5f9b9SDmitry Chagin 		printf("RESTART");
1793dde5f9b9SDmitry Chagin 	else if (error == EJUSTRETURN)
1794dde5f9b9SDmitry Chagin 		printf("JUSTRETURN");
1795dde5f9b9SDmitry Chagin 	else {
1796dde5f9b9SDmitry Chagin 		if (ktr->ktr_error <= ELAST + 1)
1797dde5f9b9SDmitry Chagin 			error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1798dde5f9b9SDmitry Chagin 		else
1799dde5f9b9SDmitry Chagin 			error = 999;
1800dde5f9b9SDmitry Chagin 		printf("-1 errno %d", error);
1801dde5f9b9SDmitry Chagin 		if (fancy)
1802dde5f9b9SDmitry Chagin 			printf(" %s", strerror(ktr->ktr_error));
1803dde5f9b9SDmitry Chagin 	}
1804dde5f9b9SDmitry Chagin 	putchar('\n');
1805dde5f9b9SDmitry Chagin }
1806dde5f9b9SDmitry Chagin #endif
1807dde5f9b9SDmitry Chagin 
180860e15db9SDag-Erling Smørgrav void
180991fbb9c1SDavid Malone usage(void)
18109b50d902SRodney W. Grimes {
18117144d36fSDmitry Chagin 	fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] "
1812da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
18139b50d902SRodney W. Grimes 	exit(1);
18149b50d902SRodney W. Grimes }
1815