]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - usr.bin/kdump/kdump.c
MFC r307755: swapoff: Remove only late devices with -aL.
[FreeBSD/stable/10.git] / usr.bin / kdump / kdump.c
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
31 static 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
38 static char sccsid[] = "@(#)kdump.c     8.1 (Berkeley) 6/6/93";
39 #endif
40 #endif /* not lint */
41 #include <sys/cdefs.h>
42 __FBSDID("$FreeBSD$");
43
44 #define _KERNEL
45 extern int errno;
46 #include <sys/errno.h>
47 #undef _KERNEL
48 #include <sys/param.h>
49 #include <sys/capsicum.h>
50 #include <sys/errno.h>
51 #define _KERNEL
52 #include <sys/time.h>
53 #undef _KERNEL
54 #include <sys/uio.h>
55 #include <sys/ktrace.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 IPX
65 #include <sys/types.h>
66 #include <netipx/ipx.h>
67 #endif
68 #ifdef NETATALK
69 #include <netatalk/at.h>
70 #endif
71 #include <arpa/inet.h>
72 #include <netinet/in.h>
73 #include <ctype.h>
74 #include <dlfcn.h>
75 #include <err.h>
76 #include <grp.h>
77 #include <inttypes.h>
78 #include <locale.h>
79 #include <netdb.h>
80 #include <nl_types.h>
81 #include <pwd.h>
82 #include <stdio.h>
83 #include <stdlib.h>
84 #include <string.h>
85 #include <termios.h>
86 #include <time.h>
87 #include <unistd.h>
88 #include <vis.h>
89 #include "ktrace.h"
90 #include "kdump_subr.h"
91
92 u_int abidump(struct ktr_header *);
93 int fetchprocinfo(struct ktr_header *, u_int *);
94 int fread_tail(void *, int, int);
95 void dumpheader(struct ktr_header *);
96 void ktrsyscall(struct ktr_syscall *, u_int);
97 void ktrsysret(struct ktr_sysret *, u_int);
98 void ktrnamei(char *, int);
99 void hexdump(char *, int, int);
100 void visdump(char *, int, int);
101 void ktrgenio(struct ktr_genio *, int);
102 void ktrpsig(struct ktr_psig *);
103 void ktrcsw(struct ktr_csw *);
104 void ktrcsw_old(struct ktr_csw_old *);
105 void ktruser_malloc(void *);
106 void ktruser_rtld(int, void *);
107 void ktruser(int, void *);
108 void ktrcaprights(cap_rights_t *);
109 void ktritimerval(struct itimerval *it);
110 void ktrsockaddr(struct sockaddr *);
111 void ktrstat(struct stat *);
112 void ktrstruct(char *, size_t);
113 void ktrcapfail(struct ktr_cap_fail *);
114 void ktrfault(struct ktr_fault *);
115 void ktrfaultend(struct ktr_faultend *);
116 void limitfd(int fd);
117 void usage(void);
118 void ioctlname(unsigned long, int);
119
120 extern const char *signames[], *syscallnames[];
121 extern int nsyscalls;
122
123 static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata,
124     resolv = 0, abiflag = 0, syscallno = 0;
125 static const char *tracefile = DEF_TRACEFILE;
126 static struct ktr_header ktr_header;
127
128 #define TIME_FORMAT     "%b %e %T %Y"
129 #define eqs(s1, s2)     (strcmp((s1), (s2)) == 0)
130
131 #define print_number(i,n,c) do {                                        \
132         if (decimal)                                                    \
133                 printf("%c%jd", c, (intmax_t)*i);                       \
134         else                                                            \
135                 printf("%c%#jx", c, (uintmax_t)(u_register_t)*i);       \
136         i++;                                                            \
137         n--;                                                            \
138         c = ',';                                                        \
139 } while (0)
140
141 #if defined(__amd64__) || defined(__i386__)
142
143 void linux_ktrsyscall(struct ktr_syscall *, u_int);
144 void linux_ktrsysret(struct ktr_sysret *, u_int);
145 extern const char *linux_syscallnames[];
146
147 #include <linux_syscalls.c>
148
149 /*
150  * from linux.h
151  * Linux syscalls return negative errno's, we do positive and map them
152  */
153 static int bsd_to_linux_errno[ELAST + 1] = {
154         -0,  -1,  -2,  -3,  -4,  -5,  -6,  -7,  -8,  -9,
155         -10, -35, -12, -13, -14, -15, -16, -17, -18, -19,
156         -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
157         -30, -31, -32, -33, -34, -11,-115,-114, -88, -89,
158         -90, -91, -92, -93, -94, -95, -96, -97, -98, -99,
159         -100,-101,-102,-103,-104,-105,-106,-107,-108,-109,
160         -110,-111, -40, -36,-112,-113, -39, -11, -87,-122,
161         -116, -66,  -6,  -6,  -6,  -6,  -6, -37, -38,  -9,
162         -6,  -6, -43, -42, -75,-125, -84, -95, -16, -74,
163         -72, -67, -71
164 };
165 #endif
166
167 #if defined(__amd64__)
168 extern const char *linux32_syscallnames[];
169
170 #include <linux32_syscalls.c>
171 #endif
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 static void
183 strerror_init(void)
184 {
185
186         /*
187          * Cache NLS data before entering capability mode.
188          * XXXPJD: There should be strerror_init() and strsignal_init() in libc.
189          */
190         (void)catopen("libc", NL_CAT_LOCALE);
191 }
192
193 static void
194 localtime_init(void)
195 {
196         time_t ltime;
197
198         /*
199          * Allow localtime(3) to cache /etc/localtime content before entering
200          * capability mode.
201          * XXXPJD: There should be localtime_init() in libc.
202          */
203         (void)time(&ltime);
204         (void)localtime(&ltime);
205 }
206
207 int
208 main(int argc, char *argv[])
209 {
210         int ch, ktrlen, size;
211         void *m;
212         int trpoints = ALL_POINTS;
213         int drop_logged;
214         pid_t pid = 0;
215         u_int sv_flags;
216
217         setlocale(LC_CTYPE, "");
218
219         while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1)
220                 switch (ch) {
221                 case 'A':
222                         abiflag = 1;
223                         break;
224                 case 'f':
225                         tracefile = optarg;
226                         break;
227                 case 'd':
228                         decimal = 1;
229                         break;
230                 case 'l':
231                         tail = 1;
232                         break;
233                 case 'm':
234                         maxdata = atoi(optarg);
235                         break;
236                 case 'n':
237                         fancy = 0;
238                         break;
239                 case 'p':
240                         pid = atoi(optarg);
241                         break;
242                 case 'r':
243                         resolv = 1;
244                         break;
245                 case 'S':
246                         syscallno = 1;
247                         break;
248                 case 's':
249                         suppressdata = 1;
250                         break;
251                 case 'E':
252                         timestamp = 3;  /* elapsed timestamp */
253                         break;
254                 case 'H':
255                         threads = 1;
256                         break;
257                 case 'R':
258                         timestamp = 2;  /* relative timestamp */
259                         break;
260                 case 'T':
261                         timestamp = 1;
262                         break;
263                 case 't':
264                         trpoints = getpoints(optarg);
265                         if (trpoints < 0)
266                                 errx(1, "unknown trace point in %s", optarg);
267                         break;
268                 default:
269                         usage();
270                 }
271
272         if (argc > optind)
273                 usage();
274
275         m = malloc(size = 1025);
276         if (m == NULL)
277                 errx(1, "%s", strerror(ENOMEM));
278         if (!freopen(tracefile, "r", stdin))
279                 err(1, "%s", tracefile);
280
281         strerror_init();
282         localtime_init();
283
284         if (resolv == 0) {
285                 if (cap_enter() < 0 && errno != ENOSYS)
286                         err(1, "unable to enter capability mode");
287         }
288         limitfd(STDIN_FILENO);
289         limitfd(STDOUT_FILENO);
290         limitfd(STDERR_FILENO);
291
292         TAILQ_INIT(&trace_procs);
293         drop_logged = 0;
294         while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) {
295                 if (ktr_header.ktr_type & KTR_DROP) {
296                         ktr_header.ktr_type &= ~KTR_DROP;
297                         if (!drop_logged && threads) {
298                                 printf(
299                                     "%6jd %6jd %-8.*s Events dropped.\n",
300                                     (intmax_t)ktr_header.ktr_pid,
301                                     ktr_header.ktr_tid > 0 ?
302                                     (intmax_t)ktr_header.ktr_tid : 0,
303                                     MAXCOMLEN, ktr_header.ktr_comm);
304                                 drop_logged = 1;
305                         } else if (!drop_logged) {
306                                 printf("%6jd %-8.*s Events dropped.\n",
307                                     (intmax_t)ktr_header.ktr_pid, MAXCOMLEN,
308                                     ktr_header.ktr_comm);
309                                 drop_logged = 1;
310                         }
311                 }
312                 if (trpoints & (1<<ktr_header.ktr_type))
313                         if (pid == 0 || ktr_header.ktr_pid == pid ||
314                             ktr_header.ktr_tid == pid)
315                                 dumpheader(&ktr_header);
316                 if ((ktrlen = ktr_header.ktr_len) < 0)
317                         errx(1, "bogus length 0x%x", ktrlen);
318                 if (ktrlen > size) {
319                         m = realloc(m, ktrlen+1);
320                         if (m == NULL)
321                                 errx(1, "%s", strerror(ENOMEM));
322                         size = ktrlen;
323                 }
324                 if (ktrlen && fread_tail(m, ktrlen, 1) == 0)
325                         errx(1, "data too short");
326                 if (fetchprocinfo(&ktr_header, (u_int *)m) != 0)
327                         continue;
328                 sv_flags = abidump(&ktr_header);
329                 if (pid && ktr_header.ktr_pid != pid &&
330                     ktr_header.ktr_tid != pid)
331                         continue;
332                 if ((trpoints & (1<<ktr_header.ktr_type)) == 0)
333                         continue;
334                 drop_logged = 0;
335                 switch (ktr_header.ktr_type) {
336                 case KTR_SYSCALL:
337 #if defined(__amd64__) || defined(__i386__)
338                         if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
339                                 linux_ktrsyscall((struct ktr_syscall *)m,
340                                     sv_flags);
341                         else
342 #endif
343                                 ktrsyscall((struct ktr_syscall *)m, sv_flags);
344                         break;
345                 case KTR_SYSRET:
346 #if defined(__amd64__) || defined(__i386__)
347                         if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
348                                 linux_ktrsysret((struct ktr_sysret *)m, 
349                                     sv_flags);
350                         else
351 #endif
352                                 ktrsysret((struct ktr_sysret *)m, sv_flags);
353                         break;
354                 case KTR_NAMEI:
355                 case KTR_SYSCTL:
356                         ktrnamei(m, ktrlen);
357                         break;
358                 case KTR_GENIO:
359                         ktrgenio((struct ktr_genio *)m, ktrlen);
360                         break;
361                 case KTR_PSIG:
362                         ktrpsig((struct ktr_psig *)m);
363                         break;
364                 case KTR_CSW:
365                         if (ktrlen == sizeof(struct ktr_csw_old))
366                                 ktrcsw_old((struct ktr_csw_old *)m);
367                         else
368                                 ktrcsw((struct ktr_csw *)m);
369                         break;
370                 case KTR_USER:
371                         ktruser(ktrlen, m);
372                         break;
373                 case KTR_STRUCT:
374                         ktrstruct(m, ktrlen);
375                         break;
376                 case KTR_CAPFAIL:
377                         ktrcapfail((struct ktr_cap_fail *)m);
378                         break;
379                 case KTR_FAULT:
380                         ktrfault((struct ktr_fault *)m);
381                         break;
382                 case KTR_FAULTEND:
383                         ktrfaultend((struct ktr_faultend *)m);
384                         break;
385                 default:
386                         printf("\n");
387                         break;
388                 }
389                 if (tail)
390                         fflush(stdout);
391         }
392         return 0;
393 }
394
395 void
396 limitfd(int fd)
397 {
398         cap_rights_t rights;
399         unsigned long cmd;
400
401         cap_rights_init(&rights, CAP_FSTAT);
402         cmd = 0;
403
404         switch (fd) {
405         case STDIN_FILENO:
406                 cap_rights_set(&rights, CAP_READ);
407                 break;
408         case STDOUT_FILENO:
409                 cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE);
410                 cmd = TIOCGETA; /* required by isatty(3) in printf(3) */
411                 break;
412         case STDERR_FILENO:
413                 cap_rights_set(&rights, CAP_WRITE);
414                 if (!suppressdata) {
415                         cap_rights_set(&rights, CAP_IOCTL);
416                         cmd = TIOCGWINSZ;
417                 }
418                 break;
419         default:
420                 abort();
421         }
422
423         if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS)
424                 err(1, "unable to limit rights for descriptor %d", fd);
425         if (cmd != 0 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS)
426                 err(1, "unable to limit ioctls for descriptor %d", fd);
427 }
428
429 int
430 fread_tail(void *buf, int size, int num)
431 {
432         int i;
433
434         while ((i = fread(buf, size, num, stdin)) == 0 && tail) {
435                 sleep(1);
436                 clearerr(stdin);
437         }
438         return (i);
439 }
440
441 int
442 fetchprocinfo(struct ktr_header *kth, u_int *flags)
443 {
444         struct proc_info *pi;
445
446         switch (kth->ktr_type) {
447         case KTR_PROCCTOR:
448                 TAILQ_FOREACH(pi, &trace_procs, info) {
449                         if (pi->pid == kth->ktr_pid) {
450                                 TAILQ_REMOVE(&trace_procs, pi, info);
451                                 break;
452                         }
453                 }
454                 pi = malloc(sizeof(struct proc_info));
455                 if (pi == NULL)
456                         errx(1, "%s", strerror(ENOMEM));
457                 pi->sv_flags = *flags;
458                 pi->pid = kth->ktr_pid;
459                 TAILQ_INSERT_TAIL(&trace_procs, pi, info);
460                 return (1);
461
462         case KTR_PROCDTOR:
463                 TAILQ_FOREACH(pi, &trace_procs, info) {
464                         if (pi->pid == kth->ktr_pid) {
465                                 TAILQ_REMOVE(&trace_procs, pi, info);
466                                 free(pi);
467                                 break;
468                         }
469                 }
470                 return (1);
471         }
472
473         return (0);
474 }
475
476 u_int
477 abidump(struct ktr_header *kth)
478 {
479         struct proc_info *pi;
480         const char *abi;
481         const char *arch;
482         u_int flags = 0;
483
484         TAILQ_FOREACH(pi, &trace_procs, info) {
485                 if (pi->pid == kth->ktr_pid) {
486                         flags = pi->sv_flags;
487                         break;
488                 }
489         }
490
491         if (abiflag == 0)
492                 return (flags);
493
494         switch (flags & SV_ABI_MASK) {
495         case SV_ABI_LINUX:
496                 abi = "L";
497                 break;
498         case SV_ABI_FREEBSD:
499                 abi = "F";
500                 break;
501         default:
502                 abi = "U";
503                 break;
504         }
505
506         if (flags != 0) {
507                 if (flags & SV_LP64)
508                         arch = "64";
509                 else
510                         arch = "32";
511         } else
512                 arch = "00";
513
514         printf("%s%s  ", abi, arch);
515
516         return (flags);
517 }
518
519 void
520 dumpheader(struct ktr_header *kth)
521 {
522         static char unknown[64];
523         static struct timeval prevtime, temp;
524         const char *type;
525
526         switch (kth->ktr_type) {
527         case KTR_SYSCALL:
528                 type = "CALL";
529                 break;
530         case KTR_SYSRET:
531                 type = "RET ";
532                 break;
533         case KTR_NAMEI:
534                 type = "NAMI";
535                 break;
536         case KTR_GENIO:
537                 type = "GIO ";
538                 break;
539         case KTR_PSIG:
540                 type = "PSIG";
541                 break;
542         case KTR_CSW:
543                 type = "CSW ";
544                 break;
545         case KTR_USER:
546                 type = "USER";
547                 break;
548         case KTR_STRUCT:
549                 type = "STRU";
550                 break;
551         case KTR_SYSCTL:
552                 type = "SCTL";
553                 break;
554         case KTR_PROCCTOR:
555                 /* FALLTHROUGH */
556         case KTR_PROCDTOR:
557                 return;
558         case KTR_CAPFAIL:
559                 type = "CAP ";
560                 break;
561         case KTR_FAULT:
562                 type = "PFLT";
563                 break;
564         case KTR_FAULTEND:
565                 type = "PRET";
566                 break;
567         default:
568                 sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type);
569                 type = unknown;
570         }
571
572         /*
573          * The ktr_tid field was previously the ktr_buffer field, which held
574          * the kernel pointer value for the buffer associated with data
575          * following the record header.  It now holds a threadid, but only
576          * for trace files after the change.  Older trace files still contain
577          * kernel pointers.  Detect this and suppress the results by printing
578          * negative tid's as 0.
579          */
580         if (threads)
581                 printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid,
582                     kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0,
583                     MAXCOMLEN, kth->ktr_comm);
584         else
585                 printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN,
586                     kth->ktr_comm);
587         if (timestamp) {
588                 if (timestamp == 3) {
589                         if (prevtime.tv_sec == 0)
590                                 prevtime = kth->ktr_time;
591                         timevalsub(&kth->ktr_time, &prevtime);
592                 }
593                 if (timestamp == 2) {
594                         temp = kth->ktr_time;
595                         timevalsub(&kth->ktr_time, &prevtime);
596                         prevtime = temp;
597                 }
598                 printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec,
599                     kth->ktr_time.tv_usec);
600         }
601         printf("%s  ", type);
602 }
603
604 #include <sys/syscall.h>
605 #define KTRACE
606 #include <sys/kern/syscalls.c>
607 #undef KTRACE
608 int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]);
609
610 void
611 ktrsyscall(struct ktr_syscall *ktr, u_int flags)
612 {
613         int narg = ktr->ktr_narg;
614         register_t *ip;
615         intmax_t arg;
616
617         if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
618             (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0))
619                 printf("[%d]", ktr->ktr_code);
620         else {
621                 printf("%s", syscallnames[ktr->ktr_code]);
622                 if (syscallno)
623                         printf("[%d]", ktr->ktr_code);
624         }
625         ip = &ktr->ktr_args[0];
626         if (narg) {
627                 char c = '(';
628                 if (fancy &&
629                     (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
630                         switch (ktr->ktr_code) {
631                         case SYS_bindat:
632                         case SYS_connectat:
633                         case SYS_faccessat:
634                         case SYS_fchmodat:
635                         case SYS_fchownat:
636                         case SYS_fstatat:
637                         case SYS_futimesat:
638                         case SYS_linkat:
639                         case SYS_mkdirat:
640                         case SYS_mkfifoat:
641                         case SYS_mknodat:
642                         case SYS_openat:
643                         case SYS_readlinkat:
644                         case SYS_renameat:
645                         case SYS_unlinkat:
646                         case SYS_utimensat:
647                                 putchar('(');
648                                 atfdname(*ip, decimal);
649                                 c = ',';
650                                 ip++;
651                                 narg--;
652                                 break;
653                         }
654                         switch (ktr->ktr_code) {
655                         case SYS_ioctl: {
656                                 print_number(ip, narg, c);
657                                 putchar(c);
658                                 ioctlname(*ip, decimal);
659                                 c = ',';
660                                 ip++;
661                                 narg--;
662                                 break;
663                         }
664                         case SYS_ptrace:
665                                 putchar('(');
666                                 ptraceopname(*ip);
667                                 c = ',';
668                                 ip++;
669                                 narg--;
670                                 break;
671                         case SYS_access:
672                         case SYS_eaccess:
673                         case SYS_faccessat:
674                                 print_number(ip, narg, c);
675                                 putchar(',');
676                                 accessmodename(*ip);
677                                 ip++;
678                                 narg--;
679                                 break;
680                         case SYS_open:
681                         case SYS_openat:
682                                 print_number(ip, narg, c);
683                                 putchar(',');
684                                 flagsandmodename(ip[0], ip[1], decimal);
685                                 ip += 2;
686                                 narg -= 2;
687                                 break;
688                         case SYS_wait4:
689                                 print_number(ip, narg, c);
690                                 print_number(ip, narg, c);
691                                 /*
692                                  * A flags value of zero is valid for
693                                  * wait4() but not for wait6(), so
694                                  * handle zero special here.
695                                  */
696                                 if (*ip == 0) {
697                                         print_number(ip, narg, c);
698                                 } else {
699                                         putchar(',');
700                                         wait6optname(*ip);
701                                         ip++;
702                                         narg--;
703                                 }
704                                 break;
705                         case SYS_wait6:
706                                 putchar('(');
707                                 idtypename(*ip, decimal);
708                                 c = ',';
709                                 ip++;
710                                 narg--;
711                                 print_number(ip, narg, c);
712                                 print_number(ip, narg, c);
713                                 putchar(',');
714                                 wait6optname(*ip);
715                                 ip++;
716                                 narg--;
717                                 break;
718                         case SYS_chmod:
719                         case SYS_fchmod:
720                         case SYS_lchmod:
721                                 print_number(ip, narg, c);
722                                 putchar(',');
723                                 modename(*ip);
724                                 ip++;
725                                 narg--;
726                                 break;
727                         case SYS_mknod:
728                         case SYS_mknodat:
729                                 print_number(ip, narg, c);
730                                 putchar(',');
731                                 modename(*ip);
732                                 ip++;
733                                 narg--;
734                                 break;
735                         case SYS_getfsstat:
736                                 print_number(ip, narg, c);
737                                 print_number(ip, narg, c);
738                                 putchar(',');
739                                 getfsstatflagsname(*ip);
740                                 ip++;
741                                 narg--;
742                                 break;
743                         case SYS_mount:
744                                 print_number(ip, narg, c);
745                                 print_number(ip, narg, c);
746                                 putchar(',');
747                                 mountflagsname(*ip);
748                                 ip++;
749                                 narg--;
750                                 break;
751                         case SYS_unmount:
752                                 print_number(ip, narg, c);
753                                 putchar(',');
754                                 mountflagsname(*ip);
755                                 ip++;
756                                 narg--;
757                                 break;
758                         case SYS_recvmsg:
759                         case SYS_sendmsg:
760                                 print_number(ip, narg, c);
761                                 print_number(ip, narg, c);
762                                 putchar(',');
763                                 sendrecvflagsname(*ip);
764                                 ip++;
765                                 narg--;
766                                 break;
767                         case SYS_recvfrom:
768                         case SYS_sendto:
769                                 print_number(ip, narg, c);
770                                 print_number(ip, narg, c);
771                                 print_number(ip, narg, c);
772                                 putchar(',');
773                                 sendrecvflagsname(*ip);
774                                 ip++;
775                                 narg--;
776                                 break;
777                         case SYS_chflags:
778                         case SYS_fchflags:
779                         case SYS_lchflags:
780                                 print_number(ip, narg, c);
781                                 putchar(',');
782                                 modename(*ip);
783                                 ip++;
784                                 narg--;
785                                 break;
786                         case SYS_kill:
787                                 print_number(ip, narg, c);
788                                 putchar(',');
789                                 signame(*ip);
790                                 ip++;
791                                 narg--;
792                                 break;
793                         case SYS_reboot:
794                                 putchar('(');
795                                 rebootoptname(*ip);
796                                 ip++;
797                                 narg--;
798                                 break;
799                         case SYS_umask:
800                                 putchar('(');
801                                 modename(*ip);
802                                 ip++;
803                                 narg--;
804                                 break;
805                         case SYS_msync:
806                                 print_number(ip, narg, c);
807                                 print_number(ip, narg, c);
808                                 putchar(',');
809                                 msyncflagsname(*ip);
810                                 ip++;
811                                 narg--;
812                                 break;
813 #ifdef SYS_freebsd6_mmap
814                         case SYS_freebsd6_mmap:
815                                 print_number(ip, narg, c);
816                                 print_number(ip, narg, c);
817                                 putchar(',');
818                                 mmapprotname(*ip);
819                                 putchar(',');
820                                 ip++;
821                                 narg--;
822                                 mmapflagsname(*ip);
823                                 ip++;
824                                 narg--;
825                                 break;
826 #endif
827                         case SYS_mmap:
828                                 print_number(ip, narg, c);
829                                 print_number(ip, narg, c);
830                                 putchar(',');
831                                 mmapprotname(*ip);
832                                 putchar(',');
833                                 ip++;
834                                 narg--;
835                                 mmapflagsname(*ip);
836                                 ip++;
837                                 narg--;
838                                 break;
839                         case SYS_mprotect:
840                                 print_number(ip, narg, c);
841                                 print_number(ip, narg, c);
842                                 putchar(',');
843                                 mmapprotname(*ip);
844                                 ip++;
845                                 narg--;
846                                 break;
847                         case SYS_madvise:
848                                 print_number(ip, narg, c);
849                                 print_number(ip, narg, c);
850                                 putchar(',');
851                                 madvisebehavname(*ip);
852                                 ip++;
853                                 narg--;
854                                 break;
855                         case SYS_setpriority:
856                                 print_number(ip, narg, c);
857                                 print_number(ip, narg, c);
858                                 putchar(',');
859                                 prioname(*ip);
860                                 ip++;
861                                 narg--;
862                                 break;
863                         case SYS_fcntl:
864                                 print_number(ip, narg, c);
865                                 putchar(',');
866                                 fcntlcmdname(ip[0], ip[1], decimal);
867                                 ip += 2;
868                                 narg -= 2;
869                                 break;
870                         case SYS_socket: {
871                                 int sockdomain;
872                                 putchar('(');
873                                 sockdomain = *ip;
874                                 sockdomainname(sockdomain);
875                                 ip++;
876                                 narg--;
877                                 putchar(',');
878                                 socktypenamewithflags(*ip);
879                                 ip++;
880                                 narg--;
881                                 if (sockdomain == PF_INET ||
882                                     sockdomain == PF_INET6) {
883                                         putchar(',');
884                                         sockipprotoname(*ip);
885                                         ip++;
886                                         narg--;
887                                 }
888                                 c = ',';
889                                 break;
890                         }
891                         case SYS_setsockopt:
892                         case SYS_getsockopt:
893                                 print_number(ip, narg, c);
894                                 putchar(',');
895                                 sockoptlevelname(*ip, decimal);
896                                 if (*ip == SOL_SOCKET) {
897                                         ip++;
898                                         narg--;
899                                         putchar(',');
900                                         sockoptname(*ip);
901                                 }
902                                 ip++;
903                                 narg--;
904                                 break;
905 #ifdef SYS_freebsd6_lseek
906                         case SYS_freebsd6_lseek:
907                                 print_number(ip, narg, c);
908                                 /* Hidden 'pad' argument, not in lseek(2) */
909                                 print_number(ip, narg, c);
910                                 print_number(ip, narg, c);
911                                 putchar(',');
912                                 whencename(*ip);
913                                 ip++;
914                                 narg--;
915                                 break;
916 #endif
917                         case SYS_lseek:
918                                 print_number(ip, narg, c);
919                                 /* Hidden 'pad' argument, not in lseek(2) */
920                                 print_number(ip, narg, c);
921                                 putchar(',');
922                                 whencename(*ip);
923                                 ip++;
924                                 narg--;
925                                 break;
926                         case SYS_flock:
927                                 print_number(ip, narg, c);
928                                 putchar(',');
929                                 flockname(*ip);
930                                 ip++;
931                                 narg--;
932                                 break;
933                         case SYS_mkfifo:
934                         case SYS_mkfifoat:
935                         case SYS_mkdir:
936                         case SYS_mkdirat:
937                                 print_number(ip, narg, c);
938                                 putchar(',');
939                                 modename(*ip);
940                                 ip++;
941                                 narg--;
942                                 break;
943                         case SYS_shutdown:
944                                 print_number(ip, narg, c);
945                                 putchar(',');
946                                 shutdownhowname(*ip);
947                                 ip++;
948                                 narg--;
949                                 break;
950                         case SYS_socketpair:
951                                 putchar('(');
952                                 sockdomainname(*ip);
953                                 ip++;
954                                 narg--;
955                                 putchar(',');
956                                 socktypenamewithflags(*ip);
957                                 ip++;
958                                 narg--;
959                                 c = ',';
960                                 break;
961                         case SYS_getrlimit:
962                         case SYS_setrlimit:
963                                 putchar('(');
964                                 rlimitname(*ip);
965                                 ip++;
966                                 narg--;
967                                 c = ',';
968                                 break;
969                         case SYS_quotactl:
970                                 print_number(ip, narg, c);
971                                 putchar(',');
972                                 quotactlname(*ip);
973                                 ip++;
974                                 narg--;
975                                 c = ',';
976                                 break;
977                         case SYS_nfssvc:
978                                 putchar('(');
979                                 nfssvcname(*ip);
980                                 ip++;
981                                 narg--;
982                                 c = ',';
983                                 break;
984                         case SYS_rtprio:
985                                 putchar('(');
986                                 rtprioname(*ip);
987                                 ip++;
988                                 narg--;
989                                 c = ',';
990                                 break;
991                         case SYS___semctl:
992                                 print_number(ip, narg, c);
993                                 print_number(ip, narg, c);
994                                 putchar(',');
995                                 semctlname(*ip);
996                                 ip++;
997                                 narg--;
998                                 break;
999                         case SYS_semget:
1000                                 print_number(ip, narg, c);
1001                                 print_number(ip, narg, c);
1002                                 putchar(',');
1003                                 semgetname(*ip);
1004                                 ip++;
1005                                 narg--;
1006                                 break;
1007                         case SYS_msgctl:
1008                                 print_number(ip, narg, c);
1009                                 putchar(',');
1010                                 shmctlname(*ip);
1011                                 ip++;
1012                                 narg--;
1013                                 break;
1014                         case SYS_shmat:
1015                                 print_number(ip, narg, c);
1016                                 print_number(ip, narg, c);
1017                                 putchar(',');
1018                                 shmatname(*ip);
1019                                 ip++;
1020                                 narg--;
1021                                 break;
1022                         case SYS_shmctl:
1023                                 print_number(ip, narg, c);
1024                                 putchar(',');
1025                                 shmctlname(*ip);
1026                                 ip++;
1027                                 narg--;
1028                                 break;
1029                         case SYS_shm_open:
1030                                 print_number(ip, narg, c);
1031                                 putchar(',');
1032                                 flagsname(ip[0]);
1033                                 printf(",0%o", (unsigned int)ip[1]);
1034                                 ip += 3;
1035                                 narg -= 3;
1036                                 break;
1037                         case SYS_minherit:
1038                                 print_number(ip, narg, c);
1039                                 print_number(ip, narg, c);
1040                                 putchar(',');
1041                                 minheritname(*ip);
1042                                 ip++;
1043                                 narg--;
1044                                 break;
1045                         case SYS_rfork:
1046                                 putchar('(');
1047                                 rforkname(*ip);
1048                                 ip++;
1049                                 narg--;
1050                                 c = ',';
1051                                 break;
1052                         case SYS_lio_listio:
1053                                 putchar('(');
1054                                 lio_listioname(*ip);
1055                                 ip++;
1056                                 narg--;
1057                                 c = ',';
1058                                 break;
1059                         case SYS_mlockall:
1060                                 putchar('(');
1061                                 mlockallname(*ip);
1062                                 ip++;
1063                                 narg--;
1064                                 break;
1065                         case SYS_sched_setscheduler:
1066                                 print_number(ip, narg, c);
1067                                 putchar(',');
1068                                 schedpolicyname(*ip);
1069                                 ip++;
1070                                 narg--;
1071                                 break;
1072                         case SYS_sched_get_priority_max:
1073                         case SYS_sched_get_priority_min:
1074                                 putchar('(');
1075                                 schedpolicyname(*ip);
1076                                 ip++;
1077                                 narg--;
1078                                 break;
1079                         case SYS_sendfile:
1080                                 print_number(ip, narg, c);
1081                                 print_number(ip, narg, c);
1082                                 print_number(ip, narg, c);
1083                                 print_number(ip, narg, c);
1084                                 print_number(ip, narg, c);
1085                                 print_number(ip, narg, c);
1086                                 putchar(',');
1087                                 sendfileflagsname(*(int *)ip);
1088                                 ip++;
1089                                 narg--;
1090                                 break;
1091                         case SYS_kldsym:
1092                                 print_number(ip, narg, c);
1093                                 putchar(',');
1094                                 kldsymcmdname(*ip);
1095                                 ip++;
1096                                 narg--;
1097                                 break;
1098                         case SYS_sigprocmask:
1099                                 putchar('(');
1100                                 sigprocmaskhowname(*ip);
1101                                 ip++;
1102                                 narg--;
1103                                 c = ',';
1104                                 break;
1105                         case SYS___acl_get_file:
1106                         case SYS___acl_set_file:
1107                         case SYS___acl_get_fd:
1108                         case SYS___acl_set_fd:
1109                         case SYS___acl_delete_file:
1110                         case SYS___acl_delete_fd:
1111                         case SYS___acl_aclcheck_file:
1112                         case SYS___acl_aclcheck_fd:
1113                         case SYS___acl_get_link:
1114                         case SYS___acl_set_link:
1115                         case SYS___acl_delete_link:
1116                         case SYS___acl_aclcheck_link:
1117                                 print_number(ip, narg, c);
1118                                 putchar(',');
1119                                 acltypename(*ip);
1120                                 ip++;
1121                                 narg--;
1122                                 break;
1123                         case SYS_sigaction:
1124                                 putchar('(');
1125                                 signame(*ip);
1126                                 ip++;
1127                                 narg--;
1128                                 c = ',';
1129                                 break;
1130                         case SYS_extattrctl:
1131                                 print_number(ip, narg, c);
1132                                 putchar(',');
1133                                 extattrctlname(*ip);
1134                                 ip++;
1135                                 narg--;
1136                                 break;
1137                         case SYS_nmount:
1138                                 print_number(ip, narg, c);
1139                                 print_number(ip, narg, c);
1140                                 putchar(',');
1141                                 mountflagsname(*ip);
1142                                 ip++;
1143                                 narg--;
1144                                 break;
1145                         case SYS_thr_create:
1146                                 print_number(ip, narg, c);
1147                                 print_number(ip, narg, c);
1148                                 putchar(',');
1149                                 thrcreateflagsname(*ip);
1150                                 ip++;
1151                                 narg--;
1152                                 break;
1153                         case SYS_thr_kill:
1154                                 print_number(ip, narg, c);
1155                                 putchar(',');
1156                                 signame(*ip);
1157                                 ip++;
1158                                 narg--;
1159                                 break;
1160                         case SYS_kldunloadf:
1161                                 print_number(ip, narg, c);
1162                                 putchar(',');
1163                                 kldunloadfflagsname(*ip);
1164                                 ip++;
1165                                 narg--;
1166                                 break;
1167                         case SYS_linkat:
1168                         case SYS_renameat:
1169                         case SYS_symlinkat:
1170                                 print_number(ip, narg, c);
1171                                 putchar(',');
1172                                 atfdname(*ip, decimal);
1173                                 ip++;
1174                                 narg--;
1175                                 break;
1176                         case SYS_cap_fcntls_limit:
1177                                 print_number(ip, narg, c);
1178                                 putchar(',');
1179                                 arg = *ip;
1180                                 ip++;
1181                                 narg--;
1182                                 capfcntlname(arg);
1183                                 break;
1184                         case SYS_posix_fadvise:
1185                                 print_number(ip, narg, c);
1186                                 print_number(ip, narg, c);
1187                                 print_number(ip, narg, c);
1188                                 (void)putchar(',');
1189                                 fadvisebehavname((int)*ip);
1190                                 ip++;
1191                                 narg--;
1192                                 break;
1193                         case SYS_procctl:
1194                                 putchar('(');
1195                                 idtypename(*ip, decimal);
1196                                 c = ',';
1197                                 ip++;
1198                                 narg--;
1199                                 print_number(ip, narg, c);
1200                                 putchar(',');
1201                                 procctlcmdname(*ip);
1202                                 ip++;
1203                                 narg--;
1204                                 break;
1205                         case SYS__umtx_op:
1206                                 print_number(ip, narg, c);
1207                                 putchar(',');
1208                                 umtxopname(*ip);
1209                                 switch (*ip) {
1210                                 case UMTX_OP_CV_WAIT:
1211                                         ip++;
1212                                         narg--;
1213                                         putchar(',');
1214                                         umtxcvwaitflags(*ip);
1215                                         break;
1216                                 case UMTX_OP_RW_RDLOCK:
1217                                         ip++;
1218                                         narg--;
1219                                         putchar(',');
1220                                         umtxrwlockflags(*ip);
1221                                         break;
1222                                 }
1223                                 ip++;
1224                                 narg--;
1225                         }
1226                 }
1227                 while (narg > 0) {
1228                         print_number(ip, narg, c);
1229                 }
1230                 putchar(')');
1231         }
1232         putchar('\n');
1233 }
1234
1235 void
1236 ktrsysret(struct ktr_sysret *ktr, u_int flags)
1237 {
1238         register_t ret = ktr->ktr_retval;
1239         int error = ktr->ktr_error;
1240         int code = ktr->ktr_code;
1241
1242         if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) ||
1243             (code >= nsyscalls || code < 0))
1244                 printf("[%d] ", code);
1245         else {
1246                 printf("%s", syscallnames[code]);
1247                 if (syscallno)
1248                         printf("[%d]", code);
1249                 printf(" ");
1250         }
1251
1252         if (error == 0) {
1253                 if (fancy) {
1254                         printf("%ld", (long)ret);
1255                         if (ret < 0 || ret > 9)
1256                                 printf("/%#lx", (unsigned long)ret);
1257                 } else {
1258                         if (decimal)
1259                                 printf("%ld", (long)ret);
1260                         else
1261                                 printf("%#lx", (unsigned long)ret);
1262                 }
1263         } else if (error == ERESTART)
1264                 printf("RESTART");
1265         else if (error == EJUSTRETURN)
1266                 printf("JUSTRETURN");
1267         else {
1268                 printf("-1 errno %d", ktr->ktr_error);
1269                 if (fancy)
1270                         printf(" %s", strerror(ktr->ktr_error));
1271         }
1272         putchar('\n');
1273 }
1274
1275 void
1276 ktrnamei(char *cp, int len)
1277 {
1278         printf("\"%.*s\"\n", len, cp);
1279 }
1280
1281 void
1282 hexdump(char *p, int len, int screenwidth)
1283 {
1284         int n, i;
1285         int width;
1286
1287         width = 0;
1288         do {
1289                 width += 2;
1290                 i = 13;                 /* base offset */
1291                 i += (width / 2) + 1;   /* spaces every second byte */
1292                 i += (width * 2);       /* width of bytes */
1293                 i += 3;                 /* "  |" */
1294                 i += width;             /* each byte */
1295                 i += 1;                 /* "|" */
1296         } while (i < screenwidth);
1297         width -= 2;
1298
1299         for (n = 0; n < len; n += width) {
1300                 for (i = n; i < n + width; i++) {
1301                         if ((i % width) == 0) { /* beginning of line */
1302                                 printf("       0x%04x", i);
1303                         }
1304                         if ((i % 2) == 0) {
1305                                 printf(" ");
1306                         }
1307                         if (i < len)
1308                                 printf("%02x", p[i] & 0xff);
1309                         else
1310                                 printf("  ");
1311                 }
1312                 printf("  |");
1313                 for (i = n; i < n + width; i++) {
1314                         if (i >= len)
1315                                 break;
1316                         if (p[i] >= ' ' && p[i] <= '~')
1317                                 printf("%c", p[i]);
1318                         else
1319                                 printf(".");
1320                 }
1321                 printf("|\n");
1322         }
1323         if ((i % width) != 0)
1324                 printf("\n");
1325 }
1326
1327 void
1328 visdump(char *dp, int datalen, int screenwidth)
1329 {
1330         int col = 0;
1331         char *cp;
1332         int width;
1333         char visbuf[5];
1334
1335         printf("       \"");
1336         col = 8;
1337         for (;datalen > 0; datalen--, dp++) {
1338                  vis(visbuf, *dp, VIS_CSTYLE, *(dp+1));
1339                 cp = visbuf;
1340                 /*
1341                  * Keep track of printables and
1342                  * space chars (like fold(1)).
1343                  */
1344                 if (col == 0) {
1345                         putchar('\t');
1346                         col = 8;
1347                 }
1348                 switch(*cp) {
1349                 case '\n':
1350                         col = 0;
1351                         putchar('\n');
1352                         continue;
1353                 case '\t':
1354                         width = 8 - (col&07);
1355                         break;
1356                 default:
1357                         width = strlen(cp);
1358                 }
1359                 if (col + width > (screenwidth-2)) {
1360                         printf("\\\n\t");
1361                         col = 8;
1362                 }
1363                 col += width;
1364                 do {
1365                         putchar(*cp++);
1366                 } while (*cp);
1367         }
1368         if (col == 0)
1369                 printf("       ");
1370         printf("\"\n");
1371 }
1372
1373 void
1374 ktrgenio(struct ktr_genio *ktr, int len)
1375 {
1376         int datalen = len - sizeof (struct ktr_genio);
1377         char *dp = (char *)ktr + sizeof (struct ktr_genio);
1378         static int screenwidth = 0;
1379         int i, binary;
1380
1381         printf("fd %d %s %d byte%s\n", ktr->ktr_fd,
1382                 ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen,
1383                 datalen == 1 ? "" : "s");
1384         if (suppressdata)
1385                 return;
1386         if (screenwidth == 0) {
1387                 struct winsize ws;
1388
1389                 if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 &&
1390                     ws.ws_col > 8)
1391                         screenwidth = ws.ws_col;
1392                 else
1393                         screenwidth = 80;
1394         }
1395         if (maxdata && datalen > maxdata)
1396                 datalen = maxdata;
1397
1398         for (i = 0, binary = 0; i < datalen && binary == 0; i++)  {
1399                 if (dp[i] >= 32 && dp[i] < 127)
1400                         continue;
1401                 if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9)
1402                         continue;
1403                 binary = 1;
1404         }
1405         if (binary)
1406                 hexdump(dp, datalen, screenwidth);
1407         else
1408                 visdump(dp, datalen, screenwidth);
1409 }
1410
1411 const char *signames[] = {
1412         "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT",     /*  1 - 6  */
1413         "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS",             /*  7 - 12 */
1414         "PIPE", "ALRM",  "TERM", "URG", "STOP", "TSTP",         /* 13 - 18 */
1415         "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU",           /* 19 - 24 */
1416         "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1",        /* 25 - 30 */
1417         "USR2", NULL,                                           /* 31 - 32 */
1418 };
1419
1420 void
1421 ktrpsig(struct ktr_psig *psig)
1422 {
1423         if (psig->signo > 0 && psig->signo < NSIG)
1424                 printf("SIG%s ", signames[psig->signo]);
1425         else
1426                 printf("SIG %d ", psig->signo);
1427         if (psig->action == SIG_DFL) {
1428                 printf("SIG_DFL code=");
1429                 sigcodename(psig->signo, psig->code);
1430                 putchar('\n');
1431         } else {
1432                 printf("caught handler=0x%lx mask=0x%x code=",
1433                     (u_long)psig->action, psig->mask.__bits[0]);
1434                 sigcodename(psig->signo, psig->code);
1435                 putchar('\n');
1436         }
1437 }
1438
1439 void
1440 ktrcsw_old(struct ktr_csw_old *cs)
1441 {
1442         printf("%s %s\n", cs->out ? "stop" : "resume",
1443                 cs->user ? "user" : "kernel");
1444 }
1445
1446 void
1447 ktrcsw(struct ktr_csw *cs)
1448 {
1449         printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume",
1450             cs->user ? "user" : "kernel", cs->wmesg);
1451 }
1452
1453 #define UTRACE_DLOPEN_START             1
1454 #define UTRACE_DLOPEN_STOP              2
1455 #define UTRACE_DLCLOSE_START            3
1456 #define UTRACE_DLCLOSE_STOP             4
1457 #define UTRACE_LOAD_OBJECT              5
1458 #define UTRACE_UNLOAD_OBJECT            6
1459 #define UTRACE_ADD_RUNDEP               7
1460 #define UTRACE_PRELOAD_FINISHED         8
1461 #define UTRACE_INIT_CALL                9
1462 #define UTRACE_FINI_CALL                10
1463 #define UTRACE_DLSYM_START              11
1464 #define UTRACE_DLSYM_STOP               12
1465
1466 struct utrace_rtld {
1467         char sig[4];                            /* 'RTLD' */
1468         int event;
1469         void *handle;
1470         void *mapbase;
1471         size_t mapsize;
1472         int refcnt;
1473         char name[MAXPATHLEN];
1474 };
1475
1476 void
1477 ktruser_rtld(int len, void *p)
1478 {
1479         struct utrace_rtld *ut = p;
1480         unsigned char *cp;
1481         void *parent;
1482         int mode;
1483
1484         switch (ut->event) {
1485         case UTRACE_DLOPEN_START:
1486                 mode = ut->refcnt;
1487                 printf("dlopen(%s, ", ut->name);
1488                 switch (mode & RTLD_MODEMASK) {
1489                 case RTLD_NOW:
1490                         printf("RTLD_NOW");
1491                         break;
1492                 case RTLD_LAZY:
1493                         printf("RTLD_LAZY");
1494                         break;
1495                 default:
1496                         printf("%#x", mode & RTLD_MODEMASK);
1497                 }
1498                 if (mode & RTLD_GLOBAL)
1499                         printf(" | RTLD_GLOBAL");
1500                 if (mode & RTLD_TRACE)
1501                         printf(" | RTLD_TRACE");
1502                 if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE))
1503                         printf(" | %#x", mode &
1504                             ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE));
1505                 printf(")\n");
1506                 break;
1507         case UTRACE_DLOPEN_STOP:
1508                 printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name,
1509                     ut->refcnt);
1510                 break;
1511         case UTRACE_DLCLOSE_START:
1512                 printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name,
1513                     ut->refcnt);
1514                 break;
1515         case UTRACE_DLCLOSE_STOP:
1516                 printf("dlclose(%p) finished\n", ut->handle);
1517                 break;
1518         case UTRACE_LOAD_OBJECT:
1519                 printf("RTLD: loaded   %p @ %p - %p (%s)\n", ut->handle,
1520                     ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
1521                     ut->name);
1522                 break;
1523         case UTRACE_UNLOAD_OBJECT:
1524                 printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle,
1525                     ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1,
1526                     ut->name);
1527                 break;
1528         case UTRACE_ADD_RUNDEP:
1529                 parent = ut->mapbase;
1530                 printf("RTLD: %p now depends on %p (%s, %d)\n", parent,
1531                     ut->handle, ut->name, ut->refcnt);
1532                 break;
1533         case UTRACE_PRELOAD_FINISHED:
1534                 printf("RTLD: LD_PRELOAD finished\n");
1535                 break;
1536         case UTRACE_INIT_CALL:
1537                 printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle,
1538                     ut->name);
1539                 break;
1540         case UTRACE_FINI_CALL:
1541                 printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
1542                     ut->name);
1543                 break;
1544         case UTRACE_DLSYM_START:
1545                 printf("RTLD: dlsym(%p, %s)\n", ut->handle, ut->name);
1546                 break;
1547         case UTRACE_DLSYM_STOP:
1548                 printf("RTLD: %p = dlsym(%p, %s)\n", ut->mapbase, ut->handle,
1549                     ut->name);
1550                 break;
1551         default:
1552                 cp = p;
1553                 cp += 4;
1554                 len -= 4;
1555                 printf("RTLD: %d ", len);
1556                 while (len--)
1557                         if (decimal)
1558                                 printf(" %d", *cp++);
1559                         else
1560                                 printf(" %02x", *cp++);
1561                 printf("\n");
1562         }
1563 }
1564
1565 struct utrace_malloc {
1566         void *p;
1567         size_t s;
1568         void *r;
1569 };
1570
1571 void
1572 ktruser_malloc(void *p)
1573 {
1574         struct utrace_malloc *ut = p;
1575
1576         if (ut->p == (void *)(intptr_t)(-1))
1577                 printf("malloc_init()\n");
1578         else if (ut->s == 0)
1579                 printf("free(%p)\n", ut->p);
1580         else if (ut->p == NULL)
1581                 printf("%p = malloc(%zu)\n", ut->r, ut->s);
1582         else
1583                 printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s);
1584 }
1585
1586 void
1587 ktruser(int len, void *p)
1588 {
1589         unsigned char *cp;
1590
1591         if (len >= 8 && bcmp(p, "RTLD", 4) == 0) {
1592                 ktruser_rtld(len, p);
1593                 return;
1594         }
1595
1596         if (len == sizeof(struct utrace_malloc)) {
1597                 ktruser_malloc(p);
1598                 return;
1599         }
1600
1601         printf("%d ", len);
1602         cp = p;
1603         while (len--)
1604                 if (decimal)
1605                         printf(" %d", *cp++);
1606                 else
1607                         printf(" %02x", *cp++);
1608         printf("\n");
1609 }
1610
1611 void
1612 ktrcaprights(cap_rights_t *rightsp)
1613 {
1614
1615         printf("cap_rights_t ");
1616         capname(rightsp);
1617         printf("\n");
1618 }
1619
1620 static void
1621 ktrtimeval(struct timeval *tv)
1622 {
1623
1624         printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec);
1625 }
1626
1627 void
1628 ktritimerval(struct itimerval *it)
1629 {
1630
1631         printf("itimerval { .interval = ");
1632         ktrtimeval(&it->it_interval);
1633         printf(", .value = ");
1634         ktrtimeval(&it->it_value);
1635         printf(" }\n");
1636 }
1637
1638 void
1639 ktrsockaddr(struct sockaddr *sa)
1640 {
1641 /*
1642  TODO: Support additional address families
1643         #include <netnatm/natm.h>
1644         struct sockaddr_natm    *natm;
1645         #include <netsmb/netbios.h>
1646         struct sockaddr_nb      *nb;
1647 */
1648         char addr[64];
1649
1650         /*
1651          * note: ktrstruct() has already verified that sa points to a
1652          * buffer at least sizeof(struct sockaddr) bytes long and exactly
1653          * sa->sa_len bytes long.
1654          */
1655         printf("struct sockaddr { ");
1656         sockfamilyname(sa->sa_family);
1657         printf(", ");
1658
1659 #define check_sockaddr_len(n)                                   \
1660         if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) {  \
1661                 printf("invalid");                              \
1662                 break;                                          \
1663         }
1664
1665         switch(sa->sa_family) {
1666         case AF_INET: {
1667                 struct sockaddr_in sa_in;
1668
1669                 memset(&sa_in, 0, sizeof(sa_in));
1670                 memcpy(&sa_in, sa, sa->sa_len);
1671                 check_sockaddr_len(in);
1672                 inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr);
1673                 printf("%s:%u", addr, ntohs(sa_in.sin_port));
1674                 break;
1675         }
1676 #ifdef NETATALK
1677         case AF_APPLETALK: {
1678                 struct sockaddr_at      sa_at;
1679                 struct netrange         *nr;
1680
1681                 memset(&sa_at, 0, sizeof(sa_at));
1682                 memcpy(&sa_at, sa, sa->sa_len);
1683                 check_sockaddr_len(at);
1684                 nr = &sa_at.sat_range.r_netrange;
1685                 printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net),
1686                         sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet),
1687                         ntohs(nr->nr_lastnet), nr->nr_phase);
1688                 break;
1689         }
1690 #endif
1691         case AF_INET6: {
1692                 struct sockaddr_in6 sa_in6;
1693
1694                 memset(&sa_in6, 0, sizeof(sa_in6));
1695                 memcpy(&sa_in6, sa, sa->sa_len);
1696                 check_sockaddr_len(in6);
1697                 getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6),
1698                     addr, sizeof(addr), NULL, 0, NI_NUMERICHOST);
1699                 printf("[%s]:%u", addr, htons(sa_in6.sin6_port));
1700                 break;
1701         }
1702 #ifdef IPX
1703         case AF_IPX: {
1704                 struct sockaddr_ipx sa_ipx;
1705
1706                 memset(&sa_ipx, 0, sizeof(sa_ipx));
1707                 memcpy(&sa_ipx, sa, sa->sa_len);
1708                 check_sockaddr_len(ipx);
1709                 /* XXX wish we had ipx_ntop */
1710                 printf("%s", ipx_ntoa(sa_ipx.sipx_addr));
1711                 free(sa_ipx);
1712                 break;
1713         }
1714 #endif
1715         case AF_UNIX: {
1716                 struct sockaddr_un sa_un;
1717
1718                 memset(&sa_un, 0, sizeof(sa_un));
1719                 memcpy(&sa_un, sa, sa->sa_len);
1720                 printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path);
1721                 break;
1722         }
1723         default:
1724                 printf("unknown address family");
1725         }
1726         printf(" }\n");
1727 }
1728
1729 void
1730 ktrstat(struct stat *statp)
1731 {
1732         char mode[12], timestr[PATH_MAX + 4];
1733         struct passwd *pwd;
1734         struct group  *grp;
1735         struct tm *tm;
1736
1737         /*
1738          * note: ktrstruct() has already verified that statp points to a
1739          * buffer exactly sizeof(struct stat) bytes long.
1740          */
1741         printf("struct stat {");
1742         printf("dev=%ju, ino=%ju, ",
1743                 (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino);
1744         if (resolv == 0)
1745                 printf("mode=0%jo, ", (uintmax_t)statp->st_mode);
1746         else {
1747                 strmode(statp->st_mode, mode);
1748                 printf("mode=%s, ", mode);
1749         }
1750         printf("nlink=%ju, ", (uintmax_t)statp->st_nlink);
1751         if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL)
1752                 printf("uid=%ju, ", (uintmax_t)statp->st_uid);
1753         else
1754                 printf("uid=\"%s\", ", pwd->pw_name);
1755         if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL)
1756                 printf("gid=%ju, ", (uintmax_t)statp->st_gid);
1757         else
1758                 printf("gid=\"%s\", ", grp->gr_name);
1759         printf("rdev=%ju, ", (uintmax_t)statp->st_rdev);
1760         printf("atime=");
1761         if (resolv == 0)
1762                 printf("%jd", (intmax_t)statp->st_atim.tv_sec);
1763         else {
1764                 tm = localtime(&statp->st_atim.tv_sec);
1765                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1766                 printf("\"%s\"", timestr);
1767         }
1768         if (statp->st_atim.tv_nsec != 0)
1769                 printf(".%09ld, ", statp->st_atim.tv_nsec);
1770         else
1771                 printf(", ");
1772         printf("mtime=");
1773         if (resolv == 0)
1774                 printf("%jd", (intmax_t)statp->st_mtim.tv_sec);
1775         else {
1776                 tm = localtime(&statp->st_mtim.tv_sec);
1777                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1778                 printf("\"%s\"", timestr);
1779         }
1780         if (statp->st_mtim.tv_nsec != 0)
1781                 printf(".%09ld, ", statp->st_mtim.tv_nsec);
1782         else
1783                 printf(", ");
1784         printf("ctime=");
1785         if (resolv == 0)
1786                 printf("%jd", (intmax_t)statp->st_ctim.tv_sec);
1787         else {
1788                 tm = localtime(&statp->st_ctim.tv_sec);
1789                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1790                 printf("\"%s\"", timestr);
1791         }
1792         if (statp->st_ctim.tv_nsec != 0)
1793                 printf(".%09ld, ", statp->st_ctim.tv_nsec);
1794         else
1795                 printf(", ");
1796         printf("birthtime=");
1797         if (resolv == 0)
1798                 printf("%jd", (intmax_t)statp->st_birthtim.tv_sec);
1799         else {
1800                 tm = localtime(&statp->st_birthtim.tv_sec);
1801                 strftime(timestr, sizeof(timestr), TIME_FORMAT, tm);
1802                 printf("\"%s\"", timestr);
1803         }
1804         if (statp->st_birthtim.tv_nsec != 0)
1805                 printf(".%09ld, ", statp->st_birthtim.tv_nsec);
1806         else
1807                 printf(", ");
1808         printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x",
1809                 (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize,
1810                 (intmax_t)statp->st_blocks, statp->st_flags);
1811         printf(" }\n");
1812 }
1813
1814 void
1815 ktrstruct(char *buf, size_t buflen)
1816 {
1817         char *name, *data;
1818         size_t namelen, datalen;
1819         int i;
1820         cap_rights_t rights;
1821         struct itimerval it;
1822         struct stat sb;
1823         struct sockaddr_storage ss;
1824
1825         for (name = buf, namelen = 0;
1826              namelen < buflen && name[namelen] != '\0';
1827              ++namelen)
1828                 /* nothing */;
1829         if (namelen == buflen)
1830                 goto invalid;
1831         if (name[namelen] != '\0')
1832                 goto invalid;
1833         data = buf + namelen + 1;
1834         datalen = buflen - namelen - 1;
1835         if (datalen == 0)
1836                 goto invalid;
1837         /* sanity check */
1838         for (i = 0; i < (int)namelen; ++i)
1839                 if (!isalpha(name[i]))
1840                         goto invalid;
1841         if (strcmp(name, "caprights") == 0) {
1842                 if (datalen != sizeof(cap_rights_t))
1843                         goto invalid;
1844                 memcpy(&rights, data, datalen);
1845                 ktrcaprights(&rights);
1846         } else if (strcmp(name, "itimerval") == 0) {
1847                 if (datalen != sizeof(struct itimerval))
1848                         goto invalid;
1849                 memcpy(&it, data, datalen);
1850                 ktritimerval(&it);
1851         } else if (strcmp(name, "stat") == 0) {
1852                 if (datalen != sizeof(struct stat))
1853                         goto invalid;
1854                 memcpy(&sb, data, datalen);
1855                 ktrstat(&sb);
1856         } else if (strcmp(name, "sockaddr") == 0) {
1857                 if (datalen > sizeof(ss))
1858                         goto invalid;
1859                 memcpy(&ss, data, datalen);
1860                 if (datalen != ss.ss_len)
1861                         goto invalid;
1862                 ktrsockaddr((struct sockaddr *)&ss);
1863         } else {
1864                 printf("unknown structure\n");
1865         }
1866         return;
1867 invalid:
1868         printf("invalid record\n");
1869 }
1870
1871 void
1872 ktrcapfail(struct ktr_cap_fail *ktr)
1873 {
1874         switch (ktr->cap_type) {
1875         case CAPFAIL_NOTCAPABLE:
1876                 /* operation on fd with insufficient capabilities */
1877                 printf("operation requires ");
1878                 capname(&ktr->cap_needed);
1879                 printf(", process holds ");
1880                 capname(&ktr->cap_held);
1881                 break;
1882         case CAPFAIL_INCREASE:
1883                 /* requested more capabilities than fd already has */
1884                 printf("attempt to increase capabilities from ");
1885                 capname(&ktr->cap_held);
1886                 printf(" to ");
1887                 capname(&ktr->cap_needed);
1888                 break;
1889         case CAPFAIL_SYSCALL:
1890                 /* called restricted syscall */
1891                 printf("disallowed system call");
1892                 break;
1893         case CAPFAIL_LOOKUP:
1894                 /* used ".." in strict-relative mode */
1895                 printf("restricted VFS lookup");
1896                 break;
1897         default:
1898                 printf("unknown capability failure: ");
1899                 capname(&ktr->cap_needed);
1900                 printf(" ");
1901                 capname(&ktr->cap_held);
1902                 break;
1903         }
1904         printf("\n");
1905 }
1906
1907 void
1908 ktrfault(struct ktr_fault *ktr)
1909 {
1910
1911         printf("0x%jx ", (uintmax_t)ktr->vaddr);
1912         vmprotname(ktr->type);
1913         printf("\n");
1914 }
1915
1916 void
1917 ktrfaultend(struct ktr_faultend *ktr)
1918 {
1919
1920         vmresultname(ktr->result);
1921         printf("\n");
1922 }
1923
1924 #if defined(__amd64__) || defined(__i386__)
1925
1926 #if defined(__amd64__)
1927 #define NLINUX_SYSCALLS(v)              ((v) & SV_ILP32 ?               \
1928             nitems(linux32_syscallnames) : nitems(linux_syscallnames))
1929 #define LINUX_SYSCALLNAMES(v, i)        ((v) & SV_ILP32 ?               \
1930             linux32_syscallnames[i] : linux_syscallnames[i])
1931 #else
1932 #define NLINUX_SYSCALLS(v)              (nitems(linux_syscallnames))
1933 #define LINUX_SYSCALLNAMES(v, i)        (linux_syscallnames[i])
1934 #endif
1935
1936 void
1937 linux_ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
1938 {
1939         int narg = ktr->ktr_narg;
1940         unsigned code = ktr->ktr_code;
1941         register_t *ip;
1942
1943         if (ktr->ktr_code < 0 || code >= NLINUX_SYSCALLS(sv_flags))
1944                 printf("[%d]", ktr->ktr_code);
1945         else {
1946                 printf("%s", LINUX_SYSCALLNAMES(sv_flags, ktr->ktr_code));
1947                 if (syscallno)
1948                         printf("[%d]", ktr->ktr_code);
1949         }
1950         ip = &ktr->ktr_args[0];
1951         if (narg) {
1952                 char c = '(';
1953                 while (narg > 0)
1954                         print_number(ip, narg, c);
1955                 putchar(')');
1956         }
1957         putchar('\n');
1958 }
1959
1960 void
1961 linux_ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
1962 {
1963         register_t ret = ktr->ktr_retval;
1964         unsigned code = ktr->ktr_code;
1965         int error = ktr->ktr_error;
1966
1967         if (ktr->ktr_code < 0 || code >= NLINUX_SYSCALLS(sv_flags))
1968                 printf("[%d] ", ktr->ktr_code);
1969         else {
1970                 printf("%s ", LINUX_SYSCALLNAMES(sv_flags, code));
1971                 if (syscallno)
1972                         printf("[%d]", code);
1973                 printf(" ");
1974         }
1975
1976         if (error == 0) {
1977                 if (fancy) {
1978                         printf("%ld", (long)ret);
1979                         if (ret < 0 || ret > 9)
1980                                 printf("/%#lx", (unsigned long)ret);
1981                 } else {
1982                         if (decimal)
1983                                 printf("%ld", (long)ret);
1984                         else
1985                                 printf("%#lx", (unsigned long)ret);
1986                 }
1987         } else if (error == ERESTART)
1988                 printf("RESTART");
1989         else if (error == EJUSTRETURN)
1990                 printf("JUSTRETURN");
1991         else {
1992                 if (ktr->ktr_error <= ELAST + 1)
1993                         error = abs(bsd_to_linux_errno[ktr->ktr_error]);
1994                 else
1995                         error = 999;
1996                 printf("-1 errno %d", error);
1997                 if (fancy)
1998                         printf(" %s", strerror(ktr->ktr_error));
1999         }
2000         putchar('\n');
2001 }
2002 #endif
2003
2004 void
2005 usage(void)
2006 {
2007         fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] "
2008             "[-m maxdata] [-p pid] [-t trstr]\n");
2009         exit(1);
2010 }