xref: /freebsd/usr.bin/kdump/kdump.c (revision fbbd9655)
19b50d902SRodney W. Grimes /*-
29b50d902SRodney W. Grimes  * Copyright (c) 1988, 1993
39b50d902SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
49b50d902SRodney W. Grimes  *
59b50d902SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
69b50d902SRodney W. Grimes  * modification, are permitted provided that the following conditions
79b50d902SRodney W. Grimes  * are met:
89b50d902SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
99b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
109b50d902SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
119b50d902SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
129b50d902SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
13fbbd9655SWarner Losh  * 3. Neither the name of the University nor the names of its contributors
149b50d902SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
159b50d902SRodney W. Grimes  *    without specific prior written permission.
169b50d902SRodney W. Grimes  *
179b50d902SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
189b50d902SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
199b50d902SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
209b50d902SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
219b50d902SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
229b50d902SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
239b50d902SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
249b50d902SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
259b50d902SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
269b50d902SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
279b50d902SRodney W. Grimes  * SUCH DAMAGE.
289b50d902SRodney W. Grimes  */
299b50d902SRodney W. Grimes 
309b50d902SRodney W. Grimes #ifndef lint
3115fc002bSPhilippe Charnier static const char copyright[] =
329b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\
339b50d902SRodney W. Grimes 	The Regents of the University of California.  All rights reserved.\n";
349b50d902SRodney W. Grimes #endif /* not lint */
359b50d902SRodney W. Grimes 
369b50d902SRodney W. Grimes #ifndef lint
3715fc002bSPhilippe Charnier #if 0
389b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
3915fc002bSPhilippe Charnier #endif
409b50d902SRodney W. Grimes #endif /* not lint */
41e026a48cSDavid E. O'Brien #include <sys/cdefs.h>
42e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$");
439b50d902SRodney W. Grimes 
44406d2926SJohn Baldwin #define _WANT_KERNEL_ERRNO
459b50d902SRodney W. Grimes #include <sys/param.h>
46b881b8beSRobert Watson #include <sys/capsicum.h>
479b50d902SRodney W. Grimes #include <sys/errno.h>
489b50d902SRodney W. Grimes #include <sys/time.h>
499b50d902SRodney W. Grimes #include <sys/uio.h>
509b50d902SRodney W. Grimes #include <sys/ktrace.h>
519b50d902SRodney W. Grimes #include <sys/ioctl.h>
528bc31d83SCraig Rodrigues #include <sys/socket.h>
5360e15db9SDag-Erling Smørgrav #include <sys/stat.h>
547144d36fSDmitry Chagin #include <sys/sysent.h>
55fdb5bf37SJohn Baldwin #include <sys/umtx.h>
5660e15db9SDag-Erling Smørgrav #include <sys/un.h>
577144d36fSDmitry Chagin #include <sys/queue.h>
5834763d1cSJohn Baldwin #include <sys/wait.h>
59c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
60c36e54bbSMariusz Zaborski #include <sys/nv.h>
61c36e54bbSMariusz Zaborski #endif
621a604cfaSXin LI #include <arpa/inet.h>
6360e15db9SDag-Erling Smørgrav #include <netinet/in.h>
641a604cfaSXin LI #include <ctype.h>
65a4e3fc54SMariusz Zaborski #include <capsicum_helpers.h>
6615fc002bSPhilippe Charnier #include <err.h>
6760e15db9SDag-Erling Smørgrav #include <grp.h>
6860e15db9SDag-Erling Smørgrav #include <inttypes.h>
6915fc002bSPhilippe Charnier #include <locale.h>
70b9ef8051SAndrey V. Elsukov #include <netdb.h>
71f9b20fc8SPawel Jakub Dawidek #include <nl_types.h>
7260e15db9SDag-Erling Smørgrav #include <pwd.h>
7371ed318eSJohn Baldwin #include <stddef.h>
749b50d902SRodney W. Grimes #include <stdio.h>
759b50d902SRodney W. Grimes #include <stdlib.h>
769b50d902SRodney W. Grimes #include <string.h>
77d6fb4894SJohn Baldwin #include <sysdecode.h>
7860e15db9SDag-Erling Smørgrav #include <time.h>
7915fc002bSPhilippe Charnier #include <unistd.h>
8015fc002bSPhilippe Charnier #include <vis.h>
819b50d902SRodney W. Grimes #include "ktrace.h"
829b50d902SRodney W. Grimes 
83c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
84c501d73cSMariusz Zaborski #include <libcasper.h>
85c501d73cSMariusz Zaborski 
86c501d73cSMariusz Zaborski #include <casper/cap_grp.h>
87c501d73cSMariusz Zaborski #include <casper/cap_pwd.h>
88c501d73cSMariusz Zaborski #endif
89c501d73cSMariusz Zaborski 
907144d36fSDmitry Chagin u_int abidump(struct ktr_header *);
917144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *);
9291fbb9c1SDavid Malone int fread_tail(void *, int, int);
9391fbb9c1SDavid Malone void dumpheader(struct ktr_header *);
947144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int);
957144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int);
9691fbb9c1SDavid Malone void ktrnamei(char *, int);
97ec4beb5dSPeter Wemm void hexdump(char *, int, int);
98ec4beb5dSPeter Wemm void visdump(char *, int, int);
9991fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int);
100dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *);
10191fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *);
10288bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *);
103bb1a2d4aSJohn Baldwin void ktruser(int, void *);
1047008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *);
105de56aee0SKonstantin Belousov void ktritimerval(struct itimerval *it);
10660e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *);
10760e15db9SDag-Erling Smørgrav void ktrstat(struct stat *);
10860e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t);
109c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *);
11035818d2eSJohn Baldwin void ktrfault(struct ktr_fault *);
11135818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *);
11291fbb9c1SDavid Malone void usage(void);
11391fbb9c1SDavid Malone 
114c1269d20SMaxim Sobolev #define	TIMESTAMP_NONE		0x0
115c1269d20SMaxim Sobolev #define	TIMESTAMP_ABSOLUTE	0x1
116c1269d20SMaxim Sobolev #define	TIMESTAMP_ELAPSED	0x2
117c1269d20SMaxim Sobolev #define	TIMESTAMP_RELATIVE	0x4
118c1269d20SMaxim Sobolev 
119bb1a2d4aSJohn Baldwin static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
120b9034ce2SBryan Drewery     resolv = 0, abiflag = 0, syscallno = 0;
121bb1a2d4aSJohn Baldwin static const char *tracefile = DEF_TRACEFILE;
122bb1a2d4aSJohn Baldwin static struct ktr_header ktr_header;
1239b50d902SRodney W. Grimes 
12460e15db9SDag-Erling Smørgrav #define TIME_FORMAT	"%b %e %T %Y"
1259b50d902SRodney W. Grimes #define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
1269b50d902SRodney W. Grimes 
12771ed318eSJohn Baldwin #define	print_number64(first,i,n,c) do {				\
12871ed318eSJohn Baldwin 	uint64_t __v;							\
12971ed318eSJohn Baldwin 									\
13071ed318eSJohn Baldwin 	if (quad_align && (((ptrdiff_t)((i) - (first))) & 1) == 1) {	\
13171ed318eSJohn Baldwin 		(i)++;							\
13271ed318eSJohn Baldwin 		(n)--;							\
13371ed318eSJohn Baldwin 	}								\
13471ed318eSJohn Baldwin 	if (quad_slots == 2)						\
13571ed318eSJohn Baldwin 		__v = (uint64_t)(uint32_t)(i)[0] |			\
13671ed318eSJohn Baldwin 		    ((uint64_t)(uint32_t)(i)[1]) << 32;			\
13771ed318eSJohn Baldwin 	else								\
13871ed318eSJohn Baldwin 		__v = (uint64_t)*(i);					\
13971ed318eSJohn Baldwin 	if (decimal)							\
14071ed318eSJohn Baldwin 		printf("%c%jd", (c), (intmax_t)__v);			\
14171ed318eSJohn Baldwin 	else								\
14271ed318eSJohn Baldwin 		printf("%c%#jx", (c), (uintmax_t)__v);			\
14371ed318eSJohn Baldwin 	(i) += quad_slots;						\
14471ed318eSJohn Baldwin 	(n) -= quad_slots;						\
14571ed318eSJohn Baldwin 	(c) = ',';							\
14671ed318eSJohn Baldwin } while (0)
14771ed318eSJohn Baldwin 
14895bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do {					\
149dde5f9b9SDmitry Chagin 	if (decimal)							\
150e4bb45b1SDag-Erling Smørgrav 		printf("%c%jd", c, (intmax_t)*i);			\
151dde5f9b9SDmitry Chagin 	else								\
152661522f5SDag-Erling Smørgrav 		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
153dde5f9b9SDmitry Chagin 	i++;								\
154dde5f9b9SDmitry Chagin 	n--;								\
155dde5f9b9SDmitry Chagin 	c = ',';							\
156e4bb45b1SDag-Erling Smørgrav } while (0)
157dde5f9b9SDmitry Chagin 
1587144d36fSDmitry Chagin struct proc_info
1597144d36fSDmitry Chagin {
1607144d36fSDmitry Chagin 	TAILQ_ENTRY(proc_info)	info;
1617144d36fSDmitry Chagin 	u_int			sv_flags;
1627144d36fSDmitry Chagin 	pid_t			pid;
1637144d36fSDmitry Chagin };
1647144d36fSDmitry Chagin 
165bb1a2d4aSJohn Baldwin static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
1667144d36fSDmitry Chagin 
167c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
1684622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp;
1694622f0e1SPawel Jakub Dawidek #endif
1704622f0e1SPawel Jakub Dawidek 
171e14da991SPawel Jakub Dawidek static void
172e14da991SPawel Jakub Dawidek strerror_init(void)
173e14da991SPawel Jakub Dawidek {
174e14da991SPawel Jakub Dawidek 
175e14da991SPawel Jakub Dawidek 	/*
176e14da991SPawel Jakub Dawidek 	 * Cache NLS data before entering capability mode.
177e14da991SPawel Jakub Dawidek 	 * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
178e14da991SPawel Jakub Dawidek 	 */
179e14da991SPawel Jakub Dawidek 	(void)catopen("libc", NL_CAT_LOCALE);
180e14da991SPawel Jakub Dawidek }
181e14da991SPawel Jakub Dawidek 
182e14da991SPawel Jakub Dawidek static void
183e14da991SPawel Jakub Dawidek localtime_init(void)
184e14da991SPawel Jakub Dawidek {
185e14da991SPawel Jakub Dawidek 	time_t ltime;
186e14da991SPawel Jakub Dawidek 
187e14da991SPawel Jakub Dawidek 	/*
188e14da991SPawel Jakub Dawidek 	 * Allow localtime(3) to cache /etc/localtime content before entering
189e14da991SPawel Jakub Dawidek 	 * capability mode.
190e14da991SPawel Jakub Dawidek 	 * XXXPJD: There should be localtime_init() in libc.
191e14da991SPawel Jakub Dawidek 	 */
192e14da991SPawel Jakub Dawidek 	(void)time(&ltime);
193e14da991SPawel Jakub Dawidek 	(void)localtime(&ltime);
194e14da991SPawel Jakub Dawidek }
195e14da991SPawel Jakub Dawidek 
196c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
1974622f0e1SPawel Jakub Dawidek static int
1984622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
1994622f0e1SPawel Jakub Dawidek {
2004622f0e1SPawel Jakub Dawidek 	cap_channel_t *capcas, *cappwdloc, *capgrploc;
2014622f0e1SPawel Jakub Dawidek 	const char *cmds[1], *fields[1];
2024622f0e1SPawel Jakub Dawidek 
2034622f0e1SPawel Jakub Dawidek 	capcas = cap_init();
2044622f0e1SPawel Jakub Dawidek 	if (capcas == NULL) {
205c501d73cSMariusz Zaborski 		err(1, "unable to create casper process");
206c501d73cSMariusz Zaborski 		exit(1);
2074622f0e1SPawel Jakub Dawidek 	}
2084622f0e1SPawel Jakub Dawidek 	cappwdloc = cap_service_open(capcas, "system.pwd");
2094622f0e1SPawel Jakub Dawidek 	capgrploc = cap_service_open(capcas, "system.grp");
2104622f0e1SPawel Jakub Dawidek 	/* Casper capability no longer needed. */
2114622f0e1SPawel Jakub Dawidek 	cap_close(capcas);
2124622f0e1SPawel Jakub Dawidek 	if (cappwdloc == NULL || capgrploc == NULL) {
2134622f0e1SPawel Jakub Dawidek 		if (cappwdloc == NULL)
2144622f0e1SPawel Jakub Dawidek 			warn("unable to open system.pwd service");
2154622f0e1SPawel Jakub Dawidek 		if (capgrploc == NULL)
2164622f0e1SPawel Jakub Dawidek 			warn("unable to open system.grp service");
2178ff3952bSPawel Jakub Dawidek 		exit(1);
2184622f0e1SPawel Jakub Dawidek 	}
2194622f0e1SPawel Jakub Dawidek 	/* Limit system.pwd to only getpwuid() function and pw_name field. */
2204622f0e1SPawel Jakub Dawidek 	cmds[0] = "getpwuid";
2218ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0)
2228ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
2234622f0e1SPawel Jakub Dawidek 	fields[0] = "pw_name";
2248ff3952bSPawel Jakub Dawidek 	if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0)
2258ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.pwd service");
2264622f0e1SPawel Jakub Dawidek 	/* Limit system.grp to only getgrgid() function and gr_name field. */
2274622f0e1SPawel Jakub Dawidek 	cmds[0] = "getgrgid";
2288ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0)
2298ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
2304622f0e1SPawel Jakub Dawidek 	fields[0] = "gr_name";
2318ff3952bSPawel Jakub Dawidek 	if (cap_grp_limit_fields(capgrploc, fields, 1) < 0)
2328ff3952bSPawel Jakub Dawidek 		err(1, "unable to limit system.grp service");
2334622f0e1SPawel Jakub Dawidek 
2344622f0e1SPawel Jakub Dawidek 	*cappwdp = cappwdloc;
2354622f0e1SPawel Jakub Dawidek 	*capgrpp = capgrploc;
2364622f0e1SPawel Jakub Dawidek 	return (0);
2374622f0e1SPawel Jakub Dawidek }
238c501d73cSMariusz Zaborski #endif	/* HAVE_LIBCASPER */
2394622f0e1SPawel Jakub Dawidek 
2409289f547SJohn Baldwin static void
2419289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), int value)
2429289f547SJohn Baldwin {
2439289f547SJohn Baldwin 	const char *str;
2449289f547SJohn Baldwin 
2459289f547SJohn Baldwin 	str = decoder(value);
2469289f547SJohn Baldwin 	if (str != NULL)
2479289f547SJohn Baldwin 		printf("%s", str);
2489289f547SJohn Baldwin 	else {
2499289f547SJohn Baldwin 		if (decimal)
2509289f547SJohn Baldwin 			printf("<invalid=%d>", value);
2519289f547SJohn Baldwin 		else
2529289f547SJohn Baldwin 			printf("<invalid=%#x>", value);
2539289f547SJohn Baldwin 	}
2549289f547SJohn Baldwin }
2559289f547SJohn Baldwin 
2569289f547SJohn Baldwin /* Like print_integer_arg but unknown values are treated as valid. */
2579289f547SJohn Baldwin static void
2589289f547SJohn Baldwin print_integer_arg_valid(const char *(*decoder)(int), int value)
2599289f547SJohn Baldwin {
2609289f547SJohn Baldwin 	const char *str;
2619289f547SJohn Baldwin 
2629289f547SJohn Baldwin 	str = decoder(value);
2639289f547SJohn Baldwin 	if (str != NULL)
2649289f547SJohn Baldwin 		printf("%s", str);
2659289f547SJohn Baldwin 	else {
2669289f547SJohn Baldwin 		if (decimal)
2679289f547SJohn Baldwin 			printf("%d", value);
2689289f547SJohn Baldwin 		else
2699289f547SJohn Baldwin 			printf("%#x", value);
2709289f547SJohn Baldwin 	}
2719289f547SJohn Baldwin }
2729289f547SJohn Baldwin 
2739289f547SJohn Baldwin static void
2749289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), int value)
2759289f547SJohn Baldwin {
2769289f547SJohn Baldwin 	bool invalid;
2779289f547SJohn Baldwin 	int rem;
2789289f547SJohn Baldwin 
2799289f547SJohn Baldwin 	printf("%#x<", value);
2809289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
2819289f547SJohn Baldwin 	printf(">");
2829289f547SJohn Baldwin 	if (invalid)
2839289f547SJohn Baldwin 		printf("<invalid>%u", rem);
2849289f547SJohn Baldwin }
2859289f547SJohn Baldwin 
2869289f547SJohn Baldwin static void
2879289f547SJohn Baldwin print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value)
2889289f547SJohn Baldwin {
2899289f547SJohn Baldwin 	bool invalid;
2909289f547SJohn Baldwin 	int rem;
2919289f547SJohn Baldwin 
2929289f547SJohn Baldwin 	if (value == 0) {
2939289f547SJohn Baldwin 		printf("0");
2949289f547SJohn Baldwin 		return;
2959289f547SJohn Baldwin 	}
2969289f547SJohn Baldwin 	printf("%#x<", value);
2979289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
2989289f547SJohn Baldwin 	printf(">");
2999289f547SJohn Baldwin 	if (invalid)
3009289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3019289f547SJohn Baldwin }
3029289f547SJohn Baldwin 
3039289f547SJohn Baldwin static void
3049289f547SJohn Baldwin decode_fileflags(fflags_t value)
3059289f547SJohn Baldwin {
3069289f547SJohn Baldwin 	bool invalid;
3079289f547SJohn Baldwin 	fflags_t rem;
3089289f547SJohn Baldwin 
3099289f547SJohn Baldwin 	if (value == 0) {
3109289f547SJohn Baldwin 		printf("0");
3119289f547SJohn Baldwin 		return;
3129289f547SJohn Baldwin 	}
3139289f547SJohn Baldwin 	printf("%#x<", value);
3149289f547SJohn Baldwin 	invalid = !sysdecode_fileflags(stdout, value, &rem);
3159289f547SJohn Baldwin 	printf(">");
3169289f547SJohn Baldwin 	if (invalid)
3179289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3189289f547SJohn Baldwin }
3199289f547SJohn Baldwin 
3209289f547SJohn Baldwin static void
3219289f547SJohn Baldwin decode_filemode(int value)
3229289f547SJohn Baldwin {
3239289f547SJohn Baldwin 	bool invalid;
3249289f547SJohn Baldwin 	int rem;
3259289f547SJohn Baldwin 
3269289f547SJohn Baldwin 	if (value == 0) {
3279289f547SJohn Baldwin 		printf("0");
3289289f547SJohn Baldwin 		return;
3299289f547SJohn Baldwin 	}
3309289f547SJohn Baldwin 	printf("%#o<", value);
3319289f547SJohn Baldwin 	invalid = !sysdecode_filemode(stdout, value, &rem);
3329289f547SJohn Baldwin 	printf(">");
3339289f547SJohn Baldwin 	if (invalid)
3349289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3359289f547SJohn Baldwin }
3369289f547SJohn Baldwin 
3379289f547SJohn Baldwin static void
3389289f547SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value)
3399289f547SJohn Baldwin {
3409289f547SJohn Baldwin 	bool invalid;
3419289f547SJohn Baldwin 	uint32_t rem;
3429289f547SJohn Baldwin 
3439289f547SJohn Baldwin 	printf("%#x<", value);
3449289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
3459289f547SJohn Baldwin 	printf(">");
3469289f547SJohn Baldwin 	if (invalid)
3479289f547SJohn Baldwin 		printf("<invalid>%u", rem);
3489289f547SJohn Baldwin }
3499289f547SJohn Baldwin 
3509289f547SJohn Baldwin static void
3519289f547SJohn Baldwin print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value)
3529289f547SJohn Baldwin {
3539289f547SJohn Baldwin 	bool invalid;
3549289f547SJohn Baldwin 	u_long rem;
3559289f547SJohn Baldwin 
3569289f547SJohn Baldwin 	if (value == 0) {
3579289f547SJohn Baldwin 		printf("0");
3589289f547SJohn Baldwin 		return;
3599289f547SJohn Baldwin 	}
3609289f547SJohn Baldwin 	printf("%#lx<", value);
3619289f547SJohn Baldwin 	invalid = !decoder(stdout, value, &rem);
3629289f547SJohn Baldwin 	printf(">");
3639289f547SJohn Baldwin 	if (invalid)
3649289f547SJohn Baldwin 		printf("<invalid>%lu", rem);
3659289f547SJohn Baldwin }
3669289f547SJohn Baldwin 
36791fbb9c1SDavid Malone int
36891fbb9c1SDavid Malone main(int argc, char *argv[])
3699b50d902SRodney W. Grimes {
3709b50d902SRodney W. Grimes 	int ch, ktrlen, size;
37191fbb9c1SDavid Malone 	void *m;
3729b50d902SRodney W. Grimes 	int trpoints = ALL_POINTS;
373db53f66bSJohn Baldwin 	int drop_logged;
374ec4beb5dSPeter Wemm 	pid_t pid = 0;
3757144d36fSDmitry Chagin 	u_int sv_flags;
3769b50d902SRodney W. Grimes 
37709307b25SDag-Erling Smørgrav 	setlocale(LC_CTYPE, "");
3785ccbfb26SAndrey A. Chernov 
379c1269d20SMaxim Sobolev 	timestamp = TIMESTAMP_NONE;
380c1269d20SMaxim Sobolev 
381b9034ce2SBryan Drewery 	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
38209307b25SDag-Erling Smørgrav 		switch (ch) {
3837144d36fSDmitry Chagin 		case 'A':
3847144d36fSDmitry Chagin 			abiflag = 1;
3857144d36fSDmitry Chagin 			break;
3869b50d902SRodney W. Grimes 		case 'f':
3879b50d902SRodney W. Grimes 			tracefile = optarg;
3889b50d902SRodney W. Grimes 			break;
3899b50d902SRodney W. Grimes 		case 'd':
3909b50d902SRodney W. Grimes 			decimal = 1;
3919b50d902SRodney W. Grimes 			break;
3929b50d902SRodney W. Grimes 		case 'l':
3939b50d902SRodney W. Grimes 			tail = 1;
3949b50d902SRodney W. Grimes 			break;
3959b50d902SRodney W. Grimes 		case 'm':
3969b50d902SRodney W. Grimes 			maxdata = atoi(optarg);
3979b50d902SRodney W. Grimes 			break;
3989b50d902SRodney W. Grimes 		case 'n':
3999b50d902SRodney W. Grimes 			fancy = 0;
4009b50d902SRodney W. Grimes 			break;
401ec4beb5dSPeter Wemm 		case 'p':
402ec4beb5dSPeter Wemm 			pid = atoi(optarg);
403ec4beb5dSPeter Wemm 			break;
40460e15db9SDag-Erling Smørgrav 		case 'r':
40560e15db9SDag-Erling Smørgrav 			resolv = 1;
40660e15db9SDag-Erling Smørgrav 			break;
407b9034ce2SBryan Drewery 		case 'S':
408b9034ce2SBryan Drewery 			syscallno = 1;
409b9034ce2SBryan Drewery 			break;
410df0c8868SRobert Watson 		case 's':
411df0c8868SRobert Watson 			suppressdata = 1;
412df0c8868SRobert Watson 			break;
413ec131914SPeter Wemm 		case 'E':
414c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ELAPSED;
415ec131914SPeter Wemm 			break;
416a9ac598bSRobert Watson 		case 'H':
417a9ac598bSRobert Watson 			threads = 1;
418a9ac598bSRobert Watson 			break;
4199b50d902SRodney W. Grimes 		case 'R':
420c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_RELATIVE;
4219b50d902SRodney W. Grimes 			break;
4229b50d902SRodney W. Grimes 		case 'T':
423c1269d20SMaxim Sobolev 			timestamp |= TIMESTAMP_ABSOLUTE;
4249b50d902SRodney W. Grimes 			break;
4259b50d902SRodney W. Grimes 		case 't':
4269b50d902SRodney W. Grimes 			trpoints = getpoints(optarg);
42715fc002bSPhilippe Charnier 			if (trpoints < 0)
42815fc002bSPhilippe Charnier 				errx(1, "unknown trace point in %s", optarg);
4299b50d902SRodney W. Grimes 			break;
4309b50d902SRodney W. Grimes 		default:
4319b50d902SRodney W. Grimes 			usage();
4329b50d902SRodney W. Grimes 		}
4339b50d902SRodney W. Grimes 
43480844fd1SBill Fenner 	if (argc > optind)
4359b50d902SRodney W. Grimes 		usage();
4369b50d902SRodney W. Grimes 
43709307b25SDag-Erling Smørgrav 	m = malloc(size = 1025);
43815fc002bSPhilippe Charnier 	if (m == NULL)
43915fc002bSPhilippe Charnier 		errx(1, "%s", strerror(ENOMEM));
4409d0fa50eSSimon J. Gerraty 	if (strcmp(tracefile, "-") != 0)
44115fc002bSPhilippe Charnier 		if (!freopen(tracefile, "r", stdin))
44215fc002bSPhilippe Charnier 			err(1, "%s", tracefile);
443f9b20fc8SPawel Jakub Dawidek 
444e14da991SPawel Jakub Dawidek 	strerror_init();
445e14da991SPawel Jakub Dawidek 	localtime_init();
446c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
4474622f0e1SPawel Jakub Dawidek 	if (resolv != 0) {
4484622f0e1SPawel Jakub Dawidek 		if (cappwdgrp_setup(&cappwd, &capgrp) < 0) {
4494622f0e1SPawel Jakub Dawidek 			cappwd = NULL;
4504622f0e1SPawel Jakub Dawidek 			capgrp = NULL;
4514622f0e1SPawel Jakub Dawidek 		}
4524622f0e1SPawel Jakub Dawidek 	}
4534622f0e1SPawel Jakub Dawidek 	if (resolv == 0 || (cappwd != NULL && capgrp != NULL)) {
4544622f0e1SPawel Jakub Dawidek 		if (cap_enter() < 0 && errno != ENOSYS)
4554622f0e1SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
4564622f0e1SPawel Jakub Dawidek 	}
4574622f0e1SPawel Jakub Dawidek #else
458d2c9ca44SPawel Jakub Dawidek 	if (resolv == 0) {
459f9b20fc8SPawel Jakub Dawidek 		if (cap_enter() < 0 && errno != ENOSYS)
460f9b20fc8SPawel Jakub Dawidek 			err(1, "unable to enter capability mode");
461d2c9ca44SPawel Jakub Dawidek 	}
4624622f0e1SPawel Jakub Dawidek #endif
463a4e3fc54SMariusz Zaborski 	if (caph_limit_stdio() == -1)
464a4e3fc54SMariusz Zaborski 		err(1, "unable to limit stdio");
465f9b20fc8SPawel Jakub Dawidek 
4667144d36fSDmitry Chagin 	TAILQ_INIT(&trace_procs);
467db53f66bSJohn Baldwin 	drop_logged = 0;
4689b50d902SRodney W. Grimes 	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
469db53f66bSJohn Baldwin 		if (ktr_header.ktr_type & KTR_DROP) {
470db53f66bSJohn Baldwin 			ktr_header.ktr_type &= ~KTR_DROP;
471a9ac598bSRobert Watson 			if (!drop_logged && threads) {
47209307b25SDag-Erling Smørgrav 				printf(
473c065c0b8SJaakko Heinonen 				    "%6jd %6jd %-8.*s Events dropped.\n",
474c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid,
475c065c0b8SJaakko Heinonen 				    ktr_header.ktr_tid > 0 ?
476c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_tid : 0,
477c065c0b8SJaakko Heinonen 				    MAXCOMLEN, ktr_header.ktr_comm);
478a9ac598bSRobert Watson 				drop_logged = 1;
479a9ac598bSRobert Watson 			} else if (!drop_logged) {
48009307b25SDag-Erling Smørgrav 				printf("%6jd %-8.*s Events dropped.\n",
481c065c0b8SJaakko Heinonen 				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
482db53f66bSJohn Baldwin 				    ktr_header.ktr_comm);
483db53f66bSJohn Baldwin 				drop_logged = 1;
484db53f66bSJohn Baldwin 			}
485db53f66bSJohn Baldwin 		}
4869b50d902SRodney W. Grimes 		if (trpoints & (1<<ktr_header.ktr_type))
48701a36e29SJohn Baldwin 			if (pid == 0 || ktr_header.ktr_pid == pid ||
48801a36e29SJohn Baldwin 			    ktr_header.ktr_tid == pid)
4899b50d902SRodney W. Grimes 				dumpheader(&ktr_header);
49015fc002bSPhilippe Charnier 		if ((ktrlen = ktr_header.ktr_len) < 0)
49115fc002bSPhilippe Charnier 			errx(1, "bogus length 0x%x", ktrlen);
4929b50d902SRodney W. Grimes 		if (ktrlen > size) {
49309307b25SDag-Erling Smørgrav 			m = realloc(m, ktrlen+1);
49415fc002bSPhilippe Charnier 			if (m == NULL)
49515fc002bSPhilippe Charnier 				errx(1, "%s", strerror(ENOMEM));
4969b50d902SRodney W. Grimes 			size = ktrlen;
4979b50d902SRodney W. Grimes 		}
49815fc002bSPhilippe Charnier 		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
49915fc002bSPhilippe Charnier 			errx(1, "data too short");
5007144d36fSDmitry Chagin 		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
5017144d36fSDmitry Chagin 			continue;
5027144d36fSDmitry Chagin 		sv_flags = abidump(&ktr_header);
50301a36e29SJohn Baldwin 		if (pid && ktr_header.ktr_pid != pid &&
50401a36e29SJohn Baldwin 		    ktr_header.ktr_tid != pid)
505ec4beb5dSPeter Wemm 			continue;
5069b50d902SRodney W. Grimes 		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
5079b50d902SRodney W. Grimes 			continue;
508db53f66bSJohn Baldwin 		drop_logged = 0;
5099b50d902SRodney W. Grimes 		switch (ktr_header.ktr_type) {
5109b50d902SRodney W. Grimes 		case KTR_SYSCALL:
5117144d36fSDmitry Chagin 			ktrsyscall((struct ktr_syscall *)m, sv_flags);
5129b50d902SRodney W. Grimes 			break;
5139b50d902SRodney W. Grimes 		case KTR_SYSRET:
5147144d36fSDmitry Chagin 			ktrsysret((struct ktr_sysret *)m, sv_flags);
5159b50d902SRodney W. Grimes 			break;
5169b50d902SRodney W. Grimes 		case KTR_NAMEI:
517a56be37eSJohn Baldwin 		case KTR_SYSCTL:
5189b50d902SRodney W. Grimes 			ktrnamei(m, ktrlen);
5199b50d902SRodney W. Grimes 			break;
5209b50d902SRodney W. Grimes 		case KTR_GENIO:
5219b50d902SRodney W. Grimes 			ktrgenio((struct ktr_genio *)m, ktrlen);
5229b50d902SRodney W. Grimes 			break;
5239b50d902SRodney W. Grimes 		case KTR_PSIG:
524dde5f9b9SDmitry Chagin 			ktrpsig((struct ktr_psig *)m);
5259b50d902SRodney W. Grimes 			break;
5269b50d902SRodney W. Grimes 		case KTR_CSW:
52788bf5036SJohn Baldwin 			if (ktrlen == sizeof(struct ktr_csw_old))
52888bf5036SJohn Baldwin 				ktrcsw_old((struct ktr_csw_old *)m);
52988bf5036SJohn Baldwin 			else
5309b50d902SRodney W. Grimes 				ktrcsw((struct ktr_csw *)m);
5319b50d902SRodney W. Grimes 			break;
53282e2dd32SPoul-Henning Kamp 		case KTR_USER:
5333f8ba9aeSPoul-Henning Kamp 			ktruser(ktrlen, m);
53482e2dd32SPoul-Henning Kamp 			break;
53560e15db9SDag-Erling Smørgrav 		case KTR_STRUCT:
53660e15db9SDag-Erling Smørgrav 			ktrstruct(m, ktrlen);
53760e15db9SDag-Erling Smørgrav 			break;
538c601ad8eSDag-Erling Smørgrav 		case KTR_CAPFAIL:
539c601ad8eSDag-Erling Smørgrav 			ktrcapfail((struct ktr_cap_fail *)m);
54035818d2eSJohn Baldwin 			break;
54135818d2eSJohn Baldwin 		case KTR_FAULT:
54235818d2eSJohn Baldwin 			ktrfault((struct ktr_fault *)m);
54335818d2eSJohn Baldwin 			break;
54435818d2eSJohn Baldwin 		case KTR_FAULTEND:
54535818d2eSJohn Baldwin 			ktrfaultend((struct ktr_faultend *)m);
54635818d2eSJohn Baldwin 			break;
547b9609ab1SJohn Baldwin 		default:
548b9609ab1SJohn Baldwin 			printf("\n");
549b9609ab1SJohn Baldwin 			break;
5509b50d902SRodney W. Grimes 		}
5519b50d902SRodney W. Grimes 		if (tail)
55209307b25SDag-Erling Smørgrav 			fflush(stdout);
5539b50d902SRodney W. Grimes 	}
55491fbb9c1SDavid Malone 	return 0;
5559b50d902SRodney W. Grimes }
5569b50d902SRodney W. Grimes 
55791fbb9c1SDavid Malone int
55891fbb9c1SDavid Malone fread_tail(void *buf, int size, int num)
5599b50d902SRodney W. Grimes {
5609b50d902SRodney W. Grimes 	int i;
5619b50d902SRodney W. Grimes 
5629b50d902SRodney W. Grimes 	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
56309307b25SDag-Erling Smørgrav 		sleep(1);
5649b50d902SRodney W. Grimes 		clearerr(stdin);
5659b50d902SRodney W. Grimes 	}
5669b50d902SRodney W. Grimes 	return (i);
5679b50d902SRodney W. Grimes }
5689b50d902SRodney W. Grimes 
5697144d36fSDmitry Chagin int
5707144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags)
5717144d36fSDmitry Chagin {
5727144d36fSDmitry Chagin 	struct proc_info *pi;
5737144d36fSDmitry Chagin 
5747144d36fSDmitry Chagin 	switch (kth->ktr_type) {
5757144d36fSDmitry Chagin 	case KTR_PROCCTOR:
5767144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5777144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5787144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5797144d36fSDmitry Chagin 				break;
5807144d36fSDmitry Chagin 			}
5817144d36fSDmitry Chagin 		}
5827144d36fSDmitry Chagin 		pi = malloc(sizeof(struct proc_info));
5837144d36fSDmitry Chagin 		if (pi == NULL)
5847144d36fSDmitry Chagin 			errx(1, "%s", strerror(ENOMEM));
5857144d36fSDmitry Chagin 		pi->sv_flags = *flags;
5867144d36fSDmitry Chagin 		pi->pid = kth->ktr_pid;
5877144d36fSDmitry Chagin 		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
5887144d36fSDmitry Chagin 		return (1);
5897144d36fSDmitry Chagin 
5907144d36fSDmitry Chagin 	case KTR_PROCDTOR:
5917144d36fSDmitry Chagin 		TAILQ_FOREACH(pi, &trace_procs, info) {
5927144d36fSDmitry Chagin 			if (pi->pid == kth->ktr_pid) {
5937144d36fSDmitry Chagin 				TAILQ_REMOVE(&trace_procs, pi, info);
5947144d36fSDmitry Chagin 				free(pi);
5957144d36fSDmitry Chagin 				break;
5967144d36fSDmitry Chagin 			}
5977144d36fSDmitry Chagin 		}
5987144d36fSDmitry Chagin 		return (1);
5997144d36fSDmitry Chagin 	}
6007144d36fSDmitry Chagin 
6017144d36fSDmitry Chagin 	return (0);
6027144d36fSDmitry Chagin }
6037144d36fSDmitry Chagin 
6047144d36fSDmitry Chagin u_int
6057144d36fSDmitry Chagin abidump(struct ktr_header *kth)
6067144d36fSDmitry Chagin {
6077144d36fSDmitry Chagin 	struct proc_info *pi;
6087144d36fSDmitry Chagin 	const char *abi;
6097144d36fSDmitry Chagin 	const char *arch;
6107144d36fSDmitry Chagin 	u_int flags = 0;
6117144d36fSDmitry Chagin 
6127144d36fSDmitry Chagin 	TAILQ_FOREACH(pi, &trace_procs, info) {
6137144d36fSDmitry Chagin 		if (pi->pid == kth->ktr_pid) {
6147144d36fSDmitry Chagin 			flags = pi->sv_flags;
6157144d36fSDmitry Chagin 			break;
6167144d36fSDmitry Chagin 		}
6177144d36fSDmitry Chagin 	}
6187144d36fSDmitry Chagin 
6197144d36fSDmitry Chagin 	if (abiflag == 0)
6207144d36fSDmitry Chagin 		return (flags);
6217144d36fSDmitry Chagin 
6227144d36fSDmitry Chagin 	switch (flags & SV_ABI_MASK) {
6237144d36fSDmitry Chagin 	case SV_ABI_LINUX:
6247144d36fSDmitry Chagin 		abi = "L";
6257144d36fSDmitry Chagin 		break;
6267144d36fSDmitry Chagin 	case SV_ABI_FREEBSD:
6277144d36fSDmitry Chagin 		abi = "F";
6287144d36fSDmitry Chagin 		break;
6296fb8946bSJohn Baldwin 	case SV_ABI_CLOUDABI:
6306fb8946bSJohn Baldwin 		abi = "C";
6316fb8946bSJohn Baldwin 		break;
6327144d36fSDmitry Chagin 	default:
6337144d36fSDmitry Chagin 		abi = "U";
6347144d36fSDmitry Chagin 		break;
6357144d36fSDmitry Chagin 	}
6367144d36fSDmitry Chagin 
6377144d36fSDmitry Chagin 	if (flags & SV_LP64)
6387144d36fSDmitry Chagin 		arch = "64";
6396fc8053fSJohn Baldwin 	else if (flags & SV_ILP32)
6407144d36fSDmitry Chagin 		arch = "32";
6416fc8053fSJohn Baldwin 	else
6427144d36fSDmitry Chagin 		arch = "00";
6437144d36fSDmitry Chagin 
6447144d36fSDmitry Chagin 	printf("%s%s  ", abi, arch);
6457144d36fSDmitry Chagin 
6467144d36fSDmitry Chagin 	return (flags);
6477144d36fSDmitry Chagin }
6487144d36fSDmitry Chagin 
64991fbb9c1SDavid Malone void
65091fbb9c1SDavid Malone dumpheader(struct ktr_header *kth)
6519b50d902SRodney W. Grimes {
6529b50d902SRodney W. Grimes 	static char unknown[64];
653dda41f20SJohn Baldwin 	static struct timeval prevtime, prevtime_e;
654dda41f20SJohn Baldwin 	struct timeval temp;
65591fbb9c1SDavid Malone 	const char *type;
656da551bb2SMaxim Sobolev 	const char *sign;
6579b50d902SRodney W. Grimes 
6589b50d902SRodney W. Grimes 	switch (kth->ktr_type) {
6599b50d902SRodney W. Grimes 	case KTR_SYSCALL:
6609b50d902SRodney W. Grimes 		type = "CALL";
6619b50d902SRodney W. Grimes 		break;
6629b50d902SRodney W. Grimes 	case KTR_SYSRET:
6639b50d902SRodney W. Grimes 		type = "RET ";
6649b50d902SRodney W. Grimes 		break;
6659b50d902SRodney W. Grimes 	case KTR_NAMEI:
6669b50d902SRodney W. Grimes 		type = "NAMI";
6679b50d902SRodney W. Grimes 		break;
6689b50d902SRodney W. Grimes 	case KTR_GENIO:
6699b50d902SRodney W. Grimes 		type = "GIO ";
6709b50d902SRodney W. Grimes 		break;
6719b50d902SRodney W. Grimes 	case KTR_PSIG:
6729b50d902SRodney W. Grimes 		type = "PSIG";
6739b50d902SRodney W. Grimes 		break;
6749b50d902SRodney W. Grimes 	case KTR_CSW:
6759b50d902SRodney W. Grimes 		type = "CSW ";
6769b50d902SRodney W. Grimes 		break;
67782e2dd32SPoul-Henning Kamp 	case KTR_USER:
67882e2dd32SPoul-Henning Kamp 		type = "USER";
67982e2dd32SPoul-Henning Kamp 		break;
68060e15db9SDag-Erling Smørgrav 	case KTR_STRUCT:
68160e15db9SDag-Erling Smørgrav 		type = "STRU";
68260e15db9SDag-Erling Smørgrav 		break;
683a56be37eSJohn Baldwin 	case KTR_SYSCTL:
684a56be37eSJohn Baldwin 		type = "SCTL";
685a56be37eSJohn Baldwin 		break;
6867144d36fSDmitry Chagin 	case KTR_PROCCTOR:
6877144d36fSDmitry Chagin 		/* FALLTHROUGH */
6887144d36fSDmitry Chagin 	case KTR_PROCDTOR:
6897144d36fSDmitry Chagin 		return;
690c601ad8eSDag-Erling Smørgrav 	case KTR_CAPFAIL:
691c601ad8eSDag-Erling Smørgrav 		type = "CAP ";
692c601ad8eSDag-Erling Smørgrav 		break;
69335818d2eSJohn Baldwin 	case KTR_FAULT:
69435818d2eSJohn Baldwin 		type = "PFLT";
69535818d2eSJohn Baldwin 		break;
69635818d2eSJohn Baldwin 	case KTR_FAULTEND:
69735818d2eSJohn Baldwin 		type = "PRET";
69835818d2eSJohn Baldwin 		break;
6999b50d902SRodney W. Grimes 	default:
70009307b25SDag-Erling Smørgrav 		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
7019b50d902SRodney W. Grimes 		type = unknown;
7029b50d902SRodney W. Grimes 	}
7039b50d902SRodney W. Grimes 
704a9ac598bSRobert Watson 	/*
705a9ac598bSRobert Watson 	 * The ktr_tid field was previously the ktr_buffer field, which held
706a9ac598bSRobert Watson 	 * the kernel pointer value for the buffer associated with data
707a9ac598bSRobert Watson 	 * following the record header.  It now holds a threadid, but only
708a9ac598bSRobert Watson 	 * for trace files after the change.  Older trace files still contain
709a9ac598bSRobert Watson 	 * kernel pointers.  Detect this and suppress the results by printing
710a9ac598bSRobert Watson 	 * negative tid's as 0.
711a9ac598bSRobert Watson 	 */
712a9ac598bSRobert Watson 	if (threads)
71309307b25SDag-Erling Smørgrav 		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
714c065c0b8SJaakko Heinonen 		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
715c065c0b8SJaakko Heinonen 		    MAXCOMLEN, kth->ktr_comm);
716a9ac598bSRobert Watson 	else
71709307b25SDag-Erling Smørgrav 		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
718a9ac598bSRobert Watson 		    kth->ktr_comm);
7199b50d902SRodney W. Grimes         if (timestamp) {
720c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_ABSOLUTE) {
721c1269d20SMaxim Sobolev 			printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
722c1269d20SMaxim Sobolev 			    kth->ktr_time.tv_usec);
723ec131914SPeter Wemm 		}
724c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_ELAPSED) {
725c1269d20SMaxim Sobolev 			if (prevtime_e.tv_sec == 0)
726c1269d20SMaxim Sobolev 				prevtime_e = kth->ktr_time;
72754b10c9eSJohn Baldwin 			timersub(&kth->ktr_time, &prevtime_e, &temp);
72854b10c9eSJohn Baldwin 			printf("%jd.%06ld ", (intmax_t)temp.tv_sec,
72954b10c9eSJohn Baldwin 			    temp.tv_usec);
730c1269d20SMaxim Sobolev 		}
731c1269d20SMaxim Sobolev 		if (timestamp & TIMESTAMP_RELATIVE) {
732da551bb2SMaxim Sobolev 			if (prevtime.tv_sec == 0)
733da551bb2SMaxim Sobolev 				prevtime = kth->ktr_time;
73454b10c9eSJohn Baldwin 			if (timercmp(&kth->ktr_time, &prevtime, <)) {
73554b10c9eSJohn Baldwin 				timersub(&prevtime, &kth->ktr_time, &temp);
736da551bb2SMaxim Sobolev 				sign = "-";
737da551bb2SMaxim Sobolev 			} else {
73854b10c9eSJohn Baldwin 				timersub(&kth->ktr_time, &prevtime, &temp);
739da551bb2SMaxim Sobolev 				sign = "";
740da551bb2SMaxim Sobolev 			}
74154b10c9eSJohn Baldwin 			prevtime = kth->ktr_time;
74254b10c9eSJohn Baldwin 			printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec,
74354b10c9eSJohn Baldwin 			    temp.tv_usec);
7449b50d902SRodney W. Grimes 		}
745c1269d20SMaxim Sobolev 	}
74609307b25SDag-Erling Smørgrav 	printf("%s  ", type);
7479b50d902SRodney W. Grimes }
7489b50d902SRodney W. Grimes 
7499b50d902SRodney W. Grimes #include <sys/syscall.h>
7509b50d902SRodney W. Grimes 
751265e5898SJohn Baldwin static void
752265e5898SJohn Baldwin ioctlname(unsigned long val)
753265e5898SJohn Baldwin {
754265e5898SJohn Baldwin 	const char *str;
755265e5898SJohn Baldwin 
756265e5898SJohn Baldwin 	str = sysdecode_ioctlname(val);
757265e5898SJohn Baldwin 	if (str != NULL)
758265e5898SJohn Baldwin 		printf("%s", str);
759265e5898SJohn Baldwin 	else if (decimal)
760265e5898SJohn Baldwin 		printf("%lu", val);
761265e5898SJohn Baldwin 	else
762265e5898SJohn Baldwin 		printf("%#lx", val);
763265e5898SJohn Baldwin }
764265e5898SJohn Baldwin 
765a5f14abfSJohn Baldwin static enum sysdecode_abi
766a5f14abfSJohn Baldwin syscallabi(u_int sv_flags)
767a5f14abfSJohn Baldwin {
768a5f14abfSJohn Baldwin 
769a5f14abfSJohn Baldwin 	if (sv_flags == 0)
7705842bd68SJohn Baldwin 		return (SYSDECODE_ABI_FREEBSD);
771a5f14abfSJohn Baldwin 	switch (sv_flags & SV_ABI_MASK) {
772a5f14abfSJohn Baldwin 	case SV_ABI_FREEBSD:
7735842bd68SJohn Baldwin 		return (SYSDECODE_ABI_FREEBSD);
774a5f14abfSJohn Baldwin #if defined(__amd64__) || defined(__i386__)
775a5f14abfSJohn Baldwin 	case SV_ABI_LINUX:
776a5f14abfSJohn Baldwin #ifdef __amd64__
777a5f14abfSJohn Baldwin 		if (sv_flags & SV_ILP32)
7785842bd68SJohn Baldwin 			return (SYSDECODE_ABI_LINUX32);
779a5f14abfSJohn Baldwin #endif
7805842bd68SJohn Baldwin 		return (SYSDECODE_ABI_LINUX);
781a5f14abfSJohn Baldwin #endif
7826fb8946bSJohn Baldwin #if defined(__aarch64__) || defined(__amd64__)
7836fb8946bSJohn Baldwin 	case SV_ABI_CLOUDABI:
7846fb8946bSJohn Baldwin 		return (SYSDECODE_ABI_CLOUDABI64);
7856fb8946bSJohn Baldwin #endif
786a5f14abfSJohn Baldwin 	default:
7875842bd68SJohn Baldwin 		return (SYSDECODE_ABI_UNKNOWN);
788a5f14abfSJohn Baldwin 	}
789a5f14abfSJohn Baldwin }
790a5f14abfSJohn Baldwin 
791a5f14abfSJohn Baldwin static void
792a5f14abfSJohn Baldwin syscallname(u_int code, u_int sv_flags)
793a5f14abfSJohn Baldwin {
794a5f14abfSJohn Baldwin 	const char *name;
795a5f14abfSJohn Baldwin 
796a5f14abfSJohn Baldwin 	name = sysdecode_syscallname(syscallabi(sv_flags), code);
797a5f14abfSJohn Baldwin 	if (name == NULL)
798a5f14abfSJohn Baldwin 		printf("[%d]", code);
799a5f14abfSJohn Baldwin 	else {
800a5f14abfSJohn Baldwin 		printf("%s", name);
801a5f14abfSJohn Baldwin 		if (syscallno)
802a5f14abfSJohn Baldwin 			printf("[%d]", code);
803a5f14abfSJohn Baldwin 	}
804a5f14abfSJohn Baldwin }
805a5f14abfSJohn Baldwin 
8069289f547SJohn Baldwin static void
8079289f547SJohn Baldwin print_signal(int signo)
8089289f547SJohn Baldwin {
8099289f547SJohn Baldwin 	const char *signame;
8109289f547SJohn Baldwin 
8119289f547SJohn Baldwin 	signame = sysdecode_signal(signo);
8129289f547SJohn Baldwin 	if (signame != NULL)
8139289f547SJohn Baldwin 		printf("%s", signame);
8149289f547SJohn Baldwin 	else
8159289f547SJohn Baldwin 		printf("SIG %d", signo);
8169289f547SJohn Baldwin }
8179289f547SJohn Baldwin 
81891fbb9c1SDavid Malone void
819a5f14abfSJohn Baldwin ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
8209b50d902SRodney W. Grimes {
82191fbb9c1SDavid Malone 	int narg = ktr->ktr_narg;
82271ed318eSJohn Baldwin 	register_t *ip, *first;
823c601ad8eSDag-Erling Smørgrav 	intmax_t arg;
82471ed318eSJohn Baldwin 	int quad_align, quad_slots;
8259b50d902SRodney W. Grimes 
826a5f14abfSJohn Baldwin 	syscallname(ktr->ktr_code, sv_flags);
82771ed318eSJohn Baldwin 	ip = first = &ktr->ktr_args[0];
8289b50d902SRodney W. Grimes 	if (narg) {
8299b50d902SRodney W. Grimes 		char c = '(';
8307144d36fSDmitry Chagin 		if (fancy &&
831a5f14abfSJohn Baldwin 		    (sv_flags == 0 ||
832a5f14abfSJohn Baldwin 		    (sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
83371ed318eSJohn Baldwin 			quad_align = 0;
83471ed318eSJohn Baldwin 			if (sv_flags & SV_ILP32) {
83571ed318eSJohn Baldwin #ifdef __powerpc__
83671ed318eSJohn Baldwin 				quad_align = 1;
83771ed318eSJohn Baldwin #endif
83871ed318eSJohn Baldwin 				quad_slots = 2;
83971ed318eSJohn Baldwin 			} else
84071ed318eSJohn Baldwin 				quad_slots = 1;
84173430055SDag-Erling Smørgrav 			switch (ktr->ktr_code) {
8421ca6c7fcSJilles Tjoelker 			case SYS_bindat:
8431ca6c7fcSJilles Tjoelker 			case SYS_connectat:
8448447b7cdSJilles Tjoelker 			case SYS_faccessat:
8458447b7cdSJilles Tjoelker 			case SYS_fchmodat:
8468447b7cdSJilles Tjoelker 			case SYS_fchownat:
8478447b7cdSJilles Tjoelker 			case SYS_fstatat:
8488447b7cdSJilles Tjoelker 			case SYS_futimesat:
8498447b7cdSJilles Tjoelker 			case SYS_linkat:
8508447b7cdSJilles Tjoelker 			case SYS_mkdirat:
8518447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
8528447b7cdSJilles Tjoelker 			case SYS_mknodat:
8538447b7cdSJilles Tjoelker 			case SYS_openat:
8548447b7cdSJilles Tjoelker 			case SYS_readlinkat:
8558447b7cdSJilles Tjoelker 			case SYS_renameat:
8568447b7cdSJilles Tjoelker 			case SYS_unlinkat:
8572205e0d1SJilles Tjoelker 			case SYS_utimensat:
8588447b7cdSJilles Tjoelker 				putchar('(');
8599289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_atfd, *ip);
8608447b7cdSJilles Tjoelker 				c = ',';
8618447b7cdSJilles Tjoelker 				ip++;
8628447b7cdSJilles Tjoelker 				narg--;
8638447b7cdSJilles Tjoelker 				break;
8648447b7cdSJilles Tjoelker 			}
8658447b7cdSJilles Tjoelker 			switch (ktr->ktr_code) {
86673430055SDag-Erling Smørgrav 			case SYS_ioctl: {
86798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
868d09e66beSDag-Erling Smørgrav 				putchar(c);
869265e5898SJohn Baldwin 				ioctlname(*ip);
8709b50d902SRodney W. Grimes 				c = ',';
8719b50d902SRodney W. Grimes 				ip++;
8729b50d902SRodney W. Grimes 				narg--;
87373430055SDag-Erling Smørgrav 				break;
87473430055SDag-Erling Smørgrav 			}
87573430055SDag-Erling Smørgrav 			case SYS_ptrace:
87609307b25SDag-Erling Smørgrav 				putchar('(');
8779289f547SJohn Baldwin 				print_integer_arg(sysdecode_ptrace_request, *ip);
8789b50d902SRodney W. Grimes 				c = ',';
8799b50d902SRodney W. Grimes 				ip++;
8809b50d902SRodney W. Grimes 				narg--;
88173430055SDag-Erling Smørgrav 				break;
88273430055SDag-Erling Smørgrav 			case SYS_access:
88373430055SDag-Erling Smørgrav 			case SYS_eaccess:
8848447b7cdSJilles Tjoelker 			case SYS_faccessat:
88598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
88609307b25SDag-Erling Smørgrav 				putchar(',');
8879289f547SJohn Baldwin 				print_mask_arg(sysdecode_access_mode, *ip);
88898a68a58SAlexander Leidinger 				ip++;
88998a68a58SAlexander Leidinger 				narg--;
89073430055SDag-Erling Smørgrav 				break;
89173430055SDag-Erling Smørgrav 			case SYS_open:
8928447b7cdSJilles Tjoelker 			case SYS_openat:
89398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
89409307b25SDag-Erling Smørgrav 				putchar(',');
8959289f547SJohn Baldwin 				print_mask_arg(sysdecode_open_flags, ip[0]);
8969289f547SJohn Baldwin 				if ((ip[0] & O_CREAT) == O_CREAT) {
8979289f547SJohn Baldwin 					putchar(',');
8989289f547SJohn Baldwin 					decode_filemode(ip[1]);
8999289f547SJohn Baldwin 				}
90073430055SDag-Erling Smørgrav 				ip += 2;
90198a68a58SAlexander Leidinger 				narg -= 2;
90273430055SDag-Erling Smørgrav 				break;
90373430055SDag-Erling Smørgrav 			case SYS_wait4:
90498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
90609307b25SDag-Erling Smørgrav 				putchar(',');
9079289f547SJohn Baldwin 				print_mask_arg0(sysdecode_wait4_options, *ip);
90834763d1cSJohn Baldwin 				ip++;
90934763d1cSJohn Baldwin 				narg--;
91034763d1cSJohn Baldwin 				break;
91134763d1cSJohn Baldwin 			case SYS_wait6:
91234763d1cSJohn Baldwin 				putchar('(');
9139289f547SJohn Baldwin 				print_integer_arg(sysdecode_idtype, *ip);
91434763d1cSJohn Baldwin 				c = ',';
91534763d1cSJohn Baldwin 				ip++;
91634763d1cSJohn Baldwin 				narg--;
91771ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
91834763d1cSJohn Baldwin 				print_number(ip, narg, c);
91934763d1cSJohn Baldwin 				putchar(',');
9209289f547SJohn Baldwin 				print_mask_arg(sysdecode_wait6_options, *ip);
92198a68a58SAlexander Leidinger 				ip++;
92298a68a58SAlexander Leidinger 				narg--;
92373430055SDag-Erling Smørgrav 				break;
92473430055SDag-Erling Smørgrav 			case SYS_chmod:
92573430055SDag-Erling Smørgrav 			case SYS_fchmod:
92673430055SDag-Erling Smørgrav 			case SYS_lchmod:
927eebea334SBaptiste Daroussin 			case SYS_fchmodat:
92898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
92909307b25SDag-Erling Smørgrav 				putchar(',');
9309289f547SJohn Baldwin 				decode_filemode(*ip);
93198a68a58SAlexander Leidinger 				ip++;
93298a68a58SAlexander Leidinger 				narg--;
93373430055SDag-Erling Smørgrav 				break;
93473430055SDag-Erling Smørgrav 			case SYS_mknod:
9358447b7cdSJilles Tjoelker 			case SYS_mknodat:
93698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
93709307b25SDag-Erling Smørgrav 				putchar(',');
9389289f547SJohn Baldwin 				decode_filemode(*ip);
93998a68a58SAlexander Leidinger 				ip++;
94098a68a58SAlexander Leidinger 				narg--;
94173430055SDag-Erling Smørgrav 				break;
94273430055SDag-Erling Smørgrav 			case SYS_getfsstat:
94398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
94498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
94509307b25SDag-Erling Smørgrav 				putchar(',');
94648f79574SJohn Baldwin 				print_integer_arg(sysdecode_getfsstat_mode, *ip);
94798a68a58SAlexander Leidinger 				ip++;
94898a68a58SAlexander Leidinger 				narg--;
94973430055SDag-Erling Smørgrav 				break;
95073430055SDag-Erling Smørgrav 			case SYS_mount:
95198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
95309307b25SDag-Erling Smørgrav 				putchar(',');
9549289f547SJohn Baldwin 				print_mask_arg(sysdecode_mount_flags, *ip);
95598a68a58SAlexander Leidinger 				ip++;
95698a68a58SAlexander Leidinger 				narg--;
95773430055SDag-Erling Smørgrav 				break;
95873430055SDag-Erling Smørgrav 			case SYS_unmount:
95998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96009307b25SDag-Erling Smørgrav 				putchar(',');
9619289f547SJohn Baldwin 				print_mask_arg(sysdecode_mount_flags, *ip);
96298a68a58SAlexander Leidinger 				ip++;
96398a68a58SAlexander Leidinger 				narg--;
96473430055SDag-Erling Smørgrav 				break;
96573430055SDag-Erling Smørgrav 			case SYS_recvmsg:
96673430055SDag-Erling Smørgrav 			case SYS_sendmsg:
96798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
96909307b25SDag-Erling Smørgrav 				putchar(',');
9709289f547SJohn Baldwin 				print_mask_arg0(sysdecode_msg_flags, *ip);
97198a68a58SAlexander Leidinger 				ip++;
97298a68a58SAlexander Leidinger 				narg--;
97373430055SDag-Erling Smørgrav 				break;
97473430055SDag-Erling Smørgrav 			case SYS_recvfrom:
97573430055SDag-Erling Smørgrav 			case SYS_sendto:
97698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
97909307b25SDag-Erling Smørgrav 				putchar(',');
9809289f547SJohn Baldwin 				print_mask_arg0(sysdecode_msg_flags, *ip);
98198a68a58SAlexander Leidinger 				ip++;
98298a68a58SAlexander Leidinger 				narg--;
98373430055SDag-Erling Smørgrav 				break;
98473430055SDag-Erling Smørgrav 			case SYS_chflags:
98573430055SDag-Erling Smørgrav 			case SYS_fchflags:
98673430055SDag-Erling Smørgrav 			case SYS_lchflags:
98798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
98809307b25SDag-Erling Smørgrav 				putchar(',');
9899289f547SJohn Baldwin 				decode_fileflags(*ip);
99098a68a58SAlexander Leidinger 				ip++;
99198a68a58SAlexander Leidinger 				narg--;
99273430055SDag-Erling Smørgrav 				break;
99373430055SDag-Erling Smørgrav 			case SYS_kill:
99498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
99509307b25SDag-Erling Smørgrav 				putchar(',');
9969289f547SJohn Baldwin 				print_signal(*ip);
99798a68a58SAlexander Leidinger 				ip++;
99898a68a58SAlexander Leidinger 				narg--;
99973430055SDag-Erling Smørgrav 				break;
100073430055SDag-Erling Smørgrav 			case SYS_reboot:
100109307b25SDag-Erling Smørgrav 				putchar('(');
10029289f547SJohn Baldwin 				print_mask_arg(sysdecode_reboot_howto, *ip);
100398a68a58SAlexander Leidinger 				ip++;
100498a68a58SAlexander Leidinger 				narg--;
100573430055SDag-Erling Smørgrav 				break;
100673430055SDag-Erling Smørgrav 			case SYS_umask:
100709307b25SDag-Erling Smørgrav 				putchar('(');
10089289f547SJohn Baldwin 				decode_filemode(*ip);
100998a68a58SAlexander Leidinger 				ip++;
101098a68a58SAlexander Leidinger 				narg--;
101173430055SDag-Erling Smørgrav 				break;
101273430055SDag-Erling Smørgrav 			case SYS_msync:
101398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
101509307b25SDag-Erling Smørgrav 				putchar(',');
10169289f547SJohn Baldwin 				print_mask_arg(sysdecode_msync_flags, *ip);
101798a68a58SAlexander Leidinger 				ip++;
101898a68a58SAlexander Leidinger 				narg--;
101973430055SDag-Erling Smørgrav 				break;
1020cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap
102173430055SDag-Erling Smørgrav 			case SYS_freebsd6_mmap:
1022cae1120aSPeter Wemm 				print_number(ip, narg, c);
1023cae1120aSPeter Wemm 				print_number(ip, narg, c);
102409307b25SDag-Erling Smørgrav 				putchar(',');
10259289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
102609307b25SDag-Erling Smørgrav 				putchar(',');
1027cae1120aSPeter Wemm 				ip++;
1028cae1120aSPeter Wemm 				narg--;
10299289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_flags, *ip);
1030cae1120aSPeter Wemm 				ip++;
1031cae1120aSPeter Wemm 				narg--;
103273430055SDag-Erling Smørgrav 				break;
1033cae1120aSPeter Wemm #endif
103473430055SDag-Erling Smørgrav 			case SYS_mmap:
103598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
103709307b25SDag-Erling Smørgrav 				putchar(',');
10389289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
103909307b25SDag-Erling Smørgrav 				putchar(',');
104098a68a58SAlexander Leidinger 				ip++;
104198a68a58SAlexander Leidinger 				narg--;
10429289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_flags, *ip);
104398a68a58SAlexander Leidinger 				ip++;
104498a68a58SAlexander Leidinger 				narg--;
104573430055SDag-Erling Smørgrav 				break;
104673430055SDag-Erling Smørgrav 			case SYS_mprotect:
104798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
104898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
104909307b25SDag-Erling Smørgrav 				putchar(',');
10509289f547SJohn Baldwin 				print_mask_arg(sysdecode_mmap_prot, *ip);
105198a68a58SAlexander Leidinger 				ip++;
105298a68a58SAlexander Leidinger 				narg--;
105373430055SDag-Erling Smørgrav 				break;
105473430055SDag-Erling Smørgrav 			case SYS_madvise:
105598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
105709307b25SDag-Erling Smørgrav 				putchar(',');
10589289f547SJohn Baldwin 				print_integer_arg(sysdecode_madvice, *ip);
105998a68a58SAlexander Leidinger 				ip++;
106098a68a58SAlexander Leidinger 				narg--;
106173430055SDag-Erling Smørgrav 				break;
106273430055SDag-Erling Smørgrav 			case SYS_setpriority:
106398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
106498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
106509307b25SDag-Erling Smørgrav 				putchar(',');
10669289f547SJohn Baldwin 				print_integer_arg(sysdecode_prio_which, *ip);
106798a68a58SAlexander Leidinger 				ip++;
106898a68a58SAlexander Leidinger 				narg--;
106973430055SDag-Erling Smørgrav 				break;
107073430055SDag-Erling Smørgrav 			case SYS_fcntl:
107198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
107209307b25SDag-Erling Smørgrav 				putchar(',');
10739289f547SJohn Baldwin 				print_integer_arg(sysdecode_fcntl_cmd, ip[0]);
10749289f547SJohn Baldwin 				if (sysdecode_fcntl_arg_p(ip[0])) {
10759289f547SJohn Baldwin 					putchar(',');
10769289f547SJohn Baldwin 					if (ip[0] == F_SETFL)
10779289f547SJohn Baldwin 						print_mask_arg(
10789289f547SJohn Baldwin 						    sysdecode_fcntl_fileflags,
10799289f547SJohn Baldwin 							ip[1]);
10809289f547SJohn Baldwin 					else
10819289f547SJohn Baldwin 						sysdecode_fcntl_arg(stdout,
10829289f547SJohn Baldwin 						    ip[0], ip[1],
10839289f547SJohn Baldwin 						    decimal ? 10 : 16);
10849289f547SJohn Baldwin 				}
108573430055SDag-Erling Smørgrav 				ip += 2;
108698a68a58SAlexander Leidinger 				narg -= 2;
108773430055SDag-Erling Smørgrav 				break;
108873430055SDag-Erling Smørgrav 			case SYS_socket: {
10898bc31d83SCraig Rodrigues 				int sockdomain;
109009307b25SDag-Erling Smørgrav 				putchar('(');
109195bb676aSDag-Erling Smørgrav 				sockdomain = *ip;
10929289f547SJohn Baldwin 				print_integer_arg(sysdecode_socketdomain,
10939289f547SJohn Baldwin 				    sockdomain);
109498a68a58SAlexander Leidinger 				ip++;
109598a68a58SAlexander Leidinger 				narg--;
109609307b25SDag-Erling Smørgrav 				putchar(',');
10979289f547SJohn Baldwin 				print_mask_arg(sysdecode_socket_type, *ip);
109898a68a58SAlexander Leidinger 				ip++;
109998a68a58SAlexander Leidinger 				narg--;
11008bc31d83SCraig Rodrigues 				if (sockdomain == PF_INET ||
11018bc31d83SCraig Rodrigues 				    sockdomain == PF_INET6) {
110209307b25SDag-Erling Smørgrav 					putchar(',');
11039289f547SJohn Baldwin 					print_integer_arg(sysdecode_ipproto,
11049289f547SJohn Baldwin 					    *ip);
11058bc31d83SCraig Rodrigues 					ip++;
11068bc31d83SCraig Rodrigues 					narg--;
11078bc31d83SCraig Rodrigues 				}
110898a68a58SAlexander Leidinger 				c = ',';
110973430055SDag-Erling Smørgrav 				break;
111073430055SDag-Erling Smørgrav 			}
111173430055SDag-Erling Smørgrav 			case SYS_setsockopt:
11129289f547SJohn Baldwin 			case SYS_getsockopt: {
11139289f547SJohn Baldwin 				const char *str;
11149289f547SJohn Baldwin 
111598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
111609307b25SDag-Erling Smørgrav 				putchar(',');
11179289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_sockopt_level,
11189289f547SJohn Baldwin 				    *ip);
11199289f547SJohn Baldwin 				str = sysdecode_sockopt_name(ip[0], ip[1]);
11209289f547SJohn Baldwin 				if (str != NULL) {
11219289f547SJohn Baldwin 					printf(",%s", str);
112298a68a58SAlexander Leidinger 					ip++;
112398a68a58SAlexander Leidinger 					narg--;
11240460d351SJohn Baldwin 				}
112598a68a58SAlexander Leidinger 				ip++;
112698a68a58SAlexander Leidinger 				narg--;
112773430055SDag-Erling Smørgrav 				break;
11289289f547SJohn Baldwin 			}
1129cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek
113073430055SDag-Erling Smørgrav 			case SYS_freebsd6_lseek:
113198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113298a68a58SAlexander Leidinger 				/* Hidden 'pad' argument, not in lseek(2) */
113398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
113471ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
113509307b25SDag-Erling Smørgrav 				putchar(',');
11369289f547SJohn Baldwin 				print_integer_arg(sysdecode_whence, *ip);
113798a68a58SAlexander Leidinger 				ip++;
113898a68a58SAlexander Leidinger 				narg--;
113973430055SDag-Erling Smørgrav 				break;
1140cae1120aSPeter Wemm #endif
114173430055SDag-Erling Smørgrav 			case SYS_lseek:
1142cae1120aSPeter Wemm 				print_number(ip, narg, c);
114371ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
114409307b25SDag-Erling Smørgrav 				putchar(',');
11459289f547SJohn Baldwin 				print_integer_arg(sysdecode_whence, *ip);
1146cae1120aSPeter Wemm 				ip++;
1147cae1120aSPeter Wemm 				narg--;
114873430055SDag-Erling Smørgrav 				break;
114973430055SDag-Erling Smørgrav 			case SYS_flock:
115098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
115109307b25SDag-Erling Smørgrav 				putchar(',');
11529289f547SJohn Baldwin 				print_mask_arg(sysdecode_flock_operation, *ip);
115398a68a58SAlexander Leidinger 				ip++;
115498a68a58SAlexander Leidinger 				narg--;
115573430055SDag-Erling Smørgrav 				break;
115673430055SDag-Erling Smørgrav 			case SYS_mkfifo:
11578447b7cdSJilles Tjoelker 			case SYS_mkfifoat:
115873430055SDag-Erling Smørgrav 			case SYS_mkdir:
11598447b7cdSJilles Tjoelker 			case SYS_mkdirat:
116098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
116109307b25SDag-Erling Smørgrav 				putchar(',');
11629289f547SJohn Baldwin 				decode_filemode(*ip);
116398a68a58SAlexander Leidinger 				ip++;
116498a68a58SAlexander Leidinger 				narg--;
116573430055SDag-Erling Smørgrav 				break;
116673430055SDag-Erling Smørgrav 			case SYS_shutdown:
116798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
116809307b25SDag-Erling Smørgrav 				putchar(',');
11699289f547SJohn Baldwin 				print_integer_arg(sysdecode_shutdown_how, *ip);
117098a68a58SAlexander Leidinger 				ip++;
117198a68a58SAlexander Leidinger 				narg--;
117273430055SDag-Erling Smørgrav 				break;
117373430055SDag-Erling Smørgrav 			case SYS_socketpair:
117409307b25SDag-Erling Smørgrav 				putchar('(');
11759289f547SJohn Baldwin 				print_integer_arg(sysdecode_socketdomain, *ip);
117698a68a58SAlexander Leidinger 				ip++;
117798a68a58SAlexander Leidinger 				narg--;
117809307b25SDag-Erling Smørgrav 				putchar(',');
11799289f547SJohn Baldwin 				print_mask_arg(sysdecode_socket_type, *ip);
118098a68a58SAlexander Leidinger 				ip++;
118198a68a58SAlexander Leidinger 				narg--;
118298a68a58SAlexander Leidinger 				c = ',';
118373430055SDag-Erling Smørgrav 				break;
118473430055SDag-Erling Smørgrav 			case SYS_getrlimit:
118573430055SDag-Erling Smørgrav 			case SYS_setrlimit:
118609307b25SDag-Erling Smørgrav 				putchar('(');
11879289f547SJohn Baldwin 				print_integer_arg(sysdecode_rlimit, *ip);
118898a68a58SAlexander Leidinger 				ip++;
118998a68a58SAlexander Leidinger 				narg--;
119098a68a58SAlexander Leidinger 				c = ',';
119173430055SDag-Erling Smørgrav 				break;
119273430055SDag-Erling Smørgrav 			case SYS_quotactl:
119398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
119409307b25SDag-Erling Smørgrav 				putchar(',');
11959289f547SJohn Baldwin 				if (!sysdecode_quotactl_cmd(stdout, *ip)) {
11969289f547SJohn Baldwin 					if (decimal)
11979289f547SJohn Baldwin 						printf("<invalid=%d>", (int)*ip);
11989289f547SJohn Baldwin 					else
11999289f547SJohn Baldwin 						printf("<invalid=%#x>",
12009289f547SJohn Baldwin 						    (int)*ip);
12019289f547SJohn Baldwin 				}
120298a68a58SAlexander Leidinger 				ip++;
120398a68a58SAlexander Leidinger 				narg--;
120498a68a58SAlexander Leidinger 				c = ',';
120573430055SDag-Erling Smørgrav 				break;
120673430055SDag-Erling Smørgrav 			case SYS_nfssvc:
120709307b25SDag-Erling Smørgrav 				putchar('(');
12089289f547SJohn Baldwin 				print_integer_arg(sysdecode_nfssvc_flags, *ip);
120998a68a58SAlexander Leidinger 				ip++;
121098a68a58SAlexander Leidinger 				narg--;
121198a68a58SAlexander Leidinger 				c = ',';
121273430055SDag-Erling Smørgrav 				break;
121373430055SDag-Erling Smørgrav 			case SYS_rtprio:
121409307b25SDag-Erling Smørgrav 				putchar('(');
12159289f547SJohn Baldwin 				print_integer_arg(sysdecode_rtprio_function,
12169289f547SJohn Baldwin 				    *ip);
121798a68a58SAlexander Leidinger 				ip++;
121898a68a58SAlexander Leidinger 				narg--;
121998a68a58SAlexander Leidinger 				c = ',';
122073430055SDag-Erling Smørgrav 				break;
122173430055SDag-Erling Smørgrav 			case SYS___semctl:
122298a68a58SAlexander Leidinger 				print_number(ip, narg, c);
122398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
122409307b25SDag-Erling Smørgrav 				putchar(',');
12259289f547SJohn Baldwin 				print_integer_arg(sysdecode_semctl_cmd, *ip);
122698a68a58SAlexander Leidinger 				ip++;
122798a68a58SAlexander Leidinger 				narg--;
122873430055SDag-Erling Smørgrav 				break;
122973430055SDag-Erling Smørgrav 			case SYS_semget:
123098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
123198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
123209307b25SDag-Erling Smørgrav 				putchar(',');
12339289f547SJohn Baldwin 				print_mask_arg(sysdecode_semget_flags, *ip);
123498a68a58SAlexander Leidinger 				ip++;
123598a68a58SAlexander Leidinger 				narg--;
123673430055SDag-Erling Smørgrav 				break;
123773430055SDag-Erling Smørgrav 			case SYS_msgctl:
123898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
123909307b25SDag-Erling Smørgrav 				putchar(',');
12409289f547SJohn Baldwin 				print_integer_arg(sysdecode_msgctl_cmd, *ip);
124198a68a58SAlexander Leidinger 				ip++;
124298a68a58SAlexander Leidinger 				narg--;
124373430055SDag-Erling Smørgrav 				break;
124473430055SDag-Erling Smørgrav 			case SYS_shmat:
124598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
124698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
124709307b25SDag-Erling Smørgrav 				putchar(',');
12489289f547SJohn Baldwin 				print_mask_arg(sysdecode_shmat_flags, *ip);
124998a68a58SAlexander Leidinger 				ip++;
125098a68a58SAlexander Leidinger 				narg--;
125173430055SDag-Erling Smørgrav 				break;
125273430055SDag-Erling Smørgrav 			case SYS_shmctl:
125398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
125409307b25SDag-Erling Smørgrav 				putchar(',');
12559289f547SJohn Baldwin 				print_integer_arg(sysdecode_shmctl_cmd, *ip);
125698a68a58SAlexander Leidinger 				ip++;
125798a68a58SAlexander Leidinger 				narg--;
125873430055SDag-Erling Smørgrav 				break;
1259777d35f4SRui Paulo 			case SYS_shm_open:
1260777d35f4SRui Paulo 				print_number(ip, narg, c);
1261777d35f4SRui Paulo 				putchar(',');
12629289f547SJohn Baldwin 				print_mask_arg(sysdecode_open_flags, ip[0]);
12639289f547SJohn Baldwin 				putchar(',');
12649289f547SJohn Baldwin 				decode_filemode(ip[1]);
12659289f547SJohn Baldwin 				ip += 2;
12669289f547SJohn Baldwin 				narg -= 2;
1267777d35f4SRui Paulo 				break;
126873430055SDag-Erling Smørgrav 			case SYS_minherit:
126998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
127098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
127109307b25SDag-Erling Smørgrav 				putchar(',');
12729289f547SJohn Baldwin 				print_integer_arg(sysdecode_minherit_inherit,
12739289f547SJohn Baldwin 				    *ip);
127498a68a58SAlexander Leidinger 				ip++;
127598a68a58SAlexander Leidinger 				narg--;
127673430055SDag-Erling Smørgrav 				break;
127773430055SDag-Erling Smørgrav 			case SYS_rfork:
127809307b25SDag-Erling Smørgrav 				putchar('(');
12799289f547SJohn Baldwin 				print_mask_arg(sysdecode_rfork_flags, *ip);
128098a68a58SAlexander Leidinger 				ip++;
128198a68a58SAlexander Leidinger 				narg--;
128298a68a58SAlexander Leidinger 				c = ',';
128373430055SDag-Erling Smørgrav 				break;
128473430055SDag-Erling Smørgrav 			case SYS_lio_listio:
128509307b25SDag-Erling Smørgrav 				putchar('(');
12869289f547SJohn Baldwin 				print_integer_arg(sysdecode_lio_listio_mode,
12879289f547SJohn Baldwin 				    *ip);
128898a68a58SAlexander Leidinger 				ip++;
128998a68a58SAlexander Leidinger 				narg--;
129098a68a58SAlexander Leidinger 				c = ',';
129173430055SDag-Erling Smørgrav 				break;
129273430055SDag-Erling Smørgrav 			case SYS_mlockall:
129309307b25SDag-Erling Smørgrav 				putchar('(');
12949289f547SJohn Baldwin 				print_mask_arg(sysdecode_mlockall_flags, *ip);
129598a68a58SAlexander Leidinger 				ip++;
129698a68a58SAlexander Leidinger 				narg--;
129773430055SDag-Erling Smørgrav 				break;
129873430055SDag-Erling Smørgrav 			case SYS_sched_setscheduler:
129998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
130009307b25SDag-Erling Smørgrav 				putchar(',');
13019289f547SJohn Baldwin 				print_integer_arg(sysdecode_scheduler_policy,
13029289f547SJohn Baldwin 				    *ip);
130398a68a58SAlexander Leidinger 				ip++;
130498a68a58SAlexander Leidinger 				narg--;
130573430055SDag-Erling Smørgrav 				break;
130673430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_max:
130773430055SDag-Erling Smørgrav 			case SYS_sched_get_priority_min:
130809307b25SDag-Erling Smørgrav 				putchar('(');
13099289f547SJohn Baldwin 				print_integer_arg(sysdecode_scheduler_policy,
13109289f547SJohn Baldwin 				    *ip);
131198a68a58SAlexander Leidinger 				ip++;
131298a68a58SAlexander Leidinger 				narg--;
131373430055SDag-Erling Smørgrav 				break;
131473430055SDag-Erling Smørgrav 			case SYS_sendfile:
131598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
131998a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132098a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132109307b25SDag-Erling Smørgrav 				putchar(',');
13229289f547SJohn Baldwin 				print_mask_arg(sysdecode_sendfile_flags, *ip);
132398a68a58SAlexander Leidinger 				ip++;
132498a68a58SAlexander Leidinger 				narg--;
132573430055SDag-Erling Smørgrav 				break;
132673430055SDag-Erling Smørgrav 			case SYS_kldsym:
132798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
132809307b25SDag-Erling Smørgrav 				putchar(',');
13299289f547SJohn Baldwin 				print_integer_arg(sysdecode_kldsym_cmd, *ip);
133098a68a58SAlexander Leidinger 				ip++;
133198a68a58SAlexander Leidinger 				narg--;
133273430055SDag-Erling Smørgrav 				break;
133373430055SDag-Erling Smørgrav 			case SYS_sigprocmask:
133409307b25SDag-Erling Smørgrav 				putchar('(');
13359289f547SJohn Baldwin 				print_integer_arg(sysdecode_sigprocmask_how,
13369289f547SJohn Baldwin 				    *ip);
133798a68a58SAlexander Leidinger 				ip++;
133898a68a58SAlexander Leidinger 				narg--;
133998a68a58SAlexander Leidinger 				c = ',';
134073430055SDag-Erling Smørgrav 				break;
134173430055SDag-Erling Smørgrav 			case SYS___acl_get_file:
134273430055SDag-Erling Smørgrav 			case SYS___acl_set_file:
134373430055SDag-Erling Smørgrav 			case SYS___acl_get_fd:
134473430055SDag-Erling Smørgrav 			case SYS___acl_set_fd:
134573430055SDag-Erling Smørgrav 			case SYS___acl_delete_file:
134673430055SDag-Erling Smørgrav 			case SYS___acl_delete_fd:
134773430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_file:
134873430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_fd:
134973430055SDag-Erling Smørgrav 			case SYS___acl_get_link:
135073430055SDag-Erling Smørgrav 			case SYS___acl_set_link:
135173430055SDag-Erling Smørgrav 			case SYS___acl_delete_link:
135273430055SDag-Erling Smørgrav 			case SYS___acl_aclcheck_link:
135398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
135409307b25SDag-Erling Smørgrav 				putchar(',');
13559289f547SJohn Baldwin 				print_integer_arg(sysdecode_acltype, *ip);
135698a68a58SAlexander Leidinger 				ip++;
135798a68a58SAlexander Leidinger 				narg--;
135873430055SDag-Erling Smørgrav 				break;
135973430055SDag-Erling Smørgrav 			case SYS_sigaction:
136009307b25SDag-Erling Smørgrav 				putchar('(');
13619289f547SJohn Baldwin 				print_signal(*ip);
136298a68a58SAlexander Leidinger 				ip++;
136398a68a58SAlexander Leidinger 				narg--;
136498a68a58SAlexander Leidinger 				c = ',';
136573430055SDag-Erling Smørgrav 				break;
136673430055SDag-Erling Smørgrav 			case SYS_extattrctl:
136798a68a58SAlexander Leidinger 				print_number(ip, narg, c);
136809307b25SDag-Erling Smørgrav 				putchar(',');
13699289f547SJohn Baldwin 				print_integer_arg(sysdecode_extattrnamespace,
13709289f547SJohn Baldwin 				    *ip);
137198a68a58SAlexander Leidinger 				ip++;
137298a68a58SAlexander Leidinger 				narg--;
137373430055SDag-Erling Smørgrav 				break;
137473430055SDag-Erling Smørgrav 			case SYS_nmount:
137598a68a58SAlexander Leidinger 				print_number(ip, narg, c);
137698a68a58SAlexander Leidinger 				print_number(ip, narg, c);
137709307b25SDag-Erling Smørgrav 				putchar(',');
13789289f547SJohn Baldwin 				print_mask_arg(sysdecode_mount_flags, *ip);
137998a68a58SAlexander Leidinger 				ip++;
138098a68a58SAlexander Leidinger 				narg--;
138173430055SDag-Erling Smørgrav 				break;
138273430055SDag-Erling Smørgrav 			case SYS_thr_create:
138398a68a58SAlexander Leidinger 				print_number(ip, narg, c);
138498a68a58SAlexander Leidinger 				print_number(ip, narg, c);
138509307b25SDag-Erling Smørgrav 				putchar(',');
13869289f547SJohn Baldwin 				print_mask_arg(sysdecode_thr_create_flags, *ip);
138798a68a58SAlexander Leidinger 				ip++;
138898a68a58SAlexander Leidinger 				narg--;
138973430055SDag-Erling Smørgrav 				break;
139073430055SDag-Erling Smørgrav 			case SYS_thr_kill:
139198a68a58SAlexander Leidinger 				print_number(ip, narg, c);
139209307b25SDag-Erling Smørgrav 				putchar(',');
13939289f547SJohn Baldwin 				print_signal(*ip);
139498a68a58SAlexander Leidinger 				ip++;
139598a68a58SAlexander Leidinger 				narg--;
139673430055SDag-Erling Smørgrav 				break;
139773430055SDag-Erling Smørgrav 			case SYS_kldunloadf:
139898a68a58SAlexander Leidinger 				print_number(ip, narg, c);
139909307b25SDag-Erling Smørgrav 				putchar(',');
14009289f547SJohn Baldwin 				print_integer_arg(sysdecode_kldunload_flags,
14019289f547SJohn Baldwin 				    *ip);
140298a68a58SAlexander Leidinger 				ip++;
140398a68a58SAlexander Leidinger 				narg--;
140473430055SDag-Erling Smørgrav 				break;
14058447b7cdSJilles Tjoelker 			case SYS_linkat:
14068447b7cdSJilles Tjoelker 			case SYS_renameat:
14078447b7cdSJilles Tjoelker 			case SYS_symlinkat:
14088447b7cdSJilles Tjoelker 				print_number(ip, narg, c);
14098447b7cdSJilles Tjoelker 				putchar(',');
14109289f547SJohn Baldwin 				print_integer_arg_valid(sysdecode_atfd, *ip);
14118447b7cdSJilles Tjoelker 				ip++;
14128447b7cdSJilles Tjoelker 				narg--;
14138447b7cdSJilles Tjoelker 				break;
14142609222aSPawel Jakub Dawidek 			case SYS_cap_fcntls_limit:
14152609222aSPawel Jakub Dawidek 				print_number(ip, narg, c);
14162609222aSPawel Jakub Dawidek 				putchar(',');
14172609222aSPawel Jakub Dawidek 				arg = *ip;
14182609222aSPawel Jakub Dawidek 				ip++;
14192609222aSPawel Jakub Dawidek 				narg--;
14209289f547SJohn Baldwin 				print_mask_arg32(sysdecode_cap_fcntlrights, arg);
14212609222aSPawel Jakub Dawidek 				break;
1422145e6aa9SJohn Baldwin 			case SYS_posix_fadvise:
1423145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1424145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1425145e6aa9SJohn Baldwin 				print_number(ip, narg, c);
1426145e6aa9SJohn Baldwin 				(void)putchar(',');
14279289f547SJohn Baldwin 				print_integer_arg(sysdecode_fadvice, *ip);
1428145e6aa9SJohn Baldwin 				ip++;
1429145e6aa9SJohn Baldwin 				narg--;
1430145e6aa9SJohn Baldwin 				break;
143155648840SJohn Baldwin 			case SYS_procctl:
143255648840SJohn Baldwin 				putchar('(');
14339289f547SJohn Baldwin 				print_integer_arg(sysdecode_idtype, *ip);
143455648840SJohn Baldwin 				c = ',';
143555648840SJohn Baldwin 				ip++;
143655648840SJohn Baldwin 				narg--;
143771ed318eSJohn Baldwin 				print_number64(first, ip, narg, c);
143855648840SJohn Baldwin 				putchar(',');
14399289f547SJohn Baldwin 				print_integer_arg(sysdecode_procctl_cmd, *ip);
144055648840SJohn Baldwin 				ip++;
144155648840SJohn Baldwin 				narg--;
144255648840SJohn Baldwin 				break;
1443fdb5bf37SJohn Baldwin 			case SYS__umtx_op:
1444fdb5bf37SJohn Baldwin 				print_number(ip, narg, c);
1445fdb5bf37SJohn Baldwin 				putchar(',');
14469289f547SJohn Baldwin 				print_integer_arg(sysdecode_umtx_op, *ip);
1447fdb5bf37SJohn Baldwin 				switch (*ip) {
1448fdb5bf37SJohn Baldwin 				case UMTX_OP_CV_WAIT:
1449fdb5bf37SJohn Baldwin 					ip++;
1450fdb5bf37SJohn Baldwin 					narg--;
1451fdb5bf37SJohn Baldwin 					putchar(',');
14529289f547SJohn Baldwin 					print_mask_argul(
14539289f547SJohn Baldwin 					    sysdecode_umtx_cvwait_flags, *ip);
1454fdb5bf37SJohn Baldwin 					break;
1455fdb5bf37SJohn Baldwin 				case UMTX_OP_RW_RDLOCK:
1456fdb5bf37SJohn Baldwin 					ip++;
1457fdb5bf37SJohn Baldwin 					narg--;
1458fdb5bf37SJohn Baldwin 					putchar(',');
14599289f547SJohn Baldwin 					print_mask_argul(
14609289f547SJohn Baldwin 					    sysdecode_umtx_rwlock_flags, *ip);
1461fdb5bf37SJohn Baldwin 					break;
1462fdb5bf37SJohn Baldwin 				}
1463fdb5bf37SJohn Baldwin 				ip++;
1464fdb5bf37SJohn Baldwin 				narg--;
14658dec6942SJohn Baldwin 				break;
14668dec6942SJohn Baldwin 			case SYS_ftruncate:
14678dec6942SJohn Baldwin 			case SYS_truncate:
14688dec6942SJohn Baldwin 				print_number(ip, narg, c);
14698dec6942SJohn Baldwin 				print_number64(first, ip, narg, c);
14708dec6942SJohn Baldwin 				break;
14719b50d902SRodney W. Grimes 			}
14729b50d902SRodney W. Grimes 		}
147348f6dd8aSAttilio Rao 		while (narg > 0) {
147498a68a58SAlexander Leidinger 			print_number(ip, narg, c);
14759b50d902SRodney W. Grimes 		}
147609307b25SDag-Erling Smørgrav 		putchar(')');
14779b50d902SRodney W. Grimes 	}
147809307b25SDag-Erling Smørgrav 	putchar('\n');
14799b50d902SRodney W. Grimes }
14809b50d902SRodney W. Grimes 
148191fbb9c1SDavid Malone void
1482a5f14abfSJohn Baldwin ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
14839b50d902SRodney W. Grimes {
148491fbb9c1SDavid Malone 	register_t ret = ktr->ktr_retval;
148591fbb9c1SDavid Malone 	int error = ktr->ktr_error;
14869b50d902SRodney W. Grimes 
1487a5f14abfSJohn Baldwin 	syscallname(ktr->ktr_code, sv_flags);
1488b9034ce2SBryan Drewery 	printf(" ");
14899b50d902SRodney W. Grimes 
14909b50d902SRodney W. Grimes 	if (error == 0) {
14919b50d902SRodney W. Grimes 		if (fancy) {
149209307b25SDag-Erling Smørgrav 			printf("%ld", (long)ret);
14939b50d902SRodney W. Grimes 			if (ret < 0 || ret > 9)
149409307b25SDag-Erling Smørgrav 				printf("/%#lx", (unsigned long)ret);
14959b50d902SRodney W. Grimes 		} else {
14969b50d902SRodney W. Grimes 			if (decimal)
149709307b25SDag-Erling Smørgrav 				printf("%ld", (long)ret);
14989b50d902SRodney W. Grimes 			else
149909307b25SDag-Erling Smørgrav 				printf("%#lx", (unsigned long)ret);
15009b50d902SRodney W. Grimes 		}
15019b50d902SRodney W. Grimes 	} else if (error == ERESTART)
150209307b25SDag-Erling Smørgrav 		printf("RESTART");
15039b50d902SRodney W. Grimes 	else if (error == EJUSTRETURN)
150409307b25SDag-Erling Smørgrav 		printf("JUSTRETURN");
15059b50d902SRodney W. Grimes 	else {
1506287b96ddSJohn Baldwin 		printf("-1 errno %d", sysdecode_freebsd_to_abi_errno(
1507287b96ddSJohn Baldwin 		    syscallabi(sv_flags), error));
15089b50d902SRodney W. Grimes 		if (fancy)
150909307b25SDag-Erling Smørgrav 			printf(" %s", strerror(ktr->ktr_error));
15109b50d902SRodney W. Grimes 	}
151109307b25SDag-Erling Smørgrav 	putchar('\n');
15129b50d902SRodney W. Grimes }
15139b50d902SRodney W. Grimes 
151491fbb9c1SDavid Malone void
151591fbb9c1SDavid Malone ktrnamei(char *cp, int len)
15169b50d902SRodney W. Grimes {
151709307b25SDag-Erling Smørgrav 	printf("\"%.*s\"\n", len, cp);
15189b50d902SRodney W. Grimes }
15199b50d902SRodney W. Grimes 
152091fbb9c1SDavid Malone void
1521ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth)
15229b50d902SRodney W. Grimes {
1523ec4beb5dSPeter Wemm 	int n, i;
1524ec4beb5dSPeter Wemm 	int width;
1525ec4beb5dSPeter Wemm 
1526ec4beb5dSPeter Wemm 	width = 0;
1527ec4beb5dSPeter Wemm 	do {
1528ec4beb5dSPeter Wemm 		width += 2;
1529ec4beb5dSPeter Wemm 		i = 13;			/* base offset */
1530ec4beb5dSPeter Wemm 		i += (width / 2) + 1;	/* spaces every second byte */
1531ec4beb5dSPeter Wemm 		i += (width * 2);	/* width of bytes */
1532ec4beb5dSPeter Wemm 		i += 3;			/* "  |" */
1533ec4beb5dSPeter Wemm 		i += width;		/* each byte */
1534ec4beb5dSPeter Wemm 		i += 1;			/* "|" */
1535ec4beb5dSPeter Wemm 	} while (i < screenwidth);
1536ec4beb5dSPeter Wemm 	width -= 2;
1537ec4beb5dSPeter Wemm 
1538ec4beb5dSPeter Wemm 	for (n = 0; n < len; n += width) {
1539ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1540ec4beb5dSPeter Wemm 			if ((i % width) == 0) {	/* beginning of line */
1541ec4beb5dSPeter Wemm 				printf("       0x%04x", i);
1542ec4beb5dSPeter Wemm 			}
1543ec4beb5dSPeter Wemm 			if ((i % 2) == 0) {
1544ec4beb5dSPeter Wemm 				printf(" ");
1545ec4beb5dSPeter Wemm 			}
1546ec4beb5dSPeter Wemm 			if (i < len)
1547ec4beb5dSPeter Wemm 				printf("%02x", p[i] & 0xff);
1548ec4beb5dSPeter Wemm 			else
1549ec4beb5dSPeter Wemm 				printf("  ");
1550ec4beb5dSPeter Wemm 		}
1551ec4beb5dSPeter Wemm 		printf("  |");
1552ec4beb5dSPeter Wemm 		for (i = n; i < n + width; i++) {
1553ec4beb5dSPeter Wemm 			if (i >= len)
1554ec4beb5dSPeter Wemm 				break;
1555ec4beb5dSPeter Wemm 			if (p[i] >= ' ' && p[i] <= '~')
1556ec4beb5dSPeter Wemm 				printf("%c", p[i]);
1557ec4beb5dSPeter Wemm 			else
1558ec4beb5dSPeter Wemm 				printf(".");
1559ec4beb5dSPeter Wemm 		}
1560ec4beb5dSPeter Wemm 		printf("|\n");
1561ec4beb5dSPeter Wemm 	}
1562ec4beb5dSPeter Wemm 	if ((i % width) != 0)
1563ec4beb5dSPeter Wemm 		printf("\n");
1564ec4beb5dSPeter Wemm }
1565ec4beb5dSPeter Wemm 
1566ec4beb5dSPeter Wemm void
1567ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth)
1568ec4beb5dSPeter Wemm {
156991fbb9c1SDavid Malone 	int col = 0;
1570ec4beb5dSPeter Wemm 	char *cp;
157191fbb9c1SDavid Malone 	int width;
15729b50d902SRodney W. Grimes 	char visbuf[5];
15739b50d902SRodney W. Grimes 
157409307b25SDag-Erling Smørgrav 	printf("       \"");
15759b50d902SRodney W. Grimes 	col = 8;
15769b50d902SRodney W. Grimes 	for (;datalen > 0; datalen--, dp++) {
157709307b25SDag-Erling Smørgrav 		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
15789b50d902SRodney W. Grimes 		cp = visbuf;
15799b50d902SRodney W. Grimes 		/*
15809b50d902SRodney W. Grimes 		 * Keep track of printables and
15819b50d902SRodney W. Grimes 		 * space chars (like fold(1)).
15829b50d902SRodney W. Grimes 		 */
15839b50d902SRodney W. Grimes 		if (col == 0) {
158409307b25SDag-Erling Smørgrav 			putchar('\t');
15859b50d902SRodney W. Grimes 			col = 8;
15869b50d902SRodney W. Grimes 		}
15879b50d902SRodney W. Grimes 		switch(*cp) {
15889b50d902SRodney W. Grimes 		case '\n':
15899b50d902SRodney W. Grimes 			col = 0;
159009307b25SDag-Erling Smørgrav 			putchar('\n');
15919b50d902SRodney W. Grimes 			continue;
15929b50d902SRodney W. Grimes 		case '\t':
15939b50d902SRodney W. Grimes 			width = 8 - (col&07);
15949b50d902SRodney W. Grimes 			break;
15959b50d902SRodney W. Grimes 		default:
15969b50d902SRodney W. Grimes 			width = strlen(cp);
15979b50d902SRodney W. Grimes 		}
15989b50d902SRodney W. Grimes 		if (col + width > (screenwidth-2)) {
159909307b25SDag-Erling Smørgrav 			printf("\\\n\t");
16009b50d902SRodney W. Grimes 			col = 8;
16019b50d902SRodney W. Grimes 		}
16029b50d902SRodney W. Grimes 		col += width;
16039b50d902SRodney W. Grimes 		do {
160409307b25SDag-Erling Smørgrav 			putchar(*cp++);
16059b50d902SRodney W. Grimes 		} while (*cp);
16069b50d902SRodney W. Grimes 	}
16079b50d902SRodney W. Grimes 	if (col == 0)
160809307b25SDag-Erling Smørgrav 		printf("       ");
160909307b25SDag-Erling Smørgrav 	printf("\"\n");
16109b50d902SRodney W. Grimes }
16119b50d902SRodney W. Grimes 
1612ec4beb5dSPeter Wemm void
1613ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len)
1614ec4beb5dSPeter Wemm {
1615ec4beb5dSPeter Wemm 	int datalen = len - sizeof (struct ktr_genio);
1616ec4beb5dSPeter Wemm 	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1617ec4beb5dSPeter Wemm 	static int screenwidth = 0;
1618ec4beb5dSPeter Wemm 	int i, binary;
1619ec4beb5dSPeter Wemm 
16204b0ae512SPawel Jakub Dawidek 	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
16214b0ae512SPawel Jakub Dawidek 		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
16224b0ae512SPawel Jakub Dawidek 		datalen == 1 ? "" : "s");
16234b0ae512SPawel Jakub Dawidek 	if (suppressdata)
16244b0ae512SPawel Jakub Dawidek 		return;
1625ec4beb5dSPeter Wemm 	if (screenwidth == 0) {
1626ec4beb5dSPeter Wemm 		struct winsize ws;
1627ec4beb5dSPeter Wemm 
1628ec4beb5dSPeter Wemm 		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1629ec4beb5dSPeter Wemm 		    ws.ws_col > 8)
1630ec4beb5dSPeter Wemm 			screenwidth = ws.ws_col;
1631ec4beb5dSPeter Wemm 		else
1632ec4beb5dSPeter Wemm 			screenwidth = 80;
1633ec4beb5dSPeter Wemm 	}
1634ec4beb5dSPeter Wemm 	if (maxdata && datalen > maxdata)
1635ec4beb5dSPeter Wemm 		datalen = maxdata;
1636ec4beb5dSPeter Wemm 
1637ec4beb5dSPeter Wemm 	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1638ec4beb5dSPeter Wemm 		if (dp[i] >= 32 && dp[i] < 127)
1639ec4beb5dSPeter Wemm 			continue;
1640ec4beb5dSPeter Wemm 		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1641ec4beb5dSPeter Wemm 			continue;
1642ec4beb5dSPeter Wemm 		binary = 1;
1643ec4beb5dSPeter Wemm 	}
1644ec4beb5dSPeter Wemm 	if (binary)
1645ec4beb5dSPeter Wemm 		hexdump(dp, datalen, screenwidth);
1646ec4beb5dSPeter Wemm 	else
1647ec4beb5dSPeter Wemm 		visdump(dp, datalen, screenwidth);
1648ec4beb5dSPeter Wemm }
1649ec4beb5dSPeter Wemm 
165091fbb9c1SDavid Malone void
1651dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig)
16529b50d902SRodney W. Grimes {
16539289f547SJohn Baldwin 	const char *str;
16549289f547SJohn Baldwin 
16559289f547SJohn Baldwin 	print_signal(psig->signo);
16565677eef9SJilles Tjoelker 	if (psig->action == SIG_DFL) {
16579289f547SJohn Baldwin 		printf(" SIG_DFL");
16585677eef9SJilles Tjoelker 	} else {
16599289f547SJohn Baldwin 		printf(" caught handler=0x%lx mask=0x%x",
16605677eef9SJilles Tjoelker 		    (u_long)psig->action, psig->mask.__bits[0]);
166191fbb9c1SDavid Malone 	}
16629289f547SJohn Baldwin 	printf(" code=");
16639289f547SJohn Baldwin 	str = sysdecode_sigcode(psig->signo, psig->code);
16649289f547SJohn Baldwin 	if (str != NULL)
16659289f547SJohn Baldwin 		printf("%s", str);
16669289f547SJohn Baldwin 	else
16679289f547SJohn Baldwin 		printf("<invalid=%#x>", psig->code);
16689289f547SJohn Baldwin 	putchar('\n');
16699b50d902SRodney W. Grimes }
16709b50d902SRodney W. Grimes 
167191fbb9c1SDavid Malone void
167288bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs)
16739b50d902SRodney W. Grimes {
167409307b25SDag-Erling Smørgrav 	printf("%s %s\n", cs->out ? "stop" : "resume",
16759b50d902SRodney W. Grimes 		cs->user ? "user" : "kernel");
16769b50d902SRodney W. Grimes }
16779b50d902SRodney W. Grimes 
167888bf5036SJohn Baldwin void
167988bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs)
168088bf5036SJohn Baldwin {
168188bf5036SJohn Baldwin 	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
168288bf5036SJohn Baldwin 	    cs->user ? "user" : "kernel", cs->wmesg);
168388bf5036SJohn Baldwin }
168488bf5036SJohn Baldwin 
168591fbb9c1SDavid Malone void
1686bb1a2d4aSJohn Baldwin ktruser(int len, void *p)
168782e2dd32SPoul-Henning Kamp {
1688bb1a2d4aSJohn Baldwin 	unsigned char *cp;
1689670b9e9fSJohn Baldwin 
1690d6fb4894SJohn Baldwin 	if (sysdecode_utrace(stdout, p, len)) {
1691195aef99SBryan Drewery 		printf("\n");
1692670b9e9fSJohn Baldwin 		return;
1693670b9e9fSJohn Baldwin 	}
1694670b9e9fSJohn Baldwin 
169509307b25SDag-Erling Smørgrav 	printf("%d ", len);
1696bb1a2d4aSJohn Baldwin 	cp = p;
16973f8ba9aeSPoul-Henning Kamp 	while (len--)
1698743f9174SPoul-Henning Kamp 		if (decimal)
1699bb1a2d4aSJohn Baldwin 			printf(" %d", *cp++);
1700743f9174SPoul-Henning Kamp 		else
1701bb1a2d4aSJohn Baldwin 			printf(" %02x", *cp++);
170209307b25SDag-Erling Smørgrav 	printf("\n");
170382e2dd32SPoul-Henning Kamp }
170482e2dd32SPoul-Henning Kamp 
170591fbb9c1SDavid Malone void
17067008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp)
17077008be5bSPawel Jakub Dawidek {
17087008be5bSPawel Jakub Dawidek 
17097008be5bSPawel Jakub Dawidek 	printf("cap_rights_t ");
17109289f547SJohn Baldwin 	sysdecode_cap_rights(stdout, rightsp);
17117008be5bSPawel Jakub Dawidek 	printf("\n");
17127008be5bSPawel Jakub Dawidek }
17137008be5bSPawel Jakub Dawidek 
1714de56aee0SKonstantin Belousov static void
1715de56aee0SKonstantin Belousov ktrtimeval(struct timeval *tv)
1716de56aee0SKonstantin Belousov {
1717de56aee0SKonstantin Belousov 
1718de56aee0SKonstantin Belousov 	printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec);
1719de56aee0SKonstantin Belousov }
1720de56aee0SKonstantin Belousov 
1721de56aee0SKonstantin Belousov void
1722de56aee0SKonstantin Belousov ktritimerval(struct itimerval *it)
1723de56aee0SKonstantin Belousov {
1724de56aee0SKonstantin Belousov 
1725de56aee0SKonstantin Belousov 	printf("itimerval { .interval = ");
1726de56aee0SKonstantin Belousov 	ktrtimeval(&it->it_interval);
1727de56aee0SKonstantin Belousov 	printf(", .value = ");
1728de56aee0SKonstantin Belousov 	ktrtimeval(&it->it_value);
1729de56aee0SKonstantin Belousov 	printf(" }\n");
1730de56aee0SKonstantin Belousov }
1731de56aee0SKonstantin Belousov 
17327008be5bSPawel Jakub Dawidek void
173360e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa)
173460e15db9SDag-Erling Smørgrav {
173560e15db9SDag-Erling Smørgrav /*
173660e15db9SDag-Erling Smørgrav  TODO: Support additional address families
173760e15db9SDag-Erling Smørgrav 	#include <netnatm/natm.h>
173860e15db9SDag-Erling Smørgrav 	struct sockaddr_natm	*natm;
1739237abf0cSDavide Italiano 	#include <netsmb/netbios.h>
1740237abf0cSDavide Italiano 	struct sockaddr_nb	*nb;
174160e15db9SDag-Erling Smørgrav */
17429289f547SJohn Baldwin 	const char *str;
174360e15db9SDag-Erling Smørgrav 	char addr[64];
174460e15db9SDag-Erling Smørgrav 
174560e15db9SDag-Erling Smørgrav 	/*
174660e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that sa points to a
174760e15db9SDag-Erling Smørgrav 	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
174860e15db9SDag-Erling Smørgrav 	 * sa->sa_len bytes long.
174960e15db9SDag-Erling Smørgrav 	 */
175060e15db9SDag-Erling Smørgrav 	printf("struct sockaddr { ");
17519289f547SJohn Baldwin 	str = sysdecode_sockaddr_family(sa->sa_family);
17529289f547SJohn Baldwin 	if (str != NULL)
17539289f547SJohn Baldwin 		printf("%s", str);
17549289f547SJohn Baldwin 	else
17559289f547SJohn Baldwin 		printf("<invalid=%d>", sa->sa_family);
175660e15db9SDag-Erling Smørgrav 	printf(", ");
175760e15db9SDag-Erling Smørgrav 
175860e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n)					\
175981a31394SDag-Erling Smørgrav 	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
176060e15db9SDag-Erling Smørgrav 		printf("invalid");				\
176160e15db9SDag-Erling Smørgrav 		break;						\
176260e15db9SDag-Erling Smørgrav 	}
176360e15db9SDag-Erling Smørgrav 
176460e15db9SDag-Erling Smørgrav 	switch(sa->sa_family) {
176560e15db9SDag-Erling Smørgrav 	case AF_INET: {
176681a31394SDag-Erling Smørgrav 		struct sockaddr_in sa_in;
176760e15db9SDag-Erling Smørgrav 
176881a31394SDag-Erling Smørgrav 		memset(&sa_in, 0, sizeof(sa_in));
1769449df4ecSAndrey Zonov 		memcpy(&sa_in, sa, sa->sa_len);
177060e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in);
177181a31394SDag-Erling Smørgrav 		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
177281a31394SDag-Erling Smørgrav 		printf("%s:%u", addr, ntohs(sa_in.sin_port));
177360e15db9SDag-Erling Smørgrav 		break;
177460e15db9SDag-Erling Smørgrav 	}
177560e15db9SDag-Erling Smørgrav 	case AF_INET6: {
177681a31394SDag-Erling Smørgrav 		struct sockaddr_in6 sa_in6;
177760e15db9SDag-Erling Smørgrav 
177881a31394SDag-Erling Smørgrav 		memset(&sa_in6, 0, sizeof(sa_in6));
1779449df4ecSAndrey Zonov 		memcpy(&sa_in6, sa, sa->sa_len);
178060e15db9SDag-Erling Smørgrav 		check_sockaddr_len(in6);
1781b9ef8051SAndrey V. Elsukov 		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1782b9ef8051SAndrey V. Elsukov 		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
178381a31394SDag-Erling Smørgrav 		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
178460e15db9SDag-Erling Smørgrav 		break;
178560e15db9SDag-Erling Smørgrav 	}
178660e15db9SDag-Erling Smørgrav 	case AF_UNIX: {
178781a31394SDag-Erling Smørgrav 		struct sockaddr_un sa_un;
178860e15db9SDag-Erling Smørgrav 
178981a31394SDag-Erling Smørgrav 		memset(&sa_un, 0, sizeof(sa_un));
1790449df4ecSAndrey Zonov 		memcpy(&sa_un, sa, sa->sa_len);
179181a31394SDag-Erling Smørgrav 		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
179260e15db9SDag-Erling Smørgrav 		break;
179360e15db9SDag-Erling Smørgrav 	}
179460e15db9SDag-Erling Smørgrav 	default:
179560e15db9SDag-Erling Smørgrav 		printf("unknown address family");
179660e15db9SDag-Erling Smørgrav 	}
179760e15db9SDag-Erling Smørgrav 	printf(" }\n");
179860e15db9SDag-Erling Smørgrav }
179960e15db9SDag-Erling Smørgrav 
180060e15db9SDag-Erling Smørgrav void
180160e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp)
180260e15db9SDag-Erling Smørgrav {
180360e15db9SDag-Erling Smørgrav 	char mode[12], timestr[PATH_MAX + 4];
180460e15db9SDag-Erling Smørgrav 	struct passwd *pwd;
180560e15db9SDag-Erling Smørgrav 	struct group  *grp;
180660e15db9SDag-Erling Smørgrav 	struct tm *tm;
180760e15db9SDag-Erling Smørgrav 
180860e15db9SDag-Erling Smørgrav 	/*
180960e15db9SDag-Erling Smørgrav 	 * note: ktrstruct() has already verified that statp points to a
181060e15db9SDag-Erling Smørgrav 	 * buffer exactly sizeof(struct stat) bytes long.
181160e15db9SDag-Erling Smørgrav 	 */
181260e15db9SDag-Erling Smørgrav 	printf("struct stat {");
181356f0ad0dSDag-Erling Smørgrav 	printf("dev=%ju, ino=%ju, ",
181456f0ad0dSDag-Erling Smørgrav 		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
181556f0ad0dSDag-Erling Smørgrav 	if (resolv == 0)
181656f0ad0dSDag-Erling Smørgrav 		printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
181756f0ad0dSDag-Erling Smørgrav 	else {
181860e15db9SDag-Erling Smørgrav 		strmode(statp->st_mode, mode);
181956f0ad0dSDag-Erling Smørgrav 		printf("mode=%s, ", mode);
182056f0ad0dSDag-Erling Smørgrav 	}
182156f0ad0dSDag-Erling Smørgrav 	printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
18224622f0e1SPawel Jakub Dawidek 	if (resolv == 0) {
18234622f0e1SPawel Jakub Dawidek 		pwd = NULL;
18244622f0e1SPawel Jakub Dawidek 	} else {
1825c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
18264622f0e1SPawel Jakub Dawidek 		if (cappwd != NULL)
18274622f0e1SPawel Jakub Dawidek 			pwd = cap_getpwuid(cappwd, statp->st_uid);
18284622f0e1SPawel Jakub Dawidek 		else
18294622f0e1SPawel Jakub Dawidek #endif
18304622f0e1SPawel Jakub Dawidek 			pwd = getpwuid(statp->st_uid);
18314622f0e1SPawel Jakub Dawidek 	}
18324622f0e1SPawel Jakub Dawidek 	if (pwd == NULL)
183360e15db9SDag-Erling Smørgrav 		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
183460e15db9SDag-Erling Smørgrav 	else
183560e15db9SDag-Erling Smørgrav 		printf("uid=\"%s\", ", pwd->pw_name);
18364622f0e1SPawel Jakub Dawidek 	if (resolv == 0) {
18374622f0e1SPawel Jakub Dawidek 		grp = NULL;
18384622f0e1SPawel Jakub Dawidek 	} else {
1839c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER
18404622f0e1SPawel Jakub Dawidek 		if (capgrp != NULL)
18414622f0e1SPawel Jakub Dawidek 			grp = cap_getgrgid(capgrp, statp->st_gid);
18424622f0e1SPawel Jakub Dawidek 		else
18434622f0e1SPawel Jakub Dawidek #endif
18444622f0e1SPawel Jakub Dawidek 			grp = getgrgid(statp->st_gid);
18454622f0e1SPawel Jakub Dawidek 	}
18464622f0e1SPawel Jakub Dawidek 	if (grp == NULL)
184760e15db9SDag-Erling Smørgrav 		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
184860e15db9SDag-Erling Smørgrav 	else
184960e15db9SDag-Erling Smørgrav 		printf("gid=\"%s\", ", grp->gr_name);
185060e15db9SDag-Erling Smørgrav 	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
185160e15db9SDag-Erling Smørgrav 	printf("atime=");
185260e15db9SDag-Erling Smørgrav 	if (resolv == 0)
185399742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
185460e15db9SDag-Erling Smørgrav 	else {
185599742a23SEd Schouten 		tm = localtime(&statp->st_atim.tv_sec);
185609307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
185760e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
185860e15db9SDag-Erling Smørgrav 	}
185999742a23SEd Schouten 	if (statp->st_atim.tv_nsec != 0)
186099742a23SEd Schouten 		printf(".%09ld, ", statp->st_atim.tv_nsec);
186160e15db9SDag-Erling Smørgrav 	else
186260e15db9SDag-Erling Smørgrav 		printf(", ");
18630e80f258SEnji Cooper 	printf("mtime=");
186460e15db9SDag-Erling Smørgrav 	if (resolv == 0)
186599742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
186660e15db9SDag-Erling Smørgrav 	else {
186799742a23SEd Schouten 		tm = localtime(&statp->st_mtim.tv_sec);
186809307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
186960e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
187060e15db9SDag-Erling Smørgrav 	}
187199742a23SEd Schouten 	if (statp->st_mtim.tv_nsec != 0)
187299742a23SEd Schouten 		printf(".%09ld, ", statp->st_mtim.tv_nsec);
187360e15db9SDag-Erling Smørgrav 	else
187460e15db9SDag-Erling Smørgrav 		printf(", ");
187560e15db9SDag-Erling Smørgrav 	printf("ctime=");
187660e15db9SDag-Erling Smørgrav 	if (resolv == 0)
187799742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
187860e15db9SDag-Erling Smørgrav 	else {
187999742a23SEd Schouten 		tm = localtime(&statp->st_ctim.tv_sec);
188009307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
188160e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
188260e15db9SDag-Erling Smørgrav 	}
188399742a23SEd Schouten 	if (statp->st_ctim.tv_nsec != 0)
188499742a23SEd Schouten 		printf(".%09ld, ", statp->st_ctim.tv_nsec);
188560e15db9SDag-Erling Smørgrav 	else
188660e15db9SDag-Erling Smørgrav 		printf(", ");
188760e15db9SDag-Erling Smørgrav 	printf("birthtime=");
188860e15db9SDag-Erling Smørgrav 	if (resolv == 0)
188999742a23SEd Schouten 		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
189060e15db9SDag-Erling Smørgrav 	else {
189199742a23SEd Schouten 		tm = localtime(&statp->st_birthtim.tv_sec);
189209307b25SDag-Erling Smørgrav 		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
189360e15db9SDag-Erling Smørgrav 		printf("\"%s\"", timestr);
189460e15db9SDag-Erling Smørgrav 	}
189599742a23SEd Schouten 	if (statp->st_birthtim.tv_nsec != 0)
189699742a23SEd Schouten 		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
189760e15db9SDag-Erling Smørgrav 	else
189860e15db9SDag-Erling Smørgrav 		printf(", ");
189960e15db9SDag-Erling Smørgrav 	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
190060e15db9SDag-Erling Smørgrav 		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
190160e15db9SDag-Erling Smørgrav 		(intmax_t)statp->st_blocks, statp->st_flags);
190260e15db9SDag-Erling Smørgrav 	printf(" }\n");
190360e15db9SDag-Erling Smørgrav }
190460e15db9SDag-Erling Smørgrav 
190560e15db9SDag-Erling Smørgrav void
190660e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen)
190760e15db9SDag-Erling Smørgrav {
190860e15db9SDag-Erling Smørgrav 	char *name, *data;
190960e15db9SDag-Erling Smørgrav 	size_t namelen, datalen;
191060e15db9SDag-Erling Smørgrav 	int i;
19117008be5bSPawel Jakub Dawidek 	cap_rights_t rights;
1912de56aee0SKonstantin Belousov 	struct itimerval it;
191330c1278fSWarner Losh 	struct stat sb;
191430c1278fSWarner Losh 	struct sockaddr_storage ss;
191560e15db9SDag-Erling Smørgrav 
191660e15db9SDag-Erling Smørgrav 	for (name = buf, namelen = 0;
191760e15db9SDag-Erling Smørgrav 	     namelen < buflen && name[namelen] != '\0';
191860e15db9SDag-Erling Smørgrav 	     ++namelen)
191960e15db9SDag-Erling Smørgrav 		/* nothing */;
192060e15db9SDag-Erling Smørgrav 	if (namelen == buflen)
192160e15db9SDag-Erling Smørgrav 		goto invalid;
192260e15db9SDag-Erling Smørgrav 	if (name[namelen] != '\0')
192360e15db9SDag-Erling Smørgrav 		goto invalid;
192460e15db9SDag-Erling Smørgrav 	data = buf + namelen + 1;
192560e15db9SDag-Erling Smørgrav 	datalen = buflen - namelen - 1;
192660e15db9SDag-Erling Smørgrav 	if (datalen == 0)
192760e15db9SDag-Erling Smørgrav 		goto invalid;
192860e15db9SDag-Erling Smørgrav 	/* sanity check */
192981a31394SDag-Erling Smørgrav 	for (i = 0; i < (int)namelen; ++i)
193081a31394SDag-Erling Smørgrav 		if (!isalpha(name[i]))
193160e15db9SDag-Erling Smørgrav 			goto invalid;
19327008be5bSPawel Jakub Dawidek 	if (strcmp(name, "caprights") == 0) {
19337008be5bSPawel Jakub Dawidek 		if (datalen != sizeof(cap_rights_t))
19347008be5bSPawel Jakub Dawidek 			goto invalid;
19357008be5bSPawel Jakub Dawidek 		memcpy(&rights, data, datalen);
19367008be5bSPawel Jakub Dawidek 		ktrcaprights(&rights);
1937de56aee0SKonstantin Belousov 	} else if (strcmp(name, "itimerval") == 0) {
1938de56aee0SKonstantin Belousov 		if (datalen != sizeof(struct itimerval))
1939de56aee0SKonstantin Belousov 			goto invalid;
1940de56aee0SKonstantin Belousov 		memcpy(&it, data, datalen);
1941de56aee0SKonstantin Belousov 		ktritimerval(&it);
19427008be5bSPawel Jakub Dawidek 	} else if (strcmp(name, "stat") == 0) {
194360e15db9SDag-Erling Smørgrav 		if (datalen != sizeof(struct stat))
194460e15db9SDag-Erling Smørgrav 			goto invalid;
194530c1278fSWarner Losh 		memcpy(&sb, data, datalen);
194630c1278fSWarner Losh 		ktrstat(&sb);
194760e15db9SDag-Erling Smørgrav 	} else if (strcmp(name, "sockaddr") == 0) {
194830c1278fSWarner Losh 		if (datalen > sizeof(ss))
194960e15db9SDag-Erling Smørgrav 			goto invalid;
195030c1278fSWarner Losh 		memcpy(&ss, data, datalen);
19514b03484fSAndrey Zonov 		if (datalen != ss.ss_len)
195230c1278fSWarner Losh 			goto invalid;
195330c1278fSWarner Losh 		ktrsockaddr((struct sockaddr *)&ss);
195460e15db9SDag-Erling Smørgrav 	} else {
195560e15db9SDag-Erling Smørgrav 		printf("unknown structure\n");
195660e15db9SDag-Erling Smørgrav 	}
195760e15db9SDag-Erling Smørgrav 	return;
195860e15db9SDag-Erling Smørgrav invalid:
195960e15db9SDag-Erling Smørgrav 	printf("invalid record\n");
196060e15db9SDag-Erling Smørgrav }
196160e15db9SDag-Erling Smørgrav 
1962c601ad8eSDag-Erling Smørgrav void
1963c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr)
1964c601ad8eSDag-Erling Smørgrav {
1965e141be6fSDag-Erling Smørgrav 	switch (ktr->cap_type) {
1966e141be6fSDag-Erling Smørgrav 	case CAPFAIL_NOTCAPABLE:
1967e141be6fSDag-Erling Smørgrav 		/* operation on fd with insufficient capabilities */
1968e141be6fSDag-Erling Smørgrav 		printf("operation requires ");
19699289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_needed);
19702c93e2a3SPawel Jakub Dawidek 		printf(", descriptor holds ");
19719289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_held);
1972e141be6fSDag-Erling Smørgrav 		break;
1973e141be6fSDag-Erling Smørgrav 	case CAPFAIL_INCREASE:
1974e141be6fSDag-Erling Smørgrav 		/* requested more capabilities than fd already has */
1975e141be6fSDag-Erling Smørgrav 		printf("attempt to increase capabilities from ");
19769289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_held);
197760e45df8SDag-Erling Smørgrav 		printf(" to ");
19789289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_needed);
1979e141be6fSDag-Erling Smørgrav 		break;
1980e141be6fSDag-Erling Smørgrav 	case CAPFAIL_SYSCALL:
1981e141be6fSDag-Erling Smørgrav 		/* called restricted syscall */
1982e141be6fSDag-Erling Smørgrav 		printf("disallowed system call");
1983e141be6fSDag-Erling Smørgrav 		break;
1984e141be6fSDag-Erling Smørgrav 	case CAPFAIL_LOOKUP:
1985e141be6fSDag-Erling Smørgrav 		/* used ".." in strict-relative mode */
1986e141be6fSDag-Erling Smørgrav 		printf("restricted VFS lookup");
1987e141be6fSDag-Erling Smørgrav 		break;
1988e141be6fSDag-Erling Smørgrav 	default:
1989e141be6fSDag-Erling Smørgrav 		printf("unknown capability failure: ");
19909289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_needed);
1991e141be6fSDag-Erling Smørgrav 		printf(" ");
19929289f547SJohn Baldwin 		sysdecode_cap_rights(stdout, &ktr->cap_held);
1993e141be6fSDag-Erling Smørgrav 		break;
1994e141be6fSDag-Erling Smørgrav 	}
199535818d2eSJohn Baldwin 	printf("\n");
199635818d2eSJohn Baldwin }
199735818d2eSJohn Baldwin 
199835818d2eSJohn Baldwin void
199935818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr)
200035818d2eSJohn Baldwin {
200135818d2eSJohn Baldwin 
200278ec874dSDmitry Chagin 	printf("0x%jx ", (uintmax_t)ktr->vaddr);
20039289f547SJohn Baldwin 	print_mask_arg(sysdecode_vmprot, ktr->type);
200435818d2eSJohn Baldwin 	printf("\n");
200535818d2eSJohn Baldwin }
200635818d2eSJohn Baldwin 
200735818d2eSJohn Baldwin void
200835818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr)
200935818d2eSJohn Baldwin {
20109289f547SJohn Baldwin 	const char *str;
201135818d2eSJohn Baldwin 
20129289f547SJohn Baldwin 	str = sysdecode_vmresult(ktr->result);
20139289f547SJohn Baldwin 	if (str != NULL)
20149289f547SJohn Baldwin 		printf("%s", str);
20159289f547SJohn Baldwin 	else
20169289f547SJohn Baldwin 		printf("<invalid=%d>", ktr->result);
201735818d2eSJohn Baldwin 	printf("\n");
2018c601ad8eSDag-Erling Smørgrav }
2019c601ad8eSDag-Erling Smørgrav 
202060e15db9SDag-Erling Smørgrav void
202191fbb9c1SDavid Malone usage(void)
20229b50d902SRodney W. Grimes {
2023b9034ce2SBryan Drewery 	fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
2024da647ae9SRuslan Ermilov 	    "[-m maxdata] [-p pid] [-t trstr]\n");
20259b50d902SRodney W. Grimes 	exit(1);
20269b50d902SRodney W. Grimes }
2027