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