xref: /freebsd/usr.bin/kdump/kdump.c (revision 7672a014)
19b50d902SRodney W. Grimes /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
49b50d902SRodney W. Grimes  * Copyright (c) 1988, 1993
59b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
69b50d902SRodney W. Grimes  *
79b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
89b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
99b50d902SRodney W. Grimes  * are met:
109b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
129b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
139b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
149b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
15fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
169b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
179b50d902SRodney W. Grimes  *    without specific prior written permission.
189b50d902SRodney W. Grimes  *
199b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
209b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
219b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
229b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
239b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
249b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
259b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
269b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
279b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
289b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
299b50d902SRodney W. Grimes  * SUCH DAMAGE.
309b50d902SRodney W. Grimes  */
319b50d902SRodney W. Grimes 
329b50d902SRodney W. Grimes #ifndef lint
3315fc002bSPhilippe Charnier static const char copyright[] =
349b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\
359b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
369b50d902SRodney W. Grimes #endif /* not lint */
379b50d902SRodney W. Grimes 
389b50d902SRodney W. Grimes #ifndef lint
3915fc002bSPhilippe Charnier #if 0
409b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
4115fc002bSPhilippe Charnier #endif
429b50d902SRodney W. Grimes #endif /* not lint */
43e026a48cSDavid E. O'Brien #include <sys/cdefs.h>
44e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$");
459b50d902SRodney W. Grimes 
46406d2926SJohn Baldwin #define _WANT_KERNEL_ERRNO
47ffb66079SJohn Baldwin #ifdef __LP64__
48ffb66079SJohn Baldwin #define	_WANT_KEVENT32
49ffb66079SJohn Baldwin #endif
50ffb66079SJohn Baldwin #define	_WANT_FREEBSD11_KEVENT
519b50d902SRodney W. Grimes #include <sys/param.h>
52b881b8beSRobert Watson #include <sys/capsicum.h>
539b50d902SRodney W. Grimes #include <sys/errno.h>
549b50d902SRodney W. Grimes #include <sys/time.h>
559b50d902SRodney W. Grimes #include <sys/uio.h>
56ffb66079SJohn Baldwin #include <sys/event.h>
579b50d902SRodney W. Grimes #include <sys/ktrace.h>
589b50d902SRodney W. Grimes #include <sys/ioctl.h>
598bc31d83SCraig Rodrigues #include <sys/socket.h>
6060e15db9SDag-Erling Smørgrav #include <sys/stat.h>
617144d36fSDmitry Chagin #include <sys/sysent.h>
62fdb5bf37SJohn Baldwin #include <sys/umtx.h>
6360e15db9SDag-Erling Smørgrav #include <sys/un.h>
647144d36fSDmitry Chagin #include <sys/queue.h>
6534763d1cSJohn Baldwin #include <sys/wait.h>
662560d181SMariusz Zaborski #ifdef WITH_CASPER
67c36e54bbSMariusz Zaborski #include <sys/nv.h>
68c36e54bbSMariusz Zaborski #endif
691a604cfaSXin LI #include <arpa/inet.h>
7060e15db9SDag-Erling Smørgrav #include <netinet/in.h>
711a604cfaSXin LI #include <ctype.h>
72a4e3fc54SMariusz Zaborski #include <capsicum_helpers.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>
8071ed318eSJohn Baldwin #include <stddef.h>
819b50d902SRodney W. Grimes #include <stdio.h>
829b50d902SRodney W. Grimes #include <stdlib.h>
839b50d902SRodney W. Grimes #include <string.h>
84d6fb4894SJohn Baldwin #include <sysdecode.h>
8560e15db9SDag-Erling Smørgrav #include <time.h>
8615fc002bSPhilippe Charnier #include <unistd.h>
8715fc002bSPhilippe Charnier #include <vis.h>
889b50d902SRodney W. Grimes #include "ktrace.h"
899b50d902SRodney W. Grimes 
902560d181SMariusz Zaborski #ifdef WITH_CASPER
91c501d73cSMariusz Zaborski #include <libcasper.h>
92c501d73cSMariusz Zaborski 
93c501d73cSMariusz Zaborski #include <casper/cap_grp.h>
94c501d73cSMariusz Zaborski #include <casper/cap_pwd.h>
95c501d73cSMariusz Zaborski #endif
96c501d73cSMariusz Zaborski 
977144d36fSDmitry Chagin u_int abidump(struct ktr_header *);
987144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
9991fbb9c1SDavid Malone int fread_tail(void *, int, int);
10091fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
1017144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
1027144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
10391fbb9c1SDavid Malone void ktrnamei(char *, int);
104ec4beb5dSPeter Wemm void hexdump(char *, int, int);
105ec4beb5dSPeter Wemm void visdump(char *, int, int);
10691fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
107dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10891fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10988bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
110bb1a2d4aSJohn Baldwin void ktruser(int, void *);
1117008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *);
112de56aee0SKonstantin Belousov void ktritimerval(struct itimerval *it);
11360e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
11460e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
11560e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
116c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11735818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11835818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
119ffb66079SJohn Baldwin void ktrkevent(struct kevent *);
120ffb66079SJohn Baldwin void ktrstructarray(struct ktr_struct_array *, size_t);
12191fbb9c1SDavid Malone void usage(void);
12291fbb9c1SDavid Malone 
123c1269d20SMaxim Sobolev #define	TIMESTAMP_NONE		0x0
124c1269d20SMaxim Sobolev #define	TIMESTAMP_ABSOLUTE	0x1
125c1269d20SMaxim Sobolev #define	TIMESTAMP_ELAPSED	0x2
126c1269d20SMaxim Sobolev #define	TIMESTAMP_RELATIVE	0x4
127c1269d20SMaxim Sobolev 
128bb1a2d4aSJohn Baldwin static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
129b9034ce2SBryan Drewery     resolv = 0, abiflag = 0, syscallno = 0;
130bb1a2d4aSJohn Baldwin static const char *tracefile = DEF_TRACEFILE;
131bb1a2d4aSJohn Baldwin static struct ktr_header ktr_header;
1329b50d902SRodney W. Grimes 
13360e15db9SDag-Erling Smørgrav #define TIME_FORMAT	"%b %e %T %Y"
1349b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
1359b50d902SRodney W. Grimes 
13671ed318eSJohn Baldwin #define	print_number64(first,i,n,c) do {				\
13771ed318eSJohn Baldwin 	uint64_t __v;							\
13871ed318eSJohn Baldwin 									\
13971ed318eSJohn Baldwin 	if (quad_align && (((ptrdiff_t)((i) - (first))) & 1) == 1) {	\
14071ed318eSJohn Baldwin 		(i)++;							\
14171ed318eSJohn Baldwin 		(n)--;							\
14271ed318eSJohn Baldwin 	}								\
14371ed318eSJohn Baldwin 	if (quad_slots == 2)						\
14471ed318eSJohn Baldwin 		__v = (uint64_t)(uint32_t)(i)[0] |			\
14571ed318eSJohn Baldwin 		    ((uint64_t)(uint32_t)(i)[1]) << 32;			\
14671ed318eSJohn Baldwin 	else								\
14771ed318eSJohn Baldwin 		__v = (uint64_t)*(i);					\
14871ed318eSJohn Baldwin 	if (decimal)							\
14971ed318eSJohn Baldwin 		printf("%c%jd", (c), (intmax_t)__v);			\
15071ed318eSJohn Baldwin 	else								\
15171ed318eSJohn Baldwin 		printf("%c%#jx", (c), (uintmax_t)__v);			\
15271ed318eSJohn Baldwin 	(i) += quad_slots;						\
15371ed318eSJohn Baldwin 	(n) -= quad_slots;						\
15471ed318eSJohn Baldwin 	(c) = ',';							\
15571ed318eSJohn Baldwin } while (0)
15671ed318eSJohn Baldwin 
15795bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do {					\
158dde5f9b9SDmitry Chagin 	if (decimal)							\
159e4bb45b1SDag-Erling Smørgrav 		printf("%c%jd", c, (intmax_t)*i);			\
160dde5f9b9SDmitry Chagin 	else								\
161661522f5SDag-Erling Smørgrav 		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
162dde5f9b9SDmitry Chagin 	i++;								\
163dde5f9b9SDmitry Chagin 	n--;								\
164dde5f9b9SDmitry Chagin 	c = ',';							\
165e4bb45b1SDag-Erling Smørgrav } while (0)
166dde5f9b9SDmitry Chagin 
1677144d36fSDmitry Chagin struct proc_info
1687144d36fSDmitry Chagin {
1697144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1707144d36fSDmitry Chagin 	u_int			sv_flags;
1717144d36fSDmitry Chagin 	pid_t			pid;
1727144d36fSDmitry Chagin };
1737144d36fSDmitry Chagin 
174bb1a2d4aSJohn Baldwin static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1757144d36fSDmitry Chagin 
1762560d181SMariusz Zaborski #ifdef WITH_CASPER
1774622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp;
1784622f0e1SPawel Jakub Dawidek 
1794622f0e1SPawel Jakub Dawidek static int
1804622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
1814622f0e1SPawel Jakub Dawidek {
1824622f0e1SPawel Jakub Dawidek 	cap_channel_t *capcas, *cappwdloc, *capgrploc;
1834622f0e1SPawel Jakub Dawidek 	const char *cmds[1], *fields[1];
1844622f0e1SPawel Jakub Dawidek 
1854622f0e1SPawel Jakub Dawidek 	capcas = cap_init();
1864622f0e1SPawel Jakub Dawidek 	if (capcas == NULL) {
187c501d73cSMariusz Zaborski 		err(1, "unable to create casper process");
188c501d73cSMariusz Zaborski 		exit(1);
1894622f0e1SPawel Jakub Dawidek 	}
1904622f0e1SPawel Jakub Dawidek 	cappwdloc = cap_service_open(capcas, "system.pwd");
1914622f0e1SPawel Jakub Dawidek 	capgrploc = cap_service_open(capcas, "system.grp");
1924622f0e1SPawel Jakub Dawidek 	/* Casper capability no longer needed. */
1934622f0e1SPawel Jakub Dawidek 	cap_close(capcas);
1944622f0e1SPawel Jakub Dawidek 	if (cappwdloc == NULL || capgrploc == NULL) {
1954622f0e1SPawel Jakub Dawidek 		if (cappwdloc == NULL)
1964622f0e1SPawel Jakub Dawidek 			warn("unable to open system.pwd service");
1974622f0e1SPawel Jakub Dawidek 		if (capgrploc == NULL)
1984622f0e1SPawel Jakub Dawidek 			warn("unable to open system.grp service");
1998ff3952bSPawel Jakub Dawidek 		exit(1);
2004622f0e1SPawel Jakub Dawidek 	}
2014622f0e1SPawel Jakub Dawidek 	/* Limit system.pwd to only getpwuid() function and pw_name field. */
2024622f0e1SPawel Jakub Dawidek 	cmds[0] = "getpwuid";
2038ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0)
2048ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
2054622f0e1SPawel Jakub Dawidek 	fields[0] = "pw_name";
2068ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0)
2078ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
2084622f0e1SPawel Jakub Dawidek 	/* Limit system.grp to only getgrgid() function and gr_name field. */
2094622f0e1SPawel Jakub Dawidek 	cmds[0] = "getgrgid";
2108ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0)
2118ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
2124622f0e1SPawel Jakub Dawidek 	fields[0] = "gr_name";
2138ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_fields(capgrploc, fields, 1) < 0)
2148ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
2154622f0e1SPawel Jakub Dawidek 
2164622f0e1SPawel Jakub Dawidek 	*cappwdp = cappwdloc;
2174622f0e1SPawel Jakub Dawidek 	*capgrpp = capgrploc;
2184622f0e1SPawel Jakub Dawidek 	return (0);
2194622f0e1SPawel Jakub Dawidek }
2202560d181SMariusz Zaborski #endif	/* WITH_CASPER */
2214622f0e1SPawel Jakub Dawidek 
2229289f547SJohn Baldwin static void
2239289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), int value)
2249289f547SJohn Baldwin {
2259289f547SJohn Baldwin 	const char *str;
2269289f547SJohn Baldwin 
2279289f547SJohn Baldwin 	str = decoder(value);
2289289f547SJohn Baldwin 	if (str != NULL)
2299289f547SJohn Baldwin 		printf("%s", str);
2309289f547SJohn Baldwin 	else {
2319289f547SJohn Baldwin 		if (decimal)
2329289f547SJohn Baldwin 			printf("<invalid=%d>", value);
2339289f547SJohn Baldwin 		else
2349289f547SJohn Baldwin 			printf("<invalid=%#x>", value);
2359289f547SJohn Baldwin 	}
2369289f547SJohn Baldwin }
2379289f547SJohn Baldwin 
2389289f547SJohn Baldwin /* Like print_integer_arg but unknown values are treated as valid. */
2399289f547SJohn Baldwin static void
2409289f547SJohn Baldwin print_integer_arg_valid(const char *(*decoder)(int), int value)
2419289f547SJohn Baldwin {
2429289f547SJohn Baldwin 	const char *str;
2439289f547SJohn Baldwin 
2449289f547SJohn Baldwin 	str = decoder(value);
2459289f547SJohn Baldwin 	if (str != NULL)
2469289f547SJohn Baldwin 		printf("%s", str);
2479289f547SJohn Baldwin 	else {
2489289f547SJohn Baldwin 		if (decimal)
2499289f547SJohn Baldwin 			printf("%d", value);
2509289f547SJohn Baldwin 		else
2519289f547SJohn Baldwin 			printf("%#x", value);
2529289f547SJohn Baldwin 	}
2539289f547SJohn Baldwin }
2549289f547SJohn Baldwin 
2559289f547SJohn Baldwin static void
2569289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), int value)
2579289f547SJohn Baldwin {
2589289f547SJohn Baldwin 	bool invalid;
2599289f547SJohn Baldwin 	int rem;
2609289f547SJohn Baldwin 
2619289f547SJohn Baldwin 	printf("%#x<", value);
2629289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
2639289f547SJohn Baldwin 	printf(">");
2649289f547SJohn Baldwin 	if (invalid)
2659289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2669289f547SJohn Baldwin }
2679289f547SJohn Baldwin 
2689289f547SJohn Baldwin static void
2699289f547SJohn Baldwin print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value)
2709289f547SJohn Baldwin {
2719289f547SJohn Baldwin 	bool invalid;
2729289f547SJohn Baldwin 	int rem;
2739289f547SJohn Baldwin 
2749289f547SJohn Baldwin 	if (value == 0) {
2759289f547SJohn Baldwin 		printf("0");
2769289f547SJohn Baldwin 		return;
2779289f547SJohn Baldwin 	}
2789289f547SJohn Baldwin 	printf("%#x<", value);
2799289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
2809289f547SJohn Baldwin 	printf(">");
2819289f547SJohn Baldwin 	if (invalid)
2829289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2839289f547SJohn Baldwin }
2849289f547SJohn Baldwin 
2859289f547SJohn Baldwin static void
2869289f547SJohn Baldwin decode_fileflags(fflags_t value)
2879289f547SJohn Baldwin {
2889289f547SJohn Baldwin 	bool invalid;
2899289f547SJohn Baldwin 	fflags_t rem;
2909289f547SJohn Baldwin 
2919289f547SJohn Baldwin 	if (value == 0) {
2929289f547SJohn Baldwin 		printf("0");
2939289f547SJohn Baldwin 		return;
2949289f547SJohn Baldwin 	}
2959289f547SJohn Baldwin 	printf("%#x<", value);
2969289f547SJohn Baldwin 	invalid = !sysdecode_fileflags(stdout, value, &rem);
2979289f547SJohn Baldwin 	printf(">");
2989289f547SJohn Baldwin 	if (invalid)
2999289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3009289f547SJohn Baldwin }
3019289f547SJohn Baldwin 
3029289f547SJohn Baldwin static void
3039289f547SJohn Baldwin decode_filemode(int value)
3049289f547SJohn Baldwin {
3059289f547SJohn Baldwin 	bool invalid;
3069289f547SJohn Baldwin 	int rem;
3079289f547SJohn Baldwin 
3089289f547SJohn Baldwin 	if (value == 0) {
3099289f547SJohn Baldwin 		printf("0");
3109289f547SJohn Baldwin 		return;
3119289f547SJohn Baldwin 	}
3129289f547SJohn Baldwin 	printf("%#o<", value);
3139289f547SJohn Baldwin 	invalid = !sysdecode_filemode(stdout, value, &rem);
3149289f547SJohn Baldwin 	printf(">");
3159289f547SJohn Baldwin 	if (invalid)
3169289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3179289f547SJohn Baldwin }
3189289f547SJohn Baldwin 
3199289f547SJohn Baldwin static void
3209289f547SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value)
3219289f547SJohn Baldwin {
3229289f547SJohn Baldwin 	bool invalid;
3239289f547SJohn Baldwin 	uint32_t rem;
3249289f547SJohn Baldwin 
3259289f547SJohn Baldwin 	printf("%#x<", value);
3269289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
3279289f547SJohn Baldwin 	printf(">");
3289289f547SJohn Baldwin 	if (invalid)
3299289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3309289f547SJohn Baldwin }
3319289f547SJohn Baldwin 
3329289f547SJohn Baldwin static void
3339289f547SJohn Baldwin print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value)
3349289f547SJohn Baldwin {
3359289f547SJohn Baldwin 	bool invalid;
3369289f547SJohn Baldwin 	u_long rem;
3379289f547SJohn Baldwin 
3389289f547SJohn Baldwin 	if (value == 0) {
3399289f547SJohn Baldwin 		printf("0");
3409289f547SJohn Baldwin 		return;
3419289f547SJohn Baldwin 	}
3429289f547SJohn Baldwin 	printf("%#lx<", value);
3439289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
3449289f547SJohn Baldwin 	printf(">");
3459289f547SJohn Baldwin 	if (invalid)
3469289f547SJohn Baldwin 		printf("<invalid>%lu", rem);
3479289f547SJohn Baldwin }
3489289f547SJohn Baldwin 
34991fbb9c1SDavid Malone int
35091fbb9c1SDavid Malone main(int argc, char *argv[])
3519b50d902SRodney W. Grimes {
3529b50d902SRodney W. Grimes 	int ch, ktrlen, size;
35391fbb9c1SDavid Malone 	void *m;
3549b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
355db53f66bSJohn Baldwin 	int drop_logged;
356ec4beb5dSPeter Wemm 	pid_t pid = 0;
3577144d36fSDmitry Chagin 	u_int sv_flags;
3589b50d902SRodney W. Grimes 
35909307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
3605ccbfb26SAndrey A. Chernov 
361c1269d20SMaxim Sobolev 	timestamp = TIMESTAMP_NONE;
362c1269d20SMaxim Sobolev 
363b9034ce2SBryan Drewery 	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
36409307b25SDag-Erling Smørgrav 		switch (ch) {
3657144d36fSDmitry Chagin 		case 'A':
3667144d36fSDmitry Chagin 			abiflag = 1;
3677144d36fSDmitry Chagin 			break;
3689b50d902SRodney W. Grimes 		case 'f':
3699b50d902SRodney W. Grimes 			tracefile = optarg;
3709b50d902SRodney W. Grimes 			break;
3719b50d902SRodney W. Grimes 		case 'd':
3729b50d902SRodney W. Grimes 			decimal = 1;
3739b50d902SRodney W. Grimes 			break;
3749b50d902SRodney W. Grimes 		case 'l':
3759b50d902SRodney W. Grimes 			tail = 1;
3769b50d902SRodney W. Grimes 			break;
3779b50d902SRodney W. Grimes 		case 'm':
3789b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
3799b50d902SRodney W. Grimes 			break;
3809b50d902SRodney W. Grimes 		case 'n':
3819b50d902SRodney W. Grimes 			fancy = 0;
3829b50d902SRodney W. Grimes 			break;
383ec4beb5dSPeter Wemm 		case 'p':
384ec4beb5dSPeter Wemm 			pid = atoi(optarg);
385ec4beb5dSPeter Wemm 			break;
38660e15db9SDag-Erling Smørgrav 		case 'r':
38760e15db9SDag-Erling Smørgrav 			resolv = 1;
38860e15db9SDag-Erling Smørgrav 			break;
389b9034ce2SBryan Drewery 		case 'S':
390b9034ce2SBryan Drewery 			syscallno = 1;
391b9034ce2SBryan Drewery 			break;
392df0c8868SRobert Watson 		case 's':
393df0c8868SRobert Watson 			suppressdata = 1;
394df0c8868SRobert Watson 			break;
395ec131914SPeter Wemm 		case 'E':
396c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ELAPSED;
397ec131914SPeter Wemm 			break;
398a9ac598bSRobert Watson 		case 'H':
399a9ac598bSRobert Watson 			threads = 1;
400a9ac598bSRobert Watson 			break;
4019b50d902SRodney W. Grimes 		case 'R':
402c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_RELATIVE;
4039b50d902SRodney W. Grimes 			break;
4049b50d902SRodney W. Grimes 		case 'T':
405c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ABSOLUTE;
4069b50d902SRodney W. Grimes 			break;
4079b50d902SRodney W. Grimes 		case 't':
4089b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
40915fc002bSPhilippe Charnier 			if (trpoints < 0)
41015fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
4119b50d902SRodney W. Grimes 			break;
4129b50d902SRodney W. Grimes 		default:
4139b50d902SRodney W. Grimes 			usage();
4149b50d902SRodney W. Grimes 		}
4159b50d902SRodney W. Grimes 
41680844fd1SBill Fenner 	if (argc > optind)
4179b50d902SRodney W. Grimes 		usage();
4189b50d902SRodney W. Grimes 
41909307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
42015fc002bSPhilippe Charnier 	if (m == NULL)
42115fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
4229d0fa50eSSimon J. Gerraty 	if (strcmp(tracefile, "-") != 0)
42315fc002bSPhilippe Charnier 		if (!freopen(tracefile, "r", stdin))
42415fc002bSPhilippe Charnier 			err(1, "%s", tracefile);
425f9b20fc8SPawel Jakub Dawidek 
426c5033697SMariusz Zaborski 	caph_cache_catpages();
427c5033697SMariusz Zaborski 	caph_cache_tzdata();
428c5033697SMariusz Zaborski 
4292560d181SMariusz Zaborski #ifdef WITH_CASPER
4304622f0e1SPawel Jakub Dawidek 	if (resolv != 0) {
4314622f0e1SPawel Jakub Dawidek 		if (cappwdgrp_setup(&cappwd, &capgrp) < 0) {
4324622f0e1SPawel Jakub Dawidek 			cappwd = NULL;
4334622f0e1SPawel Jakub Dawidek 			capgrp = NULL;
4344622f0e1SPawel Jakub Dawidek 		}
4354622f0e1SPawel Jakub Dawidek 	}
4364622f0e1SPawel Jakub Dawidek 	if (resolv == 0 || (cappwd != NULL && capgrp != NULL)) {
4377672a014SMariusz Zaborski 		if (caph_enter() < 0)
4384622f0e1SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
4394622f0e1SPawel Jakub Dawidek 	}
4404622f0e1SPawel Jakub Dawidek #else
441d2c9ca44SPawel Jakub Dawidek 	if (resolv == 0) {
4427672a014SMariusz Zaborski 		if (caph_enter() < 0)
443f9b20fc8SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
444d2c9ca44SPawel Jakub Dawidek 	}
4454622f0e1SPawel Jakub Dawidek #endif
446a4e3fc54SMariusz Zaborski 	if (caph_limit_stdio() == -1)
447a4e3fc54SMariusz Zaborski 		err(1, "unable to limit stdio");
448f9b20fc8SPawel Jakub Dawidek 
4497144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
450db53f66bSJohn Baldwin 	drop_logged = 0;
4519b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
452db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
453db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
454a9ac598bSRobert Watson 			if (!drop_logged && threads) {
45509307b25SDag-Erling Smørgrav 				printf(
456c065c0b8SJaakko Heinonen 				    "%6jd %6jd %-8.*s Events dropped.\n",
457c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid,
458c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
459c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_tid : 0,
460c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
461a9ac598bSRobert Watson 				drop_logged = 1;
462a9ac598bSRobert Watson 			} else if (!drop_logged) {
46309307b25SDag-Erling Smørgrav 				printf("%6jd %-8.*s Events dropped.\n",
464c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
465db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
466db53f66bSJohn Baldwin 				drop_logged = 1;
467db53f66bSJohn Baldwin 			}
468db53f66bSJohn Baldwin 		}
4699b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
47001a36e29SJohn Baldwin 			if (pid == 0 || ktr_header.ktr_pid == pid ||
47101a36e29SJohn Baldwin 			    ktr_header.ktr_tid == pid)
4729b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
47315fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
47415fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
4759b50d902SRodney W. Grimes 		if (ktrlen > size) {
47609307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
47715fc002bSPhilippe Charnier 			if (m == NULL)
47815fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
4799b50d902SRodney W. Grimes 			size = ktrlen;
4809b50d902SRodney W. Grimes 		}
48115fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
48215fc002bSPhilippe Charnier 			errx(1, "data too short");
4837144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
4847144d36fSDmitry Chagin 			continue;
4857144d36fSDmitry Chagin 		sv_flags = abidump(&ktr_header);
48601a36e29SJohn Baldwin 		if (pid && ktr_header.ktr_pid != pid &&
48701a36e29SJohn Baldwin 		    ktr_header.ktr_tid != pid)
488ec4beb5dSPeter Wemm 			continue;
4899b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
4909b50d902SRodney W. Grimes 			continue;
491db53f66bSJohn Baldwin 		drop_logged = 0;
4929b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
4939b50d902SRodney W. Grimes 		case KTR_SYSCALL:
4947144d36fSDmitry Chagin 			ktrsyscall((struct ktr_syscall *)m, sv_flags);
4959b50d902SRodney W. Grimes 			break;
4969b50d902SRodney W. Grimes 		case KTR_SYSRET:
4977144d36fSDmitry Chagin 			ktrsysret((struct ktr_sysret *)m, sv_flags);
4989b50d902SRodney W. Grimes 			break;
4999b50d902SRodney W. Grimes 		case KTR_NAMEI:
500a56be37eSJohn Baldwin 		case KTR_SYSCTL:
5019b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
5029b50d902SRodney W. Grimes 			break;
5039b50d902SRodney W. Grimes 		case KTR_GENIO:
5049b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
5059b50d902SRodney W. Grimes 			break;
5069b50d902SRodney W. Grimes 		case KTR_PSIG:
507dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
5089b50d902SRodney W. Grimes 			break;
5099b50d902SRodney W. Grimes 		case KTR_CSW:
51088bf5036SJohn Baldwin 			if (ktrlen == sizeof(struct ktr_csw_old))
51188bf5036SJohn Baldwin 				ktrcsw_old((struct ktr_csw_old *)m);
51288bf5036SJohn Baldwin 			else
5139b50d902SRodney W. Grimes 				ktrcsw((struct ktr_csw *)m);
5149b50d902SRodney W. Grimes 			break;
51582e2dd32SPoul-Henning Kamp 		case KTR_USER:
5163f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
51782e2dd32SPoul-Henning Kamp 			break;
51860e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
51960e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
52060e15db9SDag-Erling Smørgrav 			break;
521c601ad8eSDag-Erling Smørgrav 		case KTR_CAPFAIL:
522c601ad8eSDag-Erling Smørgrav 			ktrcapfail((struct ktr_cap_fail *)m);
52335818d2eSJohn Baldwin 			break;
52435818d2eSJohn Baldwin 		case KTR_FAULT:
52535818d2eSJohn Baldwin 			ktrfault((struct ktr_fault *)m);
52635818d2eSJohn Baldwin 			break;
52735818d2eSJohn Baldwin 		case KTR_FAULTEND:
52835818d2eSJohn Baldwin 			ktrfaultend((struct ktr_faultend *)m);
52935818d2eSJohn Baldwin 			break;
530ffb66079SJohn Baldwin 		case KTR_STRUCT_ARRAY:
531ffb66079SJohn Baldwin 			ktrstructarray((struct ktr_struct_array *)m, ktrlen);
532ffb66079SJohn Baldwin 			break;
533b9609ab1SJohn Baldwin 		default:
534b9609ab1SJohn Baldwin 			printf("\n");
535b9609ab1SJohn Baldwin 			break;
5369b50d902SRodney W. Grimes 		}
5379b50d902SRodney W. Grimes 		if (tail)
53809307b25SDag-Erling Smørgrav 			fflush(stdout);
5399b50d902SRodney W. Grimes 	}
54091fbb9c1SDavid Malone 	return 0;
5419b50d902SRodney W. Grimes }
5429b50d902SRodney W. Grimes 
54391fbb9c1SDavid Malone int
54491fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
5459b50d902SRodney W. Grimes {
5469b50d902SRodney W. Grimes 	int i;
5479b50d902SRodney W. Grimes 
5489b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
54909307b25SDag-Erling Smørgrav 		sleep(1);
5509b50d902SRodney W. Grimes 		clearerr(stdin);
5519b50d902SRodney W. Grimes 	}
5529b50d902SRodney W. Grimes 	return (i);
5539b50d902SRodney W. Grimes }
5549b50d902SRodney W. Grimes 
5557144d36fSDmitry Chagin int
5567144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
5577144d36fSDmitry Chagin {
5587144d36fSDmitry Chagin 	struct proc_info *pi;
5597144d36fSDmitry Chagin 
5607144d36fSDmitry Chagin 	switch (kth->ktr_type) {
5617144d36fSDmitry Chagin 	case KTR_PROCCTOR:
5627144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5637144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5647144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5657144d36fSDmitry Chagin 				break;
5667144d36fSDmitry Chagin 			}
5677144d36fSDmitry Chagin 		}
5687144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
5697144d36fSDmitry Chagin 		if (pi == NULL)
5707144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
5717144d36fSDmitry Chagin 		pi->sv_flags = *flags;
5727144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
5737144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
5747144d36fSDmitry Chagin 		return (1);
5757144d36fSDmitry Chagin 
5767144d36fSDmitry Chagin 	case KTR_PROCDTOR:
5777144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5787144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5797144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5807144d36fSDmitry Chagin 				free(pi);
5817144d36fSDmitry Chagin 				break;
5827144d36fSDmitry Chagin 			}
5837144d36fSDmitry Chagin 		}
5847144d36fSDmitry Chagin 		return (1);
5857144d36fSDmitry Chagin 	}
5867144d36fSDmitry Chagin 
5877144d36fSDmitry Chagin 	return (0);
5887144d36fSDmitry Chagin }
5897144d36fSDmitry Chagin 
5907144d36fSDmitry Chagin u_int
5917144d36fSDmitry Chagin abidump(struct ktr_header *kth)
5927144d36fSDmitry Chagin {
5937144d36fSDmitry Chagin 	struct proc_info *pi;
5947144d36fSDmitry Chagin 	const char *abi;
5957144d36fSDmitry Chagin 	const char *arch;
5967144d36fSDmitry Chagin 	u_int flags = 0;
5977144d36fSDmitry Chagin 
5987144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
5997144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
6007144d36fSDmitry Chagin 			flags = pi->sv_flags;
6017144d36fSDmitry Chagin 			break;
6027144d36fSDmitry Chagin 		}
6037144d36fSDmitry Chagin 	}
6047144d36fSDmitry Chagin 
6057144d36fSDmitry Chagin 	if (abiflag == 0)
6067144d36fSDmitry Chagin 		return (flags);
6077144d36fSDmitry Chagin 
6087144d36fSDmitry Chagin 	switch (flags & SV_ABI_MASK) {
6097144d36fSDmitry Chagin 	case SV_ABI_LINUX:
6107144d36fSDmitry Chagin 		abi = "L";
6117144d36fSDmitry Chagin 		break;
6127144d36fSDmitry Chagin 	case SV_ABI_FREEBSD:
6137144d36fSDmitry Chagin 		abi = "F";
6147144d36fSDmitry Chagin 		break;
6156fb8946bSJohn Baldwin 	case SV_ABI_CLOUDABI:
6166fb8946bSJohn Baldwin 		abi = "C";
6176fb8946bSJohn Baldwin 		break;
6187144d36fSDmitry Chagin 	default:
6197144d36fSDmitry Chagin 		abi = "U";
6207144d36fSDmitry Chagin 		break;
6217144d36fSDmitry Chagin 	}
6227144d36fSDmitry Chagin 
6237144d36fSDmitry Chagin 	if (flags & SV_LP64)
6247144d36fSDmitry Chagin 		arch = "64";
6256fc8053fSJohn Baldwin 	else if (flags & SV_ILP32)
6267144d36fSDmitry Chagin 		arch = "32";
6276fc8053fSJohn Baldwin 	else
6287144d36fSDmitry Chagin 		arch = "00";
6297144d36fSDmitry Chagin 
6307144d36fSDmitry Chagin 	printf("%s%s  ", abi, arch);
6317144d36fSDmitry Chagin 
6327144d36fSDmitry Chagin 	return (flags);
6337144d36fSDmitry Chagin }
6347144d36fSDmitry Chagin 
63591fbb9c1SDavid Malone void
63691fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
6379b50d902SRodney W. Grimes {
6389b50d902SRodney W. Grimes 	static char unknown[64];
639dda41f20SJohn Baldwin 	static struct timeval prevtime, prevtime_e;
640dda41f20SJohn Baldwin 	struct timeval temp;
64191fbb9c1SDavid Malone 	const char *type;
642da551bb2SMaxim Sobolev 	const char *sign;
6439b50d902SRodney W. Grimes 
6449b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
6459b50d902SRodney W. Grimes 	case KTR_SYSCALL:
6469b50d902SRodney W. Grimes 		type = "CALL";
6479b50d902SRodney W. Grimes 		break;
6489b50d902SRodney W. Grimes 	case KTR_SYSRET:
6499b50d902SRodney W. Grimes 		type = "RET ";
6509b50d902SRodney W. Grimes 		break;
6519b50d902SRodney W. Grimes 	case KTR_NAMEI:
6529b50d902SRodney W. Grimes 		type = "NAMI";
6539b50d902SRodney W. Grimes 		break;
6549b50d902SRodney W. Grimes 	case KTR_GENIO:
6559b50d902SRodney W. Grimes 		type = "GIO ";
6569b50d902SRodney W. Grimes 		break;
6579b50d902SRodney W. Grimes 	case KTR_PSIG:
6589b50d902SRodney W. Grimes 		type = "PSIG";
6599b50d902SRodney W. Grimes 		break;
6609b50d902SRodney W. Grimes 	case KTR_CSW:
6619b50d902SRodney W. Grimes 		type = "CSW ";
6629b50d902SRodney W. Grimes 		break;
66382e2dd32SPoul-Henning Kamp 	case KTR_USER:
66482e2dd32SPoul-Henning Kamp 		type = "USER";
66582e2dd32SPoul-Henning Kamp 		break;
66660e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
667ffb66079SJohn Baldwin 	case KTR_STRUCT_ARRAY:
66860e15db9SDag-Erling Smørgrav 		type = "STRU";
66960e15db9SDag-Erling Smørgrav 		break;
670a56be37eSJohn Baldwin 	case KTR_SYSCTL:
671a56be37eSJohn Baldwin 		type = "SCTL";
672a56be37eSJohn Baldwin 		break;
6737144d36fSDmitry Chagin 	case KTR_PROCCTOR:
6747144d36fSDmitry Chagin 		/* FALLTHROUGH */
6757144d36fSDmitry Chagin 	case KTR_PROCDTOR:
6767144d36fSDmitry Chagin 		return;
677c601ad8eSDag-Erling Smørgrav 	case KTR_CAPFAIL:
678c601ad8eSDag-Erling Smørgrav 		type = "CAP ";
679c601ad8eSDag-Erling Smørgrav 		break;
68035818d2eSJohn Baldwin 	case KTR_FAULT:
68135818d2eSJohn Baldwin 		type = "PFLT";
68235818d2eSJohn Baldwin 		break;
68335818d2eSJohn Baldwin 	case KTR_FAULTEND:
68435818d2eSJohn Baldwin 		type = "PRET";
68535818d2eSJohn Baldwin 		break;
6869b50d902SRodney W. Grimes 	default:
68709307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
6889b50d902SRodney W. Grimes 		type = unknown;
6899b50d902SRodney W. Grimes 	}
6909b50d902SRodney W. Grimes 
691a9ac598bSRobert Watson 	/*
692a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
693a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
694a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
695a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
696a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
697a9ac598bSRobert Watson 	 * negative tid's as 0.
698a9ac598bSRobert Watson 	 */
699a9ac598bSRobert Watson 	if (threads)
70009307b25SDag-Erling Smørgrav 		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
701c065c0b8SJaakko Heinonen 		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
702c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
703a9ac598bSRobert Watson 	else
70409307b25SDag-Erling Smørgrav 		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
705a9ac598bSRobert Watson 		    kth->ktr_comm);
7069b50d902SRodney W. Grimes         if (timestamp) {
707c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_ABSOLUTE) {
708c1269d20SMaxim Sobolev 			printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
709c1269d20SMaxim Sobolev 			    kth->ktr_time.tv_usec);
710ec131914SPeter Wemm 		}
711c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_ELAPSED) {
712c1269d20SMaxim Sobolev 			if (prevtime_e.tv_sec == 0)
713c1269d20SMaxim Sobolev 				prevtime_e = kth->ktr_time;
71454b10c9eSJohn Baldwin 			timersub(&kth->ktr_time, &prevtime_e, &temp);
71554b10c9eSJohn Baldwin 			printf("%jd.%06ld ", (intmax_t)temp.tv_sec,
71654b10c9eSJohn Baldwin 			    temp.tv_usec);
717c1269d20SMaxim Sobolev 		}
718c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_RELATIVE) {
719da551bb2SMaxim Sobolev 			if (prevtime.tv_sec == 0)
720da551bb2SMaxim Sobolev 				prevtime = kth->ktr_time;
72154b10c9eSJohn Baldwin 			if (timercmp(&kth->ktr_time, &prevtime, <)) {
72254b10c9eSJohn Baldwin 				timersub(&prevtime, &kth->ktr_time, &temp);
723da551bb2SMaxim Sobolev 				sign = "-";
724da551bb2SMaxim Sobolev 			} else {
72554b10c9eSJohn Baldwin 				timersub(&kth->ktr_time, &prevtime, &temp);
726da551bb2SMaxim Sobolev 				sign = "";
727da551bb2SMaxim Sobolev 			}
72854b10c9eSJohn Baldwin 			prevtime = kth->ktr_time;
72954b10c9eSJohn Baldwin 			printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec,
73054b10c9eSJohn Baldwin 			    temp.tv_usec);
7319b50d902SRodney W. Grimes 		}
732c1269d20SMaxim Sobolev 	}
73309307b25SDag-Erling Smørgrav 	printf("%s  ", type);
7349b50d902SRodney W. Grimes }
7359b50d902SRodney W. Grimes 
7369b50d902SRodney W. Grimes #include <sys/syscall.h>
7379b50d902SRodney W. Grimes 
738265e5898SJohn Baldwin static void
739265e5898SJohn Baldwin ioctlname(unsigned long val)
740265e5898SJohn Baldwin {
741265e5898SJohn Baldwin 	const char *str;
742265e5898SJohn Baldwin 
743265e5898SJohn Baldwin 	str = sysdecode_ioctlname(val);
744265e5898SJohn Baldwin 	if (str != NULL)
745265e5898SJohn Baldwin 		printf("%s", str);
746265e5898SJohn Baldwin 	else if (decimal)
747265e5898SJohn Baldwin 		printf("%lu", val);
748265e5898SJohn Baldwin 	else
749265e5898SJohn Baldwin 		printf("%#lx", val);
750265e5898SJohn Baldwin }
751265e5898SJohn Baldwin 
752a5f14abfSJohn Baldwin static enum sysdecode_abi
753a5f14abfSJohn Baldwin syscallabi(u_int sv_flags)
754a5f14abfSJohn Baldwin {
755a5f14abfSJohn Baldwin 
756a5f14abfSJohn Baldwin 	if (sv_flags == 0)
7575842bd68SJohn Baldwin 		return (SYSDECODE_ABI_FREEBSD);
758a5f14abfSJohn Baldwin 	switch (sv_flags & SV_ABI_MASK) {
759a5f14abfSJohn Baldwin 	case SV_ABI_FREEBSD:
7605842bd68SJohn Baldwin 		return (SYSDECODE_ABI_FREEBSD);
761a5f14abfSJohn Baldwin 	case SV_ABI_LINUX:
762fc7d33b4SEd Maste #ifdef __LP64__
763a5f14abfSJohn Baldwin 		if (sv_flags & SV_ILP32)
7645842bd68SJohn Baldwin 			return (SYSDECODE_ABI_LINUX32);
765a5f14abfSJohn Baldwin #endif
7665842bd68SJohn Baldwin 		return (SYSDECODE_ABI_LINUX);
7676fb8946bSJohn Baldwin 	case SV_ABI_CLOUDABI:
7686fb8946bSJohn Baldwin 		return (SYSDECODE_ABI_CLOUDABI64);
769a5f14abfSJohn Baldwin 	default:
7705842bd68SJohn Baldwin 		return (SYSDECODE_ABI_UNKNOWN);
771a5f14abfSJohn Baldwin 	}
772a5f14abfSJohn Baldwin }
773a5f14abfSJohn Baldwin 
774a5f14abfSJohn Baldwin static void
775a5f14abfSJohn Baldwin syscallname(u_int code, u_int sv_flags)
776a5f14abfSJohn Baldwin {
777a5f14abfSJohn Baldwin 	const char *name;
778a5f14abfSJohn Baldwin 
779a5f14abfSJohn Baldwin 	name = sysdecode_syscallname(syscallabi(sv_flags), code);
780a5f14abfSJohn Baldwin 	if (name == NULL)
781a5f14abfSJohn Baldwin 		printf("[%d]", code);
782a5f14abfSJohn Baldwin 	else {
783a5f14abfSJohn Baldwin 		printf("%s", name);
784a5f14abfSJohn Baldwin 		if (syscallno)
785a5f14abfSJohn Baldwin 			printf("[%d]", code);
786a5f14abfSJohn Baldwin 	}
787a5f14abfSJohn Baldwin }
788a5f14abfSJohn Baldwin 
7899289f547SJohn Baldwin static void
7909289f547SJohn Baldwin print_signal(int signo)
7919289f547SJohn Baldwin {
7929289f547SJohn Baldwin 	const char *signame;
7939289f547SJohn Baldwin 
7949289f547SJohn Baldwin 	signame = sysdecode_signal(signo);
7959289f547SJohn Baldwin 	if (signame != NULL)
7969289f547SJohn Baldwin 		printf("%s", signame);
7979289f547SJohn Baldwin 	else
7989289f547SJohn Baldwin 		printf("SIG %d", signo);
7999289f547SJohn Baldwin }
8009289f547SJohn Baldwin 
80191fbb9c1SDavid Malone void
802a5f14abfSJohn Baldwin ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
8039b50d902SRodney W. Grimes {
80491fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
80571ed318eSJohn Baldwin 	register_t *ip, *first;
806c601ad8eSDag-Erling Smørgrav 	intmax_t arg;
80771ed318eSJohn Baldwin 	int quad_align, quad_slots;
8089b50d902SRodney W. Grimes 
809a5f14abfSJohn Baldwin 	syscallname(ktr->ktr_code, sv_flags);
81071ed318eSJohn Baldwin 	ip = first = &ktr->ktr_args[0];
8119b50d902SRodney W. Grimes 	if (narg) {
8129b50d902SRodney W. Grimes 		char c = '(';
8137144d36fSDmitry Chagin 		if (fancy &&
814a5f14abfSJohn Baldwin 		    (sv_flags == 0 ||
815a5f14abfSJohn Baldwin 		    (sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
81671ed318eSJohn Baldwin 			quad_align = 0;
81771ed318eSJohn Baldwin 			if (sv_flags & SV_ILP32) {
81871ed318eSJohn Baldwin #ifdef __powerpc__
81971ed318eSJohn Baldwin 				quad_align = 1;
82071ed318eSJohn Baldwin #endif
82171ed318eSJohn Baldwin 				quad_slots = 2;
82271ed318eSJohn Baldwin 			} else
82371ed318eSJohn Baldwin 				quad_slots = 1;
82473430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
8251ca6c7fcSJilles Tjoelker 			case SYS_bindat:
826c4561fabSJohn Baldwin 			case SYS_chflagsat:
8271ca6c7fcSJilles Tjoelker 			case SYS_connectat:
8288447b7cdSJilles Tjoelker 			case SYS_faccessat:
8298447b7cdSJilles Tjoelker 			case SYS_fchmodat:
8308447b7cdSJilles Tjoelker 			case SYS_fchownat:
8318447b7cdSJilles Tjoelker 			case SYS_fstatat:
8328447b7cdSJilles Tjoelker 			case SYS_futimesat:
8338447b7cdSJilles Tjoelker 			case SYS_linkat:
8348447b7cdSJilles Tjoelker 			case SYS_mkdirat:
8358447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
8368447b7cdSJilles Tjoelker 			case SYS_mknodat:
8378447b7cdSJilles Tjoelker 			case SYS_openat:
8388447b7cdSJilles Tjoelker 			case SYS_readlinkat:
8398447b7cdSJilles Tjoelker 			case SYS_renameat:
8408447b7cdSJilles Tjoelker 			case SYS_unlinkat:
8412205e0d1SJilles Tjoelker 			case SYS_utimensat:
8428447b7cdSJilles Tjoelker 				putchar('(');
8439289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_atfd, *ip);
8448447b7cdSJilles Tjoelker 				c = ',';
8458447b7cdSJilles Tjoelker 				ip++;
8468447b7cdSJilles Tjoelker 				narg--;
8478447b7cdSJilles Tjoelker 				break;
8488447b7cdSJilles Tjoelker 			}
8498447b7cdSJilles Tjoelker 			switch (ktr->ktr_code) {
85073430055SDag-Erling Smørgrav 			case SYS_ioctl: {
85198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
852d09e66beSDag-Erling Smørgrav 				putchar(c);
853265e5898SJohn Baldwin 				ioctlname(*ip);
8549b50d902SRodney W. Grimes 				c = ',';
8559b50d902SRodney W. Grimes 				ip++;
8569b50d902SRodney W. Grimes 				narg--;
85773430055SDag-Erling Smørgrav 				break;
85873430055SDag-Erling Smørgrav 			}
85973430055SDag-Erling Smørgrav 			case SYS_ptrace:
86009307b25SDag-Erling Smørgrav 				putchar('(');
8619289f547SJohn Baldwin 				print_integer_arg(sysdecode_ptrace_request, *ip);
8629b50d902SRodney W. Grimes 				c = ',';
8639b50d902SRodney W. Grimes 				ip++;
8649b50d902SRodney W. Grimes 				narg--;
86573430055SDag-Erling Smørgrav 				break;
86673430055SDag-Erling Smørgrav 			case SYS_access:
86773430055SDag-Erling Smørgrav 			case SYS_eaccess:
8688447b7cdSJilles Tjoelker 			case SYS_faccessat:
86998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
87009307b25SDag-Erling Smørgrav 				putchar(',');
8719289f547SJohn Baldwin 				print_mask_arg(sysdecode_access_mode, *ip);
87298a68a58SAlexander Leidinger 				ip++;
87398a68a58SAlexander Leidinger 				narg--;
87473430055SDag-Erling Smørgrav 				break;
87573430055SDag-Erling Smørgrav 			case SYS_open:
8768447b7cdSJilles Tjoelker 			case SYS_openat:
87798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
87809307b25SDag-Erling Smørgrav 				putchar(',');
8799289f547SJohn Baldwin 				print_mask_arg(sysdecode_open_flags, ip[0]);
8809289f547SJohn Baldwin 				if ((ip[0] & O_CREAT) == O_CREAT) {
8819289f547SJohn Baldwin 					putchar(',');
8829289f547SJohn Baldwin 					decode_filemode(ip[1]);
8839289f547SJohn Baldwin 				}
88473430055SDag-Erling Smørgrav 				ip += 2;
88598a68a58SAlexander Leidinger 				narg -= 2;
88673430055SDag-Erling Smørgrav 				break;
88773430055SDag-Erling Smørgrav 			case SYS_wait4:
88898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
88998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89009307b25SDag-Erling Smørgrav 				putchar(',');
8919289f547SJohn Baldwin 				print_mask_arg0(sysdecode_wait4_options, *ip);
89234763d1cSJohn Baldwin 				ip++;
89334763d1cSJohn Baldwin 				narg--;
89434763d1cSJohn Baldwin 				break;
89534763d1cSJohn Baldwin 			case SYS_wait6:
89634763d1cSJohn Baldwin 				putchar('(');
8979289f547SJohn Baldwin 				print_integer_arg(sysdecode_idtype, *ip);
89834763d1cSJohn Baldwin 				c = ',';
89934763d1cSJohn Baldwin 				ip++;
90034763d1cSJohn Baldwin 				narg--;
90171ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
90234763d1cSJohn Baldwin 				print_number(ip, narg, c);
90334763d1cSJohn Baldwin 				putchar(',');
9049289f547SJohn Baldwin 				print_mask_arg(sysdecode_wait6_options, *ip);
90598a68a58SAlexander Leidinger 				ip++;
90698a68a58SAlexander Leidinger 				narg--;
90773430055SDag-Erling Smørgrav 				break;
90873430055SDag-Erling Smørgrav 			case SYS_chmod:
90973430055SDag-Erling Smørgrav 			case SYS_fchmod:
91073430055SDag-Erling Smørgrav 			case SYS_lchmod:
911eebea334SBaptiste Daroussin 			case SYS_fchmodat:
91298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
91309307b25SDag-Erling Smørgrav 				putchar(',');
9149289f547SJohn Baldwin 				decode_filemode(*ip);
91598a68a58SAlexander Leidinger 				ip++;
91698a68a58SAlexander Leidinger 				narg--;
91773430055SDag-Erling Smørgrav 				break;
9188447b7cdSJilles Tjoelker 			case SYS_mknodat:
91998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92009307b25SDag-Erling Smørgrav 				putchar(',');
9219289f547SJohn Baldwin 				decode_filemode(*ip);
92298a68a58SAlexander Leidinger 				ip++;
92398a68a58SAlexander Leidinger 				narg--;
92473430055SDag-Erling Smørgrav 				break;
92573430055SDag-Erling Smørgrav 			case SYS_getfsstat:
92698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92809307b25SDag-Erling Smørgrav 				putchar(',');
92948f79574SJohn Baldwin 				print_integer_arg(sysdecode_getfsstat_mode, *ip);
93098a68a58SAlexander Leidinger 				ip++;
93198a68a58SAlexander Leidinger 				narg--;
93273430055SDag-Erling Smørgrav 				break;
93373430055SDag-Erling Smørgrav 			case SYS_mount:
93498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93609307b25SDag-Erling Smørgrav 				putchar(',');
9379289f547SJohn Baldwin 				print_mask_arg(sysdecode_mount_flags, *ip);
93898a68a58SAlexander Leidinger 				ip++;
93998a68a58SAlexander Leidinger 				narg--;
94073430055SDag-Erling Smørgrav 				break;
94173430055SDag-Erling Smørgrav 			case SYS_unmount:
94298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
94309307b25SDag-Erling Smørgrav 				putchar(',');
9449289f547SJohn Baldwin 				print_mask_arg(sysdecode_mount_flags, *ip);
94598a68a58SAlexander Leidinger 				ip++;
94698a68a58SAlexander Leidinger 				narg--;
94773430055SDag-Erling Smørgrav 				break;
94873430055SDag-Erling Smørgrav 			case SYS_recvmsg:
94973430055SDag-Erling Smørgrav 			case SYS_sendmsg:
95098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95209307b25SDag-Erling Smørgrav 				putchar(',');
9539289f547SJohn Baldwin 				print_mask_arg0(sysdecode_msg_flags, *ip);
95498a68a58SAlexander Leidinger 				ip++;
95598a68a58SAlexander Leidinger 				narg--;
95673430055SDag-Erling Smørgrav 				break;
95773430055SDag-Erling Smørgrav 			case SYS_recvfrom:
95873430055SDag-Erling Smørgrav 			case SYS_sendto:
95998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96209307b25SDag-Erling Smørgrav 				putchar(',');
9639289f547SJohn Baldwin 				print_mask_arg0(sysdecode_msg_flags, *ip);
96498a68a58SAlexander Leidinger 				ip++;
96598a68a58SAlexander Leidinger 				narg--;
96673430055SDag-Erling Smørgrav 				break;
96773430055SDag-Erling Smørgrav 			case SYS_chflags:
968c4561fabSJohn Baldwin 			case SYS_chflagsat:
96973430055SDag-Erling Smørgrav 			case SYS_fchflags:
97073430055SDag-Erling Smørgrav 			case SYS_lchflags:
97198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97209307b25SDag-Erling Smørgrav 				putchar(',');
9739289f547SJohn Baldwin 				decode_fileflags(*ip);
97498a68a58SAlexander Leidinger 				ip++;
97598a68a58SAlexander Leidinger 				narg--;
97673430055SDag-Erling Smørgrav 				break;
97773430055SDag-Erling Smørgrav 			case SYS_kill:
97898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97909307b25SDag-Erling Smørgrav 				putchar(',');
9809289f547SJohn Baldwin 				print_signal(*ip);
98198a68a58SAlexander Leidinger 				ip++;
98298a68a58SAlexander Leidinger 				narg--;
98373430055SDag-Erling Smørgrav 				break;
98473430055SDag-Erling Smørgrav 			case SYS_reboot:
98509307b25SDag-Erling Smørgrav 				putchar('(');
9869289f547SJohn Baldwin 				print_mask_arg(sysdecode_reboot_howto, *ip);
98798a68a58SAlexander Leidinger 				ip++;
98898a68a58SAlexander Leidinger 				narg--;
98973430055SDag-Erling Smørgrav 				break;
99073430055SDag-Erling Smørgrav 			case SYS_umask:
99109307b25SDag-Erling Smørgrav 				putchar('(');
9929289f547SJohn Baldwin 				decode_filemode(*ip);
99398a68a58SAlexander Leidinger 				ip++;
99498a68a58SAlexander Leidinger 				narg--;
99573430055SDag-Erling Smørgrav 				break;
99673430055SDag-Erling Smørgrav 			case SYS_msync:
99798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99909307b25SDag-Erling Smørgrav 				putchar(',');
10009289f547SJohn Baldwin 				print_mask_arg(sysdecode_msync_flags, *ip);
100198a68a58SAlexander Leidinger 				ip++;
100298a68a58SAlexander Leidinger 				narg--;
100373430055SDag-Erling Smørgrav 				break;
1004cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
100573430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
1006cae1120aSPeter Wemm 				print_number(ip, narg, c);
1007cae1120aSPeter Wemm 				print_number(ip, narg, c);
100809307b25SDag-Erling Smørgrav 				putchar(',');
10099289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
101009307b25SDag-Erling Smørgrav 				putchar(',');
1011cae1120aSPeter Wemm 				ip++;
1012cae1120aSPeter Wemm 				narg--;
10139289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_flags, *ip);
1014cae1120aSPeter Wemm 				ip++;
1015cae1120aSPeter Wemm 				narg--;
101673430055SDag-Erling Smørgrav 				break;
1017cae1120aSPeter Wemm #endif
101873430055SDag-Erling Smørgrav 			case SYS_mmap:
101998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
102098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
102109307b25SDag-Erling Smørgrav 				putchar(',');
10229289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
102309307b25SDag-Erling Smørgrav 				putchar(',');
102498a68a58SAlexander Leidinger 				ip++;
102598a68a58SAlexander Leidinger 				narg--;
10269289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_flags, *ip);
102798a68a58SAlexander Leidinger 				ip++;
102898a68a58SAlexander Leidinger 				narg--;
102973430055SDag-Erling Smørgrav 				break;
103073430055SDag-Erling Smørgrav 			case SYS_mprotect:
103198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103309307b25SDag-Erling Smørgrav 				putchar(',');
10349289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
103598a68a58SAlexander Leidinger 				ip++;
103698a68a58SAlexander Leidinger 				narg--;
103773430055SDag-Erling Smørgrav 				break;
103873430055SDag-Erling Smørgrav 			case SYS_madvise:
103998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
104098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
104109307b25SDag-Erling Smørgrav 				putchar(',');
10429289f547SJohn Baldwin 				print_integer_arg(sysdecode_madvice, *ip);
104398a68a58SAlexander Leidinger 				ip++;
104498a68a58SAlexander Leidinger 				narg--;
104573430055SDag-Erling Smørgrav 				break;
104639a3a438SJohn Baldwin 			case SYS_pathconf:
104739a3a438SJohn Baldwin 			case SYS_lpathconf:
104839a3a438SJohn Baldwin 			case SYS_fpathconf:
104939a3a438SJohn Baldwin 				print_number(ip, narg, c);
105039a3a438SJohn Baldwin 				putchar(',');
105139a3a438SJohn Baldwin 				print_integer_arg(sysdecode_pathconf_name, *ip);
105239a3a438SJohn Baldwin 				ip++;
105339a3a438SJohn Baldwin 				narg--;
105439a3a438SJohn Baldwin 				break;
10559483ab16SJohn Baldwin 			case SYS_getpriority:
105673430055SDag-Erling Smørgrav 			case SYS_setpriority:
10579483ab16SJohn Baldwin 				putchar('(');
10589289f547SJohn Baldwin 				print_integer_arg(sysdecode_prio_which, *ip);
10599483ab16SJohn Baldwin 				c = ',';
106098a68a58SAlexander Leidinger 				ip++;
106198a68a58SAlexander Leidinger 				narg--;
106273430055SDag-Erling Smørgrav 				break;
106373430055SDag-Erling Smørgrav 			case SYS_fcntl:
106498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
106509307b25SDag-Erling Smørgrav 				putchar(',');
10669289f547SJohn Baldwin 				print_integer_arg(sysdecode_fcntl_cmd, ip[0]);
10679289f547SJohn Baldwin 				if (sysdecode_fcntl_arg_p(ip[0])) {
10689289f547SJohn Baldwin 					putchar(',');
10699289f547SJohn Baldwin 					if (ip[0] == F_SETFL)
10709289f547SJohn Baldwin 						print_mask_arg(
10719289f547SJohn Baldwin 						    sysdecode_fcntl_fileflags,
10729289f547SJohn Baldwin 							ip[1]);
10739289f547SJohn Baldwin 					else
10749289f547SJohn Baldwin 						sysdecode_fcntl_arg(stdout,
10759289f547SJohn Baldwin 						    ip[0], ip[1],
10769289f547SJohn Baldwin 						    decimal ? 10 : 16);
10779289f547SJohn Baldwin 				}
107873430055SDag-Erling Smørgrav 				ip += 2;
107998a68a58SAlexander Leidinger 				narg -= 2;
108073430055SDag-Erling Smørgrav 				break;
108173430055SDag-Erling Smørgrav 			case SYS_socket: {
10828bc31d83SCraig Rodrigues 				int sockdomain;
108309307b25SDag-Erling Smørgrav 				putchar('(');
108495bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
10859289f547SJohn Baldwin 				print_integer_arg(sysdecode_socketdomain,
10869289f547SJohn Baldwin 				    sockdomain);
108798a68a58SAlexander Leidinger 				ip++;
108898a68a58SAlexander Leidinger 				narg--;
108909307b25SDag-Erling Smørgrav 				putchar(',');
10909289f547SJohn Baldwin 				print_mask_arg(sysdecode_socket_type, *ip);
109198a68a58SAlexander Leidinger 				ip++;
109298a68a58SAlexander Leidinger 				narg--;
10938bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
10948bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
109509307b25SDag-Erling Smørgrav 					putchar(',');
10969289f547SJohn Baldwin 					print_integer_arg(sysdecode_ipproto,
10979289f547SJohn Baldwin 					    *ip);
10988bc31d83SCraig Rodrigues 					ip++;
10998bc31d83SCraig Rodrigues 					narg--;
11008bc31d83SCraig Rodrigues 				}
110198a68a58SAlexander Leidinger 				c = ',';
110273430055SDag-Erling Smørgrav 				break;
110373430055SDag-Erling Smørgrav 			}
110473430055SDag-Erling Smørgrav 			case SYS_setsockopt:
11059289f547SJohn Baldwin 			case SYS_getsockopt: {
11069289f547SJohn Baldwin 				const char *str;
11079289f547SJohn Baldwin 
110898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
110909307b25SDag-Erling Smørgrav 				putchar(',');
11109289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_sockopt_level,
11119289f547SJohn Baldwin 				    *ip);
11129289f547SJohn Baldwin 				str = sysdecode_sockopt_name(ip[0], ip[1]);
11139289f547SJohn Baldwin 				if (str != NULL) {
11149289f547SJohn Baldwin 					printf(",%s", str);
111598a68a58SAlexander Leidinger 					ip++;
111698a68a58SAlexander Leidinger 					narg--;
11170460d351SJohn Baldwin 				}
111898a68a58SAlexander Leidinger 				ip++;
111998a68a58SAlexander Leidinger 				narg--;
112073430055SDag-Erling Smørgrav 				break;
11219289f547SJohn Baldwin 			}
1122cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
112373430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
112498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
112598a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
112698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
112771ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
112809307b25SDag-Erling Smørgrav 				putchar(',');
11299289f547SJohn Baldwin 				print_integer_arg(sysdecode_whence, *ip);
113098a68a58SAlexander Leidinger 				ip++;
113198a68a58SAlexander Leidinger 				narg--;
113273430055SDag-Erling Smørgrav 				break;
1133cae1120aSPeter Wemm #endif
113473430055SDag-Erling Smørgrav 			case SYS_lseek:
1135cae1120aSPeter Wemm 				print_number(ip, narg, c);
113671ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
113709307b25SDag-Erling Smørgrav 				putchar(',');
11389289f547SJohn Baldwin 				print_integer_arg(sysdecode_whence, *ip);
1139cae1120aSPeter Wemm 				ip++;
1140cae1120aSPeter Wemm 				narg--;
114173430055SDag-Erling Smørgrav 				break;
114273430055SDag-Erling Smørgrav 			case SYS_flock:
114398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
114409307b25SDag-Erling Smørgrav 				putchar(',');
11459289f547SJohn Baldwin 				print_mask_arg(sysdecode_flock_operation, *ip);
114698a68a58SAlexander Leidinger 				ip++;
114798a68a58SAlexander Leidinger 				narg--;
114873430055SDag-Erling Smørgrav 				break;
114973430055SDag-Erling Smørgrav 			case SYS_mkfifo:
11508447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
115173430055SDag-Erling Smørgrav 			case SYS_mkdir:
11528447b7cdSJilles Tjoelker 			case SYS_mkdirat:
115398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
115409307b25SDag-Erling Smørgrav 				putchar(',');
11559289f547SJohn Baldwin 				decode_filemode(*ip);
115698a68a58SAlexander Leidinger 				ip++;
115798a68a58SAlexander Leidinger 				narg--;
115873430055SDag-Erling Smørgrav 				break;
115973430055SDag-Erling Smørgrav 			case SYS_shutdown:
116098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
116109307b25SDag-Erling Smørgrav 				putchar(',');
11629289f547SJohn Baldwin 				print_integer_arg(sysdecode_shutdown_how, *ip);
116398a68a58SAlexander Leidinger 				ip++;
116498a68a58SAlexander Leidinger 				narg--;
116573430055SDag-Erling Smørgrav 				break;
116673430055SDag-Erling Smørgrav 			case SYS_socketpair:
116709307b25SDag-Erling Smørgrav 				putchar('(');
11689289f547SJohn Baldwin 				print_integer_arg(sysdecode_socketdomain, *ip);
116998a68a58SAlexander Leidinger 				ip++;
117098a68a58SAlexander Leidinger 				narg--;
117109307b25SDag-Erling Smørgrav 				putchar(',');
11729289f547SJohn Baldwin 				print_mask_arg(sysdecode_socket_type, *ip);
117398a68a58SAlexander Leidinger 				ip++;
117498a68a58SAlexander Leidinger 				narg--;
117598a68a58SAlexander Leidinger 				c = ',';
117673430055SDag-Erling Smørgrav 				break;
117773430055SDag-Erling Smørgrav 			case SYS_getrlimit:
117873430055SDag-Erling Smørgrav 			case SYS_setrlimit:
117909307b25SDag-Erling Smørgrav 				putchar('(');
11809289f547SJohn Baldwin 				print_integer_arg(sysdecode_rlimit, *ip);
118198a68a58SAlexander Leidinger 				ip++;
118298a68a58SAlexander Leidinger 				narg--;
118398a68a58SAlexander Leidinger 				c = ',';
118473430055SDag-Erling Smørgrav 				break;
1185ee8aa41dSJohn Baldwin 			case SYS_getrusage:
1186ee8aa41dSJohn Baldwin 				putchar('(');
1187ee8aa41dSJohn Baldwin 				print_integer_arg(sysdecode_getrusage_who, *ip);
1188ee8aa41dSJohn Baldwin 				ip++;
1189ee8aa41dSJohn Baldwin 				narg--;
1190ee8aa41dSJohn Baldwin 				c = ',';
1191ee8aa41dSJohn Baldwin 				break;
119273430055SDag-Erling Smørgrav 			case SYS_quotactl:
119398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
119409307b25SDag-Erling Smørgrav 				putchar(',');
11959289f547SJohn Baldwin 				if (!sysdecode_quotactl_cmd(stdout, *ip)) {
11969289f547SJohn Baldwin 					if (decimal)
11979289f547SJohn Baldwin 						printf("<invalid=%d>", (int)*ip);
11989289f547SJohn Baldwin 					else
11999289f547SJohn Baldwin 						printf("<invalid=%#x>",
12009289f547SJohn Baldwin 						    (int)*ip);
12019289f547SJohn Baldwin 				}
120298a68a58SAlexander Leidinger 				ip++;
120398a68a58SAlexander Leidinger 				narg--;
120498a68a58SAlexander Leidinger 				c = ',';
120573430055SDag-Erling Smørgrav 				break;
120673430055SDag-Erling Smørgrav 			case SYS_nfssvc:
120709307b25SDag-Erling Smørgrav 				putchar('(');
12089289f547SJohn Baldwin 				print_integer_arg(sysdecode_nfssvc_flags, *ip);
120998a68a58SAlexander Leidinger 				ip++;
121098a68a58SAlexander Leidinger 				narg--;
121198a68a58SAlexander Leidinger 				c = ',';
121273430055SDag-Erling Smørgrav 				break;
121373430055SDag-Erling Smørgrav 			case SYS_rtprio:
121466ba8943SJohn Baldwin 			case SYS_rtprio_thread:
121509307b25SDag-Erling Smørgrav 				putchar('(');
12169289f547SJohn Baldwin 				print_integer_arg(sysdecode_rtprio_function,
12179289f547SJohn Baldwin 				    *ip);
121898a68a58SAlexander Leidinger 				ip++;
121998a68a58SAlexander Leidinger 				narg--;
122098a68a58SAlexander Leidinger 				c = ',';
122173430055SDag-Erling Smørgrav 				break;
122273430055SDag-Erling Smørgrav 			case SYS___semctl:
122398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
122498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
122509307b25SDag-Erling Smørgrav 				putchar(',');
12269289f547SJohn Baldwin 				print_integer_arg(sysdecode_semctl_cmd, *ip);
122798a68a58SAlexander Leidinger 				ip++;
122898a68a58SAlexander Leidinger 				narg--;
122973430055SDag-Erling Smørgrav 				break;
123073430055SDag-Erling Smørgrav 			case SYS_semget:
123198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
123298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
123309307b25SDag-Erling Smørgrav 				putchar(',');
12349289f547SJohn Baldwin 				print_mask_arg(sysdecode_semget_flags, *ip);
123598a68a58SAlexander Leidinger 				ip++;
123698a68a58SAlexander Leidinger 				narg--;
123773430055SDag-Erling Smørgrav 				break;
123873430055SDag-Erling Smørgrav 			case SYS_msgctl:
123998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
124009307b25SDag-Erling Smørgrav 				putchar(',');
12419289f547SJohn Baldwin 				print_integer_arg(sysdecode_msgctl_cmd, *ip);
124298a68a58SAlexander Leidinger 				ip++;
124398a68a58SAlexander Leidinger 				narg--;
124473430055SDag-Erling Smørgrav 				break;
124573430055SDag-Erling Smørgrav 			case SYS_shmat:
124698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
124798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
124809307b25SDag-Erling Smørgrav 				putchar(',');
12499289f547SJohn Baldwin 				print_mask_arg(sysdecode_shmat_flags, *ip);
125098a68a58SAlexander Leidinger 				ip++;
125198a68a58SAlexander Leidinger 				narg--;
125273430055SDag-Erling Smørgrav 				break;
125373430055SDag-Erling Smørgrav 			case SYS_shmctl:
125498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
125509307b25SDag-Erling Smørgrav 				putchar(',');
12569289f547SJohn Baldwin 				print_integer_arg(sysdecode_shmctl_cmd, *ip);
125798a68a58SAlexander Leidinger 				ip++;
125898a68a58SAlexander Leidinger 				narg--;
125973430055SDag-Erling Smørgrav 				break;
1260777d35f4SRui Paulo 			case SYS_shm_open:
1261777d35f4SRui Paulo 				print_number(ip, narg, c);
1262777d35f4SRui Paulo 				putchar(',');
12639289f547SJohn Baldwin 				print_mask_arg(sysdecode_open_flags, ip[0]);
12649289f547SJohn Baldwin 				putchar(',');
12659289f547SJohn Baldwin 				decode_filemode(ip[1]);
12669289f547SJohn Baldwin 				ip += 2;
12679289f547SJohn Baldwin 				narg -= 2;
1268777d35f4SRui Paulo 				break;
126973430055SDag-Erling Smørgrav 			case SYS_minherit:
127098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
127198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
127209307b25SDag-Erling Smørgrav 				putchar(',');
12739289f547SJohn Baldwin 				print_integer_arg(sysdecode_minherit_inherit,
12749289f547SJohn Baldwin 				    *ip);
127598a68a58SAlexander Leidinger 				ip++;
127698a68a58SAlexander Leidinger 				narg--;
127773430055SDag-Erling Smørgrav 				break;
127873430055SDag-Erling Smørgrav 			case SYS_rfork:
127909307b25SDag-Erling Smørgrav 				putchar('(');
12809289f547SJohn Baldwin 				print_mask_arg(sysdecode_rfork_flags, *ip);
128198a68a58SAlexander Leidinger 				ip++;
128298a68a58SAlexander Leidinger 				narg--;
128398a68a58SAlexander Leidinger 				c = ',';
128473430055SDag-Erling Smørgrav 				break;
128573430055SDag-Erling Smørgrav 			case SYS_lio_listio:
128609307b25SDag-Erling Smørgrav 				putchar('(');
12879289f547SJohn Baldwin 				print_integer_arg(sysdecode_lio_listio_mode,
12889289f547SJohn Baldwin 				    *ip);
128998a68a58SAlexander Leidinger 				ip++;
129098a68a58SAlexander Leidinger 				narg--;
129198a68a58SAlexander Leidinger 				c = ',';
129273430055SDag-Erling Smørgrav 				break;
129373430055SDag-Erling Smørgrav 			case SYS_mlockall:
129409307b25SDag-Erling Smørgrav 				putchar('(');
12959289f547SJohn Baldwin 				print_mask_arg(sysdecode_mlockall_flags, *ip);
129698a68a58SAlexander Leidinger 				ip++;
129798a68a58SAlexander Leidinger 				narg--;
129873430055SDag-Erling Smørgrav 				break;
129973430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
130098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
130109307b25SDag-Erling Smørgrav 				putchar(',');
13029289f547SJohn Baldwin 				print_integer_arg(sysdecode_scheduler_policy,
13039289f547SJohn Baldwin 				    *ip);
130498a68a58SAlexander Leidinger 				ip++;
130598a68a58SAlexander Leidinger 				narg--;
130673430055SDag-Erling Smørgrav 				break;
130773430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
130873430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
130909307b25SDag-Erling Smørgrav 				putchar('(');
13109289f547SJohn Baldwin 				print_integer_arg(sysdecode_scheduler_policy,
13119289f547SJohn Baldwin 				    *ip);
131298a68a58SAlexander Leidinger 				ip++;
131398a68a58SAlexander Leidinger 				narg--;
131473430055SDag-Erling Smørgrav 				break;
131573430055SDag-Erling Smørgrav 			case SYS_sendfile:
131698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132209307b25SDag-Erling Smørgrav 				putchar(',');
13239289f547SJohn Baldwin 				print_mask_arg(sysdecode_sendfile_flags, *ip);
132498a68a58SAlexander Leidinger 				ip++;
132598a68a58SAlexander Leidinger 				narg--;
132673430055SDag-Erling Smørgrav 				break;
132773430055SDag-Erling Smørgrav 			case SYS_kldsym:
132898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132909307b25SDag-Erling Smørgrav 				putchar(',');
13309289f547SJohn Baldwin 				print_integer_arg(sysdecode_kldsym_cmd, *ip);
133198a68a58SAlexander Leidinger 				ip++;
133298a68a58SAlexander Leidinger 				narg--;
133373430055SDag-Erling Smørgrav 				break;
133473430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
133509307b25SDag-Erling Smørgrav 				putchar('(');
13369289f547SJohn Baldwin 				print_integer_arg(sysdecode_sigprocmask_how,
13379289f547SJohn Baldwin 				    *ip);
133898a68a58SAlexander Leidinger 				ip++;
133998a68a58SAlexander Leidinger 				narg--;
134098a68a58SAlexander Leidinger 				c = ',';
134173430055SDag-Erling Smørgrav 				break;
134273430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
134373430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
134473430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
134573430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
134673430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
134773430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
134873430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
134973430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
135073430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
135173430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
135273430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
135373430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
135498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
135509307b25SDag-Erling Smørgrav 				putchar(',');
13569289f547SJohn Baldwin 				print_integer_arg(sysdecode_acltype, *ip);
135798a68a58SAlexander Leidinger 				ip++;
135898a68a58SAlexander Leidinger 				narg--;
135973430055SDag-Erling Smørgrav 				break;
136073430055SDag-Erling Smørgrav 			case SYS_sigaction:
136109307b25SDag-Erling Smørgrav 				putchar('(');
13629289f547SJohn Baldwin 				print_signal(*ip);
136398a68a58SAlexander Leidinger 				ip++;
136498a68a58SAlexander Leidinger 				narg--;
136598a68a58SAlexander Leidinger 				c = ',';
136673430055SDag-Erling Smørgrav 				break;
136773430055SDag-Erling Smørgrav 			case SYS_extattrctl:
136898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
136909307b25SDag-Erling Smørgrav 				putchar(',');
13709289f547SJohn Baldwin 				print_integer_arg(sysdecode_extattrnamespace,
13719289f547SJohn Baldwin 				    *ip);
137298a68a58SAlexander Leidinger 				ip++;
137398a68a58SAlexander Leidinger 				narg--;
137473430055SDag-Erling Smørgrav 				break;
137573430055SDag-Erling Smørgrav 			case SYS_nmount:
137698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
137798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
137809307b25SDag-Erling Smørgrav 				putchar(',');
13799289f547SJohn Baldwin 				print_mask_arg(sysdecode_mount_flags, *ip);
138098a68a58SAlexander Leidinger 				ip++;
138198a68a58SAlexander Leidinger 				narg--;
138273430055SDag-Erling Smørgrav 				break;
138373430055SDag-Erling Smørgrav 			case SYS_thr_create:
138498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
138598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
138609307b25SDag-Erling Smørgrav 				putchar(',');
13879289f547SJohn Baldwin 				print_mask_arg(sysdecode_thr_create_flags, *ip);
138898a68a58SAlexander Leidinger 				ip++;
138998a68a58SAlexander Leidinger 				narg--;
139073430055SDag-Erling Smørgrav 				break;
139173430055SDag-Erling Smørgrav 			case SYS_thr_kill:
139298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
139309307b25SDag-Erling Smørgrav 				putchar(',');
13949289f547SJohn Baldwin 				print_signal(*ip);
139598a68a58SAlexander Leidinger 				ip++;
139698a68a58SAlexander Leidinger 				narg--;
139773430055SDag-Erling Smørgrav 				break;
139873430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
139998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
140009307b25SDag-Erling Smørgrav 				putchar(',');
14019289f547SJohn Baldwin 				print_integer_arg(sysdecode_kldunload_flags,
14029289f547SJohn Baldwin 				    *ip);
140398a68a58SAlexander Leidinger 				ip++;
140498a68a58SAlexander Leidinger 				narg--;
140573430055SDag-Erling Smørgrav 				break;
14068447b7cdSJilles Tjoelker 			case SYS_linkat:
14078447b7cdSJilles Tjoelker 			case SYS_renameat:
14088447b7cdSJilles Tjoelker 			case SYS_symlinkat:
14098447b7cdSJilles Tjoelker 				print_number(ip, narg, c);
14108447b7cdSJilles Tjoelker 				putchar(',');
14119289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_atfd, *ip);
14128447b7cdSJilles Tjoelker 				ip++;
14138447b7cdSJilles Tjoelker 				narg--;
141439a3a438SJohn Baldwin 				print_number(ip, narg, c);
14158447b7cdSJilles Tjoelker 				break;
14162609222aSPawel Jakub Dawidek 			case SYS_cap_fcntls_limit:
14172609222aSPawel Jakub Dawidek 				print_number(ip, narg, c);
14182609222aSPawel Jakub Dawidek 				putchar(',');
14192609222aSPawel Jakub Dawidek 				arg = *ip;
14202609222aSPawel Jakub Dawidek 				ip++;
14212609222aSPawel Jakub Dawidek 				narg--;
14229289f547SJohn Baldwin 				print_mask_arg32(sysdecode_cap_fcntlrights, arg);
14232609222aSPawel Jakub Dawidek 				break;
1424145e6aa9SJohn Baldwin 			case SYS_posix_fadvise:
1425145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1426145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1427145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1428145e6aa9SJohn Baldwin 				(void)putchar(',');
14299289f547SJohn Baldwin 				print_integer_arg(sysdecode_fadvice, *ip);
1430145e6aa9SJohn Baldwin 				ip++;
1431145e6aa9SJohn Baldwin 				narg--;
1432145e6aa9SJohn Baldwin 				break;
143355648840SJohn Baldwin 			case SYS_procctl:
143455648840SJohn Baldwin 				putchar('(');
14359289f547SJohn Baldwin 				print_integer_arg(sysdecode_idtype, *ip);
143655648840SJohn Baldwin 				c = ',';
143755648840SJohn Baldwin 				ip++;
143855648840SJohn Baldwin 				narg--;
143971ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
144055648840SJohn Baldwin 				putchar(',');
14419289f547SJohn Baldwin 				print_integer_arg(sysdecode_procctl_cmd, *ip);
144255648840SJohn Baldwin 				ip++;
144355648840SJohn Baldwin 				narg--;
144455648840SJohn Baldwin 				break;
1445fdb5bf37SJohn Baldwin 			case SYS__umtx_op:
1446fdb5bf37SJohn Baldwin 				print_number(ip, narg, c);
1447fdb5bf37SJohn Baldwin 				putchar(',');
14489289f547SJohn Baldwin 				print_integer_arg(sysdecode_umtx_op, *ip);
1449fdb5bf37SJohn Baldwin 				switch (*ip) {
1450fdb5bf37SJohn Baldwin 				case UMTX_OP_CV_WAIT:
1451fdb5bf37SJohn Baldwin 					ip++;
1452fdb5bf37SJohn Baldwin 					narg--;
1453fdb5bf37SJohn Baldwin 					putchar(',');
14549289f547SJohn Baldwin 					print_mask_argul(
14559289f547SJohn Baldwin 					    sysdecode_umtx_cvwait_flags, *ip);
1456fdb5bf37SJohn Baldwin 					break;
1457fdb5bf37SJohn Baldwin 				case UMTX_OP_RW_RDLOCK:
1458fdb5bf37SJohn Baldwin 					ip++;
1459fdb5bf37SJohn Baldwin 					narg--;
1460fdb5bf37SJohn Baldwin 					putchar(',');
14619289f547SJohn Baldwin 					print_mask_argul(
14629289f547SJohn Baldwin 					    sysdecode_umtx_rwlock_flags, *ip);
1463fdb5bf37SJohn Baldwin 					break;
1464fdb5bf37SJohn Baldwin 				}
1465fdb5bf37SJohn Baldwin 				ip++;
1466fdb5bf37SJohn Baldwin 				narg--;
14678dec6942SJohn Baldwin 				break;
14688dec6942SJohn Baldwin 			case SYS_ftruncate:
14698dec6942SJohn Baldwin 			case SYS_truncate:
14708dec6942SJohn Baldwin 				print_number(ip, narg, c);
14718dec6942SJohn Baldwin 				print_number64(first, ip, narg, c);
14728dec6942SJohn Baldwin 				break;
147339a3a438SJohn Baldwin 			case SYS_fchownat:
147439a3a438SJohn Baldwin 				print_number(ip, narg, c);
147539a3a438SJohn Baldwin 				print_number(ip, narg, c);
147639a3a438SJohn Baldwin 				print_number(ip, narg, c);
147739a3a438SJohn Baldwin 				break;
147839a3a438SJohn Baldwin 			case SYS_fstatat:
147939a3a438SJohn Baldwin 			case SYS_utimensat:
148039a3a438SJohn Baldwin 				print_number(ip, narg, c);
148139a3a438SJohn Baldwin 				print_number(ip, narg, c);
148239a3a438SJohn Baldwin 				break;
148339a3a438SJohn Baldwin 			case SYS_unlinkat:
148439a3a438SJohn Baldwin 				print_number(ip, narg, c);
148539a3a438SJohn Baldwin 				break;
148639a3a438SJohn Baldwin 			case SYS_sysarch:
148739a3a438SJohn Baldwin 				putchar('(');
148839a3a438SJohn Baldwin 				print_integer_arg(sysdecode_sysarch_number, *ip);
148939a3a438SJohn Baldwin 				ip++;
149039a3a438SJohn Baldwin 				narg--;
149139a3a438SJohn Baldwin 				c = ',';
149239a3a438SJohn Baldwin 				break;
149339a3a438SJohn Baldwin 			}
149439a3a438SJohn Baldwin 			switch (ktr->ktr_code) {
149539a3a438SJohn Baldwin 			case SYS_chflagsat:
149639a3a438SJohn Baldwin 			case SYS_fchownat:
149739a3a438SJohn Baldwin 			case SYS_faccessat:
149839a3a438SJohn Baldwin 			case SYS_fchmodat:
149939a3a438SJohn Baldwin 			case SYS_fstatat:
150039a3a438SJohn Baldwin 			case SYS_linkat:
150139a3a438SJohn Baldwin 			case SYS_unlinkat:
150239a3a438SJohn Baldwin 			case SYS_utimensat:
150339a3a438SJohn Baldwin 				putchar(',');
150439a3a438SJohn Baldwin 				print_mask_arg0(sysdecode_atflags, *ip);
150539a3a438SJohn Baldwin 				ip++;
150639a3a438SJohn Baldwin 				narg--;
150739a3a438SJohn Baldwin 				break;
15089b50d902SRodney W. Grimes 			}
15099b50d902SRodney W. Grimes 		}
151048f6dd8aSAttilio Rao 		while (narg > 0) {
151198a68a58SAlexander Leidinger 			print_number(ip, narg, c);
15129b50d902SRodney W. Grimes 		}
151309307b25SDag-Erling Smørgrav 		putchar(')');
15149b50d902SRodney W. Grimes 	}
151509307b25SDag-Erling Smørgrav 	putchar('\n');
15169b50d902SRodney W. Grimes }
15179b50d902SRodney W. Grimes 
151891fbb9c1SDavid Malone void
1519a5f14abfSJohn Baldwin ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
15209b50d902SRodney W. Grimes {
152191fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
152291fbb9c1SDavid Malone 	int error = ktr->ktr_error;
15239b50d902SRodney W. Grimes 
1524a5f14abfSJohn Baldwin 	syscallname(ktr->ktr_code, sv_flags);
1525b9034ce2SBryan Drewery 	printf(" ");
15269b50d902SRodney W. Grimes 
15279b50d902SRodney W. Grimes 	if (error == 0) {
15289b50d902SRodney W. Grimes 		if (fancy) {
152909307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
15309b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
153109307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
15329b50d902SRodney W. Grimes 		} else {
15339b50d902SRodney W. Grimes 			if (decimal)
153409307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
15359b50d902SRodney W. Grimes 			else
153609307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
15379b50d902SRodney W. Grimes 		}
15389b50d902SRodney W. Grimes 	} else if (error == ERESTART)
153909307b25SDag-Erling Smørgrav 		printf("RESTART");
15409b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
154109307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
15429b50d902SRodney W. Grimes 	else {
1543287b96ddSJohn Baldwin 		printf("-1 errno %d", sysdecode_freebsd_to_abi_errno(
1544287b96ddSJohn Baldwin 		    syscallabi(sv_flags), error));
15459b50d902SRodney W. Grimes 		if (fancy)
154609307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
15479b50d902SRodney W. Grimes 	}
154809307b25SDag-Erling Smørgrav 	putchar('\n');
15499b50d902SRodney W. Grimes }
15509b50d902SRodney W. Grimes 
155191fbb9c1SDavid Malone void
155291fbb9c1SDavid Malone ktrnamei(char *cp, int len)
15539b50d902SRodney W. Grimes {
155409307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
15559b50d902SRodney W. Grimes }
15569b50d902SRodney W. Grimes 
155791fbb9c1SDavid Malone void
1558ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
15599b50d902SRodney W. Grimes {
1560ec4beb5dSPeter Wemm 	int n, i;
1561ec4beb5dSPeter Wemm 	int width;
1562ec4beb5dSPeter Wemm 
1563ec4beb5dSPeter Wemm 	width = 0;
1564ec4beb5dSPeter Wemm 	do {
1565ec4beb5dSPeter Wemm 		width += 2;
1566ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1567ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1568ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1569ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1570ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1571ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1572ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1573ec4beb5dSPeter Wemm 	width -= 2;
1574ec4beb5dSPeter Wemm 
1575ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1576ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1577ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1578ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1579ec4beb5dSPeter Wemm 			}
1580ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1581ec4beb5dSPeter Wemm 				printf(" ");
1582ec4beb5dSPeter Wemm 			}
1583ec4beb5dSPeter Wemm 			if (i < len)
1584ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1585ec4beb5dSPeter Wemm 			else
1586ec4beb5dSPeter Wemm 				printf("  ");
1587ec4beb5dSPeter Wemm 		}
1588ec4beb5dSPeter Wemm 		printf("  |");
1589ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1590ec4beb5dSPeter Wemm 			if (i >= len)
1591ec4beb5dSPeter Wemm 				break;
1592ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1593ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1594ec4beb5dSPeter Wemm 			else
1595ec4beb5dSPeter Wemm 				printf(".");
1596ec4beb5dSPeter Wemm 		}
1597ec4beb5dSPeter Wemm 		printf("|\n");
1598ec4beb5dSPeter Wemm 	}
1599ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1600ec4beb5dSPeter Wemm 		printf("\n");
1601ec4beb5dSPeter Wemm }
1602ec4beb5dSPeter Wemm 
1603ec4beb5dSPeter Wemm void
1604ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1605ec4beb5dSPeter Wemm {
160691fbb9c1SDavid Malone 	int col = 0;
1607ec4beb5dSPeter Wemm 	char *cp;
160891fbb9c1SDavid Malone 	int width;
16099b50d902SRodney W. Grimes 	char visbuf[5];
16109b50d902SRodney W. Grimes 
161109307b25SDag-Erling Smørgrav 	printf("       \"");
16129b50d902SRodney W. Grimes 	col = 8;
16139b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
161409307b25SDag-Erling Smørgrav 		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
16159b50d902SRodney W. Grimes 		cp = visbuf;
16169b50d902SRodney W. Grimes 		/*
16179b50d902SRodney W. Grimes 		 * Keep track of printables and
16189b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
16199b50d902SRodney W. Grimes 		 */
16209b50d902SRodney W. Grimes 		if (col == 0) {
162109307b25SDag-Erling Smørgrav 			putchar('\t');
16229b50d902SRodney W. Grimes 			col = 8;
16239b50d902SRodney W. Grimes 		}
16249b50d902SRodney W. Grimes 		switch(*cp) {
16259b50d902SRodney W. Grimes 		case '\n':
16269b50d902SRodney W. Grimes 			col = 0;
162709307b25SDag-Erling Smørgrav 			putchar('\n');
16289b50d902SRodney W. Grimes 			continue;
16299b50d902SRodney W. Grimes 		case '\t':
16309b50d902SRodney W. Grimes 			width = 8 - (col&07);
16319b50d902SRodney W. Grimes 			break;
16329b50d902SRodney W. Grimes 		default:
16339b50d902SRodney W. Grimes 			width = strlen(cp);
16349b50d902SRodney W. Grimes 		}
16359b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
163609307b25SDag-Erling Smørgrav 			printf("\\\n\t");
16379b50d902SRodney W. Grimes 			col = 8;
16389b50d902SRodney W. Grimes 		}
16399b50d902SRodney W. Grimes 		col += width;
16409b50d902SRodney W. Grimes 		do {
164109307b25SDag-Erling Smørgrav 			putchar(*cp++);
16429b50d902SRodney W. Grimes 		} while (*cp);
16439b50d902SRodney W. Grimes 	}
16449b50d902SRodney W. Grimes 	if (col == 0)
164509307b25SDag-Erling Smørgrav 		printf("       ");
164609307b25SDag-Erling Smørgrav 	printf("\"\n");
16479b50d902SRodney W. Grimes }
16489b50d902SRodney W. Grimes 
1649ec4beb5dSPeter Wemm void
1650ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1651ec4beb5dSPeter Wemm {
1652ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1653ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1654ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1655ec4beb5dSPeter Wemm 	int i, binary;
1656ec4beb5dSPeter Wemm 
16574b0ae512SPawel Jakub Dawidek 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
16584b0ae512SPawel Jakub Dawidek 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
16594b0ae512SPawel Jakub Dawidek 		datalen == 1 ? "" : "s");
16604b0ae512SPawel Jakub Dawidek 	if (suppressdata)
16614b0ae512SPawel Jakub Dawidek 		return;
1662ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1663ec4beb5dSPeter Wemm 		struct winsize ws;
1664ec4beb5dSPeter Wemm 
1665ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1666ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1667ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1668ec4beb5dSPeter Wemm 		else
1669ec4beb5dSPeter Wemm 			screenwidth = 80;
1670ec4beb5dSPeter Wemm 	}
1671ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1672ec4beb5dSPeter Wemm 		datalen = maxdata;
1673ec4beb5dSPeter Wemm 
1674ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1675ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1676ec4beb5dSPeter Wemm 			continue;
1677ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1678ec4beb5dSPeter Wemm 			continue;
1679ec4beb5dSPeter Wemm 		binary = 1;
1680ec4beb5dSPeter Wemm 	}
1681ec4beb5dSPeter Wemm 	if (binary)
1682ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1683ec4beb5dSPeter Wemm 	else
1684ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1685ec4beb5dSPeter Wemm }
1686ec4beb5dSPeter Wemm 
168791fbb9c1SDavid Malone void
1688dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
16899b50d902SRodney W. Grimes {
16909289f547SJohn Baldwin 	const char *str;
16919289f547SJohn Baldwin 
16929289f547SJohn Baldwin 	print_signal(psig->signo);
16935677eef9SJilles Tjoelker 	if (psig->action == SIG_DFL) {
16949289f547SJohn Baldwin 		printf(" SIG_DFL");
16955677eef9SJilles Tjoelker 	} else {
16969289f547SJohn Baldwin 		printf(" caught handler=0x%lx mask=0x%x",
16975677eef9SJilles Tjoelker 		    (u_long)psig->action, psig->mask.__bits[0]);
169891fbb9c1SDavid Malone 	}
16999289f547SJohn Baldwin 	printf(" code=");
17009289f547SJohn Baldwin 	str = sysdecode_sigcode(psig->signo, psig->code);
17019289f547SJohn Baldwin 	if (str != NULL)
17029289f547SJohn Baldwin 		printf("%s", str);
17039289f547SJohn Baldwin 	else
17049289f547SJohn Baldwin 		printf("<invalid=%#x>", psig->code);
17059289f547SJohn Baldwin 	putchar('\n');
17069b50d902SRodney W. Grimes }
17079b50d902SRodney W. Grimes 
170891fbb9c1SDavid Malone void
170988bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
17109b50d902SRodney W. Grimes {
171109307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
17129b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
17139b50d902SRodney W. Grimes }
17149b50d902SRodney W. Grimes 
171588bf5036SJohn Baldwin void
171688bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
171788bf5036SJohn Baldwin {
171888bf5036SJohn Baldwin 	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
171988bf5036SJohn Baldwin 	    cs->user ? "user" : "kernel", cs->wmesg);
172088bf5036SJohn Baldwin }
172188bf5036SJohn Baldwin 
172291fbb9c1SDavid Malone void
1723bb1a2d4aSJohn Baldwin ktruser(int len, void *p)
172482e2dd32SPoul-Henning Kamp {
1725bb1a2d4aSJohn Baldwin 	unsigned char *cp;
1726670b9e9fSJohn Baldwin 
1727d6fb4894SJohn Baldwin 	if (sysdecode_utrace(stdout, p, len)) {
1728195aef99SBryan Drewery 		printf("\n");
1729670b9e9fSJohn Baldwin 		return;
1730670b9e9fSJohn Baldwin 	}
1731670b9e9fSJohn Baldwin 
173209307b25SDag-Erling Smørgrav 	printf("%d ", len);
1733bb1a2d4aSJohn Baldwin 	cp = p;
17343f8ba9aeSPoul-Henning Kamp 	while (len--)
1735743f9174SPoul-Henning Kamp 		if (decimal)
1736bb1a2d4aSJohn Baldwin 			printf(" %d", *cp++);
1737743f9174SPoul-Henning Kamp 		else
1738bb1a2d4aSJohn Baldwin 			printf(" %02x", *cp++);
173909307b25SDag-Erling Smørgrav 	printf("\n");
174082e2dd32SPoul-Henning Kamp }
174182e2dd32SPoul-Henning Kamp 
174291fbb9c1SDavid Malone void
17437008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp)
17447008be5bSPawel Jakub Dawidek {
17457008be5bSPawel Jakub Dawidek 
17467008be5bSPawel Jakub Dawidek 	printf("cap_rights_t ");
17479289f547SJohn Baldwin 	sysdecode_cap_rights(stdout, rightsp);
17487008be5bSPawel Jakub Dawidek 	printf("\n");
17497008be5bSPawel Jakub Dawidek }
17507008be5bSPawel Jakub Dawidek 
1751de56aee0SKonstantin Belousov static void
1752de56aee0SKonstantin Belousov ktrtimeval(struct timeval *tv)
1753de56aee0SKonstantin Belousov {
1754de56aee0SKonstantin Belousov 
1755de56aee0SKonstantin Belousov 	printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec);
1756de56aee0SKonstantin Belousov }
1757de56aee0SKonstantin Belousov 
1758de56aee0SKonstantin Belousov void
1759de56aee0SKonstantin Belousov ktritimerval(struct itimerval *it)
1760de56aee0SKonstantin Belousov {
1761de56aee0SKonstantin Belousov 
1762de56aee0SKonstantin Belousov 	printf("itimerval { .interval = ");
1763de56aee0SKonstantin Belousov 	ktrtimeval(&it->it_interval);
1764de56aee0SKonstantin Belousov 	printf(", .value = ");
1765de56aee0SKonstantin Belousov 	ktrtimeval(&it->it_value);
1766de56aee0SKonstantin Belousov 	printf(" }\n");
1767de56aee0SKonstantin Belousov }
1768de56aee0SKonstantin Belousov 
17697008be5bSPawel Jakub Dawidek void
177060e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
177160e15db9SDag-Erling Smørgrav {
177260e15db9SDag-Erling Smørgrav /*
177360e15db9SDag-Erling Smørgrav  TODO: Support additional address families
1774237abf0cSDavide Italiano 	#include <netsmb/netbios.h>
1775237abf0cSDavide Italiano 	struct sockaddr_nb	*nb;
177660e15db9SDag-Erling Smørgrav */
17779289f547SJohn Baldwin 	const char *str;
177860e15db9SDag-Erling Smørgrav 	char addr[64];
177960e15db9SDag-Erling Smørgrav 
178060e15db9SDag-Erling Smørgrav 	/*
178160e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
178260e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
178360e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
178460e15db9SDag-Erling Smørgrav 	 */
178560e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
17869289f547SJohn Baldwin 	str = sysdecode_sockaddr_family(sa->sa_family);
17879289f547SJohn Baldwin 	if (str != NULL)
17889289f547SJohn Baldwin 		printf("%s", str);
17899289f547SJohn Baldwin 	else
17909289f547SJohn Baldwin 		printf("<invalid=%d>", sa->sa_family);
179160e15db9SDag-Erling Smørgrav 	printf(", ");
179260e15db9SDag-Erling Smørgrav 
179360e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
179481a31394SDag-Erling Smørgrav 	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
179560e15db9SDag-Erling Smørgrav 		printf("invalid");				\
179660e15db9SDag-Erling Smørgrav 		break;						\
179760e15db9SDag-Erling Smørgrav 	}
179860e15db9SDag-Erling Smørgrav 
179960e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
180060e15db9SDag-Erling Smørgrav 	case AF_INET: {
180181a31394SDag-Erling Smørgrav 		struct sockaddr_in sa_in;
180260e15db9SDag-Erling Smørgrav 
180381a31394SDag-Erling Smørgrav 		memset(&sa_in, 0, sizeof(sa_in));
1804449df4ecSAndrey Zonov 		memcpy(&sa_in, sa, sa->sa_len);
180560e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
180681a31394SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
180781a31394SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in.sin_port));
180860e15db9SDag-Erling Smørgrav 		break;
180960e15db9SDag-Erling Smørgrav 	}
181060e15db9SDag-Erling Smørgrav 	case AF_INET6: {
181181a31394SDag-Erling Smørgrav 		struct sockaddr_in6 sa_in6;
181260e15db9SDag-Erling Smørgrav 
181381a31394SDag-Erling Smørgrav 		memset(&sa_in6, 0, sizeof(sa_in6));
1814449df4ecSAndrey Zonov 		memcpy(&sa_in6, sa, sa->sa_len);
181560e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
1816b9ef8051SAndrey V. Elsukov 		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1817b9ef8051SAndrey V. Elsukov 		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
181881a31394SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
181960e15db9SDag-Erling Smørgrav 		break;
182060e15db9SDag-Erling Smørgrav 	}
182160e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
182281a31394SDag-Erling Smørgrav 		struct sockaddr_un sa_un;
182360e15db9SDag-Erling Smørgrav 
182481a31394SDag-Erling Smørgrav 		memset(&sa_un, 0, sizeof(sa_un));
1825449df4ecSAndrey Zonov 		memcpy(&sa_un, sa, sa->sa_len);
182681a31394SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
182760e15db9SDag-Erling Smørgrav 		break;
182860e15db9SDag-Erling Smørgrav 	}
182960e15db9SDag-Erling Smørgrav 	default:
183060e15db9SDag-Erling Smørgrav 		printf("unknown address family");
183160e15db9SDag-Erling Smørgrav 	}
183260e15db9SDag-Erling Smørgrav 	printf(" }\n");
183360e15db9SDag-Erling Smørgrav }
183460e15db9SDag-Erling Smørgrav 
183560e15db9SDag-Erling Smørgrav void
183660e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
183760e15db9SDag-Erling Smørgrav {
183860e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
183960e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
184060e15db9SDag-Erling Smørgrav 	struct group  *grp;
184160e15db9SDag-Erling Smørgrav 	struct tm *tm;
184260e15db9SDag-Erling Smørgrav 
184360e15db9SDag-Erling Smørgrav 	/*
184460e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
184560e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
184660e15db9SDag-Erling Smørgrav 	 */
184760e15db9SDag-Erling Smørgrav 	printf("struct stat {");
184856f0ad0dSDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, ",
184956f0ad0dSDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
185056f0ad0dSDag-Erling Smørgrav 	if (resolv == 0)
185156f0ad0dSDag-Erling Smørgrav 		printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
185256f0ad0dSDag-Erling Smørgrav 	else {
185360e15db9SDag-Erling Smørgrav 		strmode(statp->st_mode, mode);
185456f0ad0dSDag-Erling Smørgrav 		printf("mode=%s, ", mode);
185556f0ad0dSDag-Erling Smørgrav 	}
185656f0ad0dSDag-Erling Smørgrav 	printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
18574622f0e1SPawel Jakub Dawidek 	if (resolv == 0) {
18584622f0e1SPawel Jakub Dawidek 		pwd = NULL;
18594622f0e1SPawel Jakub Dawidek 	} else {
18602560d181SMariusz Zaborski #ifdef WITH_CASPER
18614622f0e1SPawel Jakub Dawidek 		if (cappwd != NULL)
18624622f0e1SPawel Jakub Dawidek 			pwd = cap_getpwuid(cappwd, statp->st_uid);
18634622f0e1SPawel Jakub Dawidek 		else
18644622f0e1SPawel Jakub Dawidek #endif
18654622f0e1SPawel Jakub Dawidek 			pwd = getpwuid(statp->st_uid);
18664622f0e1SPawel Jakub Dawidek 	}
18674622f0e1SPawel Jakub Dawidek 	if (pwd == NULL)
186860e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
186960e15db9SDag-Erling Smørgrav 	else
187060e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
18714622f0e1SPawel Jakub Dawidek 	if (resolv == 0) {
18724622f0e1SPawel Jakub Dawidek 		grp = NULL;
18734622f0e1SPawel Jakub Dawidek 	} else {
18742560d181SMariusz Zaborski #ifdef WITH_CASPER
18754622f0e1SPawel Jakub Dawidek 		if (capgrp != NULL)
18764622f0e1SPawel Jakub Dawidek 			grp = cap_getgrgid(capgrp, statp->st_gid);
18774622f0e1SPawel Jakub Dawidek 		else
18784622f0e1SPawel Jakub Dawidek #endif
18794622f0e1SPawel Jakub Dawidek 			grp = getgrgid(statp->st_gid);
18804622f0e1SPawel Jakub Dawidek 	}
18814622f0e1SPawel Jakub Dawidek 	if (grp == NULL)
188260e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
188360e15db9SDag-Erling Smørgrav 	else
188460e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
188560e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
188660e15db9SDag-Erling Smørgrav 	printf("atime=");
188760e15db9SDag-Erling Smørgrav 	if (resolv == 0)
188899742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
188960e15db9SDag-Erling Smørgrav 	else {
189099742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
189109307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
189260e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
189360e15db9SDag-Erling Smørgrav 	}
189499742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
189599742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
189660e15db9SDag-Erling Smørgrav 	else
189760e15db9SDag-Erling Smørgrav 		printf(", ");
18980e80f258SEnji Cooper 	printf("mtime=");
189960e15db9SDag-Erling Smørgrav 	if (resolv == 0)
190099742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
190160e15db9SDag-Erling Smørgrav 	else {
190299742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
190309307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
190460e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
190560e15db9SDag-Erling Smørgrav 	}
190699742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
190799742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
190860e15db9SDag-Erling Smørgrav 	else
190960e15db9SDag-Erling Smørgrav 		printf(", ");
191060e15db9SDag-Erling Smørgrav 	printf("ctime=");
191160e15db9SDag-Erling Smørgrav 	if (resolv == 0)
191299742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
191360e15db9SDag-Erling Smørgrav 	else {
191499742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
191509307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
191660e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
191760e15db9SDag-Erling Smørgrav 	}
191899742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
191999742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
192060e15db9SDag-Erling Smørgrav 	else
192160e15db9SDag-Erling Smørgrav 		printf(", ");
192260e15db9SDag-Erling Smørgrav 	printf("birthtime=");
192360e15db9SDag-Erling Smørgrav 	if (resolv == 0)
192499742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
192560e15db9SDag-Erling Smørgrav 	else {
192699742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
192709307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
192860e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
192960e15db9SDag-Erling Smørgrav 	}
193099742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
193199742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
193260e15db9SDag-Erling Smørgrav 	else
193360e15db9SDag-Erling Smørgrav 		printf(", ");
193460e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
193560e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
193660e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
193760e15db9SDag-Erling Smørgrav 	printf(" }\n");
193860e15db9SDag-Erling Smørgrav }
193960e15db9SDag-Erling Smørgrav 
194060e15db9SDag-Erling Smørgrav void
194160e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
194260e15db9SDag-Erling Smørgrav {
194360e15db9SDag-Erling Smørgrav 	char *name, *data;
194460e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
194560e15db9SDag-Erling Smørgrav 	int i;
19467008be5bSPawel Jakub Dawidek 	cap_rights_t rights;
1947de56aee0SKonstantin Belousov 	struct itimerval it;
194830c1278fSWarner Losh 	struct stat sb;
194930c1278fSWarner Losh 	struct sockaddr_storage ss;
195060e15db9SDag-Erling Smørgrav 
195160e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
195260e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
195360e15db9SDag-Erling Smørgrav 	     ++namelen)
195460e15db9SDag-Erling Smørgrav 		/* nothing */;
195560e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
195660e15db9SDag-Erling Smørgrav 		goto invalid;
195760e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
195860e15db9SDag-Erling Smørgrav 		goto invalid;
195960e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
196060e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
196160e15db9SDag-Erling Smørgrav 	if (datalen == 0)
196260e15db9SDag-Erling Smørgrav 		goto invalid;
196360e15db9SDag-Erling Smørgrav 	/* sanity check */
196481a31394SDag-Erling Smørgrav 	for (i = 0; i < (int)namelen; ++i)
196581a31394SDag-Erling Smørgrav 		if (!isalpha(name[i]))
196660e15db9SDag-Erling Smørgrav 			goto invalid;
19677008be5bSPawel Jakub Dawidek 	if (strcmp(name, "caprights") == 0) {
19687008be5bSPawel Jakub Dawidek 		if (datalen != sizeof(cap_rights_t))
19697008be5bSPawel Jakub Dawidek 			goto invalid;
19707008be5bSPawel Jakub Dawidek 		memcpy(&rights, data, datalen);
19717008be5bSPawel Jakub Dawidek 		ktrcaprights(&rights);
1972de56aee0SKonstantin Belousov 	} else if (strcmp(name, "itimerval") == 0) {
1973de56aee0SKonstantin Belousov 		if (datalen != sizeof(struct itimerval))
1974de56aee0SKonstantin Belousov 			goto invalid;
1975de56aee0SKonstantin Belousov 		memcpy(&it, data, datalen);
1976de56aee0SKonstantin Belousov 		ktritimerval(&it);
19777008be5bSPawel Jakub Dawidek 	} else if (strcmp(name, "stat") == 0) {
197860e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
197960e15db9SDag-Erling Smørgrav 			goto invalid;
198030c1278fSWarner Losh 		memcpy(&sb, data, datalen);
198130c1278fSWarner Losh 		ktrstat(&sb);
198260e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
198330c1278fSWarner Losh 		if (datalen > sizeof(ss))
198460e15db9SDag-Erling Smørgrav 			goto invalid;
198530c1278fSWarner Losh 		memcpy(&ss, data, datalen);
19864b03484fSAndrey Zonov 		if (datalen != ss.ss_len)
198730c1278fSWarner Losh 			goto invalid;
198830c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
198960e15db9SDag-Erling Smørgrav 	} else {
199060e15db9SDag-Erling Smørgrav 		printf("unknown structure\n");
199160e15db9SDag-Erling Smørgrav 	}
199260e15db9SDag-Erling Smørgrav 	return;
199360e15db9SDag-Erling Smørgrav invalid:
199460e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
199560e15db9SDag-Erling Smørgrav }
199660e15db9SDag-Erling Smørgrav 
1997c601ad8eSDag-Erling Smørgrav void
1998c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
1999c601ad8eSDag-Erling Smørgrav {
2000e141be6fSDag-Erling Smørgrav 	switch (ktr->cap_type) {
2001e141be6fSDag-Erling Smørgrav 	case CAPFAIL_NOTCAPABLE:
2002e141be6fSDag-Erling Smørgrav 		/* operation on fd with insufficient capabilities */
2003e141be6fSDag-Erling Smørgrav 		printf("operation requires ");
20049289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_needed);
20052c93e2a3SPawel Jakub Dawidek 		printf(", descriptor holds ");
20069289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_held);
2007e141be6fSDag-Erling Smørgrav 		break;
2008e141be6fSDag-Erling Smørgrav 	case CAPFAIL_INCREASE:
2009e141be6fSDag-Erling Smørgrav 		/* requested more capabilities than fd already has */
2010e141be6fSDag-Erling Smørgrav 		printf("attempt to increase capabilities from ");
20119289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_held);
201260e45df8SDag-Erling Smørgrav 		printf(" to ");
20139289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_needed);
2014e141be6fSDag-Erling Smørgrav 		break;
2015e141be6fSDag-Erling Smørgrav 	case CAPFAIL_SYSCALL:
2016e141be6fSDag-Erling Smørgrav 		/* called restricted syscall */
2017e141be6fSDag-Erling Smørgrav 		printf("disallowed system call");
2018e141be6fSDag-Erling Smørgrav 		break;
2019e141be6fSDag-Erling Smørgrav 	case CAPFAIL_LOOKUP:
2020e141be6fSDag-Erling Smørgrav 		/* used ".." in strict-relative mode */
2021e141be6fSDag-Erling Smørgrav 		printf("restricted VFS lookup");
2022e141be6fSDag-Erling Smørgrav 		break;
2023e141be6fSDag-Erling Smørgrav 	default:
2024e141be6fSDag-Erling Smørgrav 		printf("unknown capability failure: ");
20259289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_needed);
2026e141be6fSDag-Erling Smørgrav 		printf(" ");
20279289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_held);
2028e141be6fSDag-Erling Smørgrav 		break;
2029e141be6fSDag-Erling Smørgrav 	}
203035818d2eSJohn Baldwin 	printf("\n");
203135818d2eSJohn Baldwin }
203235818d2eSJohn Baldwin 
203335818d2eSJohn Baldwin void
203435818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
203535818d2eSJohn Baldwin {
203635818d2eSJohn Baldwin 
203778ec874dSDmitry Chagin 	printf("0x%jx ", (uintmax_t)ktr->vaddr);
20389289f547SJohn Baldwin 	print_mask_arg(sysdecode_vmprot, ktr->type);
203935818d2eSJohn Baldwin 	printf("\n");
204035818d2eSJohn Baldwin }
204135818d2eSJohn Baldwin 
204235818d2eSJohn Baldwin void
204335818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
204435818d2eSJohn Baldwin {
20459289f547SJohn Baldwin 	const char *str;
204635818d2eSJohn Baldwin 
20479289f547SJohn Baldwin 	str = sysdecode_vmresult(ktr->result);
20489289f547SJohn Baldwin 	if (str != NULL)
20499289f547SJohn Baldwin 		printf("%s", str);
20509289f547SJohn Baldwin 	else
20519289f547SJohn Baldwin 		printf("<invalid=%d>", ktr->result);
205235818d2eSJohn Baldwin 	printf("\n");
2053c601ad8eSDag-Erling Smørgrav }
2054c601ad8eSDag-Erling Smørgrav 
205560e15db9SDag-Erling Smørgrav void
2056ffb66079SJohn Baldwin ktrkevent(struct kevent *kev)
2057ffb66079SJohn Baldwin {
2058ffb66079SJohn Baldwin 
2059ffb66079SJohn Baldwin 	printf("{ ident=");
2060ffb66079SJohn Baldwin 	switch (kev->filter) {
2061ffb66079SJohn Baldwin 	case EVFILT_READ:
2062ffb66079SJohn Baldwin 	case EVFILT_WRITE:
2063ffb66079SJohn Baldwin 	case EVFILT_VNODE:
2064ffb66079SJohn Baldwin 	case EVFILT_PROC:
2065ffb66079SJohn Baldwin 	case EVFILT_TIMER:
2066ffb66079SJohn Baldwin 	case EVFILT_PROCDESC:
2067ffb66079SJohn Baldwin 	case EVFILT_EMPTY:
2068ffb66079SJohn Baldwin 		printf("%ju", (uintmax_t)kev->ident);
2069ffb66079SJohn Baldwin 		break;
2070ffb66079SJohn Baldwin 	case EVFILT_SIGNAL:
2071ffb66079SJohn Baldwin 		print_signal(kev->ident);
2072ffb66079SJohn Baldwin 		break;
2073ffb66079SJohn Baldwin 	default:
2074ffb66079SJohn Baldwin 		printf("%p", (void *)kev->ident);
2075ffb66079SJohn Baldwin 	}
2076ffb66079SJohn Baldwin 	printf(", filter=");
2077ffb66079SJohn Baldwin 	print_integer_arg(sysdecode_kevent_filter, kev->filter);
2078ffb66079SJohn Baldwin 	printf(", flags=");
2079ffb66079SJohn Baldwin 	print_mask_arg0(sysdecode_kevent_flags, kev->flags);
2080ffb66079SJohn Baldwin 	printf(", fflags=");
2081ffb66079SJohn Baldwin 	sysdecode_kevent_fflags(stdout, kev->filter, kev->fflags,
2082ffb66079SJohn Baldwin 	    decimal ? 10 : 16);
2083ffb66079SJohn Baldwin 	printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata);
2084ffb66079SJohn Baldwin }
2085ffb66079SJohn Baldwin 
2086ffb66079SJohn Baldwin void
2087ffb66079SJohn Baldwin ktrstructarray(struct ktr_struct_array *ksa, size_t buflen)
2088ffb66079SJohn Baldwin {
2089ffb66079SJohn Baldwin 	struct kevent kev;
2090ffb66079SJohn Baldwin 	char *name, *data;
2091ffb66079SJohn Baldwin 	size_t namelen, datalen;
2092ffb66079SJohn Baldwin 	int i;
2093ffb66079SJohn Baldwin 	bool first;
2094ffb66079SJohn Baldwin 
2095ffb66079SJohn Baldwin 	buflen -= sizeof(*ksa);
2096ffb66079SJohn Baldwin 	for (name = (char *)(ksa + 1), namelen = 0;
2097ffb66079SJohn Baldwin 	     namelen < buflen && name[namelen] != '\0';
2098ffb66079SJohn Baldwin 	     ++namelen)
2099ffb66079SJohn Baldwin 		/* nothing */;
2100ffb66079SJohn Baldwin 	if (namelen == buflen)
2101ffb66079SJohn Baldwin 		goto invalid;
2102ffb66079SJohn Baldwin 	if (name[namelen] != '\0')
2103ffb66079SJohn Baldwin 		goto invalid;
2104ffb66079SJohn Baldwin 	/* sanity check */
2105ffb66079SJohn Baldwin 	for (i = 0; i < (int)namelen; ++i)
2106ffb66079SJohn Baldwin 		if (!isalnum(name[i]) && name[i] != '_')
2107ffb66079SJohn Baldwin 			goto invalid;
2108ffb66079SJohn Baldwin 	data = name + namelen + 1;
2109ffb66079SJohn Baldwin 	datalen = buflen - namelen - 1;
2110ffb66079SJohn Baldwin 	printf("struct %s[] = { ", name);
2111ffb66079SJohn Baldwin 	first = true;
2112ffb66079SJohn Baldwin 	for (; datalen >= ksa->struct_size;
2113ffb66079SJohn Baldwin 	    data += ksa->struct_size, datalen -= ksa->struct_size) {
2114ffb66079SJohn Baldwin 		if (!first)
2115ffb66079SJohn Baldwin 			printf("\n             ");
2116ffb66079SJohn Baldwin 		else
2117ffb66079SJohn Baldwin 			first = false;
2118ffb66079SJohn Baldwin 		if (strcmp(name, "kevent") == 0) {
2119ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev))
2120ffb66079SJohn Baldwin 				goto bad_size;
2121ffb66079SJohn Baldwin 			memcpy(&kev, data, sizeof(kev));
2122ffb66079SJohn Baldwin 			ktrkevent(&kev);
2123ffb66079SJohn Baldwin 		} else if (strcmp(name, "kevent_freebsd11") == 0) {
2124ffb66079SJohn Baldwin 			struct kevent_freebsd11 kev11;
2125ffb66079SJohn Baldwin 
2126ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev11))
2127ffb66079SJohn Baldwin 				goto bad_size;
2128ffb66079SJohn Baldwin 			memcpy(&kev11, data, sizeof(kev11));
2129ffb66079SJohn Baldwin 			memset(&kev, 0, sizeof(kev));
2130ffb66079SJohn Baldwin 			kev.ident = kev11.ident;
2131ffb66079SJohn Baldwin 			kev.filter = kev11.filter;
2132ffb66079SJohn Baldwin 			kev.flags = kev11.flags;
2133ffb66079SJohn Baldwin 			kev.fflags = kev11.fflags;
2134ffb66079SJohn Baldwin 			kev.data = kev11.data;
2135ffb66079SJohn Baldwin 			kev.udata = kev11.udata;
2136ffb66079SJohn Baldwin 			ktrkevent(&kev);
2137ffb66079SJohn Baldwin #ifdef _WANT_KEVENT32
2138ffb66079SJohn Baldwin 		} else if (strcmp(name, "kevent32") == 0) {
2139ffb66079SJohn Baldwin 			struct kevent32 kev32;
2140ffb66079SJohn Baldwin 
2141ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev32))
2142ffb66079SJohn Baldwin 				goto bad_size;
2143ffb66079SJohn Baldwin 			memcpy(&kev32, data, sizeof(kev32));
2144ffb66079SJohn Baldwin 			memset(&kev, 0, sizeof(kev));
2145ffb66079SJohn Baldwin 			kev.ident = kev32.ident;
2146ffb66079SJohn Baldwin 			kev.filter = kev32.filter;
2147ffb66079SJohn Baldwin 			kev.flags = kev32.flags;
2148ffb66079SJohn Baldwin 			kev.fflags = kev32.fflags;
2149ffb66079SJohn Baldwin #if BYTE_ORDER == BIG_ENDIAN
2150ffb66079SJohn Baldwin 			kev.data = kev32.data2 | ((int64_t)kev32.data1 << 32);
2151ffb66079SJohn Baldwin #else
2152ffb66079SJohn Baldwin 			kev.data = kev32.data1 | ((int64_t)kev32.data2 << 32);
2153ffb66079SJohn Baldwin #endif
2154ffb66079SJohn Baldwin 			kev.udata = (void *)(uintptr_t)kev32.udata;
2155ffb66079SJohn Baldwin 			ktrkevent(&kev);
2156ffb66079SJohn Baldwin 		} else if (strcmp(name, "kevent32_freebsd11") == 0) {
2157ffb66079SJohn Baldwin 			struct kevent32_freebsd11 kev32;
2158ffb66079SJohn Baldwin 
2159ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev32))
2160ffb66079SJohn Baldwin 				goto bad_size;
2161ffb66079SJohn Baldwin 			memcpy(&kev32, data, sizeof(kev32));
2162ffb66079SJohn Baldwin 			memset(&kev, 0, sizeof(kev));
2163ffb66079SJohn Baldwin 			kev.ident = kev32.ident;
2164ffb66079SJohn Baldwin 			kev.filter = kev32.filter;
2165ffb66079SJohn Baldwin 			kev.flags = kev32.flags;
2166ffb66079SJohn Baldwin 			kev.fflags = kev32.fflags;
2167ffb66079SJohn Baldwin 			kev.data = kev32.data;
2168ffb66079SJohn Baldwin 			kev.udata = (void *)(uintptr_t)kev32.udata;
2169ffb66079SJohn Baldwin 			ktrkevent(&kev);
2170ffb66079SJohn Baldwin #endif
2171ffb66079SJohn Baldwin 		} else {
2172ffb66079SJohn Baldwin 			printf("<unknown structure> }\n");
2173ffb66079SJohn Baldwin 			return;
2174ffb66079SJohn Baldwin 		}
2175ffb66079SJohn Baldwin 	}
2176ffb66079SJohn Baldwin 	printf(" }\n");
2177ffb66079SJohn Baldwin 	return;
2178ffb66079SJohn Baldwin invalid:
2179ffb66079SJohn Baldwin 	printf("invalid record\n");
2180ffb66079SJohn Baldwin 	return;
2181ffb66079SJohn Baldwin bad_size:
2182ffb66079SJohn Baldwin 	printf("<bad size> }\n");
2183ffb66079SJohn Baldwin 	return;
2184ffb66079SJohn Baldwin }
2185ffb66079SJohn Baldwin 
2186ffb66079SJohn Baldwin void
218791fbb9c1SDavid Malone usage(void)
21889b50d902SRodney W. Grimes {
2189b9034ce2SBryan Drewery 	fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
2190da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
21919b50d902SRodney W. Grimes 	exit(1);
21929b50d902SRodney W. Grimes }
2193