1/*-
2 * Copyright (c) 1988, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef lint
31static const char copyright[] =
32"@(#) Copyright (c) 1988, 1993\n\
33	The Regents of the University of California.  All rights reserved.\n";
34#endif /* not lint */
35
36#ifndef lint
37#if 0
38static char sccsid[] = "@(#)kdump.c	8.1 (Berkeley) 6/6/93";
39#endif
40#endif /* not lint */
41#include <sys/cdefs.h>
42__FBSDID("$FreeBSD: stable/11/usr.bin/kdump/kdump.c 358253 2020-02-22 21:44:00Z kevans $");
43
44#define _WANT_KERNEL_ERRNO
45#ifdef __LP64__
46#define	_WANT_KEVENT32
47#endif
48#include <sys/param.h>
49#include <sys/capsicum.h>
50#include <sys/errno.h>
51#include <sys/time.h>
52#include <sys/uio.h>
53#include <sys/event.h>
54#include <sys/ktrace.h>
55#include <sys/mman.h>
56#include <sys/ioctl.h>
57#include <sys/socket.h>
58#include <sys/stat.h>
59#include <sys/sysent.h>
60#include <sys/umtx.h>
61#include <sys/un.h>
62#include <sys/queue.h>
63#include <sys/wait.h>
64#ifdef HAVE_LIBCASPER
65#include <sys/nv.h>
66#endif
67#include <arpa/inet.h>
68#include <netinet/in.h>
69#include <ctype.h>
70#include <err.h>
71#include <grp.h>
72#include <inttypes.h>
73#include <locale.h>
74#include <netdb.h>
75#include <nl_types.h>
76#include <pwd.h>
77#include <stddef.h>
78#include <stdio.h>
79#include <stdlib.h>
80#include <string.h>
81#include <sysdecode.h>
82#include <termios.h>
83#include <time.h>
84#include <unistd.h>
85#include <vis.h>
86#include "ktrace.h"
87
88#ifdef HAVE_LIBCASPER
89#include <libcasper.h>
90
91#include <casper/cap_grp.h>
92#include <casper/cap_pwd.h>
93#endif
94
95int fetchprocinfo(struct ktr_header *, u_int *);
96u_int findabi(struct ktr_header *);
97int fread_tail(void *, int, int);
98void dumpheader(struct ktr_header *, u_int);
99void ktrsyscall(struct ktr_syscall *, u_int);
100void ktrsysret(struct ktr_sysret *, u_int);
101void ktrnamei(char *, int);
102void hexdump(char *, int, int);
103void visdump(char *, int, int);
104void ktrgenio(struct ktr_genio *, int);
105void ktrpsig(struct ktr_psig *);
106void ktrcsw(struct ktr_csw *);
107void ktrcsw_old(struct ktr_csw_old *);
108void ktruser(int, void *);
109void ktrcaprights(cap_rights_t *);
110void ktritimerval(struct itimerval *it);
111void ktrsockaddr(struct sockaddr *);
112void ktrstat(struct stat *);
113void ktrstruct(char *, size_t);
114void ktrcapfail(struct ktr_cap_fail *);
115void ktrfault(struct ktr_fault *);
116void ktrfaultend(struct ktr_faultend *);
117void ktrkevent(struct kevent *);
118void ktrstructarray(struct ktr_struct_array *, size_t);
119void limitfd(int fd);
120void usage(void);
121
122#define	TIMESTAMP_NONE		0x0
123#define	TIMESTAMP_ABSOLUTE	0x1
124#define	TIMESTAMP_ELAPSED	0x2
125#define	TIMESTAMP_RELATIVE	0x4
126
127static bool abiflag, decimal, fancy = true, resolv, suppressdata, syscallno,
128    tail, threads;
129static int timestamp, maxdata;
130static const char *tracefile = DEF_TRACEFILE;
131static struct ktr_header ktr_header;
132
133#define TIME_FORMAT	"%b %e %T %Y"
134#define eqs(s1, s2)	(strcmp((s1), (s2)) == 0)
135
136#define	print_number64(first,i,n,c) do {				\
137	uint64_t __v;							\
138									\
139	if (quad_align && (((ptrdiff_t)((i) - (first))) & 1) == 1) {	\
140		(i)++;							\
141		(n)--;							\
142	}								\
143	if (quad_slots == 2)						\
144		__v = (uint64_t)(uint32_t)(i)[0] |			\
145		    ((uint64_t)(uint32_t)(i)[1]) << 32;			\
146	else								\
147		__v = (uint64_t)*(i);					\
148	if (decimal)							\
149		printf("%c%jd", (c), (intmax_t)__v);			\
150	else								\
151		printf("%c%#jx", (c), (uintmax_t)__v);			\
152	(i) += quad_slots;						\
153	(n) -= quad_slots;						\
154	(c) = ',';							\
155} while (0)
156
157#define print_number(i,n,c) do {					\
158	if (decimal)							\
159		printf("%c%jd", c, (intmax_t)*i);			\
160	else								\
161		printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);	\
162	i++;								\
163	n--;								\
164	c = ',';							\
165} while (0)
166
167struct proc_info
168{
169	TAILQ_ENTRY(proc_info)	info;
170	u_int			sv_flags;
171	pid_t			pid;
172};
173
174static TAILQ_HEAD(trace_procs, proc_info) trace_procs;
175
176#ifdef HAVE_LIBCASPER
177static cap_channel_t *cappwd, *capgrp;
178#endif
179
180static void
181strerror_init(void)
182{
183
184	/*
185	 * Cache NLS data before entering capability mode.
186	 * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
187	 */
188	(void)catopen("libc", NL_CAT_LOCALE);
189}
190
191static void
192localtime_init(void)
193{
194	time_t ltime;
195
196	/*
197	 * Allow localtime(3) to cache /etc/localtime content before entering
198	 * capability mode.
199	 * XXXPJD: There should be localtime_init() in libc.
200	 */
201	(void)time(&ltime);
202	(void)localtime(&ltime);
203}
204
205#ifdef HAVE_LIBCASPER
206static int
207cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp)
208{
209	cap_channel_t *capcas, *cappwdloc, *capgrploc;
210	const char *cmds[1], *fields[1];
211
212	capcas = cap_init();
213	if (capcas == NULL) {
214		err(1, "unable to create casper process");
215		exit(1);
216	}
217	cappwdloc = cap_service_open(capcas, "system.pwd");
218	capgrploc = cap_service_open(capcas, "system.grp");
219	/* Casper capability no longer needed. */
220	cap_close(capcas);
221	if (cappwdloc == NULL || capgrploc == NULL) {
222		if (cappwdloc == NULL)
223			warn("unable to open system.pwd service");
224		if (capgrploc == NULL)
225			warn("unable to open system.grp service");
226		exit(1);
227	}
228	/* Limit system.pwd to only getpwuid() function and pw_name field. */
229	cmds[0] = "getpwuid";
230	if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0)
231		err(1, "unable to limit system.pwd service");
232	fields[0] = "pw_name";
233	if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0)
234		err(1, "unable to limit system.pwd service");
235	/* Limit system.grp to only getgrgid() function and gr_name field. */
236	cmds[0] = "getgrgid";
237	if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0)
238		err(1, "unable to limit system.grp service");
239	fields[0] = "gr_name";
240	if (cap_grp_limit_fields(capgrploc, fields, 1) < 0)
241		err(1, "unable to limit system.grp service");
242
243	*cappwdp = cappwdloc;
244	*capgrpp = capgrploc;
245	return (0);
246}
247#endif	/* HAVE_LIBCASPER */
248
249static void
250print_integer_arg(const char *(*decoder)(int), int value)
251{
252	const char *str;
253
254	str = decoder(value);
255	if (str != NULL)
256		printf("%s", str);
257	else {
258		if (decimal)
259			printf("<invalid=%d>", value);
260		else
261			printf("<invalid=%#x>", value);
262	}
263}
264
265/* Like print_integer_arg but unknown values are treated as valid. */
266static void
267print_integer_arg_valid(const char *(*decoder)(int), int value)
268{
269	const char *str;
270
271	str = decoder(value);
272	if (str != NULL)
273		printf("%s", str);
274	else {
275		if (decimal)
276			printf("%d", value);
277		else
278			printf("%#x", value);
279	}
280}
281
282static void
283print_mask_arg(bool (*decoder)(FILE *, int, int *), int value)
284{
285	bool invalid;
286	int rem;
287
288	printf("%#x<", value);
289	invalid = !decoder(stdout, value, &rem);
290	printf(">");
291	if (invalid)
292		printf("<invalid>%u", rem);
293}
294
295static void
296print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value)
297{
298	bool invalid;
299	int rem;
300
301	if (value == 0) {
302		printf("0");
303		return;
304	}
305	printf("%#x<", value);
306	invalid = !decoder(stdout, value, &rem);
307	printf(">");
308	if (invalid)
309		printf("<invalid>%u", rem);
310}
311
312static void
313decode_fileflags(fflags_t value)
314{
315	bool invalid;
316	fflags_t rem;
317
318	if (value == 0) {
319		printf("0");
320		return;
321	}
322	printf("%#x<", value);
323	invalid = !sysdecode_fileflags(stdout, value, &rem);
324	printf(">");
325	if (invalid)
326		printf("<invalid>%u", rem);
327}
328
329static void
330decode_filemode(int value)
331{
332	bool invalid;
333	int rem;
334
335	if (value == 0) {
336		printf("0");
337		return;
338	}
339	printf("%#o<", value);
340	invalid = !sysdecode_filemode(stdout, value, &rem);
341	printf(">");
342	if (invalid)
343		printf("<invalid>%u", rem);
344}
345
346static void
347print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value)
348{
349	bool invalid;
350	uint32_t rem;
351
352	printf("%#x<", value);
353	invalid = !decoder(stdout, value, &rem);
354	printf(">");
355	if (invalid)
356		printf("<invalid>%u", rem);
357}
358
359static void
360print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value)
361{
362	bool invalid;
363	u_long rem;
364
365	if (value == 0) {
366		printf("0");
367		return;
368	}
369	printf("%#lx<", value);
370	invalid = !decoder(stdout, value, &rem);
371	printf(">");
372	if (invalid)
373		printf("<invalid>%lu", rem);
374}
375
376int
377main(int argc, char *argv[])
378{
379	int ch, ktrlen, size;
380	void *m;
381	int trpoints = ALL_POINTS;
382	int drop_logged;
383	pid_t pid = 0;
384	u_int sv_flags;
385
386	setlocale(LC_CTYPE, "");
387
388	timestamp = TIMESTAMP_NONE;
389
390	while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
391		switch (ch) {
392		case 'A':
393			abiflag = true;
394			break;
395		case 'f':
396			tracefile = optarg;
397			break;
398		case 'd':
399			decimal = true;
400			break;
401		case 'l':
402			tail = true;
403			break;
404		case 'm':
405			maxdata = atoi(optarg);
406			break;
407		case 'n':
408			fancy = false;
409			break;
410		case 'p':
411			pid = atoi(optarg);
412			break;
413		case 'r':
414			resolv = true;
415			break;
416		case 'S':
417			syscallno = true;
418			break;
419		case 's':
420			suppressdata = true;
421			break;
422		case 'E':
423			timestamp |= TIMESTAMP_ELAPSED;
424			break;
425		case 'H':
426			threads = true;
427			break;
428		case 'R':
429			timestamp |= TIMESTAMP_RELATIVE;
430			break;
431		case 'T':
432			timestamp |= TIMESTAMP_ABSOLUTE;
433			break;
434		case 't':
435			trpoints = getpoints(optarg);
436			if (trpoints < 0)
437				errx(1, "unknown trace point in %s", optarg);
438			break;
439		default:
440			usage();
441		}
442
443	if (argc > optind)
444		usage();
445
446	m = malloc(size = 1025);
447	if (m == NULL)
448		errx(1, "%s", strerror(ENOMEM));
449	if (strcmp(tracefile, "-") != 0)
450		if (!freopen(tracefile, "r", stdin))
451			err(1, "%s", tracefile);
452
453	strerror_init();
454	localtime_init();
455#ifdef HAVE_LIBCASPER
456	if (resolv) {
457		if (cappwdgrp_setup(&cappwd, &capgrp) < 0) {
458			cappwd = NULL;
459			capgrp = NULL;
460		}
461	}
462	if (!resolv || (cappwd != NULL && capgrp != NULL)) {
463		if (cap_enter() < 0 && errno != ENOSYS)
464			err(1, "unable to enter capability mode");
465	}
466#else
467	if (!resolv) {
468		if (cap_enter() < 0 && errno != ENOSYS)
469			err(1, "unable to enter capability mode");
470	}
471#endif
472	limitfd(STDIN_FILENO);
473	limitfd(STDOUT_FILENO);
474	limitfd(STDERR_FILENO);
475
476	TAILQ_INIT(&trace_procs);
477	drop_logged = 0;
478	while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
479		if (ktr_header.ktr_type & KTR_DROP) {
480			ktr_header.ktr_type &= ~KTR_DROP;
481			if (!drop_logged && threads) {
482				printf(
483				    "%6jd %6jd %-8.*s Events dropped.\n",
484				    (intmax_t)ktr_header.ktr_pid,
485				    ktr_header.ktr_tid > 0 ?
486				    (intmax_t)ktr_header.ktr_tid : 0,
487				    MAXCOMLEN, ktr_header.ktr_comm);
488				drop_logged = 1;
489			} else if (!drop_logged) {
490				printf("%6jd %-8.*s Events dropped.\n",
491				    (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
492				    ktr_header.ktr_comm);
493				drop_logged = 1;
494			}
495		}
496		if ((ktrlen = ktr_header.ktr_len) < 0)
497			errx(1, "bogus length 0x%x", ktrlen);
498		if (ktrlen > size) {
499			m = realloc(m, ktrlen+1);
500			if (m == NULL)
501				errx(1, "%s", strerror(ENOMEM));
502			size = ktrlen;
503		}
504		if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
505			errx(1, "data too short");
506		if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
507			continue;
508		if (pid && ktr_header.ktr_pid != pid &&
509		    ktr_header.ktr_tid != pid)
510			continue;
511		if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
512			continue;
513		sv_flags = findabi(&ktr_header);
514		dumpheader(&ktr_header, sv_flags);
515		drop_logged = 0;
516		switch (ktr_header.ktr_type) {
517		case KTR_SYSCALL:
518			ktrsyscall((struct ktr_syscall *)m, sv_flags);
519			break;
520		case KTR_SYSRET:
521			ktrsysret((struct ktr_sysret *)m, sv_flags);
522			break;
523		case KTR_NAMEI:
524		case KTR_SYSCTL:
525			ktrnamei(m, ktrlen);
526			break;
527		case KTR_GENIO:
528			ktrgenio((struct ktr_genio *)m, ktrlen);
529			break;
530		case KTR_PSIG:
531			ktrpsig((struct ktr_psig *)m);
532			break;
533		case KTR_CSW:
534			if (ktrlen == sizeof(struct ktr_csw_old))
535				ktrcsw_old((struct ktr_csw_old *)m);
536			else
537				ktrcsw((struct ktr_csw *)m);
538			break;
539		case KTR_USER:
540			ktruser(ktrlen, m);
541			break;
542		case KTR_STRUCT:
543			ktrstruct(m, ktrlen);
544			break;
545		case KTR_CAPFAIL:
546			ktrcapfail((struct ktr_cap_fail *)m);
547			break;
548		case KTR_FAULT:
549			ktrfault((struct ktr_fault *)m);
550			break;
551		case KTR_FAULTEND:
552			ktrfaultend((struct ktr_faultend *)m);
553			break;
554		case KTR_STRUCT_ARRAY:
555			ktrstructarray((struct ktr_struct_array *)m, ktrlen);
556			break;
557		default:
558			printf("\n");
559			break;
560		}
561		if (tail)
562			fflush(stdout);
563	}
564	return 0;
565}
566
567void
568limitfd(int fd)
569{
570	cap_rights_t rights;
571	unsigned long cmd;
572
573	cap_rights_init(&rights, CAP_FSTAT);
574	cmd = 0;
575
576	switch (fd) {
577	case STDIN_FILENO:
578		cap_rights_set(&rights, CAP_READ);
579		break;
580	case STDOUT_FILENO:
581		cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE);
582		cmd = TIOCGETA;	/* required by isatty(3) in printf(3) */
583		break;
584	case STDERR_FILENO:
585		cap_rights_set(&rights, CAP_WRITE);
586		if (!suppressdata) {
587			cap_rights_set(&rights, CAP_IOCTL);
588			cmd = TIOCGWINSZ;
589		}
590		break;
591	default:
592		abort();
593	}
594
595	if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
596		err(1, "unable to limit rights for descriptor %d", fd);
597	if (cmd != 0 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
598		err(1, "unable to limit ioctls for descriptor %d", fd);
599}
600
601int
602fread_tail(void *buf, int size, int num)
603{
604	int i;
605
606	while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
607		sleep(1);
608		clearerr(stdin);
609	}
610	return (i);
611}
612
613int
614fetchprocinfo(struct ktr_header *kth, u_int *flags)
615{
616	struct proc_info *pi;
617
618	switch (kth->ktr_type) {
619	case KTR_PROCCTOR:
620		TAILQ_FOREACH(pi, &trace_procs, info) {
621			if (pi->pid == kth->ktr_pid) {
622				TAILQ_REMOVE(&trace_procs, pi, info);
623				break;
624			}
625		}
626		pi = malloc(sizeof(struct proc_info));
627		if (pi == NULL)
628			errx(1, "%s", strerror(ENOMEM));
629		pi->sv_flags = *flags;
630		pi->pid = kth->ktr_pid;
631		TAILQ_INSERT_TAIL(&trace_procs, pi, info);
632		return (1);
633
634	case KTR_PROCDTOR:
635		TAILQ_FOREACH(pi, &trace_procs, info) {
636			if (pi->pid == kth->ktr_pid) {
637				TAILQ_REMOVE(&trace_procs, pi, info);
638				free(pi);
639				break;
640			}
641		}
642		return (1);
643	}
644
645	return (0);
646}
647
648u_int
649findabi(struct ktr_header *kth)
650{
651	struct proc_info *pi;
652
653	TAILQ_FOREACH(pi, &trace_procs, info) {
654		if (pi->pid == kth->ktr_pid) {
655			return (pi->sv_flags);
656		}
657	}
658	return (0);
659}
660
661void
662dumpheader(struct ktr_header *kth, u_int sv_flags)
663{
664	static char unknown[64];
665	static struct timeval prevtime, prevtime_e;
666	struct timeval temp;
667	const char *abi;
668	const char *arch;
669	const char *type;
670	const char *sign;
671
672	switch (kth->ktr_type) {
673	case KTR_SYSCALL:
674		type = "CALL";
675		break;
676	case KTR_SYSRET:
677		type = "RET ";
678		break;
679	case KTR_NAMEI:
680		type = "NAMI";
681		break;
682	case KTR_GENIO:
683		type = "GIO ";
684		break;
685	case KTR_PSIG:
686		type = "PSIG";
687		break;
688	case KTR_CSW:
689		type = "CSW ";
690		break;
691	case KTR_USER:
692		type = "USER";
693		break;
694	case KTR_STRUCT:
695	case KTR_STRUCT_ARRAY:
696		type = "STRU";
697		break;
698	case KTR_SYSCTL:
699		type = "SCTL";
700		break;
701	case KTR_CAPFAIL:
702		type = "CAP ";
703		break;
704	case KTR_FAULT:
705		type = "PFLT";
706		break;
707	case KTR_FAULTEND:
708		type = "PRET";
709		break;
710	default:
711		sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
712		type = unknown;
713	}
714
715	/*
716	 * The ktr_tid field was previously the ktr_buffer field, which held
717	 * the kernel pointer value for the buffer associated with data
718	 * following the record header.  It now holds a threadid, but only
719	 * for trace files after the change.  Older trace files still contain
720	 * kernel pointers.  Detect this and suppress the results by printing
721	 * negative tid's as 0.
722	 */
723	if (threads)
724		printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
725		    kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
726		    MAXCOMLEN, kth->ktr_comm);
727	else
728		printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
729		    kth->ktr_comm);
730        if (timestamp) {
731		if (timestamp & TIMESTAMP_ABSOLUTE) {
732			printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
733			    kth->ktr_time.tv_usec);
734		}
735		if (timestamp & TIMESTAMP_ELAPSED) {
736			if (prevtime_e.tv_sec == 0)
737				prevtime_e = kth->ktr_time;
738			timersub(&kth->ktr_time, &prevtime_e, &temp);
739			printf("%jd.%06ld ", (intmax_t)temp.tv_sec,
740			    temp.tv_usec);
741		}
742		if (timestamp & TIMESTAMP_RELATIVE) {
743			if (prevtime.tv_sec == 0)
744				prevtime = kth->ktr_time;
745			if (timercmp(&kth->ktr_time, &prevtime, <)) {
746				timersub(&prevtime, &kth->ktr_time, &temp);
747				sign = "-";
748			} else {
749				timersub(&kth->ktr_time, &prevtime, &temp);
750				sign = "";
751			}
752			prevtime = kth->ktr_time;
753			printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec,
754			    temp.tv_usec);
755		}
756	}
757	printf("%s  ", type);
758	if (abiflag != 0) {
759		switch (sv_flags & SV_ABI_MASK) {
760		case SV_ABI_LINUX:
761			abi = "L";
762			break;
763		case SV_ABI_FREEBSD:
764			abi = "F";
765			break;
766		case SV_ABI_CLOUDABI:
767			abi = "C";
768			break;
769		default:
770			abi = "U";
771			break;
772		}
773
774		if ((sv_flags & SV_LP64) != 0)
775			arch = "64";
776		else if ((sv_flags & SV_ILP32) != 0)
777			arch = "32";
778		else
779			arch = "00";
780
781		printf("%s%s  ", abi, arch);
782	}
783}
784
785#include <sys/syscall.h>
786
787static void
788ioctlname(unsigned long val)
789{
790	const char *str;
791
792	str = sysdecode_ioctlname(val);
793	if (str != NULL)
794		printf("%s", str);
795	else if (decimal)
796		printf("%lu", val);
797	else
798		printf("%#lx", val);
799}
800
801static enum sysdecode_abi
802syscallabi(u_int sv_flags)
803{
804
805	if (sv_flags == 0)
806		return (SYSDECODE_ABI_FREEBSD);
807	switch (sv_flags & SV_ABI_MASK) {
808	case SV_ABI_FREEBSD:
809		return (SYSDECODE_ABI_FREEBSD);
810#if defined(__amd64__) || defined(__i386__)
811	case SV_ABI_LINUX:
812#ifdef __amd64__
813		if (sv_flags & SV_ILP32)
814			return (SYSDECODE_ABI_LINUX32);
815#endif
816		return (SYSDECODE_ABI_LINUX);
817#endif
818#if defined(__aarch64__) || defined(__amd64__)
819	case SV_ABI_CLOUDABI:
820		return (SYSDECODE_ABI_CLOUDABI64);
821#endif
822	default:
823		return (SYSDECODE_ABI_UNKNOWN);
824	}
825}
826
827static void
828syscallname(u_int code, u_int sv_flags)
829{
830	const char *name;
831
832	name = sysdecode_syscallname(syscallabi(sv_flags), code);
833	if (name == NULL)
834		printf("[%d]", code);
835	else {
836		printf("%s", name);
837		if (syscallno)
838			printf("[%d]", code);
839	}
840}
841
842static void
843print_signal(int signo)
844{
845	const char *signame;
846
847	signame = sysdecode_signal(signo);
848	if (signame != NULL)
849		printf("%s", signame);
850	else
851		printf("SIG %d", signo);
852}
853
854void
855ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
856{
857	int narg = ktr->ktr_narg;
858	register_t *ip, *first;
859	intmax_t arg;
860	int quad_align, quad_slots;
861
862	syscallname(ktr->ktr_code, sv_flags);
863	ip = first = &ktr->ktr_args[0];
864	if (narg) {
865		char c = '(';
866		if (fancy &&
867		    (sv_flags == 0 ||
868		    (sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
869			quad_align = 0;
870			if (sv_flags & SV_ILP32) {
871#ifdef __powerpc__
872				quad_align = 1;
873#endif
874				quad_slots = 2;
875			} else
876				quad_slots = 1;
877			switch (ktr->ktr_code) {
878			case SYS_bindat:
879			case SYS_chflagsat:
880			case SYS_connectat:
881			case SYS_faccessat:
882			case SYS_fchmodat:
883			case SYS_fchownat:
884			case SYS_fstatat:
885			case SYS_futimesat:
886			case SYS_linkat:
887			case SYS_mkdirat:
888			case SYS_mkfifoat:
889			case SYS_mknodat:
890			case SYS_openat:
891			case SYS_readlinkat:
892			case SYS_renameat:
893			case SYS_unlinkat:
894			case SYS_utimensat:
895				putchar('(');
896				print_integer_arg_valid(sysdecode_atfd, *ip);
897				c = ',';
898				ip++;
899				narg--;
900				break;
901			}
902			switch (ktr->ktr_code) {
903			case SYS_ioctl: {
904				print_number(ip, narg, c);
905				putchar(c);
906				ioctlname(*ip);
907				c = ',';
908				ip++;
909				narg--;
910				break;
911			}
912			case SYS_ptrace:
913				putchar('(');
914				print_integer_arg(sysdecode_ptrace_request, *ip);
915				c = ',';
916				ip++;
917				narg--;
918				break;
919			case SYS_access:
920			case SYS_eaccess:
921			case SYS_faccessat:
922				print_number(ip, narg, c);
923				putchar(',');
924				print_mask_arg(sysdecode_access_mode, *ip);
925				ip++;
926				narg--;
927				break;
928			case SYS_open:
929			case SYS_openat:
930				print_number(ip, narg, c);
931				putchar(',');
932				print_mask_arg(sysdecode_open_flags, ip[0]);
933				if ((ip[0] & O_CREAT) == O_CREAT) {
934					putchar(',');
935					decode_filemode(ip[1]);
936				}
937				ip += 2;
938				narg -= 2;
939				break;
940			case SYS_wait4:
941				print_number(ip, narg, c);
942				print_number(ip, narg, c);
943				putchar(',');
944				print_mask_arg0(sysdecode_wait4_options, *ip);
945				ip++;
946				narg--;
947				break;
948			case SYS_wait6:
949				putchar('(');
950				print_integer_arg(sysdecode_idtype, *ip);
951				c = ',';
952				ip++;
953				narg--;
954				print_number64(first, ip, narg, c);
955				print_number(ip, narg, c);
956				putchar(',');
957				print_mask_arg(sysdecode_wait6_options, *ip);
958				ip++;
959				narg--;
960				break;
961			case SYS_chmod:
962			case SYS_fchmod:
963			case SYS_lchmod:
964			case SYS_fchmodat:
965				print_number(ip, narg, c);
966				putchar(',');
967				decode_filemode(*ip);
968				ip++;
969				narg--;
970				break;
971			case SYS_mknod:
972			case SYS_mknodat:
973				print_number(ip, narg, c);
974				putchar(',');
975				decode_filemode(*ip);
976				ip++;
977				narg--;
978				break;
979			case SYS_getfsstat:
980				print_number(ip, narg, c);
981				print_number(ip, narg, c);
982				putchar(',');
983				print_integer_arg(sysdecode_getfsstat_mode, *ip);
984				ip++;
985				narg--;
986				break;
987			case SYS_mount:
988				print_number(ip, narg, c);
989				print_number(ip, narg, c);
990				putchar(',');
991				print_mask_arg(sysdecode_mount_flags, *ip);
992				ip++;
993				narg--;
994				break;
995			case SYS_unmount:
996				print_number(ip, narg, c);
997				putchar(',');
998				print_mask_arg(sysdecode_mount_flags, *ip);
999				ip++;
1000				narg--;
1001				break;
1002			case SYS_recvmsg:
1003			case SYS_sendmsg:
1004				print_number(ip, narg, c);
1005				print_number(ip, narg, c);
1006				putchar(',');
1007				print_mask_arg0(sysdecode_msg_flags, *ip);
1008				ip++;
1009				narg--;
1010				break;
1011			case SYS_recvfrom:
1012			case SYS_sendto:
1013				print_number(ip, narg, c);
1014				print_number(ip, narg, c);
1015				print_number(ip, narg, c);
1016				putchar(',');
1017				print_mask_arg0(sysdecode_msg_flags, *ip);
1018				ip++;
1019				narg--;
1020				break;
1021			case SYS_chflags:
1022			case SYS_chflagsat:
1023			case SYS_fchflags:
1024			case SYS_lchflags:
1025				print_number(ip, narg, c);
1026				putchar(',');
1027				decode_fileflags(*ip);
1028				ip++;
1029				narg--;
1030				break;
1031			case SYS_kill:
1032				print_number(ip, narg, c);
1033				putchar(',');
1034				print_signal(*ip);
1035				ip++;
1036				narg--;
1037				break;
1038			case SYS_reboot:
1039				putchar('(');
1040				print_mask_arg(sysdecode_reboot_howto, *ip);
1041				ip++;
1042				narg--;
1043				break;
1044			case SYS_umask:
1045				putchar('(');
1046				decode_filemode(*ip);
1047				ip++;
1048				narg--;
1049				break;
1050			case SYS_msync:
1051				print_number(ip, narg, c);
1052				print_number(ip, narg, c);
1053				putchar(',');
1054				print_mask_arg(sysdecode_msync_flags, *ip);
1055				ip++;
1056				narg--;
1057				break;
1058#ifdef SYS_freebsd6_mmap
1059			case SYS_freebsd6_mmap:
1060				print_number(ip, narg, c);
1061				print_number(ip, narg, c);
1062				putchar(',');
1063				print_mask_arg(sysdecode_mmap_prot, *ip);
1064				putchar(',');
1065				ip++;
1066				narg--;
1067				print_mask_arg(sysdecode_mmap_flags, *ip);
1068				ip++;
1069				narg--;
1070				break;
1071#endif
1072			case SYS_mmap:
1073				print_number(ip, narg, c);
1074				print_number(ip, narg, c);
1075				putchar(',');
1076				print_mask_arg(sysdecode_mmap_prot, *ip);
1077				putchar(',');
1078				ip++;
1079				narg--;
1080				print_mask_arg(sysdecode_mmap_flags, *ip);
1081				ip++;
1082				narg--;
1083				break;
1084			case SYS_mprotect:
1085				print_number(ip, narg, c);
1086				print_number(ip, narg, c);
1087				putchar(',');
1088				print_mask_arg(sysdecode_mmap_prot, *ip);
1089				ip++;
1090				narg--;
1091				break;
1092			case SYS_madvise:
1093				print_number(ip, narg, c);
1094				print_number(ip, narg, c);
1095				putchar(',');
1096				print_integer_arg(sysdecode_madvice, *ip);
1097				ip++;
1098				narg--;
1099				break;
1100			case SYS_pathconf:
1101			case SYS_lpathconf:
1102			case SYS_fpathconf:
1103				print_number(ip, narg, c);
1104				putchar(',');
1105				print_integer_arg(sysdecode_pathconf_name, *ip);
1106				ip++;
1107				narg--;
1108				break;
1109			case SYS_getpriority:
1110			case SYS_setpriority:
1111				putchar('(');
1112				print_integer_arg(sysdecode_prio_which, *ip);
1113				c = ',';
1114				ip++;
1115				narg--;
1116				break;
1117			case SYS_fcntl:
1118				print_number(ip, narg, c);
1119				putchar(',');
1120				print_integer_arg(sysdecode_fcntl_cmd, ip[0]);
1121				if (sysdecode_fcntl_arg_p(ip[0])) {
1122					putchar(',');
1123					if (ip[0] == F_SETFL)
1124						print_mask_arg(
1125						    sysdecode_fcntl_fileflags,
1126							ip[1]);
1127					else
1128						sysdecode_fcntl_arg(stdout,
1129						    ip[0], ip[1],
1130						    decimal ? 10 : 16);
1131				}
1132				ip += 2;
1133				narg -= 2;
1134				break;
1135			case SYS_socket: {
1136				int sockdomain;
1137				putchar('(');
1138				sockdomain = *ip;
1139				print_integer_arg(sysdecode_socketdomain,
1140				    sockdomain);
1141				ip++;
1142				narg--;
1143				putchar(',');
1144				print_mask_arg(sysdecode_socket_type, *ip);
1145				ip++;
1146				narg--;
1147				if (sockdomain == PF_INET ||
1148				    sockdomain == PF_INET6) {
1149					putchar(',');
1150					print_integer_arg(sysdecode_ipproto,
1151					    *ip);
1152					ip++;
1153					narg--;
1154				}
1155				c = ',';
1156				break;
1157			}
1158			case SYS_setsockopt:
1159			case SYS_getsockopt: {
1160				const char *str;
1161
1162				print_number(ip, narg, c);
1163				putchar(',');
1164				print_integer_arg_valid(sysdecode_sockopt_level,
1165				    *ip);
1166				str = sysdecode_sockopt_name(ip[0], ip[1]);
1167				if (str != NULL) {
1168					printf(",%s", str);
1169					ip++;
1170					narg--;
1171				}
1172				ip++;
1173				narg--;
1174				break;
1175			}
1176#ifdef SYS_freebsd6_lseek
1177			case SYS_freebsd6_lseek:
1178				print_number(ip, narg, c);
1179				/* Hidden 'pad' argument, not in lseek(2) */
1180				print_number(ip, narg, c);
1181				print_number64(first, ip, narg, c);
1182				putchar(',');
1183				print_integer_arg(sysdecode_whence, *ip);
1184				ip++;
1185				narg--;
1186				break;
1187#endif
1188			case SYS_lseek:
1189				print_number(ip, narg, c);
1190				print_number64(first, ip, narg, c);
1191				putchar(',');
1192				print_integer_arg(sysdecode_whence, *ip);
1193				ip++;
1194				narg--;
1195				break;
1196			case SYS_flock:
1197				print_number(ip, narg, c);
1198				putchar(',');
1199				print_mask_arg(sysdecode_flock_operation, *ip);
1200				ip++;
1201				narg--;
1202				break;
1203			case SYS_mkfifo:
1204			case SYS_mkfifoat:
1205			case SYS_mkdir:
1206			case SYS_mkdirat:
1207				print_number(ip, narg, c);
1208				putchar(',');
1209				decode_filemode(*ip);
1210				ip++;
1211				narg--;
1212				break;
1213			case SYS_shutdown:
1214				print_number(ip, narg, c);
1215				putchar(',');
1216				print_integer_arg(sysdecode_shutdown_how, *ip);
1217				ip++;
1218				narg--;
1219				break;
1220			case SYS_socketpair:
1221				putchar('(');
1222				print_integer_arg(sysdecode_socketdomain, *ip);
1223				ip++;
1224				narg--;
1225				putchar(',');
1226				print_mask_arg(sysdecode_socket_type, *ip);
1227				ip++;
1228				narg--;
1229				c = ',';
1230				break;
1231			case SYS_getrlimit:
1232			case SYS_setrlimit:
1233				putchar('(');
1234				print_integer_arg(sysdecode_rlimit, *ip);
1235				ip++;
1236				narg--;
1237				c = ',';
1238				break;
1239			case SYS_getrusage:
1240				putchar('(');
1241				print_integer_arg(sysdecode_getrusage_who, *ip);
1242				ip++;
1243				narg--;
1244				c = ',';
1245				break;
1246			case SYS_quotactl:
1247				print_number(ip, narg, c);
1248				putchar(',');
1249				if (!sysdecode_quotactl_cmd(stdout, *ip)) {
1250					if (decimal)
1251						printf("<invalid=%d>", (int)*ip);
1252					else
1253						printf("<invalid=%#x>",
1254						    (int)*ip);
1255				}
1256				ip++;
1257				narg--;
1258				c = ',';
1259				break;
1260			case SYS_nfssvc:
1261				putchar('(');
1262				print_integer_arg(sysdecode_nfssvc_flags, *ip);
1263				ip++;
1264				narg--;
1265				c = ',';
1266				break;
1267			case SYS_rtprio:
1268			case SYS_rtprio_thread:
1269				putchar('(');
1270				print_integer_arg(sysdecode_rtprio_function,
1271				    *ip);
1272				ip++;
1273				narg--;
1274				c = ',';
1275				break;
1276			case SYS___semctl:
1277				print_number(ip, narg, c);
1278				print_number(ip, narg, c);
1279				putchar(',');
1280				print_integer_arg(sysdecode_semctl_cmd, *ip);
1281				ip++;
1282				narg--;
1283				break;
1284			case SYS_semget:
1285				print_number(ip, narg, c);
1286				print_number(ip, narg, c);
1287				putchar(',');
1288				print_mask_arg(sysdecode_semget_flags, *ip);
1289				ip++;
1290				narg--;
1291				break;
1292			case SYS_msgctl:
1293				print_number(ip, narg, c);
1294				putchar(',');
1295				print_integer_arg(sysdecode_msgctl_cmd, *ip);
1296				ip++;
1297				narg--;
1298				break;
1299			case SYS_shmat:
1300				print_number(ip, narg, c);
1301				print_number(ip, narg, c);
1302				putchar(',');
1303				print_mask_arg(sysdecode_shmat_flags, *ip);
1304				ip++;
1305				narg--;
1306				break;
1307			case SYS_shmctl:
1308				print_number(ip, narg, c);
1309				putchar(',');
1310				print_integer_arg(sysdecode_shmctl_cmd, *ip);
1311				ip++;
1312				narg--;
1313				break;
1314			case SYS_shm_open:
1315				if (ip[0] == (uintptr_t)SHM_ANON) {
1316					printf("(SHM_ANON");
1317					ip++;
1318				} else {
1319					print_number(ip, narg, c);
1320				}
1321				putchar(',');
1322				print_mask_arg(sysdecode_open_flags, ip[0]);
1323				putchar(',');
1324				decode_filemode(ip[1]);
1325				ip += 2;
1326				narg -= 2;
1327				break;
1328			case SYS_minherit:
1329				print_number(ip, narg, c);
1330				print_number(ip, narg, c);
1331				putchar(',');
1332				print_integer_arg(sysdecode_minherit_inherit,
1333				    *ip);
1334				ip++;
1335				narg--;
1336				break;
1337			case SYS_rfork:
1338				putchar('(');
1339				print_mask_arg(sysdecode_rfork_flags, *ip);
1340				ip++;
1341				narg--;
1342				c = ',';
1343				break;
1344			case SYS_lio_listio:
1345				putchar('(');
1346				print_integer_arg(sysdecode_lio_listio_mode,
1347				    *ip);
1348				ip++;
1349				narg--;
1350				c = ',';
1351				break;
1352			case SYS_mlockall:
1353				putchar('(');
1354				print_mask_arg(sysdecode_mlockall_flags, *ip);
1355				ip++;
1356				narg--;
1357				break;
1358			case SYS_sched_setscheduler:
1359				print_number(ip, narg, c);
1360				putchar(',');
1361				print_integer_arg(sysdecode_scheduler_policy,
1362				    *ip);
1363				ip++;
1364				narg--;
1365				break;
1366			case SYS_sched_get_priority_max:
1367			case SYS_sched_get_priority_min:
1368				putchar('(');
1369				print_integer_arg(sysdecode_scheduler_policy,
1370				    *ip);
1371				ip++;
1372				narg--;
1373				break;
1374			case SYS_sendfile:
1375				print_number(ip, narg, c);
1376				print_number(ip, narg, c);
1377				print_number(ip, narg, c);
1378				print_number(ip, narg, c);
1379				print_number(ip, narg, c);
1380				print_number(ip, narg, c);
1381				putchar(',');
1382				print_mask_arg(sysdecode_sendfile_flags, *ip);
1383				ip++;
1384				narg--;
1385				break;
1386			case SYS_kldsym:
1387				print_number(ip, narg, c);
1388				putchar(',');
1389				print_integer_arg(sysdecode_kldsym_cmd, *ip);
1390				ip++;
1391				narg--;
1392				break;
1393			case SYS_sigprocmask:
1394				putchar('(');
1395				print_integer_arg(sysdecode_sigprocmask_how,
1396				    *ip);
1397				ip++;
1398				narg--;
1399				c = ',';
1400				break;
1401			case SYS___acl_get_file:
1402			case SYS___acl_set_file:
1403			case SYS___acl_get_fd:
1404			case SYS___acl_set_fd:
1405			case SYS___acl_delete_file:
1406			case SYS___acl_delete_fd:
1407			case SYS___acl_aclcheck_file:
1408			case SYS___acl_aclcheck_fd:
1409			case SYS___acl_get_link:
1410			case SYS___acl_set_link:
1411			case SYS___acl_delete_link:
1412			case SYS___acl_aclcheck_link:
1413				print_number(ip, narg, c);
1414				putchar(',');
1415				print_integer_arg(sysdecode_acltype, *ip);
1416				ip++;
1417				narg--;
1418				break;
1419			case SYS_sigaction:
1420				putchar('(');
1421				print_signal(*ip);
1422				ip++;
1423				narg--;
1424				c = ',';
1425				break;
1426			case SYS_extattrctl:
1427				print_number(ip, narg, c);
1428				putchar(',');
1429				print_integer_arg(sysdecode_extattrnamespace,
1430				    *ip);
1431				ip++;
1432				narg--;
1433				break;
1434			case SYS_nmount:
1435				print_number(ip, narg, c);
1436				print_number(ip, narg, c);
1437				putchar(',');
1438				print_mask_arg(sysdecode_mount_flags, *ip);
1439				ip++;
1440				narg--;
1441				break;
1442			case SYS_thr_create:
1443				print_number(ip, narg, c);
1444				print_number(ip, narg, c);
1445				putchar(',');
1446				print_mask_arg(sysdecode_thr_create_flags, *ip);
1447				ip++;
1448				narg--;
1449				break;
1450			case SYS_thr_kill:
1451				print_number(ip, narg, c);
1452				putchar(',');
1453				print_signal(*ip);
1454				ip++;
1455				narg--;
1456				break;
1457			case SYS_kldunloadf:
1458				print_number(ip, narg, c);
1459				putchar(',');
1460				print_integer_arg(sysdecode_kldunload_flags,
1461				    *ip);
1462				ip++;
1463				narg--;
1464				break;
1465			case SYS_linkat:
1466			case SYS_renameat:
1467			case SYS_symlinkat:
1468				print_number(ip, narg, c);
1469				putchar(',');
1470				print_integer_arg_valid(sysdecode_atfd, *ip);
1471				ip++;
1472				narg--;
1473				print_number(ip, narg, c);
1474				break;
1475			case SYS_cap_fcntls_limit:
1476				print_number(ip, narg, c);
1477				putchar(',');
1478				arg = *ip;
1479				ip++;
1480				narg--;
1481				print_mask_arg32(sysdecode_cap_fcntlrights, arg);
1482				break;
1483			case SYS_posix_fadvise:
1484				print_number(ip, narg, c);
1485				print_number(ip, narg, c);
1486				print_number(ip, narg, c);
1487				(void)putchar(',');
1488				print_integer_arg(sysdecode_fadvice, *ip);
1489				ip++;
1490				narg--;
1491				break;
1492			case SYS_procctl:
1493				putchar('(');
1494				print_integer_arg(sysdecode_idtype, *ip);
1495				c = ',';
1496				ip++;
1497				narg--;
1498				print_number64(first, ip, narg, c);
1499				putchar(',');
1500				print_integer_arg(sysdecode_procctl_cmd, *ip);
1501				ip++;
1502				narg--;
1503				break;
1504			case SYS__umtx_op:
1505				print_number(ip, narg, c);
1506				putchar(',');
1507				print_integer_arg(sysdecode_umtx_op, *ip);
1508				switch (*ip) {
1509				case UMTX_OP_CV_WAIT:
1510					ip++;
1511					narg--;
1512					putchar(',');
1513					print_mask_argul(
1514					    sysdecode_umtx_cvwait_flags, *ip);
1515					break;
1516				case UMTX_OP_RW_RDLOCK:
1517					ip++;
1518					narg--;
1519					putchar(',');
1520					print_mask_argul(
1521					    sysdecode_umtx_rwlock_flags, *ip);
1522					break;
1523				}
1524				ip++;
1525				narg--;
1526				break;
1527			case SYS_ftruncate:
1528			case SYS_truncate:
1529				print_number(ip, narg, c);
1530				print_number64(first, ip, narg, c);
1531				break;
1532			case SYS_fchownat:
1533				print_number(ip, narg, c);
1534				print_number(ip, narg, c);
1535				print_number(ip, narg, c);
1536				break;
1537			case SYS_fstatat:
1538			case SYS_utimensat:
1539				print_number(ip, narg, c);
1540				print_number(ip, narg, c);
1541				break;
1542			case SYS_unlinkat:
1543				print_number(ip, narg, c);
1544				break;
1545			case SYS_sysarch:
1546				putchar('(');
1547				print_integer_arg(sysdecode_sysarch_number, *ip);
1548				ip++;
1549				narg--;
1550				c = ',';
1551				break;
1552			}
1553			switch (ktr->ktr_code) {
1554			case SYS_chflagsat:
1555			case SYS_fchownat:
1556			case SYS_faccessat:
1557			case SYS_fchmodat:
1558			case SYS_fstatat:
1559			case SYS_linkat:
1560			case SYS_unlinkat:
1561			case SYS_utimensat:
1562				putchar(',');
1563				print_mask_arg0(sysdecode_atflags, *ip);
1564				ip++;
1565				narg--;
1566				break;
1567			}
1568		}
1569		while (narg > 0) {
1570			print_number(ip, narg, c);
1571		}
1572		putchar(')');
1573	}
1574	putchar('\n');
1575}
1576
1577void
1578ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
1579{
1580	register_t ret = ktr->ktr_retval;
1581	int error = ktr->ktr_error;
1582
1583	syscallname(ktr->ktr_code, sv_flags);
1584	printf(" ");
1585
1586	if (error == 0) {
1587		if (fancy) {
1588			printf("%ld", (long)ret);
1589			if (ret < 0 || ret > 9)
1590				printf("/%#lx", (unsigned long)ret);
1591		} else {
1592			if (decimal)
1593				printf("%ld", (long)ret);
1594			else
1595				printf("%#lx", (unsigned long)ret);
1596		}
1597	} else if (error == ERESTART)
1598		printf("RESTART");
1599	else if (error == EJUSTRETURN)
1600		printf("JUSTRETURN");
1601	else {
1602		printf("-1 errno %d", sysdecode_freebsd_to_abi_errno(
1603		    syscallabi(sv_flags), error));
1604		if (fancy)
1605			printf(" %s", strerror(ktr->ktr_error));
1606	}
1607	putchar('\n');
1608}
1609
1610void
1611ktrnamei(char *cp, int len)
1612{
1613	printf("\"%.*s\"\n", len, cp);
1614}
1615
1616void
1617hexdump(char *p, int len, int screenwidth)
1618{
1619	int n, i;
1620	int width;
1621
1622	width = 0;
1623	do {
1624		width += 2;
1625		i = 13;			/* base offset */
1626		i += (width / 2) + 1;	/* spaces every second byte */
1627		i += (width * 2);	/* width of bytes */
1628		i += 3;			/* "  |" */
1629		i += width;		/* each byte */
1630		i += 1;			/* "|" */
1631	} while (i < screenwidth);
1632	width -= 2;
1633
1634	for (n = 0; n < len; n += width) {
1635		for (i = n; i < n + width; i++) {
1636			if ((i % width) == 0) {	/* beginning of line */
1637				printf("       0x%04x", i);
1638			}
1639			if ((i % 2) == 0) {
1640				printf(" ");
1641			}
1642			if (i < len)
1643				printf("%02x", p[i] & 0xff);
1644			else
1645				printf("  ");
1646		}
1647		printf("  |");
1648		for (i = n; i < n + width; i++) {
1649			if (i >= len)
1650				break;
1651			if (p[i] >= ' ' && p[i] <= '~')
1652				printf("%c", p[i]);
1653			else
1654				printf(".");
1655		}
1656		printf("|\n");
1657	}
1658	if ((i % width) != 0)
1659		printf("\n");
1660}
1661
1662void
1663visdump(char *dp, int datalen, int screenwidth)
1664{
1665	int col = 0;
1666	char *cp;
1667	int width;
1668	char visbuf[5];
1669
1670	printf("       \"");
1671	col = 8;
1672	for (;datalen > 0; datalen--, dp++) {
1673		 vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
1674		cp = visbuf;
1675		/*
1676		 * Keep track of printables and
1677		 * space chars (like fold(1)).
1678		 */
1679		if (col == 0) {
1680			putchar('\t');
1681			col = 8;
1682		}
1683		switch(*cp) {
1684		case '\n':
1685			col = 0;
1686			putchar('\n');
1687			continue;
1688		case '\t':
1689			width = 8 - (col&07);
1690			break;
1691		default:
1692			width = strlen(cp);
1693		}
1694		if (col + width > (screenwidth-2)) {
1695			printf("\\\n\t");
1696			col = 8;
1697		}
1698		col += width;
1699		do {
1700			putchar(*cp++);
1701		} while (*cp);
1702	}
1703	if (col == 0)
1704		printf("       ");
1705	printf("\"\n");
1706}
1707
1708void
1709ktrgenio(struct ktr_genio *ktr, int len)
1710{
1711	int datalen = len - sizeof (struct ktr_genio);
1712	char *dp = (char *)ktr + sizeof (struct ktr_genio);
1713	static int screenwidth = 0;
1714	int i, binary;
1715
1716	printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
1717		ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
1718		datalen == 1 ? "" : "s");
1719	if (suppressdata)
1720		return;
1721	if (screenwidth == 0) {
1722		struct winsize ws;
1723
1724		if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1725		    ws.ws_col > 8)
1726			screenwidth = ws.ws_col;
1727		else
1728			screenwidth = 80;
1729	}
1730	if (maxdata && datalen > maxdata)
1731		datalen = maxdata;
1732
1733	for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1734		if (dp[i] >= 32 && dp[i] < 127)
1735			continue;
1736		if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1737			continue;
1738		binary = 1;
1739	}
1740	if (binary)
1741		hexdump(dp, datalen, screenwidth);
1742	else
1743		visdump(dp, datalen, screenwidth);
1744}
1745
1746void
1747ktrpsig(struct ktr_psig *psig)
1748{
1749	const char *str;
1750
1751	print_signal(psig->signo);
1752	if (psig->action == SIG_DFL) {
1753		printf(" SIG_DFL");
1754	} else {
1755		printf(" caught handler=0x%lx mask=0x%x",
1756		    (u_long)psig->action, psig->mask.__bits[0]);
1757	}
1758	printf(" code=");
1759	str = sysdecode_sigcode(psig->signo, psig->code);
1760	if (str != NULL)
1761		printf("%s", str);
1762	else
1763		printf("<invalid=%#x>", psig->code);
1764	putchar('\n');
1765}
1766
1767void
1768ktrcsw_old(struct ktr_csw_old *cs)
1769{
1770	printf("%s %s\n", cs->out ? "stop" : "resume",
1771		cs->user ? "user" : "kernel");
1772}
1773
1774void
1775ktrcsw(struct ktr_csw *cs)
1776{
1777	printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
1778	    cs->user ? "user" : "kernel", cs->wmesg);
1779}
1780
1781void
1782ktruser(int len, void *p)
1783{
1784	unsigned char *cp;
1785
1786	if (sysdecode_utrace(stdout, p, len)) {
1787		printf("\n");
1788		return;
1789	}
1790
1791	printf("%d ", len);
1792	cp = p;
1793	while (len--)
1794		if (decimal)
1795			printf(" %d", *cp++);
1796		else
1797			printf(" %02x", *cp++);
1798	printf("\n");
1799}
1800
1801void
1802ktrcaprights(cap_rights_t *rightsp)
1803{
1804
1805	printf("cap_rights_t ");
1806	sysdecode_cap_rights(stdout, rightsp);
1807	printf("\n");
1808}
1809
1810static void
1811ktrtimeval(struct timeval *tv)
1812{
1813
1814	printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec);
1815}
1816
1817void
1818ktritimerval(struct itimerval *it)
1819{
1820
1821	printf("itimerval { .interval = ");
1822	ktrtimeval(&it->it_interval);
1823	printf(", .value = ");
1824	ktrtimeval(&it->it_value);
1825	printf(" }\n");
1826}
1827
1828void
1829ktrsockaddr(struct sockaddr *sa)
1830{
1831/*
1832 TODO: Support additional address families
1833	#include <netnatm/natm.h>
1834	struct sockaddr_natm	*natm;
1835	#include <netsmb/netbios.h>
1836	struct sockaddr_nb	*nb;
1837*/
1838	const char *str;
1839	char addr[64];
1840
1841	/*
1842	 * note: ktrstruct() has already verified that sa points to a
1843	 * buffer at least sizeof(struct sockaddr) bytes long and exactly
1844	 * sa->sa_len bytes long.
1845	 */
1846	printf("struct sockaddr { ");
1847	str = sysdecode_sockaddr_family(sa->sa_family);
1848	if (str != NULL)
1849		printf("%s", str);
1850	else
1851		printf("<invalid=%d>", sa->sa_family);
1852	printf(", ");
1853
1854#define check_sockaddr_len(n)					\
1855	if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {	\
1856		printf("invalid");				\
1857		break;						\
1858	}
1859
1860	switch(sa->sa_family) {
1861	case AF_INET: {
1862		struct sockaddr_in sa_in;
1863
1864		memset(&sa_in, 0, sizeof(sa_in));
1865		memcpy(&sa_in, sa, sa->sa_len);
1866		check_sockaddr_len(in);
1867		inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
1868		printf("%s:%u", addr, ntohs(sa_in.sin_port));
1869		break;
1870	}
1871	case AF_INET6: {
1872		struct sockaddr_in6 sa_in6;
1873
1874		memset(&sa_in6, 0, sizeof(sa_in6));
1875		memcpy(&sa_in6, sa, sa->sa_len);
1876		check_sockaddr_len(in6);
1877		getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1878		    addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
1879		printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
1880		break;
1881	}
1882	case AF_UNIX: {
1883		struct sockaddr_un sa_un;
1884
1885		memset(&sa_un, 0, sizeof(sa_un));
1886		memcpy(&sa_un, sa, sa->sa_len);
1887		printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
1888		break;
1889	}
1890	default:
1891		printf("unknown address family");
1892	}
1893	printf(" }\n");
1894}
1895
1896void
1897ktrstat(struct stat *statp)
1898{
1899	char mode[12], timestr[PATH_MAX + 4];
1900	struct passwd *pwd;
1901	struct group  *grp;
1902	struct tm *tm;
1903
1904	/*
1905	 * note: ktrstruct() has already verified that statp points to a
1906	 * buffer exactly sizeof(struct stat) bytes long.
1907	 */
1908	printf("struct stat {");
1909	printf("dev=%ju, ino=%ju, ",
1910		(uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
1911	if (!resolv)
1912		printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
1913	else {
1914		strmode(statp->st_mode, mode);
1915		printf("mode=%s, ", mode);
1916	}
1917	printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
1918	if (!resolv) {
1919		pwd = NULL;
1920	} else {
1921#ifdef HAVE_LIBCASPER
1922		if (cappwd != NULL)
1923			pwd = cap_getpwuid(cappwd, statp->st_uid);
1924		else
1925#endif
1926			pwd = getpwuid(statp->st_uid);
1927	}
1928	if (pwd == NULL)
1929		printf("uid=%ju, ", (uintmax_t)statp->st_uid);
1930	else
1931		printf("uid=\"%s\", ", pwd->pw_name);
1932	if (!resolv) {
1933		grp = NULL;
1934	} else {
1935#ifdef HAVE_LIBCASPER
1936		if (capgrp != NULL)
1937			grp = cap_getgrgid(capgrp, statp->st_gid);
1938		else
1939#endif
1940			grp = getgrgid(statp->st_gid);
1941	}
1942	if (grp == NULL)
1943		printf("gid=%ju, ", (uintmax_t)statp->st_gid);
1944	else
1945		printf("gid=\"%s\", ", grp->gr_name);
1946	printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
1947	printf("atime=");
1948	if (!resolv)
1949		printf("%jd", (intmax_t)statp->st_atim.tv_sec);
1950	else {
1951		tm = localtime(&statp->st_atim.tv_sec);
1952		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1953		printf("\"%s\"", timestr);
1954	}
1955	if (statp->st_atim.tv_nsec != 0)
1956		printf(".%09ld, ", statp->st_atim.tv_nsec);
1957	else
1958		printf(", ");
1959	printf("mtime=");
1960	if (!resolv)
1961		printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
1962	else {
1963		tm = localtime(&statp->st_mtim.tv_sec);
1964		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1965		printf("\"%s\"", timestr);
1966	}
1967	if (statp->st_mtim.tv_nsec != 0)
1968		printf(".%09ld, ", statp->st_mtim.tv_nsec);
1969	else
1970		printf(", ");
1971	printf("ctime=");
1972	if (!resolv)
1973		printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
1974	else {
1975		tm = localtime(&statp->st_ctim.tv_sec);
1976		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1977		printf("\"%s\"", timestr);
1978	}
1979	if (statp->st_ctim.tv_nsec != 0)
1980		printf(".%09ld, ", statp->st_ctim.tv_nsec);
1981	else
1982		printf(", ");
1983	printf("birthtime=");
1984	if (!resolv)
1985		printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
1986	else {
1987		tm = localtime(&statp->st_birthtim.tv_sec);
1988		strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1989		printf("\"%s\"", timestr);
1990	}
1991	if (statp->st_birthtim.tv_nsec != 0)
1992		printf(".%09ld, ", statp->st_birthtim.tv_nsec);
1993	else
1994		printf(", ");
1995	printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
1996		(uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
1997		(intmax_t)statp->st_blocks, statp->st_flags);
1998	printf(" }\n");
1999}
2000
2001void
2002ktrstruct(char *buf, size_t buflen)
2003{
2004	char *name, *data;
2005	size_t namelen, datalen;
2006	int i;
2007	cap_rights_t rights;
2008	struct itimerval it;
2009	struct stat sb;
2010	struct sockaddr_storage ss;
2011
2012	for (name = buf, namelen = 0;
2013	     namelen < buflen && name[namelen] != '\0';
2014	     ++namelen)
2015		/* nothing */;
2016	if (namelen == buflen)
2017		goto invalid;
2018	if (name[namelen] != '\0')
2019		goto invalid;
2020	data = buf + namelen + 1;
2021	datalen = buflen - namelen - 1;
2022	if (datalen == 0)
2023		goto invalid;
2024	/* sanity check */
2025	for (i = 0; i < (int)namelen; ++i)
2026		if (!isalpha(name[i]))
2027			goto invalid;
2028	if (strcmp(name, "caprights") == 0) {
2029		if (datalen != sizeof(cap_rights_t))
2030			goto invalid;
2031		memcpy(&rights, data, datalen);
2032		ktrcaprights(&rights);
2033	} else if (strcmp(name, "itimerval") == 0) {
2034		if (datalen != sizeof(struct itimerval))
2035			goto invalid;
2036		memcpy(&it, data, datalen);
2037		ktritimerval(&it);
2038	} else if (strcmp(name, "stat") == 0) {
2039		if (datalen != sizeof(struct stat))
2040			goto invalid;
2041		memcpy(&sb, data, datalen);
2042		ktrstat(&sb);
2043	} else if (strcmp(name, "sockaddr") == 0) {
2044		if (datalen > sizeof(ss))
2045			goto invalid;
2046		memcpy(&ss, data, datalen);
2047		if (datalen != ss.ss_len)
2048			goto invalid;
2049		ktrsockaddr((struct sockaddr *)&ss);
2050	} else {
2051		printf("unknown structure\n");
2052	}
2053	return;
2054invalid:
2055	printf("invalid record\n");
2056}
2057
2058void
2059ktrcapfail(struct ktr_cap_fail *ktr)
2060{
2061	switch (ktr->cap_type) {
2062	case CAPFAIL_NOTCAPABLE:
2063		/* operation on fd with insufficient capabilities */
2064		printf("operation requires ");
2065		sysdecode_cap_rights(stdout, &ktr->cap_needed);
2066		printf(", descriptor holds ");
2067		sysdecode_cap_rights(stdout, &ktr->cap_held);
2068		break;
2069	case CAPFAIL_INCREASE:
2070		/* requested more capabilities than fd already has */
2071		printf("attempt to increase capabilities from ");
2072		sysdecode_cap_rights(stdout, &ktr->cap_held);
2073		printf(" to ");
2074		sysdecode_cap_rights(stdout, &ktr->cap_needed);
2075		break;
2076	case CAPFAIL_SYSCALL:
2077		/* called restricted syscall */
2078		printf("disallowed system call");
2079		break;
2080	case CAPFAIL_LOOKUP:
2081		/* used ".." in strict-relative mode */
2082		printf("restricted VFS lookup");
2083		break;
2084	default:
2085		printf("unknown capability failure: ");
2086		sysdecode_cap_rights(stdout, &ktr->cap_needed);
2087		printf(" ");
2088		sysdecode_cap_rights(stdout, &ktr->cap_held);
2089		break;
2090	}
2091	printf("\n");
2092}
2093
2094void
2095ktrfault(struct ktr_fault *ktr)
2096{
2097
2098	printf("0x%jx ", (uintmax_t)ktr->vaddr);
2099	print_mask_arg(sysdecode_vmprot, ktr->type);
2100	printf("\n");
2101}
2102
2103void
2104ktrfaultend(struct ktr_faultend *ktr)
2105{
2106	const char *str;
2107
2108	str = sysdecode_vmresult(ktr->result);
2109	if (str != NULL)
2110		printf("%s", str);
2111	else
2112		printf("<invalid=%d>", ktr->result);
2113	printf("\n");
2114}
2115
2116void
2117ktrkevent(struct kevent *kev)
2118{
2119
2120	printf("{ ident=");
2121	switch (kev->filter) {
2122	case EVFILT_READ:
2123	case EVFILT_WRITE:
2124	case EVFILT_VNODE:
2125	case EVFILT_PROC:
2126	case EVFILT_TIMER:
2127	case EVFILT_PROCDESC:
2128		printf("%ju", (uintmax_t)kev->ident);
2129		break;
2130	case EVFILT_SIGNAL:
2131		print_signal(kev->ident);
2132		break;
2133	default:
2134		printf("%p", (void *)kev->ident);
2135	}
2136	printf(", filter=");
2137	print_integer_arg(sysdecode_kevent_filter, kev->filter);
2138	printf(", flags=");
2139	print_mask_arg0(sysdecode_kevent_flags, kev->flags);
2140	printf(", fflags=");
2141	sysdecode_kevent_fflags(stdout, kev->filter, kev->fflags,
2142	    decimal ? 10 : 16);
2143	printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata);
2144}
2145
2146void
2147ktrstructarray(struct ktr_struct_array *ksa, size_t buflen)
2148{
2149	struct kevent kev;
2150	char *name, *data;
2151	size_t namelen, datalen;
2152	int i;
2153	bool first;
2154
2155	buflen -= sizeof(*ksa);
2156	for (name = (char *)(ksa + 1), namelen = 0;
2157	     namelen < buflen && name[namelen] != '\0';
2158	     ++namelen)
2159		/* nothing */;
2160	if (namelen == buflen)
2161		goto invalid;
2162	if (name[namelen] != '\0')
2163		goto invalid;
2164	/* sanity check */
2165	for (i = 0; i < (int)namelen; ++i)
2166		if (!isalnum(name[i]) && name[i] != '_')
2167			goto invalid;
2168	data = name + namelen + 1;
2169	datalen = buflen - namelen - 1;
2170	printf("struct %s[] = { ", name);
2171	first = true;
2172	for (; datalen >= ksa->struct_size;
2173	    data += ksa->struct_size, datalen -= ksa->struct_size) {
2174		if (!first)
2175			printf("\n             ");
2176		else
2177			first = false;
2178		if (strcmp(name, "kevent") == 0) {
2179			if (ksa->struct_size != sizeof(kev))
2180				goto bad_size;
2181			memcpy(&kev, data, sizeof(kev));
2182			ktrkevent(&kev);
2183#ifdef _WANT_KEVENT32
2184		} else if (strcmp(name, "kevent32") == 0) {
2185			struct kevent32 kev32;
2186
2187			if (ksa->struct_size != sizeof(kev32))
2188				goto bad_size;
2189			memcpy(&kev32, data, sizeof(kev32));
2190			memset(&kev, 0, sizeof(kev));
2191			kev.ident = kev32.ident;
2192			kev.filter = kev32.filter;
2193			kev.flags = kev32.flags;
2194			kev.fflags = kev32.fflags;
2195			kev.data = kev32.data;
2196			kev.udata = (void *)(uintptr_t)kev32.udata;
2197			ktrkevent(&kev);
2198#endif
2199		} else {
2200			printf("<unknown structure> }\n");
2201			return;
2202		}
2203	}
2204	printf(" }\n");
2205	return;
2206invalid:
2207	printf("invalid record\n");
2208	return;
2209bad_size:
2210	printf("<bad size> }\n");
2211	return;
2212}
2213
2214void
2215usage(void)
2216{
2217	fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
2218	    "[-m maxdata] [-p pid] [-t trstr]\n");
2219	exit(1);
2220}
2221