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