xref: /freebsd/usr.bin/kdump/kdump.c (revision 9bec8413)
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 
32406d2926SJohn Baldwin #define _WANT_KERNEL_ERRNO
33ffb66079SJohn Baldwin #ifdef __LP64__
34ffb66079SJohn Baldwin #define	_WANT_KEVENT32
35ffb66079SJohn Baldwin #endif
36ffb66079SJohn Baldwin #define	_WANT_FREEBSD11_KEVENT
37586ed321SDmitry Chagin #define	_WANT_FREEBSD_BITSET
389b50d902SRodney W. Grimes #include <sys/param.h>
39b881b8beSRobert Watson #include <sys/capsicum.h>
40586ed321SDmitry Chagin #include <sys/_bitset.h>
41586ed321SDmitry Chagin #include <sys/bitset.h>
429b50d902SRodney W. Grimes #include <sys/errno.h>
439b50d902SRodney W. Grimes #include <sys/time.h>
449b50d902SRodney W. Grimes #include <sys/uio.h>
45ffb66079SJohn Baldwin #include <sys/event.h>
469b50d902SRodney W. Grimes #include <sys/ktrace.h>
47550bec4fSKyle Evans #include <sys/mman.h>
489b50d902SRodney W. Grimes #include <sys/ioctl.h>
4902c57f7bSKyle Evans #include <sys/poll.h>
508bc31d83SCraig Rodrigues #include <sys/socket.h>
5160e15db9SDag-Erling Smørgrav #include <sys/stat.h>
527144d36fSDmitry Chagin #include <sys/sysent.h>
53fdb5bf37SJohn Baldwin #include <sys/umtx.h>
5460e15db9SDag-Erling Smørgrav #include <sys/un.h>
557144d36fSDmitry Chagin #include <sys/queue.h>
5634763d1cSJohn Baldwin #include <sys/wait.h>
572560d181SMariusz Zaborski #ifdef WITH_CASPER
58c36e54bbSMariusz Zaborski #include <sys/nv.h>
59c36e54bbSMariusz Zaborski #endif
601a604cfaSXin LI #include <arpa/inet.h>
6160e15db9SDag-Erling Smørgrav #include <netinet/in.h>
621a604cfaSXin LI #include <ctype.h>
63a4e3fc54SMariusz Zaborski #include <capsicum_helpers.h>
6415fc002bSPhilippe Charnier #include <err.h>
6560e15db9SDag-Erling Smørgrav #include <grp.h>
6660e15db9SDag-Erling Smørgrav #include <inttypes.h>
6715fc002bSPhilippe Charnier #include <locale.h>
68b9ef8051SAndrey V. Elsukov #include <netdb.h>
69f9b20fc8SPawel Jakub Dawidek #include <nl_types.h>
7060e15db9SDag-Erling Smørgrav #include <pwd.h>
7171ed318eSJohn Baldwin #include <stddef.h>
729b50d902SRodney W. Grimes #include <stdio.h>
739b50d902SRodney W. Grimes #include <stdlib.h>
749b50d902SRodney W. Grimes #include <string.h>
75d6fb4894SJohn Baldwin #include <sysdecode.h>
7660e15db9SDag-Erling Smørgrav #include <time.h>
7715fc002bSPhilippe Charnier #include <unistd.h>
7815fc002bSPhilippe Charnier #include <vis.h>
799b50d902SRodney W. Grimes #include "ktrace.h"
808b8e2e8fSDmitry Chagin #include "kdump.h"
819b50d902SRodney W. Grimes 
822560d181SMariusz Zaborski #ifdef WITH_CASPER
83c501d73cSMariusz Zaborski #include <libcasper.h>
84c501d73cSMariusz Zaborski 
85c501d73cSMariusz Zaborski #include <casper/cap_grp.h>
86c501d73cSMariusz Zaborski #include <casper/cap_pwd.h>
87c501d73cSMariusz Zaborski #endif
88c501d73cSMariusz Zaborski 
897144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
907cf2ca3bSJohn Baldwin u_int findabi(struct ktr_header *);
9191fbb9c1SDavid Malone int fread_tail(void *, int, int);
927cf2ca3bSJohn Baldwin void dumpheader(struct ktr_header *, u_int);
93fc90f3a2SDmitry Chagin void dumptimeval(struct ktr_header_v0 *kth);
94fc90f3a2SDmitry Chagin void dumptimespec(struct ktr_header *kth);
957144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
967144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9791fbb9c1SDavid Malone void ktrnamei(char *, int);
98ec4beb5dSPeter Wemm void hexdump(char *, int, int);
99ec4beb5dSPeter Wemm void visdump(char *, int, int);
10091fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
101dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10291fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10388bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
104bb1a2d4aSJohn Baldwin void ktruser(int, void *);
1057008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *);
106de56aee0SKonstantin Belousov void ktritimerval(struct itimerval *it);
10760e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
10860e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
10960e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
110c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11135818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11235818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
113ffb66079SJohn Baldwin void ktrkevent(struct kevent *);
11402c57f7bSKyle Evans void ktrpollfd(struct pollfd *);
115ffb66079SJohn Baldwin void ktrstructarray(struct ktr_struct_array *, size_t);
116586ed321SDmitry Chagin void ktrbitset(char *, struct bitset *, size_t);
1178a0f6d8cSDmitry Chagin void ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip,
1188a0f6d8cSDmitry Chagin     int *resnarg, char *resc, u_int sv_flags);
11991fbb9c1SDavid Malone void usage(void);
12091fbb9c1SDavid Malone 
121c1269d20SMaxim Sobolev #define	TIMESTAMP_NONE		0x0
122c1269d20SMaxim Sobolev #define	TIMESTAMP_ABSOLUTE	0x1
123c1269d20SMaxim Sobolev #define	TIMESTAMP_ELAPSED	0x2
124c1269d20SMaxim Sobolev #define	TIMESTAMP_RELATIVE	0x4
125c1269d20SMaxim Sobolev 
1268b8e2e8fSDmitry Chagin bool decimal, fancy = true, resolv;
127fc90f3a2SDmitry Chagin static bool abiflag, suppressdata, syscallno, tail, threads, cpuflag;
1285cb9940cSJohn Baldwin static int timestamp, maxdata;
129bb1a2d4aSJohn Baldwin static const char *tracefile = DEF_TRACEFILE;
130bb1a2d4aSJohn Baldwin static struct ktr_header ktr_header;
131fc90f3a2SDmitry Chagin static short version;
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 
1367144d36fSDmitry Chagin struct proc_info
1377144d36fSDmitry Chagin {
1387144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1397144d36fSDmitry Chagin 	u_int			sv_flags;
1407144d36fSDmitry Chagin 	pid_t			pid;
1417144d36fSDmitry Chagin };
1427144d36fSDmitry Chagin 
143bb1a2d4aSJohn Baldwin static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1447144d36fSDmitry Chagin 
1452560d181SMariusz Zaborski #ifdef WITH_CASPER
1464622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp;
1474622f0e1SPawel Jakub Dawidek 
1484622f0e1SPawel Jakub Dawidek static int
cappwdgrp_setup(cap_channel_t ** cappwdp,cap_channel_t ** capgrpp)1494622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
1504622f0e1SPawel Jakub Dawidek {
1514622f0e1SPawel Jakub Dawidek 	cap_channel_t *capcas, *cappwdloc, *capgrploc;
1524622f0e1SPawel Jakub Dawidek 	const char *cmds[1], *fields[1];
1534622f0e1SPawel Jakub Dawidek 
1544622f0e1SPawel Jakub Dawidek 	capcas = cap_init();
1554622f0e1SPawel Jakub Dawidek 	if (capcas == NULL) {
156c501d73cSMariusz Zaborski 		err(1, "unable to create casper process");
157c501d73cSMariusz Zaborski 		exit(1);
1584622f0e1SPawel Jakub Dawidek 	}
1594622f0e1SPawel Jakub Dawidek 	cappwdloc = cap_service_open(capcas, "system.pwd");
1604622f0e1SPawel Jakub Dawidek 	capgrploc = cap_service_open(capcas, "system.grp");
1614622f0e1SPawel Jakub Dawidek 	/* Casper capability no longer needed. */
1624622f0e1SPawel Jakub Dawidek 	cap_close(capcas);
1634622f0e1SPawel Jakub Dawidek 	if (cappwdloc == NULL || capgrploc == NULL) {
1644622f0e1SPawel Jakub Dawidek 		if (cappwdloc == NULL)
1654622f0e1SPawel Jakub Dawidek 			warn("unable to open system.pwd service");
1664622f0e1SPawel Jakub Dawidek 		if (capgrploc == NULL)
1674622f0e1SPawel Jakub Dawidek 			warn("unable to open system.grp service");
1688ff3952bSPawel Jakub Dawidek 		exit(1);
1694622f0e1SPawel Jakub Dawidek 	}
1704622f0e1SPawel Jakub Dawidek 	/* Limit system.pwd to only getpwuid() function and pw_name field. */
1714622f0e1SPawel Jakub Dawidek 	cmds[0] = "getpwuid";
1728ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0)
1738ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
1744622f0e1SPawel Jakub Dawidek 	fields[0] = "pw_name";
1758ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0)
1768ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
1774622f0e1SPawel Jakub Dawidek 	/* Limit system.grp to only getgrgid() function and gr_name field. */
1784622f0e1SPawel Jakub Dawidek 	cmds[0] = "getgrgid";
1798ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0)
1808ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
1814622f0e1SPawel Jakub Dawidek 	fields[0] = "gr_name";
1828ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_fields(capgrploc, fields, 1) < 0)
1838ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
1844622f0e1SPawel Jakub Dawidek 
1854622f0e1SPawel Jakub Dawidek 	*cappwdp = cappwdloc;
1864622f0e1SPawel Jakub Dawidek 	*capgrpp = capgrploc;
1874622f0e1SPawel Jakub Dawidek 	return (0);
1884622f0e1SPawel Jakub Dawidek }
1892560d181SMariusz Zaborski #endif	/* WITH_CASPER */
1904622f0e1SPawel Jakub Dawidek 
1918b8e2e8fSDmitry Chagin void
print_integer_arg(const char * (* decoder)(int),int value)1929289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), int value)
1939289f547SJohn Baldwin {
1949289f547SJohn Baldwin 	const char *str;
1959289f547SJohn Baldwin 
1969289f547SJohn Baldwin 	str = decoder(value);
1979289f547SJohn Baldwin 	if (str != NULL)
1989289f547SJohn Baldwin 		printf("%s", str);
1999289f547SJohn Baldwin 	else {
2009289f547SJohn Baldwin 		if (decimal)
2019289f547SJohn Baldwin 			printf("<invalid=%d>", value);
2029289f547SJohn Baldwin 		else
2039289f547SJohn Baldwin 			printf("<invalid=%#x>", value);
2049289f547SJohn Baldwin 	}
2059289f547SJohn Baldwin }
2069289f547SJohn Baldwin 
2079289f547SJohn Baldwin /* Like print_integer_arg but unknown values are treated as valid. */
2088b8e2e8fSDmitry Chagin void
print_integer_arg_valid(const char * (* decoder)(int),int value)2099289f547SJohn Baldwin print_integer_arg_valid(const char *(*decoder)(int), int value)
2109289f547SJohn Baldwin {
2119289f547SJohn Baldwin 	const char *str;
2129289f547SJohn Baldwin 
2139289f547SJohn Baldwin 	str = decoder(value);
2149289f547SJohn Baldwin 	if (str != NULL)
2159289f547SJohn Baldwin 		printf("%s", str);
2169289f547SJohn Baldwin 	else {
2179289f547SJohn Baldwin 		if (decimal)
2189289f547SJohn Baldwin 			printf("%d", value);
2199289f547SJohn Baldwin 		else
2209289f547SJohn Baldwin 			printf("%#x", value);
2219289f547SJohn Baldwin 	}
2229289f547SJohn Baldwin }
2239289f547SJohn Baldwin 
2248b8e2e8fSDmitry Chagin bool
print_mask_arg_part(bool (* decoder)(FILE *,int,int *),int value,int * rem)225c2679dd7SKyle Evans print_mask_arg_part(bool (*decoder)(FILE *, int, int *), int value, int *rem)
226c2679dd7SKyle Evans {
227c2679dd7SKyle Evans 
228c2679dd7SKyle Evans 	printf("%#x<", value);
229c2679dd7SKyle Evans 	return (decoder(stdout, value, rem));
230c2679dd7SKyle Evans }
231c2679dd7SKyle Evans 
2328b8e2e8fSDmitry Chagin void
print_mask_arg(bool (* decoder)(FILE *,int,int *),int value)2339289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), int value)
2349289f547SJohn Baldwin {
2359289f547SJohn Baldwin 	bool invalid;
2369289f547SJohn Baldwin 	int rem;
2379289f547SJohn Baldwin 
238c2679dd7SKyle Evans 	invalid = !print_mask_arg_part(decoder, value, &rem);
2399289f547SJohn Baldwin 	printf(">");
2409289f547SJohn Baldwin 	if (invalid)
2419289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2429289f547SJohn Baldwin }
2439289f547SJohn Baldwin 
2448b8e2e8fSDmitry Chagin void
print_mask_arg0(bool (* decoder)(FILE *,int,int *),int value)2459289f547SJohn Baldwin print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value)
2469289f547SJohn Baldwin {
2479289f547SJohn Baldwin 	bool invalid;
2489289f547SJohn Baldwin 	int rem;
2499289f547SJohn Baldwin 
2509289f547SJohn Baldwin 	if (value == 0) {
2519289f547SJohn Baldwin 		printf("0");
2529289f547SJohn Baldwin 		return;
2539289f547SJohn Baldwin 	}
2549289f547SJohn Baldwin 	printf("%#x<", value);
2559289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
2569289f547SJohn Baldwin 	printf(">");
2579289f547SJohn Baldwin 	if (invalid)
2589289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2599289f547SJohn Baldwin }
2609289f547SJohn Baldwin 
2619289f547SJohn Baldwin static void
decode_fileflags(fflags_t value)2629289f547SJohn Baldwin decode_fileflags(fflags_t value)
2639289f547SJohn Baldwin {
2649289f547SJohn Baldwin 	bool invalid;
2659289f547SJohn Baldwin 	fflags_t rem;
2669289f547SJohn Baldwin 
2679289f547SJohn Baldwin 	if (value == 0) {
2689289f547SJohn Baldwin 		printf("0");
2699289f547SJohn Baldwin 		return;
2709289f547SJohn Baldwin 	}
2719289f547SJohn Baldwin 	printf("%#x<", value);
2729289f547SJohn Baldwin 	invalid = !sysdecode_fileflags(stdout, value, &rem);
2739289f547SJohn Baldwin 	printf(">");
2749289f547SJohn Baldwin 	if (invalid)
2759289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2769289f547SJohn Baldwin }
2779289f547SJohn Baldwin 
278ed2f123aSDmitry Chagin void
decode_filemode(int value)2799289f547SJohn Baldwin decode_filemode(int value)
2809289f547SJohn Baldwin {
2819289f547SJohn Baldwin 	bool invalid;
2829289f547SJohn Baldwin 	int rem;
2839289f547SJohn Baldwin 
2849289f547SJohn Baldwin 	if (value == 0) {
2859289f547SJohn Baldwin 		printf("0");
2869289f547SJohn Baldwin 		return;
2879289f547SJohn Baldwin 	}
2889289f547SJohn Baldwin 	printf("%#o<", value);
2899289f547SJohn Baldwin 	invalid = !sysdecode_filemode(stdout, value, &rem);
2909289f547SJohn Baldwin 	printf(">");
2919289f547SJohn Baldwin 	if (invalid)
2929289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2939289f547SJohn Baldwin }
2949289f547SJohn Baldwin 
2958b8e2e8fSDmitry Chagin void
print_mask_arg32(bool (* decoder)(FILE *,uint32_t,uint32_t *),uint32_t value)2969289f547SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value)
2979289f547SJohn Baldwin {
2989289f547SJohn Baldwin 	bool invalid;
2999289f547SJohn Baldwin 	uint32_t rem;
3009289f547SJohn Baldwin 
3019289f547SJohn Baldwin 	printf("%#x<", value);
3029289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
3039289f547SJohn Baldwin 	printf(">");
3049289f547SJohn Baldwin 	if (invalid)
3059289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3069289f547SJohn Baldwin }
3079289f547SJohn Baldwin 
3088b8e2e8fSDmitry Chagin void
print_mask_argul(bool (* decoder)(FILE *,u_long,u_long *),u_long value)3099289f547SJohn Baldwin print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value)
3109289f547SJohn Baldwin {
3119289f547SJohn Baldwin 	bool invalid;
3129289f547SJohn Baldwin 	u_long rem;
3139289f547SJohn Baldwin 
3149289f547SJohn Baldwin 	if (value == 0) {
3159289f547SJohn Baldwin 		printf("0");
3169289f547SJohn Baldwin 		return;
3179289f547SJohn Baldwin 	}
3189289f547SJohn Baldwin 	printf("%#lx<", value);
3199289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
3209289f547SJohn Baldwin 	printf(">");
3219289f547SJohn Baldwin 	if (invalid)
3229289f547SJohn Baldwin 		printf("<invalid>%lu", rem);
3239289f547SJohn Baldwin }
3249289f547SJohn Baldwin 
32591fbb9c1SDavid Malone int
main(int argc,char * argv[])32691fbb9c1SDavid Malone main(int argc, char *argv[])
3279b50d902SRodney W. Grimes {
3289b50d902SRodney W. Grimes 	int ch, ktrlen, size;
32991fbb9c1SDavid Malone 	void *m;
3309b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
331db53f66bSJohn Baldwin 	int drop_logged;
332ec4beb5dSPeter Wemm 	pid_t pid = 0;
3337144d36fSDmitry Chagin 	u_int sv_flags;
3349b50d902SRodney W. Grimes 
33509307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
3365ccbfb26SAndrey A. Chernov 
337c1269d20SMaxim Sobolev 	timestamp = TIMESTAMP_NONE;
338c1269d20SMaxim Sobolev 
339fc90f3a2SDmitry Chagin 	while ((ch = getopt(argc,argv,"f:cdElm:np:AHRrSsTt:")) != -1)
34009307b25SDag-Erling Smørgrav 		switch (ch) {
3417144d36fSDmitry Chagin 		case 'A':
3425cb9940cSJohn Baldwin 			abiflag = true;
3437144d36fSDmitry Chagin 			break;
3449b50d902SRodney W. Grimes 		case 'f':
3459b50d902SRodney W. Grimes 			tracefile = optarg;
3469b50d902SRodney W. Grimes 			break;
347fc90f3a2SDmitry Chagin 		case 'c':
348fc90f3a2SDmitry Chagin 			cpuflag = true;
349fc90f3a2SDmitry Chagin 			break;
3509b50d902SRodney W. Grimes 		case 'd':
3515cb9940cSJohn Baldwin 			decimal = true;
3529b50d902SRodney W. Grimes 			break;
3539b50d902SRodney W. Grimes 		case 'l':
3545cb9940cSJohn Baldwin 			tail = true;
3559b50d902SRodney W. Grimes 			break;
3569b50d902SRodney W. Grimes 		case 'm':
3579b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
3589b50d902SRodney W. Grimes 			break;
3599b50d902SRodney W. Grimes 		case 'n':
3605cb9940cSJohn Baldwin 			fancy = false;
3619b50d902SRodney W. Grimes 			break;
362ec4beb5dSPeter Wemm 		case 'p':
363ec4beb5dSPeter Wemm 			pid = atoi(optarg);
364ec4beb5dSPeter Wemm 			break;
36560e15db9SDag-Erling Smørgrav 		case 'r':
3665cb9940cSJohn Baldwin 			resolv = true;
36760e15db9SDag-Erling Smørgrav 			break;
368b9034ce2SBryan Drewery 		case 'S':
3695cb9940cSJohn Baldwin 			syscallno = true;
370b9034ce2SBryan Drewery 			break;
371df0c8868SRobert Watson 		case 's':
3725cb9940cSJohn Baldwin 			suppressdata = true;
373df0c8868SRobert Watson 			break;
374ec131914SPeter Wemm 		case 'E':
375c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ELAPSED;
376ec131914SPeter Wemm 			break;
377a9ac598bSRobert Watson 		case 'H':
3785cb9940cSJohn Baldwin 			threads = true;
379a9ac598bSRobert Watson 			break;
3809b50d902SRodney W. Grimes 		case 'R':
381c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_RELATIVE;
3829b50d902SRodney W. Grimes 			break;
3839b50d902SRodney W. Grimes 		case 'T':
384c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ABSOLUTE;
3859b50d902SRodney W. Grimes 			break;
3869b50d902SRodney W. Grimes 		case 't':
3879b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
38815fc002bSPhilippe Charnier 			if (trpoints < 0)
38915fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
3909b50d902SRodney W. Grimes 			break;
3919b50d902SRodney W. Grimes 		default:
3929b50d902SRodney W. Grimes 			usage();
3939b50d902SRodney W. Grimes 		}
3949b50d902SRodney W. Grimes 
39580844fd1SBill Fenner 	if (argc > optind)
3969b50d902SRodney W. Grimes 		usage();
3979b50d902SRodney W. Grimes 
39809307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
39915fc002bSPhilippe Charnier 	if (m == NULL)
40015fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
4019d0fa50eSSimon J. Gerraty 	if (strcmp(tracefile, "-") != 0)
40215fc002bSPhilippe Charnier 		if (!freopen(tracefile, "r", stdin))
40315fc002bSPhilippe Charnier 			err(1, "%s", tracefile);
404f9b20fc8SPawel Jakub Dawidek 
405c5033697SMariusz Zaborski 	caph_cache_catpages();
406c5033697SMariusz Zaborski 	caph_cache_tzdata();
407c5033697SMariusz Zaborski 
4082560d181SMariusz Zaborski #ifdef WITH_CASPER
4095cb9940cSJohn Baldwin 	if (resolv) {
4104622f0e1SPawel Jakub Dawidek 		if (cappwdgrp_setup(&cappwd, &capgrp) < 0) {
4114622f0e1SPawel Jakub Dawidek 			cappwd = NULL;
4124622f0e1SPawel Jakub Dawidek 			capgrp = NULL;
4134622f0e1SPawel Jakub Dawidek 		}
4144622f0e1SPawel Jakub Dawidek 	}
4155cb9940cSJohn Baldwin 	if (!resolv || (cappwd != NULL && capgrp != NULL)) {
4167672a014SMariusz Zaborski 		if (caph_enter() < 0)
4174622f0e1SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
4184622f0e1SPawel Jakub Dawidek 	}
4194622f0e1SPawel Jakub Dawidek #else
4205cb9940cSJohn Baldwin 	if (!resolv) {
4217672a014SMariusz Zaborski 		if (caph_enter() < 0)
422f9b20fc8SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
423d2c9ca44SPawel Jakub Dawidek 	}
4244622f0e1SPawel Jakub Dawidek #endif
425a4e3fc54SMariusz Zaborski 	if (caph_limit_stdio() == -1)
426a4e3fc54SMariusz Zaborski 		err(1, "unable to limit stdio");
427f9b20fc8SPawel Jakub Dawidek 
4287144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
429db53f66bSJohn Baldwin 	drop_logged = 0;
4309b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
431fc90f3a2SDmitry Chagin 		if (ktr_header.ktr_type & KTR_VERSIONED) {
432fc90f3a2SDmitry Chagin 			ktr_header.ktr_type &= ~KTR_VERSIONED;
433fc90f3a2SDmitry Chagin 			version = ktr_header.ktr_version;
434fc90f3a2SDmitry Chagin 		} else
435fc90f3a2SDmitry Chagin 			version = KTR_VERSION0;
436db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
437db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
438a9ac598bSRobert Watson 			if (!drop_logged && threads) {
43909307b25SDag-Erling Smørgrav 				printf(
440bb239328SBrooks Davis 				    "%6d %6d %-8.*s Events dropped.\n",
441bb239328SBrooks Davis 				    ktr_header.ktr_pid,
442c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
443bb239328SBrooks Davis 				    (lwpid_t)ktr_header.ktr_tid : 0,
444c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
445a9ac598bSRobert Watson 				drop_logged = 1;
446a9ac598bSRobert Watson 			} else if (!drop_logged) {
447bb239328SBrooks Davis 				printf("%6d %-8.*s Events dropped.\n",
448bb239328SBrooks Davis 				    ktr_header.ktr_pid, MAXCOMLEN,
449db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
450db53f66bSJohn Baldwin 				drop_logged = 1;
451db53f66bSJohn Baldwin 			}
452db53f66bSJohn Baldwin 		}
45315fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
45415fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
4559b50d902SRodney W. Grimes 		if (ktrlen > size) {
45609307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
45715fc002bSPhilippe Charnier 			if (m == NULL)
45815fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
4599b50d902SRodney W. Grimes 			size = ktrlen;
4609b50d902SRodney W. Grimes 		}
461fc90f3a2SDmitry Chagin 		if (version == KTR_VERSION0 &&
462fc90f3a2SDmitry Chagin 		    fseek(stdin, KTR_OFFSET_V0, SEEK_CUR) < 0)
463fc90f3a2SDmitry Chagin 			errx(1, "%s", strerror(errno));
46415fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
46515fc002bSPhilippe Charnier 			errx(1, "data too short");
4667144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
4677144d36fSDmitry Chagin 			continue;
46801a36e29SJohn Baldwin 		if (pid && ktr_header.ktr_pid != pid &&
46901a36e29SJohn Baldwin 		    ktr_header.ktr_tid != pid)
470ec4beb5dSPeter Wemm 			continue;
4719b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
4729b50d902SRodney W. Grimes 			continue;
4737cf2ca3bSJohn Baldwin 		sv_flags = findabi(&ktr_header);
4747cf2ca3bSJohn Baldwin 		dumpheader(&ktr_header, sv_flags);
475db53f66bSJohn Baldwin 		drop_logged = 0;
4769b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
4779b50d902SRodney W. Grimes 		case KTR_SYSCALL:
4787144d36fSDmitry Chagin 			ktrsyscall((struct ktr_syscall *)m, sv_flags);
4799b50d902SRodney W. Grimes 			break;
4809b50d902SRodney W. Grimes 		case KTR_SYSRET:
4817144d36fSDmitry Chagin 			ktrsysret((struct ktr_sysret *)m, sv_flags);
4829b50d902SRodney W. Grimes 			break;
4839b50d902SRodney W. Grimes 		case KTR_NAMEI:
484a56be37eSJohn Baldwin 		case KTR_SYSCTL:
4859b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
4869b50d902SRodney W. Grimes 			break;
4879b50d902SRodney W. Grimes 		case KTR_GENIO:
4889b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
4899b50d902SRodney W. Grimes 			break;
4909b50d902SRodney W. Grimes 		case KTR_PSIG:
491dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
4929b50d902SRodney W. Grimes 			break;
4939b50d902SRodney W. Grimes 		case KTR_CSW:
49488bf5036SJohn Baldwin 			if (ktrlen == sizeof(struct ktr_csw_old))
49588bf5036SJohn Baldwin 				ktrcsw_old((struct ktr_csw_old *)m);
49688bf5036SJohn Baldwin 			else
4979b50d902SRodney W. Grimes 				ktrcsw((struct ktr_csw *)m);
4989b50d902SRodney W. Grimes 			break;
49982e2dd32SPoul-Henning Kamp 		case KTR_USER:
5003f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
50182e2dd32SPoul-Henning Kamp 			break;
50260e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
50360e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
50460e15db9SDag-Erling Smørgrav 			break;
505c601ad8eSDag-Erling Smørgrav 		case KTR_CAPFAIL:
506c601ad8eSDag-Erling Smørgrav 			ktrcapfail((struct ktr_cap_fail *)m);
50735818d2eSJohn Baldwin 			break;
50835818d2eSJohn Baldwin 		case KTR_FAULT:
50935818d2eSJohn Baldwin 			ktrfault((struct ktr_fault *)m);
51035818d2eSJohn Baldwin 			break;
51135818d2eSJohn Baldwin 		case KTR_FAULTEND:
51235818d2eSJohn Baldwin 			ktrfaultend((struct ktr_faultend *)m);
51335818d2eSJohn Baldwin 			break;
514ffb66079SJohn Baldwin 		case KTR_STRUCT_ARRAY:
515ffb66079SJohn Baldwin 			ktrstructarray((struct ktr_struct_array *)m, ktrlen);
516ffb66079SJohn Baldwin 			break;
517b9609ab1SJohn Baldwin 		default:
518b9609ab1SJohn Baldwin 			printf("\n");
519b9609ab1SJohn Baldwin 			break;
5209b50d902SRodney W. Grimes 		}
5219b50d902SRodney W. Grimes 		if (tail)
52209307b25SDag-Erling Smørgrav 			fflush(stdout);
5239b50d902SRodney W. Grimes 	}
52491fbb9c1SDavid Malone 	return 0;
5259b50d902SRodney W. Grimes }
5269b50d902SRodney W. Grimes 
52791fbb9c1SDavid Malone int
fread_tail(void * buf,int size,int num)52891fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
5299b50d902SRodney W. Grimes {
5309b50d902SRodney W. Grimes 	int i;
5319b50d902SRodney W. Grimes 
5329b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
53309307b25SDag-Erling Smørgrav 		sleep(1);
5349b50d902SRodney W. Grimes 		clearerr(stdin);
5359b50d902SRodney W. Grimes 	}
5369b50d902SRodney W. Grimes 	return (i);
5379b50d902SRodney W. Grimes }
5389b50d902SRodney W. Grimes 
5397144d36fSDmitry Chagin int
fetchprocinfo(struct ktr_header * kth,u_int * flags)5407144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
5417144d36fSDmitry Chagin {
5427144d36fSDmitry Chagin 	struct proc_info *pi;
5437144d36fSDmitry Chagin 
5447144d36fSDmitry Chagin 	switch (kth->ktr_type) {
5457144d36fSDmitry Chagin 	case KTR_PROCCTOR:
5467144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5477144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5487144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5497144d36fSDmitry Chagin 				break;
5507144d36fSDmitry Chagin 			}
5517144d36fSDmitry Chagin 		}
5527144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
5537144d36fSDmitry Chagin 		if (pi == NULL)
5547144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
5557144d36fSDmitry Chagin 		pi->sv_flags = *flags;
5567144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
5577144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
5587144d36fSDmitry Chagin 		return (1);
5597144d36fSDmitry Chagin 
5607144d36fSDmitry Chagin 	case KTR_PROCDTOR:
5617144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5627144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5637144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5647144d36fSDmitry Chagin 				free(pi);
5657144d36fSDmitry Chagin 				break;
5667144d36fSDmitry Chagin 			}
5677144d36fSDmitry Chagin 		}
5687144d36fSDmitry Chagin 		return (1);
5697144d36fSDmitry Chagin 	}
5707144d36fSDmitry Chagin 
5717144d36fSDmitry Chagin 	return (0);
5727144d36fSDmitry Chagin }
5737144d36fSDmitry Chagin 
5747144d36fSDmitry Chagin u_int
findabi(struct ktr_header * kth)5757cf2ca3bSJohn Baldwin findabi(struct ktr_header *kth)
5767144d36fSDmitry Chagin {
5777144d36fSDmitry Chagin 	struct proc_info *pi;
5787144d36fSDmitry Chagin 
5797144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
5807144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
5817cf2ca3bSJohn Baldwin 			return (pi->sv_flags);
5827144d36fSDmitry Chagin 		}
5837144d36fSDmitry Chagin 	}
5847cf2ca3bSJohn Baldwin 	return (0);
5857144d36fSDmitry Chagin }
5867144d36fSDmitry Chagin 
58791fbb9c1SDavid Malone void
dumptimeval(struct ktr_header_v0 * kth)588fc90f3a2SDmitry Chagin dumptimeval(struct ktr_header_v0 *kth)
589fc90f3a2SDmitry Chagin {
590fc90f3a2SDmitry Chagin 	static struct timeval prevtime, prevtime_e;
591fc90f3a2SDmitry Chagin 	struct timeval temp;
592fc90f3a2SDmitry Chagin 	const char *sign;
593fc90f3a2SDmitry Chagin 
594fc90f3a2SDmitry Chagin 	if (timestamp & TIMESTAMP_ABSOLUTE) {
595fc90f3a2SDmitry Chagin 		printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
596fc90f3a2SDmitry Chagin 		    kth->ktr_time.tv_usec);
597fc90f3a2SDmitry Chagin 	}
598fc90f3a2SDmitry Chagin 	if (timestamp & TIMESTAMP_ELAPSED) {
599fc90f3a2SDmitry Chagin 		if (prevtime_e.tv_sec == 0)
600fc90f3a2SDmitry Chagin 			prevtime_e = kth->ktr_time;
601fc90f3a2SDmitry Chagin 		timersub(&kth->ktr_time, &prevtime_e, &temp);
602fc90f3a2SDmitry Chagin 		printf("%jd.%06ld ", (intmax_t)temp.tv_sec,
603fc90f3a2SDmitry Chagin 		    temp.tv_usec);
604fc90f3a2SDmitry Chagin 	}
605fc90f3a2SDmitry Chagin 	if (timestamp & TIMESTAMP_RELATIVE) {
606fc90f3a2SDmitry Chagin 		if (prevtime.tv_sec == 0)
607fc90f3a2SDmitry Chagin 			prevtime = kth->ktr_time;
608fc90f3a2SDmitry Chagin 		if (timercmp(&kth->ktr_time, &prevtime, <)) {
609fc90f3a2SDmitry Chagin 			timersub(&prevtime, &kth->ktr_time, &temp);
610fc90f3a2SDmitry Chagin 			sign = "-";
611fc90f3a2SDmitry Chagin 		} else {
612fc90f3a2SDmitry Chagin 			timersub(&kth->ktr_time, &prevtime, &temp);
613fc90f3a2SDmitry Chagin 			sign = "";
614fc90f3a2SDmitry Chagin 		}
615fc90f3a2SDmitry Chagin 		prevtime = kth->ktr_time;
616fc90f3a2SDmitry Chagin 		printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec,
617fc90f3a2SDmitry Chagin 		    temp.tv_usec);
618fc90f3a2SDmitry Chagin 	}
619fc90f3a2SDmitry Chagin }
620fc90f3a2SDmitry Chagin 
621fc90f3a2SDmitry Chagin void
dumptimespec(struct ktr_header * kth)622fc90f3a2SDmitry Chagin dumptimespec(struct ktr_header *kth)
623fc90f3a2SDmitry Chagin {
624fc90f3a2SDmitry Chagin 	static struct timespec prevtime, prevtime_e;
625fc90f3a2SDmitry Chagin 	struct timespec temp;
626fc90f3a2SDmitry Chagin 	const char *sign;
627fc90f3a2SDmitry Chagin 
628fc90f3a2SDmitry Chagin 	if (timestamp & TIMESTAMP_ABSOLUTE) {
629fc90f3a2SDmitry Chagin 		printf("%jd.%09ld ", (intmax_t)kth->ktr_time.tv_sec,
630fc90f3a2SDmitry Chagin 		    kth->ktr_time.tv_nsec);
631fc90f3a2SDmitry Chagin 	}
632fc90f3a2SDmitry Chagin 	if (timestamp & TIMESTAMP_ELAPSED) {
633fc90f3a2SDmitry Chagin 		if (prevtime_e.tv_sec == 0)
634fc90f3a2SDmitry Chagin 			prevtime_e = kth->ktr_time;
635fc90f3a2SDmitry Chagin 		timespecsub(&kth->ktr_time, &prevtime_e, &temp);
636fc90f3a2SDmitry Chagin 		printf("%jd.%09ld ", (intmax_t)temp.tv_sec,
637fc90f3a2SDmitry Chagin 		    temp.tv_nsec);
638fc90f3a2SDmitry Chagin 	}
639fc90f3a2SDmitry Chagin 	if (timestamp & TIMESTAMP_RELATIVE) {
640fc90f3a2SDmitry Chagin 		if (prevtime.tv_sec == 0)
641fc90f3a2SDmitry Chagin 			prevtime = kth->ktr_time;
642fc90f3a2SDmitry Chagin 		if (timespeccmp(&kth->ktr_time, &prevtime, <)) {
643fc90f3a2SDmitry Chagin 			timespecsub(&prevtime, &kth->ktr_time, &temp);
644fc90f3a2SDmitry Chagin 			sign = "-";
645fc90f3a2SDmitry Chagin 		} else {
646fc90f3a2SDmitry Chagin 			timespecsub(&kth->ktr_time, &prevtime, &temp);
647fc90f3a2SDmitry Chagin 			sign = "";
648fc90f3a2SDmitry Chagin 		}
649fc90f3a2SDmitry Chagin 		prevtime = kth->ktr_time;
650fc90f3a2SDmitry Chagin 		printf("%s%jd.%09ld ", sign, (intmax_t)temp.tv_sec,
651fc90f3a2SDmitry Chagin 		    temp.tv_nsec);
652fc90f3a2SDmitry Chagin 	}
653fc90f3a2SDmitry Chagin }
654fc90f3a2SDmitry Chagin 
655fc90f3a2SDmitry Chagin void
dumpheader(struct ktr_header * kth,u_int sv_flags)6567cf2ca3bSJohn Baldwin dumpheader(struct ktr_header *kth, u_int sv_flags)
6579b50d902SRodney W. Grimes {
6589b50d902SRodney W. Grimes 	static char unknown[64];
6597cf2ca3bSJohn Baldwin 	const char *abi;
6607cf2ca3bSJohn Baldwin 	const char *arch;
66191fbb9c1SDavid Malone 	const char *type;
6629b50d902SRodney W. Grimes 
6639b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
6649b50d902SRodney W. Grimes 	case KTR_SYSCALL:
6659b50d902SRodney W. Grimes 		type = "CALL";
6669b50d902SRodney W. Grimes 		break;
6679b50d902SRodney W. Grimes 	case KTR_SYSRET:
6689b50d902SRodney W. Grimes 		type = "RET ";
6699b50d902SRodney W. Grimes 		break;
6709b50d902SRodney W. Grimes 	case KTR_NAMEI:
6719b50d902SRodney W. Grimes 		type = "NAMI";
6729b50d902SRodney W. Grimes 		break;
6739b50d902SRodney W. Grimes 	case KTR_GENIO:
6749b50d902SRodney W. Grimes 		type = "GIO ";
6759b50d902SRodney W. Grimes 		break;
6769b50d902SRodney W. Grimes 	case KTR_PSIG:
6779b50d902SRodney W. Grimes 		type = "PSIG";
6789b50d902SRodney W. Grimes 		break;
6799b50d902SRodney W. Grimes 	case KTR_CSW:
6809b50d902SRodney W. Grimes 		type = "CSW ";
6819b50d902SRodney W. Grimes 		break;
68282e2dd32SPoul-Henning Kamp 	case KTR_USER:
68382e2dd32SPoul-Henning Kamp 		type = "USER";
68482e2dd32SPoul-Henning Kamp 		break;
68560e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
686ffb66079SJohn Baldwin 	case KTR_STRUCT_ARRAY:
68760e15db9SDag-Erling Smørgrav 		type = "STRU";
68860e15db9SDag-Erling Smørgrav 		break;
689a56be37eSJohn Baldwin 	case KTR_SYSCTL:
690a56be37eSJohn Baldwin 		type = "SCTL";
691a56be37eSJohn Baldwin 		break;
692c601ad8eSDag-Erling Smørgrav 	case KTR_CAPFAIL:
693c601ad8eSDag-Erling Smørgrav 		type = "CAP ";
694c601ad8eSDag-Erling Smørgrav 		break;
69535818d2eSJohn Baldwin 	case KTR_FAULT:
69635818d2eSJohn Baldwin 		type = "PFLT";
69735818d2eSJohn Baldwin 		break;
69835818d2eSJohn Baldwin 	case KTR_FAULTEND:
69935818d2eSJohn Baldwin 		type = "PRET";
70035818d2eSJohn Baldwin 		break;
7019b50d902SRodney W. Grimes 	default:
70209307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
7039b50d902SRodney W. Grimes 		type = unknown;
7049b50d902SRodney W. Grimes 	}
7059b50d902SRodney W. Grimes 
706a9ac598bSRobert Watson 	/*
707a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
708a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
709a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
710a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
711a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
712a9ac598bSRobert Watson 	 * negative tid's as 0.
713a9ac598bSRobert Watson 	 */
714a9ac598bSRobert Watson 	if (threads)
715bb239328SBrooks Davis 		printf("%6d %6d %-8.*s ", kth->ktr_pid,
716bb239328SBrooks Davis 		    kth->ktr_tid > 0 ? (lwpid_t)kth->ktr_tid : 0,
717c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
718a9ac598bSRobert Watson 	else
719bb239328SBrooks Davis 		printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, kth->ktr_comm);
7209b50d902SRodney W. Grimes         if (timestamp) {
721fc90f3a2SDmitry Chagin 		if (version == KTR_VERSION0)
722fc90f3a2SDmitry Chagin 			dumptimeval((struct ktr_header_v0 *)kth);
723fc90f3a2SDmitry Chagin 		else
724fc90f3a2SDmitry Chagin 			dumptimespec(kth);
725ec131914SPeter Wemm 	}
726fc90f3a2SDmitry Chagin 	if (cpuflag && version > KTR_VERSION0)
727fc90f3a2SDmitry Chagin 		printf("%3d ", kth->ktr_cpu);
72809307b25SDag-Erling Smørgrav 	printf("%s  ", type);
7297cf2ca3bSJohn Baldwin 	if (abiflag != 0) {
7307cf2ca3bSJohn Baldwin 		switch (sv_flags & SV_ABI_MASK) {
7317cf2ca3bSJohn Baldwin 		case SV_ABI_LINUX:
7327cf2ca3bSJohn Baldwin 			abi = "L";
7337cf2ca3bSJohn Baldwin 			break;
7347cf2ca3bSJohn Baldwin 		case SV_ABI_FREEBSD:
7357cf2ca3bSJohn Baldwin 			abi = "F";
7367cf2ca3bSJohn Baldwin 			break;
7377cf2ca3bSJohn Baldwin 		default:
7387cf2ca3bSJohn Baldwin 			abi = "U";
7397cf2ca3bSJohn Baldwin 			break;
7407cf2ca3bSJohn Baldwin 		}
7417cf2ca3bSJohn Baldwin 
7427cf2ca3bSJohn Baldwin 		if ((sv_flags & SV_LP64) != 0)
7437cf2ca3bSJohn Baldwin 			arch = "64";
7447cf2ca3bSJohn Baldwin 		else if ((sv_flags & SV_ILP32) != 0)
7457cf2ca3bSJohn Baldwin 			arch = "32";
7467cf2ca3bSJohn Baldwin 		else
7477cf2ca3bSJohn Baldwin 			arch = "00";
7487cf2ca3bSJohn Baldwin 
7497cf2ca3bSJohn Baldwin 		printf("%s%s  ", abi, arch);
7507cf2ca3bSJohn Baldwin 	}
7519b50d902SRodney W. Grimes }
7529b50d902SRodney W. Grimes 
7539b50d902SRodney W. Grimes #include <sys/syscall.h>
7549b50d902SRodney W. Grimes 
755265e5898SJohn Baldwin static void
ioctlname(unsigned long val)756265e5898SJohn Baldwin ioctlname(unsigned long val)
757265e5898SJohn Baldwin {
758265e5898SJohn Baldwin 	const char *str;
759265e5898SJohn Baldwin 
760265e5898SJohn Baldwin 	str = sysdecode_ioctlname(val);
761265e5898SJohn Baldwin 	if (str != NULL)
762265e5898SJohn Baldwin 		printf("%s", str);
763265e5898SJohn Baldwin 	else if (decimal)
764265e5898SJohn Baldwin 		printf("%lu", val);
765265e5898SJohn Baldwin 	else
766265e5898SJohn Baldwin 		printf("%#lx", val);
767265e5898SJohn Baldwin }
768265e5898SJohn Baldwin 
769a5f14abfSJohn Baldwin static enum sysdecode_abi
syscallabi(u_int sv_flags)770a5f14abfSJohn Baldwin syscallabi(u_int sv_flags)
771a5f14abfSJohn Baldwin {
772a5f14abfSJohn Baldwin 
773a5f14abfSJohn Baldwin 	if (sv_flags == 0)
7745842bd68SJohn Baldwin 		return (SYSDECODE_ABI_FREEBSD);
775a5f14abfSJohn Baldwin 	switch (sv_flags & SV_ABI_MASK) {
776a5f14abfSJohn Baldwin 	case SV_ABI_FREEBSD:
7775842bd68SJohn Baldwin 		return (SYSDECODE_ABI_FREEBSD);
778a5f14abfSJohn Baldwin 	case SV_ABI_LINUX:
779fc7d33b4SEd Maste #ifdef __LP64__
780a5f14abfSJohn Baldwin 		if (sv_flags & SV_ILP32)
7815842bd68SJohn Baldwin 			return (SYSDECODE_ABI_LINUX32);
782a5f14abfSJohn Baldwin #endif
7835842bd68SJohn Baldwin 		return (SYSDECODE_ABI_LINUX);
784a5f14abfSJohn Baldwin 	default:
7855842bd68SJohn Baldwin 		return (SYSDECODE_ABI_UNKNOWN);
786a5f14abfSJohn Baldwin 	}
787a5f14abfSJohn Baldwin }
788a5f14abfSJohn Baldwin 
789a5f14abfSJohn Baldwin static void
syscallname(u_int code,u_int sv_flags)790a5f14abfSJohn Baldwin syscallname(u_int code, u_int sv_flags)
791a5f14abfSJohn Baldwin {
792a5f14abfSJohn Baldwin 	const char *name;
793a5f14abfSJohn Baldwin 
794a5f14abfSJohn Baldwin 	name = sysdecode_syscallname(syscallabi(sv_flags), code);
795a5f14abfSJohn Baldwin 	if (name == NULL)
796a5f14abfSJohn Baldwin 		printf("[%d]", code);
797a5f14abfSJohn Baldwin 	else {
798a5f14abfSJohn Baldwin 		printf("%s", name);
799a5f14abfSJohn Baldwin 		if (syscallno)
800a5f14abfSJohn Baldwin 			printf("[%d]", code);
801a5f14abfSJohn Baldwin 	}
802a5f14abfSJohn Baldwin }
803a5f14abfSJohn Baldwin 
8049289f547SJohn Baldwin static void
print_signal(int signo)8059289f547SJohn Baldwin print_signal(int signo)
8069289f547SJohn Baldwin {
8079289f547SJohn Baldwin 	const char *signame;
8089289f547SJohn Baldwin 
8099289f547SJohn Baldwin 	signame = sysdecode_signal(signo);
8109289f547SJohn Baldwin 	if (signame != NULL)
8119289f547SJohn Baldwin 		printf("%s", signame);
8129289f547SJohn Baldwin 	else
8139289f547SJohn Baldwin 		printf("SIG %d", signo);
8149289f547SJohn Baldwin }
8159289f547SJohn Baldwin 
81691fbb9c1SDavid Malone void
ktrsyscall(struct ktr_syscall * ktr,u_int sv_flags)817a5f14abfSJohn Baldwin ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
8189b50d902SRodney W. Grimes {
81991fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
8208a0f6d8cSDmitry Chagin 	register_t *ip;
8218a0f6d8cSDmitry Chagin 
8228a0f6d8cSDmitry Chagin 	syscallname(ktr->ktr_code, sv_flags);
8238a0f6d8cSDmitry Chagin 	ip = &ktr->ktr_args[0];
8248a0f6d8cSDmitry Chagin 	if (narg) {
8258a0f6d8cSDmitry Chagin 		char c = '(';
8268a0f6d8cSDmitry Chagin 		if (fancy) {
8278a0f6d8cSDmitry Chagin 			switch (sv_flags & SV_ABI_MASK) {
8288a0f6d8cSDmitry Chagin 			case SV_ABI_FREEBSD:
8298a0f6d8cSDmitry Chagin 				ktrsyscall_freebsd(ktr, &ip, &narg, &c,
8308a0f6d8cSDmitry Chagin 				    sv_flags);
8318a0f6d8cSDmitry Chagin 				break;
8328a0f6d8cSDmitry Chagin #ifdef SYSDECODE_HAVE_LINUX
8338a0f6d8cSDmitry Chagin 			case SV_ABI_LINUX:
8348a0f6d8cSDmitry Chagin #ifdef __amd64__
8358a0f6d8cSDmitry Chagin 				if (sv_flags & SV_ILP32)
8368a0f6d8cSDmitry Chagin 					ktrsyscall_linux32(ktr, &ip,
8378a0f6d8cSDmitry Chagin 					    &narg, &c);
8388a0f6d8cSDmitry Chagin 				else
8398a0f6d8cSDmitry Chagin #endif
8408a0f6d8cSDmitry Chagin 				ktrsyscall_linux(ktr, &ip, &narg, &c);
8418a0f6d8cSDmitry Chagin 				break;
8428a0f6d8cSDmitry Chagin #endif /* SYSDECODE_HAVE_LINUX */
8438a0f6d8cSDmitry Chagin 			}
8448a0f6d8cSDmitry Chagin 		}
8458a0f6d8cSDmitry Chagin 		while (narg > 0)
8468a0f6d8cSDmitry Chagin 			print_number(ip, narg, c);
8478a0f6d8cSDmitry Chagin 		putchar(')');
8488a0f6d8cSDmitry Chagin 	}
8498a0f6d8cSDmitry Chagin 	putchar('\n');
8508a0f6d8cSDmitry Chagin }
8518a0f6d8cSDmitry Chagin 
8528a0f6d8cSDmitry Chagin void
ktrsyscall_freebsd(struct ktr_syscall * ktr,register_t ** resip,int * resnarg,char * resc,u_int sv_flags)8538a0f6d8cSDmitry Chagin ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip,
8548a0f6d8cSDmitry Chagin     int *resnarg, char *resc, u_int sv_flags)
8558a0f6d8cSDmitry Chagin {
8568a0f6d8cSDmitry Chagin 	int narg = ktr->ktr_narg;
85771ed318eSJohn Baldwin 	register_t *ip, *first;
858c601ad8eSDag-Erling Smørgrav 	intmax_t arg;
85971ed318eSJohn Baldwin 	int quad_align, quad_slots;
8609b50d902SRodney W. Grimes 
86171ed318eSJohn Baldwin 	ip = first = &ktr->ktr_args[0];
8628a0f6d8cSDmitry Chagin 	char c = *resc;
8638a0f6d8cSDmitry Chagin 
86471ed318eSJohn Baldwin 			quad_align = 0;
86571ed318eSJohn Baldwin 			if (sv_flags & SV_ILP32) {
86671ed318eSJohn Baldwin #ifdef __powerpc__
86771ed318eSJohn Baldwin 				quad_align = 1;
86871ed318eSJohn Baldwin #endif
86971ed318eSJohn Baldwin 				quad_slots = 2;
87071ed318eSJohn Baldwin 			} else
87171ed318eSJohn Baldwin 				quad_slots = 1;
87273430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
8731ca6c7fcSJilles Tjoelker 			case SYS_bindat:
874c4561fabSJohn Baldwin 			case SYS_chflagsat:
8751ca6c7fcSJilles Tjoelker 			case SYS_connectat:
8768447b7cdSJilles Tjoelker 			case SYS_faccessat:
8778447b7cdSJilles Tjoelker 			case SYS_fchmodat:
8788447b7cdSJilles Tjoelker 			case SYS_fchownat:
8798447b7cdSJilles Tjoelker 			case SYS_fstatat:
8808447b7cdSJilles Tjoelker 			case SYS_futimesat:
8818447b7cdSJilles Tjoelker 			case SYS_linkat:
8828447b7cdSJilles Tjoelker 			case SYS_mkdirat:
8838447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
8848447b7cdSJilles Tjoelker 			case SYS_mknodat:
8858447b7cdSJilles Tjoelker 			case SYS_openat:
8868447b7cdSJilles Tjoelker 			case SYS_readlinkat:
8878447b7cdSJilles Tjoelker 			case SYS_renameat:
8888447b7cdSJilles Tjoelker 			case SYS_unlinkat:
8892205e0d1SJilles Tjoelker 			case SYS_utimensat:
8908447b7cdSJilles Tjoelker 				putchar('(');
8919289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_atfd, *ip);
8928447b7cdSJilles Tjoelker 				c = ',';
8938447b7cdSJilles Tjoelker 				ip++;
8948447b7cdSJilles Tjoelker 				narg--;
8958447b7cdSJilles Tjoelker 				break;
8968447b7cdSJilles Tjoelker 			}
8978447b7cdSJilles Tjoelker 			switch (ktr->ktr_code) {
89873430055SDag-Erling Smørgrav 			case SYS_ioctl: {
89998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
900d09e66beSDag-Erling Smørgrav 				putchar(c);
901265e5898SJohn Baldwin 				ioctlname(*ip);
9029b50d902SRodney W. Grimes 				c = ',';
9039b50d902SRodney W. Grimes 				ip++;
9049b50d902SRodney W. Grimes 				narg--;
90573430055SDag-Erling Smørgrav 				break;
90673430055SDag-Erling Smørgrav 			}
90773430055SDag-Erling Smørgrav 			case SYS_ptrace:
90809307b25SDag-Erling Smørgrav 				putchar('(');
9099289f547SJohn Baldwin 				print_integer_arg(sysdecode_ptrace_request, *ip);
9109b50d902SRodney W. Grimes 				c = ',';
9119b50d902SRodney W. Grimes 				ip++;
9129b50d902SRodney W. Grimes 				narg--;
91373430055SDag-Erling Smørgrav 				break;
91473430055SDag-Erling Smørgrav 			case SYS_access:
91573430055SDag-Erling Smørgrav 			case SYS_eaccess:
9168447b7cdSJilles Tjoelker 			case SYS_faccessat:
91798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
91809307b25SDag-Erling Smørgrav 				putchar(',');
9199289f547SJohn Baldwin 				print_mask_arg(sysdecode_access_mode, *ip);
92098a68a58SAlexander Leidinger 				ip++;
92198a68a58SAlexander Leidinger 				narg--;
92273430055SDag-Erling Smørgrav 				break;
923f3f3e3c4SMateusz Guzik 			case SYS_close_range:
924f3f3e3c4SMateusz Guzik 				print_number(ip, narg, c);
925f3f3e3c4SMateusz Guzik 				print_number(ip, narg, c);
926f3f3e3c4SMateusz Guzik 				putchar(',');
927a2065247SKyle Evans 				print_mask_arg0(sysdecode_close_range_flags,
928a2065247SKyle Evans 				    *ip);
929f3f3e3c4SMateusz Guzik 				ip += 3;
930f3f3e3c4SMateusz Guzik 				narg -= 3;
931f3f3e3c4SMateusz Guzik 				break;
93273430055SDag-Erling Smørgrav 			case SYS_open:
9338447b7cdSJilles Tjoelker 			case SYS_openat:
93498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93509307b25SDag-Erling Smørgrav 				putchar(',');
9369289f547SJohn Baldwin 				print_mask_arg(sysdecode_open_flags, ip[0]);
9379289f547SJohn Baldwin 				if ((ip[0] & O_CREAT) == O_CREAT) {
9389289f547SJohn Baldwin 					putchar(',');
9399289f547SJohn Baldwin 					decode_filemode(ip[1]);
9409289f547SJohn Baldwin 				}
94173430055SDag-Erling Smørgrav 				ip += 2;
94298a68a58SAlexander Leidinger 				narg -= 2;
94373430055SDag-Erling Smørgrav 				break;
94473430055SDag-Erling Smørgrav 			case SYS_wait4:
94598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
94698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
94709307b25SDag-Erling Smørgrav 				putchar(',');
9489289f547SJohn Baldwin 				print_mask_arg0(sysdecode_wait4_options, *ip);
94934763d1cSJohn Baldwin 				ip++;
95034763d1cSJohn Baldwin 				narg--;
95134763d1cSJohn Baldwin 				break;
95234763d1cSJohn Baldwin 			case SYS_wait6:
95334763d1cSJohn Baldwin 				putchar('(');
9549289f547SJohn Baldwin 				print_integer_arg(sysdecode_idtype, *ip);
95534763d1cSJohn Baldwin 				c = ',';
95634763d1cSJohn Baldwin 				ip++;
95734763d1cSJohn Baldwin 				narg--;
95871ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
95934763d1cSJohn Baldwin 				print_number(ip, narg, c);
96034763d1cSJohn Baldwin 				putchar(',');
9619289f547SJohn Baldwin 				print_mask_arg(sysdecode_wait6_options, *ip);
96298a68a58SAlexander Leidinger 				ip++;
96398a68a58SAlexander Leidinger 				narg--;
96473430055SDag-Erling Smørgrav 				break;
96573430055SDag-Erling Smørgrav 			case SYS_chmod:
96673430055SDag-Erling Smørgrav 			case SYS_fchmod:
96773430055SDag-Erling Smørgrav 			case SYS_lchmod:
968eebea334SBaptiste Daroussin 			case SYS_fchmodat:
96998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97009307b25SDag-Erling Smørgrav 				putchar(',');
9719289f547SJohn Baldwin 				decode_filemode(*ip);
97298a68a58SAlexander Leidinger 				ip++;
97398a68a58SAlexander Leidinger 				narg--;
97473430055SDag-Erling Smørgrav 				break;
9758447b7cdSJilles Tjoelker 			case SYS_mknodat:
97698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97709307b25SDag-Erling Smørgrav 				putchar(',');
9789289f547SJohn Baldwin 				decode_filemode(*ip);
97998a68a58SAlexander Leidinger 				ip++;
98098a68a58SAlexander Leidinger 				narg--;
98173430055SDag-Erling Smørgrav 				break;
98273430055SDag-Erling Smørgrav 			case SYS_getfsstat:
98398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98509307b25SDag-Erling Smørgrav 				putchar(',');
98648f79574SJohn Baldwin 				print_integer_arg(sysdecode_getfsstat_mode, *ip);
98798a68a58SAlexander Leidinger 				ip++;
98898a68a58SAlexander Leidinger 				narg--;
98973430055SDag-Erling Smørgrav 				break;
99073430055SDag-Erling Smørgrav 			case SYS_mount:
99198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99309307b25SDag-Erling Smørgrav 				putchar(',');
994a2065247SKyle Evans 				print_mask_arg0(sysdecode_mount_flags, *ip);
99598a68a58SAlexander Leidinger 				ip++;
99698a68a58SAlexander Leidinger 				narg--;
99773430055SDag-Erling Smørgrav 				break;
99873430055SDag-Erling Smørgrav 			case SYS_unmount:
99998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
100009307b25SDag-Erling Smørgrav 				putchar(',');
1001a2065247SKyle Evans 				print_mask_arg0(sysdecode_mount_flags, *ip);
100298a68a58SAlexander Leidinger 				ip++;
100398a68a58SAlexander Leidinger 				narg--;
100473430055SDag-Erling Smørgrav 				break;
100573430055SDag-Erling Smørgrav 			case SYS_recvmsg:
100673430055SDag-Erling Smørgrav 			case SYS_sendmsg:
100798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
100898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
100909307b25SDag-Erling Smørgrav 				putchar(',');
10109289f547SJohn Baldwin 				print_mask_arg0(sysdecode_msg_flags, *ip);
101198a68a58SAlexander Leidinger 				ip++;
101298a68a58SAlexander Leidinger 				narg--;
101373430055SDag-Erling Smørgrav 				break;
101473430055SDag-Erling Smørgrav 			case SYS_recvfrom:
101573430055SDag-Erling Smørgrav 			case SYS_sendto:
101698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101909307b25SDag-Erling Smørgrav 				putchar(',');
10209289f547SJohn Baldwin 				print_mask_arg0(sysdecode_msg_flags, *ip);
102198a68a58SAlexander Leidinger 				ip++;
102298a68a58SAlexander Leidinger 				narg--;
102373430055SDag-Erling Smørgrav 				break;
102473430055SDag-Erling Smørgrav 			case SYS_chflags:
1025c4561fabSJohn Baldwin 			case SYS_chflagsat:
102673430055SDag-Erling Smørgrav 			case SYS_fchflags:
102773430055SDag-Erling Smørgrav 			case SYS_lchflags:
102898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
102909307b25SDag-Erling Smørgrav 				putchar(',');
10309289f547SJohn Baldwin 				decode_fileflags(*ip);
103198a68a58SAlexander Leidinger 				ip++;
103298a68a58SAlexander Leidinger 				narg--;
103373430055SDag-Erling Smørgrav 				break;
103473430055SDag-Erling Smørgrav 			case SYS_kill:
103598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103609307b25SDag-Erling Smørgrav 				putchar(',');
10379289f547SJohn Baldwin 				print_signal(*ip);
103898a68a58SAlexander Leidinger 				ip++;
103998a68a58SAlexander Leidinger 				narg--;
104073430055SDag-Erling Smørgrav 				break;
104173430055SDag-Erling Smørgrav 			case SYS_reboot:
104209307b25SDag-Erling Smørgrav 				putchar('(');
10439289f547SJohn Baldwin 				print_mask_arg(sysdecode_reboot_howto, *ip);
104498a68a58SAlexander Leidinger 				ip++;
104598a68a58SAlexander Leidinger 				narg--;
104673430055SDag-Erling Smørgrav 				break;
104773430055SDag-Erling Smørgrav 			case SYS_umask:
104809307b25SDag-Erling Smørgrav 				putchar('(');
10499289f547SJohn Baldwin 				decode_filemode(*ip);
105098a68a58SAlexander Leidinger 				ip++;
105198a68a58SAlexander Leidinger 				narg--;
105273430055SDag-Erling Smørgrav 				break;
105373430055SDag-Erling Smørgrav 			case SYS_msync:
105498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105609307b25SDag-Erling Smørgrav 				putchar(',');
10579289f547SJohn Baldwin 				print_mask_arg(sysdecode_msync_flags, *ip);
105898a68a58SAlexander Leidinger 				ip++;
105998a68a58SAlexander Leidinger 				narg--;
106073430055SDag-Erling Smørgrav 				break;
1061cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
106273430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
1063cae1120aSPeter Wemm 				print_number(ip, narg, c);
1064cae1120aSPeter Wemm 				print_number(ip, narg, c);
106509307b25SDag-Erling Smørgrav 				putchar(',');
10669289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
106709307b25SDag-Erling Smørgrav 				putchar(',');
1068cae1120aSPeter Wemm 				ip++;
1069cae1120aSPeter Wemm 				narg--;
10709289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_flags, *ip);
1071cae1120aSPeter Wemm 				ip++;
1072cae1120aSPeter Wemm 				narg--;
107373430055SDag-Erling Smørgrav 				break;
1074cae1120aSPeter Wemm #endif
107573430055SDag-Erling Smørgrav 			case SYS_mmap:
107698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
107798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
107809307b25SDag-Erling Smørgrav 				putchar(',');
10799289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
108009307b25SDag-Erling Smørgrav 				putchar(',');
108198a68a58SAlexander Leidinger 				ip++;
108298a68a58SAlexander Leidinger 				narg--;
10839289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_flags, *ip);
108498a68a58SAlexander Leidinger 				ip++;
108598a68a58SAlexander Leidinger 				narg--;
108673430055SDag-Erling Smørgrav 				break;
108773430055SDag-Erling Smørgrav 			case SYS_mprotect:
108898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
108998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
109009307b25SDag-Erling Smørgrav 				putchar(',');
10919289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
109298a68a58SAlexander Leidinger 				ip++;
109398a68a58SAlexander Leidinger 				narg--;
109473430055SDag-Erling Smørgrav 				break;
109573430055SDag-Erling Smørgrav 			case SYS_madvise:
109698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
109798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
109809307b25SDag-Erling Smørgrav 				putchar(',');
10999289f547SJohn Baldwin 				print_integer_arg(sysdecode_madvice, *ip);
110098a68a58SAlexander Leidinger 				ip++;
110198a68a58SAlexander Leidinger 				narg--;
110273430055SDag-Erling Smørgrav 				break;
110339a3a438SJohn Baldwin 			case SYS_pathconf:
110439a3a438SJohn Baldwin 			case SYS_lpathconf:
110539a3a438SJohn Baldwin 			case SYS_fpathconf:
110639a3a438SJohn Baldwin 				print_number(ip, narg, c);
110739a3a438SJohn Baldwin 				putchar(',');
110839a3a438SJohn Baldwin 				print_integer_arg(sysdecode_pathconf_name, *ip);
110939a3a438SJohn Baldwin 				ip++;
111039a3a438SJohn Baldwin 				narg--;
111139a3a438SJohn Baldwin 				break;
11129483ab16SJohn Baldwin 			case SYS_getpriority:
111373430055SDag-Erling Smørgrav 			case SYS_setpriority:
11149483ab16SJohn Baldwin 				putchar('(');
11159289f547SJohn Baldwin 				print_integer_arg(sysdecode_prio_which, *ip);
11169483ab16SJohn Baldwin 				c = ',';
111798a68a58SAlexander Leidinger 				ip++;
111898a68a58SAlexander Leidinger 				narg--;
111973430055SDag-Erling Smørgrav 				break;
112073430055SDag-Erling Smørgrav 			case SYS_fcntl:
112198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
112209307b25SDag-Erling Smørgrav 				putchar(',');
11239289f547SJohn Baldwin 				print_integer_arg(sysdecode_fcntl_cmd, ip[0]);
11249289f547SJohn Baldwin 				if (sysdecode_fcntl_arg_p(ip[0])) {
11259289f547SJohn Baldwin 					putchar(',');
11269289f547SJohn Baldwin 					if (ip[0] == F_SETFL)
11279289f547SJohn Baldwin 						print_mask_arg(
11289289f547SJohn Baldwin 						    sysdecode_fcntl_fileflags,
11299289f547SJohn Baldwin 							ip[1]);
11309289f547SJohn Baldwin 					else
11319289f547SJohn Baldwin 						sysdecode_fcntl_arg(stdout,
11329289f547SJohn Baldwin 						    ip[0], ip[1],
11339289f547SJohn Baldwin 						    decimal ? 10 : 16);
11349289f547SJohn Baldwin 				}
113573430055SDag-Erling Smørgrav 				ip += 2;
113698a68a58SAlexander Leidinger 				narg -= 2;
113773430055SDag-Erling Smørgrav 				break;
113873430055SDag-Erling Smørgrav 			case SYS_socket: {
11398bc31d83SCraig Rodrigues 				int sockdomain;
114009307b25SDag-Erling Smørgrav 				putchar('(');
114195bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
11429289f547SJohn Baldwin 				print_integer_arg(sysdecode_socketdomain,
11439289f547SJohn Baldwin 				    sockdomain);
114498a68a58SAlexander Leidinger 				ip++;
114598a68a58SAlexander Leidinger 				narg--;
114609307b25SDag-Erling Smørgrav 				putchar(',');
11479289f547SJohn Baldwin 				print_mask_arg(sysdecode_socket_type, *ip);
114898a68a58SAlexander Leidinger 				ip++;
114998a68a58SAlexander Leidinger 				narg--;
11508bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
11518bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
115209307b25SDag-Erling Smørgrav 					putchar(',');
11539289f547SJohn Baldwin 					print_integer_arg(sysdecode_ipproto,
11549289f547SJohn Baldwin 					    *ip);
11558bc31d83SCraig Rodrigues 					ip++;
11568bc31d83SCraig Rodrigues 					narg--;
11578bc31d83SCraig Rodrigues 				}
115898a68a58SAlexander Leidinger 				c = ',';
115973430055SDag-Erling Smørgrav 				break;
116073430055SDag-Erling Smørgrav 			}
116173430055SDag-Erling Smørgrav 			case SYS_setsockopt:
11629289f547SJohn Baldwin 			case SYS_getsockopt: {
11639289f547SJohn Baldwin 				const char *str;
11649289f547SJohn Baldwin 
116598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
116609307b25SDag-Erling Smørgrav 				putchar(',');
11679289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_sockopt_level,
11689289f547SJohn Baldwin 				    *ip);
11699289f547SJohn Baldwin 				str = sysdecode_sockopt_name(ip[0], ip[1]);
11709289f547SJohn Baldwin 				if (str != NULL) {
11719289f547SJohn Baldwin 					printf(",%s", str);
117298a68a58SAlexander Leidinger 					ip++;
117398a68a58SAlexander Leidinger 					narg--;
11740460d351SJohn Baldwin 				}
117598a68a58SAlexander Leidinger 				ip++;
117698a68a58SAlexander Leidinger 				narg--;
117773430055SDag-Erling Smørgrav 				break;
11789289f547SJohn Baldwin 			}
1179cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
118073430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
118198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
118298a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
118398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
118471ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
118509307b25SDag-Erling Smørgrav 				putchar(',');
11869289f547SJohn Baldwin 				print_integer_arg(sysdecode_whence, *ip);
118798a68a58SAlexander Leidinger 				ip++;
118898a68a58SAlexander Leidinger 				narg--;
118973430055SDag-Erling Smørgrav 				break;
1190cae1120aSPeter Wemm #endif
119173430055SDag-Erling Smørgrav 			case SYS_lseek:
1192cae1120aSPeter Wemm 				print_number(ip, narg, c);
119371ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
119409307b25SDag-Erling Smørgrav 				putchar(',');
11959289f547SJohn Baldwin 				print_integer_arg(sysdecode_whence, *ip);
1196cae1120aSPeter Wemm 				ip++;
1197cae1120aSPeter Wemm 				narg--;
119873430055SDag-Erling Smørgrav 				break;
119973430055SDag-Erling Smørgrav 			case SYS_flock:
120098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
120109307b25SDag-Erling Smørgrav 				putchar(',');
12029289f547SJohn Baldwin 				print_mask_arg(sysdecode_flock_operation, *ip);
120398a68a58SAlexander Leidinger 				ip++;
120498a68a58SAlexander Leidinger 				narg--;
120573430055SDag-Erling Smørgrav 				break;
120673430055SDag-Erling Smørgrav 			case SYS_mkfifo:
12078447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
120873430055SDag-Erling Smørgrav 			case SYS_mkdir:
12098447b7cdSJilles Tjoelker 			case SYS_mkdirat:
121098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
121109307b25SDag-Erling Smørgrav 				putchar(',');
12129289f547SJohn Baldwin 				decode_filemode(*ip);
121398a68a58SAlexander Leidinger 				ip++;
121498a68a58SAlexander Leidinger 				narg--;
121573430055SDag-Erling Smørgrav 				break;
121673430055SDag-Erling Smørgrav 			case SYS_shutdown:
121798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
121809307b25SDag-Erling Smørgrav 				putchar(',');
12199289f547SJohn Baldwin 				print_integer_arg(sysdecode_shutdown_how, *ip);
122098a68a58SAlexander Leidinger 				ip++;
122198a68a58SAlexander Leidinger 				narg--;
122273430055SDag-Erling Smørgrav 				break;
122373430055SDag-Erling Smørgrav 			case SYS_socketpair:
122409307b25SDag-Erling Smørgrav 				putchar('(');
12259289f547SJohn Baldwin 				print_integer_arg(sysdecode_socketdomain, *ip);
122698a68a58SAlexander Leidinger 				ip++;
122798a68a58SAlexander Leidinger 				narg--;
122809307b25SDag-Erling Smørgrav 				putchar(',');
12299289f547SJohn Baldwin 				print_mask_arg(sysdecode_socket_type, *ip);
123098a68a58SAlexander Leidinger 				ip++;
123198a68a58SAlexander Leidinger 				narg--;
123298a68a58SAlexander Leidinger 				c = ',';
123373430055SDag-Erling Smørgrav 				break;
123473430055SDag-Erling Smørgrav 			case SYS_getrlimit:
123573430055SDag-Erling Smørgrav 			case SYS_setrlimit:
123609307b25SDag-Erling Smørgrav 				putchar('(');
12379289f547SJohn Baldwin 				print_integer_arg(sysdecode_rlimit, *ip);
123898a68a58SAlexander Leidinger 				ip++;
123998a68a58SAlexander Leidinger 				narg--;
124098a68a58SAlexander Leidinger 				c = ',';
124173430055SDag-Erling Smørgrav 				break;
1242ee8aa41dSJohn Baldwin 			case SYS_getrusage:
1243ee8aa41dSJohn Baldwin 				putchar('(');
1244ee8aa41dSJohn Baldwin 				print_integer_arg(sysdecode_getrusage_who, *ip);
1245ee8aa41dSJohn Baldwin 				ip++;
1246ee8aa41dSJohn Baldwin 				narg--;
1247ee8aa41dSJohn Baldwin 				c = ',';
1248ee8aa41dSJohn Baldwin 				break;
124973430055SDag-Erling Smørgrav 			case SYS_quotactl:
125098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
125109307b25SDag-Erling Smørgrav 				putchar(',');
12529289f547SJohn Baldwin 				if (!sysdecode_quotactl_cmd(stdout, *ip)) {
12539289f547SJohn Baldwin 					if (decimal)
12549289f547SJohn Baldwin 						printf("<invalid=%d>", (int)*ip);
12559289f547SJohn Baldwin 					else
12569289f547SJohn Baldwin 						printf("<invalid=%#x>",
12579289f547SJohn Baldwin 						    (int)*ip);
12589289f547SJohn Baldwin 				}
125998a68a58SAlexander Leidinger 				ip++;
126098a68a58SAlexander Leidinger 				narg--;
126198a68a58SAlexander Leidinger 				c = ',';
126273430055SDag-Erling Smørgrav 				break;
126373430055SDag-Erling Smørgrav 			case SYS_nfssvc:
126409307b25SDag-Erling Smørgrav 				putchar('(');
12659289f547SJohn Baldwin 				print_integer_arg(sysdecode_nfssvc_flags, *ip);
126698a68a58SAlexander Leidinger 				ip++;
126798a68a58SAlexander Leidinger 				narg--;
126898a68a58SAlexander Leidinger 				c = ',';
126973430055SDag-Erling Smørgrav 				break;
127073430055SDag-Erling Smørgrav 			case SYS_rtprio:
127166ba8943SJohn Baldwin 			case SYS_rtprio_thread:
127209307b25SDag-Erling Smørgrav 				putchar('(');
12739289f547SJohn Baldwin 				print_integer_arg(sysdecode_rtprio_function,
12749289f547SJohn Baldwin 				    *ip);
127598a68a58SAlexander Leidinger 				ip++;
127698a68a58SAlexander Leidinger 				narg--;
127798a68a58SAlexander Leidinger 				c = ',';
127873430055SDag-Erling Smørgrav 				break;
127973430055SDag-Erling Smørgrav 			case SYS___semctl:
128098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
128198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
128209307b25SDag-Erling Smørgrav 				putchar(',');
12839289f547SJohn Baldwin 				print_integer_arg(sysdecode_semctl_cmd, *ip);
128498a68a58SAlexander Leidinger 				ip++;
128598a68a58SAlexander Leidinger 				narg--;
128673430055SDag-Erling Smørgrav 				break;
128773430055SDag-Erling Smørgrav 			case SYS_semget:
128898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
128998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
129009307b25SDag-Erling Smørgrav 				putchar(',');
12919289f547SJohn Baldwin 				print_mask_arg(sysdecode_semget_flags, *ip);
129298a68a58SAlexander Leidinger 				ip++;
129398a68a58SAlexander Leidinger 				narg--;
129473430055SDag-Erling Smørgrav 				break;
129573430055SDag-Erling Smørgrav 			case SYS_msgctl:
129698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
129709307b25SDag-Erling Smørgrav 				putchar(',');
12989289f547SJohn Baldwin 				print_integer_arg(sysdecode_msgctl_cmd, *ip);
129998a68a58SAlexander Leidinger 				ip++;
130098a68a58SAlexander Leidinger 				narg--;
130173430055SDag-Erling Smørgrav 				break;
130273430055SDag-Erling Smørgrav 			case SYS_shmat:
130398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
130498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
130509307b25SDag-Erling Smørgrav 				putchar(',');
13069289f547SJohn Baldwin 				print_mask_arg(sysdecode_shmat_flags, *ip);
130798a68a58SAlexander Leidinger 				ip++;
130898a68a58SAlexander Leidinger 				narg--;
130973430055SDag-Erling Smørgrav 				break;
131073430055SDag-Erling Smørgrav 			case SYS_shmctl:
131198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131209307b25SDag-Erling Smørgrav 				putchar(',');
13139289f547SJohn Baldwin 				print_integer_arg(sysdecode_shmctl_cmd, *ip);
131498a68a58SAlexander Leidinger 				ip++;
131598a68a58SAlexander Leidinger 				narg--;
131673430055SDag-Erling Smørgrav 				break;
1317a9ac5e14SKyle Evans #ifdef SYS_freebsd12_shm_open
1318a9ac5e14SKyle Evans 			case SYS_freebsd12_shm_open:
1319550bec4fSKyle Evans 				if (ip[0] == (uintptr_t)SHM_ANON) {
1320550bec4fSKyle Evans 					printf("(SHM_ANON");
1321550bec4fSKyle Evans 					ip++;
1322550bec4fSKyle Evans 				} else {
1323777d35f4SRui Paulo 					print_number(ip, narg, c);
1324550bec4fSKyle Evans 				}
1325777d35f4SRui Paulo 				putchar(',');
13269289f547SJohn Baldwin 				print_mask_arg(sysdecode_open_flags, ip[0]);
13279289f547SJohn Baldwin 				putchar(',');
13289289f547SJohn Baldwin 				decode_filemode(ip[1]);
13299289f547SJohn Baldwin 				ip += 2;
13309289f547SJohn Baldwin 				narg -= 2;
1331777d35f4SRui Paulo 				break;
1332a9ac5e14SKyle Evans #endif
1333c1b0c847SKyle Evans 			case SYS_shm_open2:
1334c1b0c847SKyle Evans 				if (ip[0] == (uintptr_t)SHM_ANON) {
1335c1b0c847SKyle Evans 					printf("(SHM_ANON");
1336c1b0c847SKyle Evans 					ip++;
1337c1b0c847SKyle Evans 				} else {
1338c1b0c847SKyle Evans 					print_number(ip, narg, c);
1339c1b0c847SKyle Evans 				}
1340c1b0c847SKyle Evans 				putchar(',');
1341c1b0c847SKyle Evans 				print_mask_arg(sysdecode_open_flags, ip[0]);
1342c1b0c847SKyle Evans 				putchar(',');
1343c1b0c847SKyle Evans 				decode_filemode(ip[1]);
1344c1b0c847SKyle Evans 				putchar(',');
1345c1b0c847SKyle Evans 				print_mask_arg(sysdecode_shmflags, ip[2]);
1346c1b0c847SKyle Evans 				ip += 3;
1347c1b0c847SKyle Evans 				narg -= 3;
1348c1b0c847SKyle Evans 				break;
134973430055SDag-Erling Smørgrav 			case SYS_minherit:
135098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
135198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
135209307b25SDag-Erling Smørgrav 				putchar(',');
13539289f547SJohn Baldwin 				print_integer_arg(sysdecode_minherit_inherit,
13549289f547SJohn Baldwin 				    *ip);
135598a68a58SAlexander Leidinger 				ip++;
135698a68a58SAlexander Leidinger 				narg--;
135773430055SDag-Erling Smørgrav 				break;
135873430055SDag-Erling Smørgrav 			case SYS_rfork:
135909307b25SDag-Erling Smørgrav 				putchar('(');
13609289f547SJohn Baldwin 				print_mask_arg(sysdecode_rfork_flags, *ip);
136198a68a58SAlexander Leidinger 				ip++;
136298a68a58SAlexander Leidinger 				narg--;
136398a68a58SAlexander Leidinger 				c = ',';
136473430055SDag-Erling Smørgrav 				break;
136573430055SDag-Erling Smørgrav 			case SYS_lio_listio:
136609307b25SDag-Erling Smørgrav 				putchar('(');
13679289f547SJohn Baldwin 				print_integer_arg(sysdecode_lio_listio_mode,
13689289f547SJohn Baldwin 				    *ip);
136998a68a58SAlexander Leidinger 				ip++;
137098a68a58SAlexander Leidinger 				narg--;
137198a68a58SAlexander Leidinger 				c = ',';
137273430055SDag-Erling Smørgrav 				break;
137373430055SDag-Erling Smørgrav 			case SYS_mlockall:
137409307b25SDag-Erling Smørgrav 				putchar('(');
13759289f547SJohn Baldwin 				print_mask_arg(sysdecode_mlockall_flags, *ip);
137698a68a58SAlexander Leidinger 				ip++;
137798a68a58SAlexander Leidinger 				narg--;
137873430055SDag-Erling Smørgrav 				break;
137973430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
138098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
138109307b25SDag-Erling Smørgrav 				putchar(',');
13829289f547SJohn Baldwin 				print_integer_arg(sysdecode_scheduler_policy,
13839289f547SJohn Baldwin 				    *ip);
138498a68a58SAlexander Leidinger 				ip++;
138598a68a58SAlexander Leidinger 				narg--;
138673430055SDag-Erling Smørgrav 				break;
138773430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
138873430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
138909307b25SDag-Erling Smørgrav 				putchar('(');
13909289f547SJohn Baldwin 				print_integer_arg(sysdecode_scheduler_policy,
13919289f547SJohn Baldwin 				    *ip);
139298a68a58SAlexander Leidinger 				ip++;
139398a68a58SAlexander Leidinger 				narg--;
139473430055SDag-Erling Smørgrav 				break;
139573430055SDag-Erling Smørgrav 			case SYS_sendfile:
139698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
139798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
139898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
139998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
140098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
140198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
140209307b25SDag-Erling Smørgrav 				putchar(',');
14039289f547SJohn Baldwin 				print_mask_arg(sysdecode_sendfile_flags, *ip);
140498a68a58SAlexander Leidinger 				ip++;
140598a68a58SAlexander Leidinger 				narg--;
140673430055SDag-Erling Smørgrav 				break;
140773430055SDag-Erling Smørgrav 			case SYS_kldsym:
140898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
140909307b25SDag-Erling Smørgrav 				putchar(',');
14109289f547SJohn Baldwin 				print_integer_arg(sysdecode_kldsym_cmd, *ip);
141198a68a58SAlexander Leidinger 				ip++;
141298a68a58SAlexander Leidinger 				narg--;
141373430055SDag-Erling Smørgrav 				break;
141473430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
141509307b25SDag-Erling Smørgrav 				putchar('(');
14169289f547SJohn Baldwin 				print_integer_arg(sysdecode_sigprocmask_how,
14179289f547SJohn Baldwin 				    *ip);
141898a68a58SAlexander Leidinger 				ip++;
141998a68a58SAlexander Leidinger 				narg--;
142098a68a58SAlexander Leidinger 				c = ',';
142173430055SDag-Erling Smørgrav 				break;
142273430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
142373430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
142473430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
142573430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
142673430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
142773430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
142873430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
142973430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
143073430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
143173430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
143273430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
143373430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
143498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
143509307b25SDag-Erling Smørgrav 				putchar(',');
14369289f547SJohn Baldwin 				print_integer_arg(sysdecode_acltype, *ip);
143798a68a58SAlexander Leidinger 				ip++;
143898a68a58SAlexander Leidinger 				narg--;
143973430055SDag-Erling Smørgrav 				break;
144073430055SDag-Erling Smørgrav 			case SYS_sigaction:
144109307b25SDag-Erling Smørgrav 				putchar('(');
14429289f547SJohn Baldwin 				print_signal(*ip);
144398a68a58SAlexander Leidinger 				ip++;
144498a68a58SAlexander Leidinger 				narg--;
144598a68a58SAlexander Leidinger 				c = ',';
144673430055SDag-Erling Smørgrav 				break;
144773430055SDag-Erling Smørgrav 			case SYS_extattrctl:
144898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
144909307b25SDag-Erling Smørgrav 				putchar(',');
14509289f547SJohn Baldwin 				print_integer_arg(sysdecode_extattrnamespace,
14519289f547SJohn Baldwin 				    *ip);
145298a68a58SAlexander Leidinger 				ip++;
145398a68a58SAlexander Leidinger 				narg--;
145473430055SDag-Erling Smørgrav 				break;
145573430055SDag-Erling Smørgrav 			case SYS_nmount:
145698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
145798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
145809307b25SDag-Erling Smørgrav 				putchar(',');
1459a2065247SKyle Evans 				print_mask_arg0(sysdecode_mount_flags, *ip);
146098a68a58SAlexander Leidinger 				ip++;
146198a68a58SAlexander Leidinger 				narg--;
146273430055SDag-Erling Smørgrav 				break;
146373430055SDag-Erling Smørgrav 			case SYS_thr_create:
146498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
146598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
146609307b25SDag-Erling Smørgrav 				putchar(',');
14679289f547SJohn Baldwin 				print_mask_arg(sysdecode_thr_create_flags, *ip);
146898a68a58SAlexander Leidinger 				ip++;
146998a68a58SAlexander Leidinger 				narg--;
147073430055SDag-Erling Smørgrav 				break;
147173430055SDag-Erling Smørgrav 			case SYS_thr_kill:
147298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
147309307b25SDag-Erling Smørgrav 				putchar(',');
14749289f547SJohn Baldwin 				print_signal(*ip);
147598a68a58SAlexander Leidinger 				ip++;
147698a68a58SAlexander Leidinger 				narg--;
147773430055SDag-Erling Smørgrav 				break;
147873430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
147998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
148009307b25SDag-Erling Smørgrav 				putchar(',');
14819289f547SJohn Baldwin 				print_integer_arg(sysdecode_kldunload_flags,
14829289f547SJohn Baldwin 				    *ip);
148398a68a58SAlexander Leidinger 				ip++;
148498a68a58SAlexander Leidinger 				narg--;
148573430055SDag-Erling Smørgrav 				break;
14868447b7cdSJilles Tjoelker 			case SYS_linkat:
14878447b7cdSJilles Tjoelker 			case SYS_renameat:
14888447b7cdSJilles Tjoelker 			case SYS_symlinkat:
14898447b7cdSJilles Tjoelker 				print_number(ip, narg, c);
14908447b7cdSJilles Tjoelker 				putchar(',');
14919289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_atfd, *ip);
14928447b7cdSJilles Tjoelker 				ip++;
14938447b7cdSJilles Tjoelker 				narg--;
149439a3a438SJohn Baldwin 				print_number(ip, narg, c);
14958447b7cdSJilles Tjoelker 				break;
14962609222aSPawel Jakub Dawidek 			case SYS_cap_fcntls_limit:
14972609222aSPawel Jakub Dawidek 				print_number(ip, narg, c);
14982609222aSPawel Jakub Dawidek 				putchar(',');
14992609222aSPawel Jakub Dawidek 				arg = *ip;
15002609222aSPawel Jakub Dawidek 				ip++;
15012609222aSPawel Jakub Dawidek 				narg--;
15029289f547SJohn Baldwin 				print_mask_arg32(sysdecode_cap_fcntlrights, arg);
15032609222aSPawel Jakub Dawidek 				break;
1504145e6aa9SJohn Baldwin 			case SYS_posix_fadvise:
1505145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1506145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1507145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1508145e6aa9SJohn Baldwin 				(void)putchar(',');
15099289f547SJohn Baldwin 				print_integer_arg(sysdecode_fadvice, *ip);
1510145e6aa9SJohn Baldwin 				ip++;
1511145e6aa9SJohn Baldwin 				narg--;
1512145e6aa9SJohn Baldwin 				break;
151355648840SJohn Baldwin 			case SYS_procctl:
151455648840SJohn Baldwin 				putchar('(');
15159289f547SJohn Baldwin 				print_integer_arg(sysdecode_idtype, *ip);
151655648840SJohn Baldwin 				c = ',';
151755648840SJohn Baldwin 				ip++;
151855648840SJohn Baldwin 				narg--;
151971ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
152055648840SJohn Baldwin 				putchar(',');
15219289f547SJohn Baldwin 				print_integer_arg(sysdecode_procctl_cmd, *ip);
152255648840SJohn Baldwin 				ip++;
152355648840SJohn Baldwin 				narg--;
152455648840SJohn Baldwin 				break;
1525c2679dd7SKyle Evans 			case SYS__umtx_op: {
1526c2679dd7SKyle Evans 				int op;
1527c2679dd7SKyle Evans 
1528fdb5bf37SJohn Baldwin 				print_number(ip, narg, c);
1529fdb5bf37SJohn Baldwin 				putchar(',');
1530c2679dd7SKyle Evans 				if (print_mask_arg_part(sysdecode_umtx_op_flags,
1531c2679dd7SKyle Evans 				    *ip, &op))
1532c2679dd7SKyle Evans 					putchar('|');
1533c2679dd7SKyle Evans 				print_integer_arg(sysdecode_umtx_op, op);
1534c2679dd7SKyle Evans 				putchar('>');
1535fdb5bf37SJohn Baldwin 				switch (*ip) {
1536fdb5bf37SJohn Baldwin 				case UMTX_OP_CV_WAIT:
1537fdb5bf37SJohn Baldwin 					ip++;
1538fdb5bf37SJohn Baldwin 					narg--;
1539fdb5bf37SJohn Baldwin 					putchar(',');
15409289f547SJohn Baldwin 					print_mask_argul(
15419289f547SJohn Baldwin 					    sysdecode_umtx_cvwait_flags, *ip);
1542fdb5bf37SJohn Baldwin 					break;
1543fdb5bf37SJohn Baldwin 				case UMTX_OP_RW_RDLOCK:
1544fdb5bf37SJohn Baldwin 					ip++;
1545fdb5bf37SJohn Baldwin 					narg--;
1546fdb5bf37SJohn Baldwin 					putchar(',');
15479289f547SJohn Baldwin 					print_mask_argul(
15489289f547SJohn Baldwin 					    sysdecode_umtx_rwlock_flags, *ip);
1549fdb5bf37SJohn Baldwin 					break;
1550fdb5bf37SJohn Baldwin 				}
1551fdb5bf37SJohn Baldwin 				ip++;
1552fdb5bf37SJohn Baldwin 				narg--;
15538dec6942SJohn Baldwin 				break;
1554c2679dd7SKyle Evans 			}
15558dec6942SJohn Baldwin 			case SYS_ftruncate:
15568dec6942SJohn Baldwin 			case SYS_truncate:
15578dec6942SJohn Baldwin 				print_number(ip, narg, c);
15588dec6942SJohn Baldwin 				print_number64(first, ip, narg, c);
15598dec6942SJohn Baldwin 				break;
156039a3a438SJohn Baldwin 			case SYS_fchownat:
156139a3a438SJohn Baldwin 				print_number(ip, narg, c);
156239a3a438SJohn Baldwin 				print_number(ip, narg, c);
156339a3a438SJohn Baldwin 				print_number(ip, narg, c);
156439a3a438SJohn Baldwin 				break;
156539a3a438SJohn Baldwin 			case SYS_fstatat:
156639a3a438SJohn Baldwin 			case SYS_utimensat:
156739a3a438SJohn Baldwin 				print_number(ip, narg, c);
156839a3a438SJohn Baldwin 				print_number(ip, narg, c);
156939a3a438SJohn Baldwin 				break;
157039a3a438SJohn Baldwin 			case SYS_unlinkat:
157139a3a438SJohn Baldwin 				print_number(ip, narg, c);
157239a3a438SJohn Baldwin 				break;
157339a3a438SJohn Baldwin 			case SYS_sysarch:
157439a3a438SJohn Baldwin 				putchar('(');
157539a3a438SJohn Baldwin 				print_integer_arg(sysdecode_sysarch_number, *ip);
157639a3a438SJohn Baldwin 				ip++;
157739a3a438SJohn Baldwin 				narg--;
157839a3a438SJohn Baldwin 				c = ',';
157939a3a438SJohn Baldwin 				break;
1580b9b86b67SDmitry Chagin 			case SYS_getitimer:
1581b9b86b67SDmitry Chagin 			case SYS_setitimer:
1582b9b86b67SDmitry Chagin 				putchar('(');
1583b9b86b67SDmitry Chagin 				print_integer_arg(sysdecode_itimer, *ip);
1584b9b86b67SDmitry Chagin 				ip++;
1585b9b86b67SDmitry Chagin 				narg--;
1586b9b86b67SDmitry Chagin 				c = ',';
1587b9b86b67SDmitry Chagin 				break;
158839a3a438SJohn Baldwin 			}
158939a3a438SJohn Baldwin 			switch (ktr->ktr_code) {
159039a3a438SJohn Baldwin 			case SYS_chflagsat:
159139a3a438SJohn Baldwin 			case SYS_fchownat:
159239a3a438SJohn Baldwin 			case SYS_faccessat:
159339a3a438SJohn Baldwin 			case SYS_fchmodat:
159439a3a438SJohn Baldwin 			case SYS_fstatat:
159539a3a438SJohn Baldwin 			case SYS_linkat:
159639a3a438SJohn Baldwin 			case SYS_unlinkat:
159739a3a438SJohn Baldwin 			case SYS_utimensat:
159839a3a438SJohn Baldwin 				putchar(',');
159939a3a438SJohn Baldwin 				print_mask_arg0(sysdecode_atflags, *ip);
160039a3a438SJohn Baldwin 				ip++;
160139a3a438SJohn Baldwin 				narg--;
160239a3a438SJohn Baldwin 				break;
16039b50d902SRodney W. Grimes 			}
16048a0f6d8cSDmitry Chagin 	*resc = c;
16058a0f6d8cSDmitry Chagin 	*resip = ip;
16068a0f6d8cSDmitry Chagin 	*resnarg = narg;
16079b50d902SRodney W. Grimes }
16089b50d902SRodney W. Grimes 
160991fbb9c1SDavid Malone void
ktrsysret(struct ktr_sysret * ktr,u_int sv_flags)1610a5f14abfSJohn Baldwin ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
16119b50d902SRodney W. Grimes {
161291fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
161391fbb9c1SDavid Malone 	int error = ktr->ktr_error;
16149b50d902SRodney W. Grimes 
1615a5f14abfSJohn Baldwin 	syscallname(ktr->ktr_code, sv_flags);
1616b9034ce2SBryan Drewery 	printf(" ");
16179b50d902SRodney W. Grimes 
16189b50d902SRodney W. Grimes 	if (error == 0) {
16199b50d902SRodney W. Grimes 		if (fancy) {
162009307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
16219b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
162209307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
16239b50d902SRodney W. Grimes 		} else {
16249b50d902SRodney W. Grimes 			if (decimal)
162509307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
16269b50d902SRodney W. Grimes 			else
162709307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
16289b50d902SRodney W. Grimes 		}
16299b50d902SRodney W. Grimes 	} else if (error == ERESTART)
163009307b25SDag-Erling Smørgrav 		printf("RESTART");
16319b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
163209307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
16339b50d902SRodney W. Grimes 	else {
1634287b96ddSJohn Baldwin 		printf("-1 errno %d", sysdecode_freebsd_to_abi_errno(
1635287b96ddSJohn Baldwin 		    syscallabi(sv_flags), error));
16369b50d902SRodney W. Grimes 		if (fancy)
163709307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
16389b50d902SRodney W. Grimes 	}
163909307b25SDag-Erling Smørgrav 	putchar('\n');
16409b50d902SRodney W. Grimes }
16419b50d902SRodney W. Grimes 
164291fbb9c1SDavid Malone void
ktrnamei(char * cp,int len)164391fbb9c1SDavid Malone ktrnamei(char *cp, int len)
16449b50d902SRodney W. Grimes {
164509307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
16469b50d902SRodney W. Grimes }
16479b50d902SRodney W. Grimes 
164891fbb9c1SDavid Malone void
hexdump(char * p,int len,int screenwidth)1649ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
16509b50d902SRodney W. Grimes {
1651ec4beb5dSPeter Wemm 	int n, i;
1652ec4beb5dSPeter Wemm 	int width;
1653ec4beb5dSPeter Wemm 
1654ec4beb5dSPeter Wemm 	width = 0;
1655ec4beb5dSPeter Wemm 	do {
1656ec4beb5dSPeter Wemm 		width += 2;
1657ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1658ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1659ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1660ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1661ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1662ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1663ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1664ec4beb5dSPeter Wemm 	width -= 2;
1665ec4beb5dSPeter Wemm 
1666ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1667ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1668ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1669ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1670ec4beb5dSPeter Wemm 			}
1671ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1672ec4beb5dSPeter Wemm 				printf(" ");
1673ec4beb5dSPeter Wemm 			}
1674ec4beb5dSPeter Wemm 			if (i < len)
1675ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1676ec4beb5dSPeter Wemm 			else
1677ec4beb5dSPeter Wemm 				printf("  ");
1678ec4beb5dSPeter Wemm 		}
1679ec4beb5dSPeter Wemm 		printf("  |");
1680ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1681ec4beb5dSPeter Wemm 			if (i >= len)
1682ec4beb5dSPeter Wemm 				break;
1683ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1684ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1685ec4beb5dSPeter Wemm 			else
1686ec4beb5dSPeter Wemm 				printf(".");
1687ec4beb5dSPeter Wemm 		}
1688ec4beb5dSPeter Wemm 		printf("|\n");
1689ec4beb5dSPeter Wemm 	}
1690ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1691ec4beb5dSPeter Wemm 		printf("\n");
1692ec4beb5dSPeter Wemm }
1693ec4beb5dSPeter Wemm 
1694ec4beb5dSPeter Wemm void
visdump(char * dp,int datalen,int screenwidth)1695ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1696ec4beb5dSPeter Wemm {
169791fbb9c1SDavid Malone 	int col = 0;
1698ec4beb5dSPeter Wemm 	char *cp;
169991fbb9c1SDavid Malone 	int width;
17009b50d902SRodney W. Grimes 	char visbuf[5];
17019b50d902SRodney W. Grimes 
170209307b25SDag-Erling Smørgrav 	printf("       \"");
17039b50d902SRodney W. Grimes 	col = 8;
17049b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
17051a3a57d7SAlex Richardson 		vis(visbuf, *dp, VIS_CSTYLE | VIS_NOLOCALE, *(dp+1));
17069b50d902SRodney W. Grimes 		cp = visbuf;
17079b50d902SRodney W. Grimes 		/*
17089b50d902SRodney W. Grimes 		 * Keep track of printables and
17099b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
17109b50d902SRodney W. Grimes 		 */
17119b50d902SRodney W. Grimes 		if (col == 0) {
171209307b25SDag-Erling Smørgrav 			putchar('\t');
17139b50d902SRodney W. Grimes 			col = 8;
17149b50d902SRodney W. Grimes 		}
17159b50d902SRodney W. Grimes 		switch(*cp) {
17169b50d902SRodney W. Grimes 		case '\n':
17179b50d902SRodney W. Grimes 			col = 0;
171809307b25SDag-Erling Smørgrav 			putchar('\n');
17199b50d902SRodney W. Grimes 			continue;
17209b50d902SRodney W. Grimes 		case '\t':
17219b50d902SRodney W. Grimes 			width = 8 - (col&07);
17229b50d902SRodney W. Grimes 			break;
17239b50d902SRodney W. Grimes 		default:
17249b50d902SRodney W. Grimes 			width = strlen(cp);
17259b50d902SRodney W. Grimes 		}
17269b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
172709307b25SDag-Erling Smørgrav 			printf("\\\n\t");
17289b50d902SRodney W. Grimes 			col = 8;
17299b50d902SRodney W. Grimes 		}
17309b50d902SRodney W. Grimes 		col += width;
17319b50d902SRodney W. Grimes 		do {
173209307b25SDag-Erling Smørgrav 			putchar(*cp++);
17339b50d902SRodney W. Grimes 		} while (*cp);
17349b50d902SRodney W. Grimes 	}
17359b50d902SRodney W. Grimes 	if (col == 0)
173609307b25SDag-Erling Smørgrav 		printf("       ");
173709307b25SDag-Erling Smørgrav 	printf("\"\n");
17389b50d902SRodney W. Grimes }
17399b50d902SRodney W. Grimes 
1740ec4beb5dSPeter Wemm void
ktrgenio(struct ktr_genio * ktr,int len)1741ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1742ec4beb5dSPeter Wemm {
1743ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1744ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1745ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1746ec4beb5dSPeter Wemm 	int i, binary;
1747ec4beb5dSPeter Wemm 
17484b0ae512SPawel Jakub Dawidek 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
17494b0ae512SPawel Jakub Dawidek 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
17504b0ae512SPawel Jakub Dawidek 		datalen == 1 ? "" : "s");
17514b0ae512SPawel Jakub Dawidek 	if (suppressdata)
17524b0ae512SPawel Jakub Dawidek 		return;
1753ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1754ec4beb5dSPeter Wemm 		struct winsize ws;
1755ec4beb5dSPeter Wemm 
1756ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1757ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1758ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1759ec4beb5dSPeter Wemm 		else
1760ec4beb5dSPeter Wemm 			screenwidth = 80;
1761ec4beb5dSPeter Wemm 	}
1762ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1763ec4beb5dSPeter Wemm 		datalen = maxdata;
1764ec4beb5dSPeter Wemm 
1765ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1766ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1767ec4beb5dSPeter Wemm 			continue;
1768ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1769ec4beb5dSPeter Wemm 			continue;
1770ec4beb5dSPeter Wemm 		binary = 1;
1771ec4beb5dSPeter Wemm 	}
1772ec4beb5dSPeter Wemm 	if (binary)
1773ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1774ec4beb5dSPeter Wemm 	else
1775ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1776ec4beb5dSPeter Wemm }
1777ec4beb5dSPeter Wemm 
177891fbb9c1SDavid Malone void
ktrpsig(struct ktr_psig * psig)1779dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
17809b50d902SRodney W. Grimes {
17819289f547SJohn Baldwin 	const char *str;
17829289f547SJohn Baldwin 
17839289f547SJohn Baldwin 	print_signal(psig->signo);
17845677eef9SJilles Tjoelker 	if (psig->action == SIG_DFL) {
17859289f547SJohn Baldwin 		printf(" SIG_DFL");
17865677eef9SJilles Tjoelker 	} else {
17879289f547SJohn Baldwin 		printf(" caught handler=0x%lx mask=0x%x",
17885677eef9SJilles Tjoelker 		    (u_long)psig->action, psig->mask.__bits[0]);
178991fbb9c1SDavid Malone 	}
17909289f547SJohn Baldwin 	printf(" code=");
17919289f547SJohn Baldwin 	str = sysdecode_sigcode(psig->signo, psig->code);
17929289f547SJohn Baldwin 	if (str != NULL)
17939289f547SJohn Baldwin 		printf("%s", str);
17949289f547SJohn Baldwin 	else
17959289f547SJohn Baldwin 		printf("<invalid=%#x>", psig->code);
17969289f547SJohn Baldwin 	putchar('\n');
17979b50d902SRodney W. Grimes }
17989b50d902SRodney W. Grimes 
179991fbb9c1SDavid Malone void
ktrcsw_old(struct ktr_csw_old * cs)180088bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
18019b50d902SRodney W. Grimes {
180209307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
18039b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
18049b50d902SRodney W. Grimes }
18059b50d902SRodney W. Grimes 
180688bf5036SJohn Baldwin void
ktrcsw(struct ktr_csw * cs)180788bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
180888bf5036SJohn Baldwin {
180988bf5036SJohn Baldwin 	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
181088bf5036SJohn Baldwin 	    cs->user ? "user" : "kernel", cs->wmesg);
181188bf5036SJohn Baldwin }
181288bf5036SJohn Baldwin 
181391fbb9c1SDavid Malone void
ktruser(int len,void * p)1814bb1a2d4aSJohn Baldwin ktruser(int len, void *p)
181582e2dd32SPoul-Henning Kamp {
1816bb1a2d4aSJohn Baldwin 	unsigned char *cp;
1817670b9e9fSJohn Baldwin 
1818d6fb4894SJohn Baldwin 	if (sysdecode_utrace(stdout, p, len)) {
1819195aef99SBryan Drewery 		printf("\n");
1820670b9e9fSJohn Baldwin 		return;
1821670b9e9fSJohn Baldwin 	}
1822670b9e9fSJohn Baldwin 
182309307b25SDag-Erling Smørgrav 	printf("%d ", len);
1824bb1a2d4aSJohn Baldwin 	cp = p;
18253f8ba9aeSPoul-Henning Kamp 	while (len--)
1826743f9174SPoul-Henning Kamp 		if (decimal)
1827bb1a2d4aSJohn Baldwin 			printf(" %d", *cp++);
1828743f9174SPoul-Henning Kamp 		else
1829bb1a2d4aSJohn Baldwin 			printf(" %02x", *cp++);
183009307b25SDag-Erling Smørgrav 	printf("\n");
183182e2dd32SPoul-Henning Kamp }
183282e2dd32SPoul-Henning Kamp 
183391fbb9c1SDavid Malone void
ktrcaprights(cap_rights_t * rightsp)18347008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp)
18357008be5bSPawel Jakub Dawidek {
18367008be5bSPawel Jakub Dawidek 
18377008be5bSPawel Jakub Dawidek 	printf("cap_rights_t ");
18389289f547SJohn Baldwin 	sysdecode_cap_rights(stdout, rightsp);
18397008be5bSPawel Jakub Dawidek 	printf("\n");
18407008be5bSPawel Jakub Dawidek }
18417008be5bSPawel Jakub Dawidek 
1842de56aee0SKonstantin Belousov static void
ktrtimeval(struct timeval * tv)1843de56aee0SKonstantin Belousov ktrtimeval(struct timeval *tv)
1844de56aee0SKonstantin Belousov {
1845de56aee0SKonstantin Belousov 
1846de56aee0SKonstantin Belousov 	printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec);
1847de56aee0SKonstantin Belousov }
1848de56aee0SKonstantin Belousov 
1849de56aee0SKonstantin Belousov void
ktritimerval(struct itimerval * it)1850de56aee0SKonstantin Belousov ktritimerval(struct itimerval *it)
1851de56aee0SKonstantin Belousov {
1852de56aee0SKonstantin Belousov 
1853de56aee0SKonstantin Belousov 	printf("itimerval { .interval = ");
1854de56aee0SKonstantin Belousov 	ktrtimeval(&it->it_interval);
1855de56aee0SKonstantin Belousov 	printf(", .value = ");
1856de56aee0SKonstantin Belousov 	ktrtimeval(&it->it_value);
1857de56aee0SKonstantin Belousov 	printf(" }\n");
1858de56aee0SKonstantin Belousov }
1859de56aee0SKonstantin Belousov 
18607008be5bSPawel Jakub Dawidek void
ktrsockaddr(struct sockaddr * sa)186160e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
186260e15db9SDag-Erling Smørgrav {
186360e15db9SDag-Erling Smørgrav /*
186460e15db9SDag-Erling Smørgrav  TODO: Support additional address families
1865237abf0cSDavide Italiano 	#include <netsmb/netbios.h>
1866237abf0cSDavide Italiano 	struct sockaddr_nb	*nb;
186760e15db9SDag-Erling Smørgrav */
18689289f547SJohn Baldwin 	const char *str;
186960e15db9SDag-Erling Smørgrav 	char addr[64];
187060e15db9SDag-Erling Smørgrav 
187160e15db9SDag-Erling Smørgrav 	/*
187260e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
187360e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
187460e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
187560e15db9SDag-Erling Smørgrav 	 */
187660e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
18779289f547SJohn Baldwin 	str = sysdecode_sockaddr_family(sa->sa_family);
18789289f547SJohn Baldwin 	if (str != NULL)
18799289f547SJohn Baldwin 		printf("%s", str);
18809289f547SJohn Baldwin 	else
18819289f547SJohn Baldwin 		printf("<invalid=%d>", sa->sa_family);
188260e15db9SDag-Erling Smørgrav 	printf(", ");
188360e15db9SDag-Erling Smørgrav 
188460e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
188581a31394SDag-Erling Smørgrav 	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
188660e15db9SDag-Erling Smørgrav 		printf("invalid");				\
188760e15db9SDag-Erling Smørgrav 		break;						\
188860e15db9SDag-Erling Smørgrav 	}
188960e15db9SDag-Erling Smørgrav 
189060e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
189160e15db9SDag-Erling Smørgrav 	case AF_INET: {
189281a31394SDag-Erling Smørgrav 		struct sockaddr_in sa_in;
189360e15db9SDag-Erling Smørgrav 
189481a31394SDag-Erling Smørgrav 		memset(&sa_in, 0, sizeof(sa_in));
1895449df4ecSAndrey Zonov 		memcpy(&sa_in, sa, sa->sa_len);
189660e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
189781a31394SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
189881a31394SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in.sin_port));
189960e15db9SDag-Erling Smørgrav 		break;
190060e15db9SDag-Erling Smørgrav 	}
190160e15db9SDag-Erling Smørgrav 	case AF_INET6: {
190281a31394SDag-Erling Smørgrav 		struct sockaddr_in6 sa_in6;
190360e15db9SDag-Erling Smørgrav 
190481a31394SDag-Erling Smørgrav 		memset(&sa_in6, 0, sizeof(sa_in6));
1905449df4ecSAndrey Zonov 		memcpy(&sa_in6, sa, sa->sa_len);
190660e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
1907b9ef8051SAndrey V. Elsukov 		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1908b9ef8051SAndrey V. Elsukov 		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
190981a31394SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
191060e15db9SDag-Erling Smørgrav 		break;
191160e15db9SDag-Erling Smørgrav 	}
191260e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
191381a31394SDag-Erling Smørgrav 		struct sockaddr_un sa_un;
191460e15db9SDag-Erling Smørgrav 
191581a31394SDag-Erling Smørgrav 		memset(&sa_un, 0, sizeof(sa_un));
1916449df4ecSAndrey Zonov 		memcpy(&sa_un, sa, sa->sa_len);
191781a31394SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
191860e15db9SDag-Erling Smørgrav 		break;
191960e15db9SDag-Erling Smørgrav 	}
192060e15db9SDag-Erling Smørgrav 	default:
192160e15db9SDag-Erling Smørgrav 		printf("unknown address family");
192260e15db9SDag-Erling Smørgrav 	}
192360e15db9SDag-Erling Smørgrav 	printf(" }\n");
192460e15db9SDag-Erling Smørgrav }
192560e15db9SDag-Erling Smørgrav 
192660e15db9SDag-Erling Smørgrav void
ktrstat(struct stat * statp)192760e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
192860e15db9SDag-Erling Smørgrav {
192960e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
193060e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
193160e15db9SDag-Erling Smørgrav 	struct group  *grp;
193260e15db9SDag-Erling Smørgrav 	struct tm *tm;
193360e15db9SDag-Erling Smørgrav 
193460e15db9SDag-Erling Smørgrav 	/*
193560e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
193660e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
193760e15db9SDag-Erling Smørgrav 	 */
193860e15db9SDag-Erling Smørgrav 	printf("struct stat {");
193956f0ad0dSDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, ",
194056f0ad0dSDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
19415cb9940cSJohn Baldwin 	if (!resolv)
194256f0ad0dSDag-Erling Smørgrav 		printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
194356f0ad0dSDag-Erling Smørgrav 	else {
194460e15db9SDag-Erling Smørgrav 		strmode(statp->st_mode, mode);
194556f0ad0dSDag-Erling Smørgrav 		printf("mode=%s, ", mode);
194656f0ad0dSDag-Erling Smørgrav 	}
194756f0ad0dSDag-Erling Smørgrav 	printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
19485cb9940cSJohn Baldwin 	if (!resolv) {
19494622f0e1SPawel Jakub Dawidek 		pwd = NULL;
19504622f0e1SPawel Jakub Dawidek 	} else {
19512560d181SMariusz Zaborski #ifdef WITH_CASPER
19524622f0e1SPawel Jakub Dawidek 		if (cappwd != NULL)
19534622f0e1SPawel Jakub Dawidek 			pwd = cap_getpwuid(cappwd, statp->st_uid);
19544622f0e1SPawel Jakub Dawidek 		else
19554622f0e1SPawel Jakub Dawidek #endif
19564622f0e1SPawel Jakub Dawidek 			pwd = getpwuid(statp->st_uid);
19574622f0e1SPawel Jakub Dawidek 	}
19584622f0e1SPawel Jakub Dawidek 	if (pwd == NULL)
195960e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
196060e15db9SDag-Erling Smørgrav 	else
196160e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
19625cb9940cSJohn Baldwin 	if (!resolv) {
19634622f0e1SPawel Jakub Dawidek 		grp = NULL;
19644622f0e1SPawel Jakub Dawidek 	} else {
19652560d181SMariusz Zaborski #ifdef WITH_CASPER
19664622f0e1SPawel Jakub Dawidek 		if (capgrp != NULL)
19674622f0e1SPawel Jakub Dawidek 			grp = cap_getgrgid(capgrp, statp->st_gid);
19684622f0e1SPawel Jakub Dawidek 		else
19694622f0e1SPawel Jakub Dawidek #endif
19704622f0e1SPawel Jakub Dawidek 			grp = getgrgid(statp->st_gid);
19714622f0e1SPawel Jakub Dawidek 	}
19724622f0e1SPawel Jakub Dawidek 	if (grp == NULL)
197360e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
197460e15db9SDag-Erling Smørgrav 	else
197560e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
197660e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
197760e15db9SDag-Erling Smørgrav 	printf("atime=");
19785cb9940cSJohn Baldwin 	if (!resolv)
197999742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
198060e15db9SDag-Erling Smørgrav 	else {
198199742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
198209307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
198360e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
198460e15db9SDag-Erling Smørgrav 	}
198599742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
198699742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
198760e15db9SDag-Erling Smørgrav 	else
198860e15db9SDag-Erling Smørgrav 		printf(", ");
19890e80f258SEnji Cooper 	printf("mtime=");
19905cb9940cSJohn Baldwin 	if (!resolv)
199199742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
199260e15db9SDag-Erling Smørgrav 	else {
199399742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
199409307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
199560e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
199660e15db9SDag-Erling Smørgrav 	}
199799742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
199899742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
199960e15db9SDag-Erling Smørgrav 	else
200060e15db9SDag-Erling Smørgrav 		printf(", ");
200160e15db9SDag-Erling Smørgrav 	printf("ctime=");
20025cb9940cSJohn Baldwin 	if (!resolv)
200399742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
200460e15db9SDag-Erling Smørgrav 	else {
200599742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
200609307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
200760e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
200860e15db9SDag-Erling Smørgrav 	}
200999742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
201099742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
201160e15db9SDag-Erling Smørgrav 	else
201260e15db9SDag-Erling Smørgrav 		printf(", ");
201360e15db9SDag-Erling Smørgrav 	printf("birthtime=");
20145cb9940cSJohn Baldwin 	if (!resolv)
201599742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
201660e15db9SDag-Erling Smørgrav 	else {
201799742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
201809307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
201960e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
202060e15db9SDag-Erling Smørgrav 	}
202199742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
202299742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
202360e15db9SDag-Erling Smørgrav 	else
202460e15db9SDag-Erling Smørgrav 		printf(", ");
202560e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
202660e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
202760e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
202860e15db9SDag-Erling Smørgrav 	printf(" }\n");
202960e15db9SDag-Erling Smørgrav }
203060e15db9SDag-Erling Smørgrav 
203160e15db9SDag-Erling Smørgrav void
ktrbitset(char * name,struct bitset * set,size_t setlen)2032586ed321SDmitry Chagin ktrbitset(char *name, struct bitset *set, size_t setlen)
2033586ed321SDmitry Chagin {
2034586ed321SDmitry Chagin 	int i, maxi, c = 0;
2035586ed321SDmitry Chagin 
2036586ed321SDmitry Chagin 	if (setlen > INT32_MAX)
2037586ed321SDmitry Chagin 		setlen = INT32_MAX;
2038586ed321SDmitry Chagin 	maxi = setlen * CHAR_BIT;
2039586ed321SDmitry Chagin 	printf("%s [ ", name);
2040586ed321SDmitry Chagin 	for (i = 0; i < maxi; i++) {
2041586ed321SDmitry Chagin 		if (!BIT_ISSET(setlen, i, set))
2042586ed321SDmitry Chagin 			continue;
2043586ed321SDmitry Chagin 		if (c == 0)
2044586ed321SDmitry Chagin 			printf("%d", i);
2045586ed321SDmitry Chagin 		else
2046586ed321SDmitry Chagin 			printf(", %d", i);
2047586ed321SDmitry Chagin 		c++;
2048586ed321SDmitry Chagin 	}
2049586ed321SDmitry Chagin 	if (c == 0)
2050586ed321SDmitry Chagin 		printf(" empty ]\n");
2051586ed321SDmitry Chagin 	else
2052586ed321SDmitry Chagin 		printf(" ]\n");
2053586ed321SDmitry Chagin }
2054586ed321SDmitry Chagin 
2055586ed321SDmitry Chagin void
ktrstruct(char * buf,size_t buflen)205660e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
205760e15db9SDag-Erling Smørgrav {
205860e15db9SDag-Erling Smørgrav 	char *name, *data;
205960e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
206060e15db9SDag-Erling Smørgrav 	int i;
20617008be5bSPawel Jakub Dawidek 	cap_rights_t rights;
2062de56aee0SKonstantin Belousov 	struct itimerval it;
206330c1278fSWarner Losh 	struct stat sb;
206430c1278fSWarner Losh 	struct sockaddr_storage ss;
2065586ed321SDmitry Chagin 	struct bitset *set;
206660e15db9SDag-Erling Smørgrav 
206760e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
206860e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
206960e15db9SDag-Erling Smørgrav 	     ++namelen)
207060e15db9SDag-Erling Smørgrav 		/* nothing */;
207160e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
207260e15db9SDag-Erling Smørgrav 		goto invalid;
207360e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
207460e15db9SDag-Erling Smørgrav 		goto invalid;
207560e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
207660e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
207760e15db9SDag-Erling Smørgrav 	if (datalen == 0)
207860e15db9SDag-Erling Smørgrav 		goto invalid;
207960e15db9SDag-Erling Smørgrav 	/* sanity check */
208081a31394SDag-Erling Smørgrav 	for (i = 0; i < (int)namelen; ++i)
2081586ed321SDmitry Chagin 		if (!isalpha(name[i]) && name[i] != '_')
208260e15db9SDag-Erling Smørgrav 			goto invalid;
20837008be5bSPawel Jakub Dawidek 	if (strcmp(name, "caprights") == 0) {
20847008be5bSPawel Jakub Dawidek 		if (datalen != sizeof(cap_rights_t))
20857008be5bSPawel Jakub Dawidek 			goto invalid;
20867008be5bSPawel Jakub Dawidek 		memcpy(&rights, data, datalen);
20877008be5bSPawel Jakub Dawidek 		ktrcaprights(&rights);
2088de56aee0SKonstantin Belousov 	} else if (strcmp(name, "itimerval") == 0) {
2089de56aee0SKonstantin Belousov 		if (datalen != sizeof(struct itimerval))
2090de56aee0SKonstantin Belousov 			goto invalid;
2091de56aee0SKonstantin Belousov 		memcpy(&it, data, datalen);
2092de56aee0SKonstantin Belousov 		ktritimerval(&it);
20937008be5bSPawel Jakub Dawidek 	} else if (strcmp(name, "stat") == 0) {
209460e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
209560e15db9SDag-Erling Smørgrav 			goto invalid;
209630c1278fSWarner Losh 		memcpy(&sb, data, datalen);
209730c1278fSWarner Losh 		ktrstat(&sb);
209860e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
209930c1278fSWarner Losh 		if (datalen > sizeof(ss))
210060e15db9SDag-Erling Smørgrav 			goto invalid;
210130c1278fSWarner Losh 		memcpy(&ss, data, datalen);
21024b03484fSAndrey Zonov 		if (datalen != ss.ss_len)
210330c1278fSWarner Losh 			goto invalid;
210430c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
2105586ed321SDmitry Chagin 	} else if (strcmp(name, "cpuset_t") == 0) {
2106586ed321SDmitry Chagin 		if (datalen < 1)
2107586ed321SDmitry Chagin 			goto invalid;
2108586ed321SDmitry Chagin 		set = malloc(datalen);
2109586ed321SDmitry Chagin 		if (set == NULL)
2110586ed321SDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
2111586ed321SDmitry Chagin 		memcpy(set, data, datalen);
2112586ed321SDmitry Chagin 		ktrbitset(name, set, datalen);
2113586ed321SDmitry Chagin 		free(set);
211460e15db9SDag-Erling Smørgrav 	} else {
21153606a213SDmitry Chagin #ifdef SYSDECODE_HAVE_LINUX
21163606a213SDmitry Chagin 		if (ktrstruct_linux(name, data, datalen) == false)
21173606a213SDmitry Chagin #endif
211860e15db9SDag-Erling Smørgrav 			printf("unknown structure\n");
211960e15db9SDag-Erling Smørgrav 	}
212060e15db9SDag-Erling Smørgrav 	return;
212160e15db9SDag-Erling Smørgrav invalid:
212260e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
212360e15db9SDag-Erling Smørgrav }
212460e15db9SDag-Erling Smørgrav 
2125c601ad8eSDag-Erling Smørgrav void
ktrcapfail(struct ktr_cap_fail * ktr)2126c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
2127c601ad8eSDag-Erling Smørgrav {
21289bec8413SJake Freeland 	union ktr_cap_data *kcd = &ktr->cap_data;
21299bec8413SJake Freeland 
2130e141be6fSDag-Erling Smørgrav 	switch (ktr->cap_type) {
2131e141be6fSDag-Erling Smørgrav 	case CAPFAIL_NOTCAPABLE:
2132e141be6fSDag-Erling Smørgrav 		/* operation on fd with insufficient capabilities */
2133e141be6fSDag-Erling Smørgrav 		printf("operation requires ");
21349bec8413SJake Freeland 		sysdecode_cap_rights(stdout, &kcd->cap_needed);
21352c93e2a3SPawel Jakub Dawidek 		printf(", descriptor holds ");
21369bec8413SJake Freeland 		sysdecode_cap_rights(stdout, &kcd->cap_held);
2137e141be6fSDag-Erling Smørgrav 		break;
2138e141be6fSDag-Erling Smørgrav 	case CAPFAIL_INCREASE:
2139e141be6fSDag-Erling Smørgrav 		/* requested more capabilities than fd already has */
2140e141be6fSDag-Erling Smørgrav 		printf("attempt to increase capabilities from ");
21419bec8413SJake Freeland 		sysdecode_cap_rights(stdout, &kcd->cap_held);
214260e45df8SDag-Erling Smørgrav 		printf(" to ");
21439bec8413SJake Freeland 		sysdecode_cap_rights(stdout, &kcd->cap_needed);
2144e141be6fSDag-Erling Smørgrav 		break;
2145e141be6fSDag-Erling Smørgrav 	case CAPFAIL_SYSCALL:
2146e141be6fSDag-Erling Smørgrav 		/* called restricted syscall */
21479bec8413SJake Freeland 		printf("system call not allowed: ");
21489bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21499bec8413SJake Freeland 		if (syscallabi(ktr->cap_svflags) == SYSDECODE_ABI_FREEBSD) {
21509bec8413SJake Freeland 			switch (ktr->cap_code) {
21519bec8413SJake Freeland 			case SYS_sysarch:
21529bec8413SJake Freeland 				printf(", op: ");
21539bec8413SJake Freeland 				print_integer_arg(sysdecode_sysarch_number,
21549bec8413SJake Freeland 				    kcd->cap_int);
2155e141be6fSDag-Erling Smørgrav 				break;
21569bec8413SJake Freeland 			case SYS_fcntl:
21579bec8413SJake Freeland 				printf(", cmd: ");
21589bec8413SJake Freeland 				print_integer_arg(sysdecode_fcntl_cmd,
21599bec8413SJake Freeland 				    kcd->cap_int);
21609bec8413SJake Freeland 				break;
21619bec8413SJake Freeland 			}
21629bec8413SJake Freeland 		}
21639bec8413SJake Freeland 		break;
21649bec8413SJake Freeland 	case CAPFAIL_SIGNAL:
21659bec8413SJake Freeland 		/* sent signal to proc other than self */
21669bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21679bec8413SJake Freeland 		printf(": signal delivery not allowed: ");
21689bec8413SJake Freeland 		print_integer_arg(sysdecode_signal, kcd->cap_int);
21699bec8413SJake Freeland 		break;
21709bec8413SJake Freeland 	case CAPFAIL_PROTO:
21719bec8413SJake Freeland 		/* created socket with restricted protocol */
21729bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21739bec8413SJake Freeland 		printf(": protocol not allowed: ");
21749bec8413SJake Freeland 		print_integer_arg(sysdecode_ipproto, kcd->cap_int);
21759bec8413SJake Freeland 		break;
21769bec8413SJake Freeland 	case CAPFAIL_SOCKADDR:
21779bec8413SJake Freeland 		/* unable to look up address */
21789bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21799bec8413SJake Freeland 		printf(": restricted address lookup: ");
21809bec8413SJake Freeland 		ktrsockaddr(&kcd->cap_sockaddr);
21819bec8413SJake Freeland 		return;
21829bec8413SJake Freeland 	case CAPFAIL_NAMEI:
2183c0347e18SEd Maste 		/* absolute or AT_FDCWD path, ".." path, etc. */
21849bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21859bec8413SJake Freeland 		printf(": restricted VFS lookup: %s\n", kcd->cap_path);
21869bec8413SJake Freeland 		return;
21879bec8413SJake Freeland 	case CAPFAIL_CPUSET:
21889bec8413SJake Freeland 		/* modification of an external cpuset */
21899bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21909bec8413SJake Freeland 		printf(": restricted cpuset operation\n");
21919bec8413SJake Freeland 		return;
2192e141be6fSDag-Erling Smørgrav 	default:
21939bec8413SJake Freeland 		syscallname(ktr->cap_code, ktr->cap_svflags);
21949bec8413SJake Freeland 		printf(": unknown capability failure\n");
21959bec8413SJake Freeland 		return;
2196e141be6fSDag-Erling Smørgrav 	}
219735818d2eSJohn Baldwin 	printf("\n");
219835818d2eSJohn Baldwin }
219935818d2eSJohn Baldwin 
220035818d2eSJohn Baldwin void
ktrfault(struct ktr_fault * ktr)220135818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
220235818d2eSJohn Baldwin {
220335818d2eSJohn Baldwin 
220478ec874dSDmitry Chagin 	printf("0x%jx ", (uintmax_t)ktr->vaddr);
22059289f547SJohn Baldwin 	print_mask_arg(sysdecode_vmprot, ktr->type);
220635818d2eSJohn Baldwin 	printf("\n");
220735818d2eSJohn Baldwin }
220835818d2eSJohn Baldwin 
220935818d2eSJohn Baldwin void
ktrfaultend(struct ktr_faultend * ktr)221035818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
221135818d2eSJohn Baldwin {
22129289f547SJohn Baldwin 	const char *str;
221335818d2eSJohn Baldwin 
22149289f547SJohn Baldwin 	str = sysdecode_vmresult(ktr->result);
22159289f547SJohn Baldwin 	if (str != NULL)
22169289f547SJohn Baldwin 		printf("%s", str);
22179289f547SJohn Baldwin 	else
22189289f547SJohn Baldwin 		printf("<invalid=%d>", ktr->result);
221935818d2eSJohn Baldwin 	printf("\n");
2220c601ad8eSDag-Erling Smørgrav }
2221c601ad8eSDag-Erling Smørgrav 
222260e15db9SDag-Erling Smørgrav void
ktrkevent(struct kevent * kev)2223ffb66079SJohn Baldwin ktrkevent(struct kevent *kev)
2224ffb66079SJohn Baldwin {
2225ffb66079SJohn Baldwin 
2226ffb66079SJohn Baldwin 	printf("{ ident=");
2227ffb66079SJohn Baldwin 	switch (kev->filter) {
2228ffb66079SJohn Baldwin 	case EVFILT_READ:
2229ffb66079SJohn Baldwin 	case EVFILT_WRITE:
2230ffb66079SJohn Baldwin 	case EVFILT_VNODE:
2231ffb66079SJohn Baldwin 	case EVFILT_PROC:
2232ffb66079SJohn Baldwin 	case EVFILT_TIMER:
2233ffb66079SJohn Baldwin 	case EVFILT_PROCDESC:
2234ffb66079SJohn Baldwin 	case EVFILT_EMPTY:
2235ffb66079SJohn Baldwin 		printf("%ju", (uintmax_t)kev->ident);
2236ffb66079SJohn Baldwin 		break;
2237ffb66079SJohn Baldwin 	case EVFILT_SIGNAL:
2238ffb66079SJohn Baldwin 		print_signal(kev->ident);
2239ffb66079SJohn Baldwin 		break;
2240ffb66079SJohn Baldwin 	default:
2241ffb66079SJohn Baldwin 		printf("%p", (void *)kev->ident);
2242ffb66079SJohn Baldwin 	}
2243ffb66079SJohn Baldwin 	printf(", filter=");
2244ffb66079SJohn Baldwin 	print_integer_arg(sysdecode_kevent_filter, kev->filter);
2245ffb66079SJohn Baldwin 	printf(", flags=");
2246ffb66079SJohn Baldwin 	print_mask_arg0(sysdecode_kevent_flags, kev->flags);
2247ffb66079SJohn Baldwin 	printf(", fflags=");
2248ffb66079SJohn Baldwin 	sysdecode_kevent_fflags(stdout, kev->filter, kev->fflags,
2249ffb66079SJohn Baldwin 	    decimal ? 10 : 16);
2250ffb66079SJohn Baldwin 	printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata);
2251ffb66079SJohn Baldwin }
2252ffb66079SJohn Baldwin 
2253ffb66079SJohn Baldwin void
ktrpollfd(struct pollfd * pfd)225402c57f7bSKyle Evans ktrpollfd(struct pollfd *pfd)
225502c57f7bSKyle Evans {
225602c57f7bSKyle Evans 
225702c57f7bSKyle Evans 	printf("{ fd=%d", pfd->fd);
225802c57f7bSKyle Evans 	printf(", events=");
225902c57f7bSKyle Evans 	print_mask_arg0(sysdecode_pollfd_events, pfd->events);
226002c57f7bSKyle Evans 	printf(", revents=");
226102c57f7bSKyle Evans 	print_mask_arg0(sysdecode_pollfd_events, pfd->revents);
226202c57f7bSKyle Evans 	printf("}");
226302c57f7bSKyle Evans }
226402c57f7bSKyle Evans 
226502c57f7bSKyle Evans void
ktrstructarray(struct ktr_struct_array * ksa,size_t buflen)2266ffb66079SJohn Baldwin ktrstructarray(struct ktr_struct_array *ksa, size_t buflen)
2267ffb66079SJohn Baldwin {
2268ffb66079SJohn Baldwin 	struct kevent kev;
226902c57f7bSKyle Evans 	struct pollfd pfd;
2270ffb66079SJohn Baldwin 	char *name, *data;
2271ffb66079SJohn Baldwin 	size_t namelen, datalen;
2272ffb66079SJohn Baldwin 	int i;
2273ffb66079SJohn Baldwin 	bool first;
2274ffb66079SJohn Baldwin 
2275ffb66079SJohn Baldwin 	buflen -= sizeof(*ksa);
2276ffb66079SJohn Baldwin 	for (name = (char *)(ksa + 1), namelen = 0;
2277ffb66079SJohn Baldwin 	     namelen < buflen && name[namelen] != '\0';
2278ffb66079SJohn Baldwin 	     ++namelen)
2279ffb66079SJohn Baldwin 		/* nothing */;
2280ffb66079SJohn Baldwin 	if (namelen == buflen)
2281ffb66079SJohn Baldwin 		goto invalid;
2282ffb66079SJohn Baldwin 	if (name[namelen] != '\0')
2283ffb66079SJohn Baldwin 		goto invalid;
2284ffb66079SJohn Baldwin 	/* sanity check */
2285ffb66079SJohn Baldwin 	for (i = 0; i < (int)namelen; ++i)
2286ffb66079SJohn Baldwin 		if (!isalnum(name[i]) && name[i] != '_')
2287ffb66079SJohn Baldwin 			goto invalid;
2288ffb66079SJohn Baldwin 	data = name + namelen + 1;
2289ffb66079SJohn Baldwin 	datalen = buflen - namelen - 1;
2290ffb66079SJohn Baldwin 	printf("struct %s[] = { ", name);
2291ffb66079SJohn Baldwin 	first = true;
2292ffb66079SJohn Baldwin 	for (; datalen >= ksa->struct_size;
2293ffb66079SJohn Baldwin 	    data += ksa->struct_size, datalen -= ksa->struct_size) {
2294ffb66079SJohn Baldwin 		if (!first)
2295ffb66079SJohn Baldwin 			printf("\n             ");
2296ffb66079SJohn Baldwin 		else
2297ffb66079SJohn Baldwin 			first = false;
2298ffb66079SJohn Baldwin 		if (strcmp(name, "kevent") == 0) {
2299ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev))
2300ffb66079SJohn Baldwin 				goto bad_size;
2301ffb66079SJohn Baldwin 			memcpy(&kev, data, sizeof(kev));
2302ffb66079SJohn Baldwin 			ktrkevent(&kev);
23038e4a3addSBrooks Davis 		} else if (strcmp(name, "freebsd11_kevent") == 0) {
23048e4a3addSBrooks Davis 			struct freebsd11_kevent kev11;
2305ffb66079SJohn Baldwin 
2306ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev11))
2307ffb66079SJohn Baldwin 				goto bad_size;
2308ffb66079SJohn Baldwin 			memcpy(&kev11, data, sizeof(kev11));
2309ffb66079SJohn Baldwin 			memset(&kev, 0, sizeof(kev));
2310ffb66079SJohn Baldwin 			kev.ident = kev11.ident;
2311ffb66079SJohn Baldwin 			kev.filter = kev11.filter;
2312ffb66079SJohn Baldwin 			kev.flags = kev11.flags;
2313ffb66079SJohn Baldwin 			kev.fflags = kev11.fflags;
2314ffb66079SJohn Baldwin 			kev.data = kev11.data;
2315ffb66079SJohn Baldwin 			kev.udata = kev11.udata;
2316ffb66079SJohn Baldwin 			ktrkevent(&kev);
2317ffb66079SJohn Baldwin #ifdef _WANT_KEVENT32
2318ffb66079SJohn Baldwin 		} else if (strcmp(name, "kevent32") == 0) {
2319ffb66079SJohn Baldwin 			struct kevent32 kev32;
2320ffb66079SJohn Baldwin 
2321ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev32))
2322ffb66079SJohn Baldwin 				goto bad_size;
2323ffb66079SJohn Baldwin 			memcpy(&kev32, data, sizeof(kev32));
2324ffb66079SJohn Baldwin 			memset(&kev, 0, sizeof(kev));
2325ffb66079SJohn Baldwin 			kev.ident = kev32.ident;
2326ffb66079SJohn Baldwin 			kev.filter = kev32.filter;
2327ffb66079SJohn Baldwin 			kev.flags = kev32.flags;
2328ffb66079SJohn Baldwin 			kev.fflags = kev32.fflags;
2329ffb66079SJohn Baldwin #if BYTE_ORDER == BIG_ENDIAN
2330ffb66079SJohn Baldwin 			kev.data = kev32.data2 | ((int64_t)kev32.data1 << 32);
2331ffb66079SJohn Baldwin #else
2332ffb66079SJohn Baldwin 			kev.data = kev32.data1 | ((int64_t)kev32.data2 << 32);
2333ffb66079SJohn Baldwin #endif
2334ffb66079SJohn Baldwin 			kev.udata = (void *)(uintptr_t)kev32.udata;
2335ffb66079SJohn Baldwin 			ktrkevent(&kev);
23368e4a3addSBrooks Davis 		} else if (strcmp(name, "freebsd11_kevent32") == 0) {
23378e4a3addSBrooks Davis 			struct freebsd11_kevent32 kev32;
2338ffb66079SJohn Baldwin 
2339ffb66079SJohn Baldwin 			if (ksa->struct_size != sizeof(kev32))
2340ffb66079SJohn Baldwin 				goto bad_size;
2341ffb66079SJohn Baldwin 			memcpy(&kev32, data, sizeof(kev32));
2342ffb66079SJohn Baldwin 			memset(&kev, 0, sizeof(kev));
2343ffb66079SJohn Baldwin 			kev.ident = kev32.ident;
2344ffb66079SJohn Baldwin 			kev.filter = kev32.filter;
2345ffb66079SJohn Baldwin 			kev.flags = kev32.flags;
2346ffb66079SJohn Baldwin 			kev.fflags = kev32.fflags;
2347ffb66079SJohn Baldwin 			kev.data = kev32.data;
2348ffb66079SJohn Baldwin 			kev.udata = (void *)(uintptr_t)kev32.udata;
2349ffb66079SJohn Baldwin 			ktrkevent(&kev);
2350ffb66079SJohn Baldwin #endif
235102c57f7bSKyle Evans 		} else if (strcmp(name, "pollfd") == 0) {
235202c57f7bSKyle Evans 			if (ksa->struct_size != sizeof(pfd))
235302c57f7bSKyle Evans 				goto bad_size;
235402c57f7bSKyle Evans 			memcpy(&pfd, data, sizeof(pfd));
235502c57f7bSKyle Evans 			ktrpollfd(&pfd);
2356ffb66079SJohn Baldwin 		} else {
2357ffb66079SJohn Baldwin 			printf("<unknown structure> }\n");
2358ffb66079SJohn Baldwin 			return;
2359ffb66079SJohn Baldwin 		}
2360ffb66079SJohn Baldwin 	}
2361ffb66079SJohn Baldwin 	printf(" }\n");
2362ffb66079SJohn Baldwin 	return;
2363ffb66079SJohn Baldwin invalid:
2364ffb66079SJohn Baldwin 	printf("invalid record\n");
2365ffb66079SJohn Baldwin 	return;
2366ffb66079SJohn Baldwin bad_size:
2367ffb66079SJohn Baldwin 	printf("<bad size> }\n");
2368ffb66079SJohn Baldwin 	return;
2369ffb66079SJohn Baldwin }
2370ffb66079SJohn Baldwin 
2371ffb66079SJohn Baldwin void
usage(void)237291fbb9c1SDavid Malone usage(void)
23739b50d902SRodney W. Grimes {
2374b9034ce2SBryan Drewery 	fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
2375da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
23769b50d902SRodney W. Grimes 	exit(1);
23779b50d902SRodney W. Grimes }
2378