19b50d902SRodney W. Grimes /*- 29b50d902SRodney W. Grimes * Copyright (c) 1988, 1993 39b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 49b50d902SRodney W. Grimes * 59b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 69b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 79b50d902SRodney W. Grimes * are met: 89b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 99b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 109b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 119b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 129b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 139b50d902SRodney W. Grimes * 4. Neither the name of the University nor the names of its contributors 149b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 159b50d902SRodney W. Grimes * without specific prior written permission. 169b50d902SRodney W. Grimes * 179b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 189b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 199b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 209b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 219b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 229b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 239b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 249b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 259b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 269b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 279b50d902SRodney W. Grimes * SUCH DAMAGE. 289b50d902SRodney W. Grimes */ 299b50d902SRodney W. Grimes 309b50d902SRodney W. Grimes #ifndef lint 3115fc002bSPhilippe Charnier static const char copyright[] = 329b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\ 339b50d902SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 349b50d902SRodney W. Grimes #endif /* not lint */ 359b50d902SRodney W. Grimes 369b50d902SRodney W. Grimes #ifndef lint 3715fc002bSPhilippe Charnier #if 0 389b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; 3915fc002bSPhilippe Charnier #endif 409b50d902SRodney W. Grimes #endif /* not lint */ 41e026a48cSDavid E. O'Brien #include <sys/cdefs.h> 42e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$"); 439b50d902SRodney W. Grimes 44c4473420SPeter Wemm #define _KERNEL 45c1b99fe6SGeoff Rehmet extern int errno; 46c1b99fe6SGeoff Rehmet #include <sys/errno.h> 47c4473420SPeter Wemm #undef _KERNEL 489b50d902SRodney W. Grimes #include <sys/param.h> 499b50d902SRodney W. Grimes #include <sys/errno.h> 5091fbb9c1SDavid Malone #define _KERNEL 519b50d902SRodney W. Grimes #include <sys/time.h> 5291fbb9c1SDavid Malone #undef _KERNEL 539b50d902SRodney W. Grimes #include <sys/uio.h> 549b50d902SRodney W. Grimes #include <sys/ktrace.h> 559b50d902SRodney W. Grimes #include <sys/ioctl.h> 568bc31d83SCraig Rodrigues #include <sys/socket.h> 5760e15db9SDag-Erling Smørgrav #include <sys/stat.h> 587144d36fSDmitry Chagin #include <sys/sysent.h> 5960e15db9SDag-Erling Smørgrav #include <sys/un.h> 607144d36fSDmitry Chagin #include <sys/queue.h> 6160e15db9SDag-Erling Smørgrav #ifdef IPX 6260e15db9SDag-Erling Smørgrav #include <sys/types.h> 6360e15db9SDag-Erling Smørgrav #include <netipx/ipx.h> 6460e15db9SDag-Erling Smørgrav #endif 6560e15db9SDag-Erling Smørgrav #ifdef NETATALK 6660e15db9SDag-Erling Smørgrav #include <netatalk/at.h> 6760e15db9SDag-Erling Smørgrav #endif 681a604cfaSXin LI #include <arpa/inet.h> 6960e15db9SDag-Erling Smørgrav #include <netinet/in.h> 701a604cfaSXin LI #include <ctype.h> 711f4b63f8SJohn Baldwin #include <dlfcn.h> 7215fc002bSPhilippe Charnier #include <err.h> 7360e15db9SDag-Erling Smørgrav #include <grp.h> 7460e15db9SDag-Erling Smørgrav #include <inttypes.h> 7515fc002bSPhilippe Charnier #include <locale.h> 7660e15db9SDag-Erling Smørgrav #include <pwd.h> 779b50d902SRodney W. Grimes #include <stdio.h> 789b50d902SRodney W. Grimes #include <stdlib.h> 799b50d902SRodney W. Grimes #include <string.h> 8060e15db9SDag-Erling Smørgrav #include <time.h> 8115fc002bSPhilippe Charnier #include <unistd.h> 8215fc002bSPhilippe Charnier #include <vis.h> 839b50d902SRodney W. Grimes #include "ktrace.h" 8498a68a58SAlexander Leidinger #include "kdump_subr.h" 859b50d902SRodney W. Grimes 867144d36fSDmitry Chagin u_int abidump(struct ktr_header *); 877144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *); 8891fbb9c1SDavid Malone int fread_tail(void *, int, int); 8991fbb9c1SDavid Malone void dumpheader(struct ktr_header *); 907144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int); 917144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int); 9291fbb9c1SDavid Malone void ktrnamei(char *, int); 93ec4beb5dSPeter Wemm void hexdump(char *, int, int); 94ec4beb5dSPeter Wemm void visdump(char *, int, int); 9591fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int); 96dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *); 9791fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *); 9891fbb9c1SDavid Malone void ktruser(int, unsigned char *); 9960e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *); 10060e15db9SDag-Erling Smørgrav void ktrstat(struct stat *); 10160e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t); 10291fbb9c1SDavid Malone void usage(void); 103d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int); 10491fbb9c1SDavid Malone 10560e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, 1067144d36fSDmitry Chagin resolv = 0, abiflag = 0; 10791fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE; 1089b50d902SRodney W. Grimes struct ktr_header ktr_header; 1099b50d902SRodney W. Grimes 11060e15db9SDag-Erling Smørgrav #define TIME_FORMAT "%b %e %T %Y" 1119b50d902SRodney W. Grimes #define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 1129b50d902SRodney W. Grimes 11395bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do { \ 114dde5f9b9SDmitry Chagin if (decimal) \ 115e4bb45b1SDag-Erling Smørgrav printf("%c%jd", c, (intmax_t)*i); \ 116dde5f9b9SDmitry Chagin else \ 117661522f5SDag-Erling Smørgrav printf("%c%#jx", c, (uintmax_t)(u_register_t)*i); \ 118dde5f9b9SDmitry Chagin i++; \ 119dde5f9b9SDmitry Chagin n--; \ 120dde5f9b9SDmitry Chagin c = ','; \ 121e4bb45b1SDag-Erling Smørgrav } while (0) 122dde5f9b9SDmitry Chagin 123dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 124dde5f9b9SDmitry Chagin 125dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *); 126dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *); 127dde5f9b9SDmitry Chagin extern char *linux_syscallnames[]; 128dde5f9b9SDmitry Chagin extern int nlinux_syscalls; 129dde5f9b9SDmitry Chagin 130dde5f9b9SDmitry Chagin /* 131dde5f9b9SDmitry Chagin * from linux.h 132dde5f9b9SDmitry Chagin * Linux syscalls return negative errno's, we do positive and map them 133dde5f9b9SDmitry Chagin */ 134dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = { 135dde5f9b9SDmitry Chagin -0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 136dde5f9b9SDmitry Chagin -10, -35, -12, -13, -14, -15, -16, -17, -18, -19, 137dde5f9b9SDmitry Chagin -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, 138dde5f9b9SDmitry Chagin -30, -31, -32, -33, -34, -11,-115,-114, -88, -89, 139dde5f9b9SDmitry Chagin -90, -91, -92, -93, -94, -95, -96, -97, -98, -99, 140dde5f9b9SDmitry Chagin -100,-101,-102,-103,-104,-105,-106,-107,-108,-109, 141dde5f9b9SDmitry Chagin -110,-111, -40, -36,-112,-113, -39, -11, -87,-122, 142dde5f9b9SDmitry Chagin -116, -66, -6, -6, -6, -6, -6, -37, -38, -9, 143dde5f9b9SDmitry Chagin -6, -6, -43, -42, -75,-125, -84, -95, -16, -74, 144dde5f9b9SDmitry Chagin -72, -67, -71 145dde5f9b9SDmitry Chagin }; 146dde5f9b9SDmitry Chagin #endif 147dde5f9b9SDmitry Chagin 1487144d36fSDmitry Chagin struct proc_info 1497144d36fSDmitry Chagin { 1507144d36fSDmitry Chagin TAILQ_ENTRY(proc_info) info; 1517144d36fSDmitry Chagin u_int sv_flags; 1527144d36fSDmitry Chagin pid_t pid; 1537144d36fSDmitry Chagin }; 1547144d36fSDmitry Chagin 1557144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs; 1567144d36fSDmitry Chagin 15791fbb9c1SDavid Malone int 15891fbb9c1SDavid Malone main(int argc, char *argv[]) 1599b50d902SRodney W. Grimes { 1609b50d902SRodney W. Grimes int ch, ktrlen, size; 16191fbb9c1SDavid Malone void *m; 1629b50d902SRodney W. Grimes int trpoints = ALL_POINTS; 163db53f66bSJohn Baldwin int drop_logged; 164ec4beb5dSPeter Wemm pid_t pid = 0; 1657144d36fSDmitry Chagin u_int sv_flags; 1669b50d902SRodney W. Grimes 16709307b25SDag-Erling Smørgrav setlocale(LC_CTYPE, ""); 1685ccbfb26SAndrey A. Chernov 1697144d36fSDmitry Chagin while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1) 17009307b25SDag-Erling Smørgrav switch (ch) { 1717144d36fSDmitry Chagin case 'A': 1727144d36fSDmitry Chagin abiflag = 1; 1737144d36fSDmitry Chagin break; 1749b50d902SRodney W. Grimes case 'f': 1759b50d902SRodney W. Grimes tracefile = optarg; 1769b50d902SRodney W. Grimes break; 1779b50d902SRodney W. Grimes case 'd': 1789b50d902SRodney W. Grimes decimal = 1; 1799b50d902SRodney W. Grimes break; 1809b50d902SRodney W. Grimes case 'l': 1819b50d902SRodney W. Grimes tail = 1; 1829b50d902SRodney W. Grimes break; 1839b50d902SRodney W. Grimes case 'm': 1849b50d902SRodney W. Grimes maxdata = atoi(optarg); 1859b50d902SRodney W. Grimes break; 1869b50d902SRodney W. Grimes case 'n': 1879b50d902SRodney W. Grimes fancy = 0; 1889b50d902SRodney W. Grimes break; 189ec4beb5dSPeter Wemm case 'p': 190ec4beb5dSPeter Wemm pid = atoi(optarg); 191ec4beb5dSPeter Wemm break; 19260e15db9SDag-Erling Smørgrav case 'r': 19360e15db9SDag-Erling Smørgrav resolv = 1; 19460e15db9SDag-Erling Smørgrav break; 195df0c8868SRobert Watson case 's': 196df0c8868SRobert Watson suppressdata = 1; 197df0c8868SRobert Watson break; 198ec131914SPeter Wemm case 'E': 199ec131914SPeter Wemm timestamp = 3; /* elapsed timestamp */ 200ec131914SPeter Wemm break; 201a9ac598bSRobert Watson case 'H': 202a9ac598bSRobert Watson threads = 1; 203a9ac598bSRobert Watson break; 2049b50d902SRodney W. Grimes case 'R': 2059b50d902SRodney W. Grimes timestamp = 2; /* relative timestamp */ 2069b50d902SRodney W. Grimes break; 2079b50d902SRodney W. Grimes case 'T': 2089b50d902SRodney W. Grimes timestamp = 1; 2099b50d902SRodney W. Grimes break; 2109b50d902SRodney W. Grimes case 't': 2119b50d902SRodney W. Grimes trpoints = getpoints(optarg); 21215fc002bSPhilippe Charnier if (trpoints < 0) 21315fc002bSPhilippe Charnier errx(1, "unknown trace point in %s", optarg); 2149b50d902SRodney W. Grimes break; 2159b50d902SRodney W. Grimes default: 2169b50d902SRodney W. Grimes usage(); 2179b50d902SRodney W. Grimes } 2189b50d902SRodney W. Grimes 21980844fd1SBill Fenner if (argc > optind) 2209b50d902SRodney W. Grimes usage(); 2219b50d902SRodney W. Grimes 22209307b25SDag-Erling Smørgrav m = malloc(size = 1025); 22315fc002bSPhilippe Charnier if (m == NULL) 22415fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 22515fc002bSPhilippe Charnier if (!freopen(tracefile, "r", stdin)) 22615fc002bSPhilippe Charnier err(1, "%s", tracefile); 2277144d36fSDmitry Chagin TAILQ_INIT(&trace_procs); 228db53f66bSJohn Baldwin drop_logged = 0; 2299b50d902SRodney W. Grimes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 230db53f66bSJohn Baldwin if (ktr_header.ktr_type & KTR_DROP) { 231db53f66bSJohn Baldwin ktr_header.ktr_type &= ~KTR_DROP; 232a9ac598bSRobert Watson if (!drop_logged && threads) { 23309307b25SDag-Erling Smørgrav printf( 234c065c0b8SJaakko Heinonen "%6jd %6jd %-8.*s Events dropped.\n", 235c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, 236c065c0b8SJaakko Heinonen ktr_header.ktr_tid > 0 ? 237c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_tid : 0, 238c065c0b8SJaakko Heinonen MAXCOMLEN, ktr_header.ktr_comm); 239a9ac598bSRobert Watson drop_logged = 1; 240a9ac598bSRobert Watson } else if (!drop_logged) { 24109307b25SDag-Erling Smørgrav printf("%6jd %-8.*s Events dropped.\n", 242c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, MAXCOMLEN, 243db53f66bSJohn Baldwin ktr_header.ktr_comm); 244db53f66bSJohn Baldwin drop_logged = 1; 245db53f66bSJohn Baldwin } 246db53f66bSJohn Baldwin } 2479b50d902SRodney W. Grimes if (trpoints & (1<<ktr_header.ktr_type)) 248ec4beb5dSPeter Wemm if (pid == 0 || ktr_header.ktr_pid == pid) 2499b50d902SRodney W. Grimes dumpheader(&ktr_header); 25015fc002bSPhilippe Charnier if ((ktrlen = ktr_header.ktr_len) < 0) 25115fc002bSPhilippe Charnier errx(1, "bogus length 0x%x", ktrlen); 2529b50d902SRodney W. Grimes if (ktrlen > size) { 25309307b25SDag-Erling Smørgrav m = realloc(m, ktrlen+1); 25415fc002bSPhilippe Charnier if (m == NULL) 25515fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 2569b50d902SRodney W. Grimes size = ktrlen; 2579b50d902SRodney W. Grimes } 25815fc002bSPhilippe Charnier if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 25915fc002bSPhilippe Charnier errx(1, "data too short"); 2607144d36fSDmitry Chagin if (fetchprocinfo(&ktr_header, (u_int *)m) != 0) 2617144d36fSDmitry Chagin continue; 2627144d36fSDmitry Chagin sv_flags = abidump(&ktr_header); 263ec4beb5dSPeter Wemm if (pid && ktr_header.ktr_pid != pid) 264ec4beb5dSPeter Wemm continue; 2659b50d902SRodney W. Grimes if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 2669b50d902SRodney W. Grimes continue; 267db53f66bSJohn Baldwin drop_logged = 0; 2689b50d902SRodney W. Grimes switch (ktr_header.ktr_type) { 2699b50d902SRodney W. Grimes case KTR_SYSCALL: 270dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 271dde5f9b9SDmitry Chagin if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX) 272dde5f9b9SDmitry Chagin linux_ktrsyscall((struct ktr_syscall *)m); 273dde5f9b9SDmitry Chagin else 274dde5f9b9SDmitry Chagin #endif 2757144d36fSDmitry Chagin ktrsyscall((struct ktr_syscall *)m, sv_flags); 2769b50d902SRodney W. Grimes break; 2779b50d902SRodney W. Grimes case KTR_SYSRET: 278dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 279dde5f9b9SDmitry Chagin if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX) 280dde5f9b9SDmitry Chagin linux_ktrsysret((struct ktr_sysret *)m); 281dde5f9b9SDmitry Chagin else 282dde5f9b9SDmitry Chagin #endif 2837144d36fSDmitry Chagin ktrsysret((struct ktr_sysret *)m, sv_flags); 2849b50d902SRodney W. Grimes break; 2859b50d902SRodney W. Grimes case KTR_NAMEI: 286a56be37eSJohn Baldwin case KTR_SYSCTL: 2879b50d902SRodney W. Grimes ktrnamei(m, ktrlen); 2889b50d902SRodney W. Grimes break; 2899b50d902SRodney W. Grimes case KTR_GENIO: 2909b50d902SRodney W. Grimes ktrgenio((struct ktr_genio *)m, ktrlen); 2919b50d902SRodney W. Grimes break; 2929b50d902SRodney W. Grimes case KTR_PSIG: 293dde5f9b9SDmitry Chagin ktrpsig((struct ktr_psig *)m); 2949b50d902SRodney W. Grimes break; 2959b50d902SRodney W. Grimes case KTR_CSW: 2969b50d902SRodney W. Grimes ktrcsw((struct ktr_csw *)m); 2979b50d902SRodney W. Grimes break; 29882e2dd32SPoul-Henning Kamp case KTR_USER: 2993f8ba9aeSPoul-Henning Kamp ktruser(ktrlen, m); 30082e2dd32SPoul-Henning Kamp break; 30160e15db9SDag-Erling Smørgrav case KTR_STRUCT: 30260e15db9SDag-Erling Smørgrav ktrstruct(m, ktrlen); 30360e15db9SDag-Erling Smørgrav break; 304b9609ab1SJohn Baldwin default: 305b9609ab1SJohn Baldwin printf("\n"); 306b9609ab1SJohn Baldwin break; 3079b50d902SRodney W. Grimes } 3089b50d902SRodney W. Grimes if (tail) 30909307b25SDag-Erling Smørgrav fflush(stdout); 3109b50d902SRodney W. Grimes } 31191fbb9c1SDavid Malone return 0; 3129b50d902SRodney W. Grimes } 3139b50d902SRodney W. Grimes 31491fbb9c1SDavid Malone int 31591fbb9c1SDavid Malone fread_tail(void *buf, int size, int num) 3169b50d902SRodney W. Grimes { 3179b50d902SRodney W. Grimes int i; 3189b50d902SRodney W. Grimes 3199b50d902SRodney W. Grimes while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 32009307b25SDag-Erling Smørgrav sleep(1); 3219b50d902SRodney W. Grimes clearerr(stdin); 3229b50d902SRodney W. Grimes } 3239b50d902SRodney W. Grimes return (i); 3249b50d902SRodney W. Grimes } 3259b50d902SRodney W. Grimes 3267144d36fSDmitry Chagin int 3277144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags) 3287144d36fSDmitry Chagin { 3297144d36fSDmitry Chagin struct proc_info *pi; 3307144d36fSDmitry Chagin 3317144d36fSDmitry Chagin switch (kth->ktr_type) { 3327144d36fSDmitry Chagin case KTR_PROCCTOR: 3337144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 3347144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 3357144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 3367144d36fSDmitry Chagin break; 3377144d36fSDmitry Chagin } 3387144d36fSDmitry Chagin } 3397144d36fSDmitry Chagin pi = malloc(sizeof(struct proc_info)); 3407144d36fSDmitry Chagin if (pi == NULL) 3417144d36fSDmitry Chagin errx(1, "%s", strerror(ENOMEM)); 3427144d36fSDmitry Chagin pi->sv_flags = *flags; 3437144d36fSDmitry Chagin pi->pid = kth->ktr_pid; 3447144d36fSDmitry Chagin TAILQ_INSERT_TAIL(&trace_procs, pi, info); 3457144d36fSDmitry Chagin return (1); 3467144d36fSDmitry Chagin 3477144d36fSDmitry Chagin case KTR_PROCDTOR: 3487144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 3497144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 3507144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 3517144d36fSDmitry Chagin free(pi); 3527144d36fSDmitry Chagin break; 3537144d36fSDmitry Chagin } 3547144d36fSDmitry Chagin } 3557144d36fSDmitry Chagin return (1); 3567144d36fSDmitry Chagin } 3577144d36fSDmitry Chagin 3587144d36fSDmitry Chagin return (0); 3597144d36fSDmitry Chagin } 3607144d36fSDmitry Chagin 3617144d36fSDmitry Chagin u_int 3627144d36fSDmitry Chagin abidump(struct ktr_header *kth) 3637144d36fSDmitry Chagin { 3647144d36fSDmitry Chagin struct proc_info *pi; 3657144d36fSDmitry Chagin const char *abi; 3667144d36fSDmitry Chagin const char *arch; 3677144d36fSDmitry Chagin u_int flags = 0; 3687144d36fSDmitry Chagin 3697144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 3707144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 3717144d36fSDmitry Chagin flags = pi->sv_flags; 3727144d36fSDmitry Chagin break; 3737144d36fSDmitry Chagin } 3747144d36fSDmitry Chagin } 3757144d36fSDmitry Chagin 3767144d36fSDmitry Chagin if (abiflag == 0) 3777144d36fSDmitry Chagin return (flags); 3787144d36fSDmitry Chagin 3797144d36fSDmitry Chagin switch (flags & SV_ABI_MASK) { 3807144d36fSDmitry Chagin case SV_ABI_LINUX: 3817144d36fSDmitry Chagin abi = "L"; 3827144d36fSDmitry Chagin break; 3837144d36fSDmitry Chagin case SV_ABI_FREEBSD: 3847144d36fSDmitry Chagin abi = "F"; 3857144d36fSDmitry Chagin break; 3867144d36fSDmitry Chagin default: 3877144d36fSDmitry Chagin abi = "U"; 3887144d36fSDmitry Chagin break; 3897144d36fSDmitry Chagin } 3907144d36fSDmitry Chagin 3917144d36fSDmitry Chagin if (flags != 0) { 3927144d36fSDmitry Chagin if (flags & SV_LP64) 3937144d36fSDmitry Chagin arch = "64"; 3947144d36fSDmitry Chagin else 3957144d36fSDmitry Chagin arch = "32"; 3967144d36fSDmitry Chagin } else 3977144d36fSDmitry Chagin arch = "00"; 3987144d36fSDmitry Chagin 3997144d36fSDmitry Chagin printf("%s%s ", abi, arch); 4007144d36fSDmitry Chagin 4017144d36fSDmitry Chagin return (flags); 4027144d36fSDmitry Chagin } 4037144d36fSDmitry Chagin 40491fbb9c1SDavid Malone void 40591fbb9c1SDavid Malone dumpheader(struct ktr_header *kth) 4069b50d902SRodney W. Grimes { 4079b50d902SRodney W. Grimes static char unknown[64]; 4089b50d902SRodney W. Grimes static struct timeval prevtime, temp; 40991fbb9c1SDavid Malone const char *type; 4109b50d902SRodney W. Grimes 4119b50d902SRodney W. Grimes switch (kth->ktr_type) { 4129b50d902SRodney W. Grimes case KTR_SYSCALL: 4139b50d902SRodney W. Grimes type = "CALL"; 4149b50d902SRodney W. Grimes break; 4159b50d902SRodney W. Grimes case KTR_SYSRET: 4169b50d902SRodney W. Grimes type = "RET "; 4179b50d902SRodney W. Grimes break; 4189b50d902SRodney W. Grimes case KTR_NAMEI: 4199b50d902SRodney W. Grimes type = "NAMI"; 4209b50d902SRodney W. Grimes break; 4219b50d902SRodney W. Grimes case KTR_GENIO: 4229b50d902SRodney W. Grimes type = "GIO "; 4239b50d902SRodney W. Grimes break; 4249b50d902SRodney W. Grimes case KTR_PSIG: 4259b50d902SRodney W. Grimes type = "PSIG"; 4269b50d902SRodney W. Grimes break; 4279b50d902SRodney W. Grimes case KTR_CSW: 4289b50d902SRodney W. Grimes type = "CSW "; 4299b50d902SRodney W. Grimes break; 43082e2dd32SPoul-Henning Kamp case KTR_USER: 43182e2dd32SPoul-Henning Kamp type = "USER"; 43282e2dd32SPoul-Henning Kamp break; 43360e15db9SDag-Erling Smørgrav case KTR_STRUCT: 43460e15db9SDag-Erling Smørgrav type = "STRU"; 43560e15db9SDag-Erling Smørgrav break; 436a56be37eSJohn Baldwin case KTR_SYSCTL: 437a56be37eSJohn Baldwin type = "SCTL"; 438a56be37eSJohn Baldwin break; 4397144d36fSDmitry Chagin case KTR_PROCCTOR: 4407144d36fSDmitry Chagin /* FALLTHROUGH */ 4417144d36fSDmitry Chagin case KTR_PROCDTOR: 4427144d36fSDmitry Chagin return; 4439b50d902SRodney W. Grimes default: 44409307b25SDag-Erling Smørgrav sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 4459b50d902SRodney W. Grimes type = unknown; 4469b50d902SRodney W. Grimes } 4479b50d902SRodney W. Grimes 448a9ac598bSRobert Watson /* 449a9ac598bSRobert Watson * The ktr_tid field was previously the ktr_buffer field, which held 450a9ac598bSRobert Watson * the kernel pointer value for the buffer associated with data 451a9ac598bSRobert Watson * following the record header. It now holds a threadid, but only 452a9ac598bSRobert Watson * for trace files after the change. Older trace files still contain 453a9ac598bSRobert Watson * kernel pointers. Detect this and suppress the results by printing 454a9ac598bSRobert Watson * negative tid's as 0. 455a9ac598bSRobert Watson */ 456a9ac598bSRobert Watson if (threads) 45709307b25SDag-Erling Smørgrav printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid, 458c065c0b8SJaakko Heinonen kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0, 459c065c0b8SJaakko Heinonen MAXCOMLEN, kth->ktr_comm); 460a9ac598bSRobert Watson else 46109307b25SDag-Erling Smørgrav printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN, 462a9ac598bSRobert Watson kth->ktr_comm); 4639b50d902SRodney W. Grimes if (timestamp) { 464ec131914SPeter Wemm if (timestamp == 3) { 465ec131914SPeter Wemm if (prevtime.tv_sec == 0) 466ec131914SPeter Wemm prevtime = kth->ktr_time; 467ec131914SPeter Wemm timevalsub(&kth->ktr_time, &prevtime); 468ec131914SPeter Wemm } 4699b50d902SRodney W. Grimes if (timestamp == 2) { 4709b50d902SRodney W. Grimes temp = kth->ktr_time; 4719b50d902SRodney W. Grimes timevalsub(&kth->ktr_time, &prevtime); 4729b50d902SRodney W. Grimes prevtime = temp; 4739b50d902SRodney W. Grimes } 47409307b25SDag-Erling Smørgrav printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec, 475c065c0b8SJaakko Heinonen kth->ktr_time.tv_usec); 4769b50d902SRodney W. Grimes } 47709307b25SDag-Erling Smørgrav printf("%s ", type); 4789b50d902SRodney W. Grimes } 4799b50d902SRodney W. Grimes 4809b50d902SRodney W. Grimes #include <sys/syscall.h> 4819b50d902SRodney W. Grimes #define KTRACE 48255229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c> 4839b50d902SRodney W. Grimes #undef KTRACE 4849b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]); 4859b50d902SRodney W. Grimes 48691fbb9c1SDavid Malone void 4877144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags) 4889b50d902SRodney W. Grimes { 48991fbb9c1SDavid Malone int narg = ktr->ktr_narg; 49091fbb9c1SDavid Malone register_t *ip; 4919b50d902SRodney W. Grimes 4927144d36fSDmitry Chagin if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) || 4937144d36fSDmitry Chagin (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)) 49409307b25SDag-Erling Smørgrav printf("[%d]", ktr->ktr_code); 4959b50d902SRodney W. Grimes else 49609307b25SDag-Erling Smørgrav printf("%s", syscallnames[ktr->ktr_code]); 4977a6ec4cfSDmitrij Tejblum ip = &ktr->ktr_args[0]; 4989b50d902SRodney W. Grimes if (narg) { 4999b50d902SRodney W. Grimes char c = '('; 5007144d36fSDmitry Chagin if (fancy && 5017144d36fSDmitry Chagin (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) { 50273430055SDag-Erling Smørgrav switch (ktr->ktr_code) { 50373430055SDag-Erling Smørgrav case SYS_ioctl: { 50491fbb9c1SDavid Malone const char *cp; 50598a68a58SAlexander Leidinger print_number(ip, narg, c); 506d09e66beSDag-Erling Smørgrav putchar(c); 507d09e66beSDag-Erling Smørgrav ioctlname(*ip, decimal); 5089b50d902SRodney W. Grimes c = ','; 5099b50d902SRodney W. Grimes ip++; 5109b50d902SRodney W. Grimes narg--; 51173430055SDag-Erling Smørgrav break; 51273430055SDag-Erling Smørgrav } 51373430055SDag-Erling Smørgrav case SYS_ptrace: 51409307b25SDag-Erling Smørgrav putchar('('); 51595bb676aSDag-Erling Smørgrav ptraceopname(*ip); 5169b50d902SRodney W. Grimes c = ','; 5179b50d902SRodney W. Grimes ip++; 5189b50d902SRodney W. Grimes narg--; 51973430055SDag-Erling Smørgrav break; 52073430055SDag-Erling Smørgrav case SYS_access: 52173430055SDag-Erling Smørgrav case SYS_eaccess: 52298a68a58SAlexander Leidinger print_number(ip, narg, c); 52309307b25SDag-Erling Smørgrav putchar(','); 52495bb676aSDag-Erling Smørgrav accessmodename(*ip); 52598a68a58SAlexander Leidinger ip++; 52698a68a58SAlexander Leidinger narg--; 52773430055SDag-Erling Smørgrav break; 52873430055SDag-Erling Smørgrav case SYS_open: 52998a68a58SAlexander Leidinger print_number(ip, narg, c); 53009307b25SDag-Erling Smørgrav putchar(','); 53195bb676aSDag-Erling Smørgrav flagsandmodename(ip[0], ip[1], decimal); 53273430055SDag-Erling Smørgrav ip += 2; 53398a68a58SAlexander Leidinger narg -= 2; 53473430055SDag-Erling Smørgrav break; 53573430055SDag-Erling Smørgrav case SYS_wait4: 53698a68a58SAlexander Leidinger print_number(ip, narg, c); 53798a68a58SAlexander Leidinger print_number(ip, narg, c); 53809307b25SDag-Erling Smørgrav putchar(','); 53995bb676aSDag-Erling Smørgrav wait4optname(*ip); 54098a68a58SAlexander Leidinger ip++; 54198a68a58SAlexander Leidinger narg--; 54273430055SDag-Erling Smørgrav break; 54373430055SDag-Erling Smørgrav case SYS_chmod: 54473430055SDag-Erling Smørgrav case SYS_fchmod: 54573430055SDag-Erling Smørgrav case SYS_lchmod: 54698a68a58SAlexander Leidinger print_number(ip, narg, c); 54709307b25SDag-Erling Smørgrav putchar(','); 54895bb676aSDag-Erling Smørgrav modename(*ip); 54998a68a58SAlexander Leidinger ip++; 55098a68a58SAlexander Leidinger narg--; 55173430055SDag-Erling Smørgrav break; 55273430055SDag-Erling Smørgrav case SYS_mknod: 55398a68a58SAlexander Leidinger print_number(ip, narg, c); 55409307b25SDag-Erling Smørgrav putchar(','); 55595bb676aSDag-Erling Smørgrav modename(*ip); 55698a68a58SAlexander Leidinger ip++; 55798a68a58SAlexander Leidinger narg--; 55873430055SDag-Erling Smørgrav break; 55973430055SDag-Erling Smørgrav case SYS_getfsstat: 56098a68a58SAlexander Leidinger print_number(ip, narg, c); 56198a68a58SAlexander Leidinger print_number(ip, narg, c); 56209307b25SDag-Erling Smørgrav putchar(','); 56395bb676aSDag-Erling Smørgrav getfsstatflagsname(*ip); 56498a68a58SAlexander Leidinger ip++; 56598a68a58SAlexander Leidinger narg--; 56673430055SDag-Erling Smørgrav break; 56773430055SDag-Erling Smørgrav case SYS_mount: 56898a68a58SAlexander Leidinger print_number(ip, narg, c); 56998a68a58SAlexander Leidinger print_number(ip, narg, c); 57009307b25SDag-Erling Smørgrav putchar(','); 57195bb676aSDag-Erling Smørgrav mountflagsname(*ip); 57298a68a58SAlexander Leidinger ip++; 57398a68a58SAlexander Leidinger narg--; 57473430055SDag-Erling Smørgrav break; 57573430055SDag-Erling Smørgrav case SYS_unmount: 57698a68a58SAlexander Leidinger print_number(ip, narg, c); 57709307b25SDag-Erling Smørgrav putchar(','); 57895bb676aSDag-Erling Smørgrav mountflagsname(*ip); 57998a68a58SAlexander Leidinger ip++; 58098a68a58SAlexander Leidinger narg--; 58173430055SDag-Erling Smørgrav break; 58273430055SDag-Erling Smørgrav case SYS_recvmsg: 58373430055SDag-Erling Smørgrav case SYS_sendmsg: 58498a68a58SAlexander Leidinger print_number(ip, narg, c); 58598a68a58SAlexander Leidinger print_number(ip, narg, c); 58609307b25SDag-Erling Smørgrav putchar(','); 58795bb676aSDag-Erling Smørgrav sendrecvflagsname(*ip); 58898a68a58SAlexander Leidinger ip++; 58998a68a58SAlexander Leidinger narg--; 59073430055SDag-Erling Smørgrav break; 59173430055SDag-Erling Smørgrav case SYS_recvfrom: 59273430055SDag-Erling Smørgrav case SYS_sendto: 59398a68a58SAlexander Leidinger print_number(ip, narg, c); 59498a68a58SAlexander Leidinger print_number(ip, narg, c); 59598a68a58SAlexander Leidinger print_number(ip, narg, c); 59609307b25SDag-Erling Smørgrav putchar(','); 59795bb676aSDag-Erling Smørgrav sendrecvflagsname(*ip); 59898a68a58SAlexander Leidinger ip++; 59998a68a58SAlexander Leidinger narg--; 60073430055SDag-Erling Smørgrav break; 60173430055SDag-Erling Smørgrav case SYS_chflags: 60273430055SDag-Erling Smørgrav case SYS_fchflags: 60373430055SDag-Erling Smørgrav case SYS_lchflags: 60498a68a58SAlexander Leidinger print_number(ip, narg, c); 60509307b25SDag-Erling Smørgrav putchar(','); 60695bb676aSDag-Erling Smørgrav modename(*ip); 60798a68a58SAlexander Leidinger ip++; 60898a68a58SAlexander Leidinger narg--; 60973430055SDag-Erling Smørgrav break; 61073430055SDag-Erling Smørgrav case SYS_kill: 61198a68a58SAlexander Leidinger print_number(ip, narg, c); 61209307b25SDag-Erling Smørgrav putchar(','); 61395bb676aSDag-Erling Smørgrav signame(*ip); 61498a68a58SAlexander Leidinger ip++; 61598a68a58SAlexander Leidinger narg--; 61673430055SDag-Erling Smørgrav break; 61773430055SDag-Erling Smørgrav case SYS_reboot: 61809307b25SDag-Erling Smørgrav putchar('('); 61995bb676aSDag-Erling Smørgrav rebootoptname(*ip); 62098a68a58SAlexander Leidinger ip++; 62198a68a58SAlexander Leidinger narg--; 62273430055SDag-Erling Smørgrav break; 62373430055SDag-Erling Smørgrav case SYS_umask: 62409307b25SDag-Erling Smørgrav putchar('('); 62595bb676aSDag-Erling Smørgrav modename(*ip); 62698a68a58SAlexander Leidinger ip++; 62798a68a58SAlexander Leidinger narg--; 62873430055SDag-Erling Smørgrav break; 62973430055SDag-Erling Smørgrav case SYS_msync: 63098a68a58SAlexander Leidinger print_number(ip, narg, c); 63198a68a58SAlexander Leidinger print_number(ip, narg, c); 63209307b25SDag-Erling Smørgrav putchar(','); 63395bb676aSDag-Erling Smørgrav msyncflagsname(*ip); 63498a68a58SAlexander Leidinger ip++; 63598a68a58SAlexander Leidinger narg--; 63673430055SDag-Erling Smørgrav break; 637cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap 63873430055SDag-Erling Smørgrav case SYS_freebsd6_mmap: 639cae1120aSPeter Wemm print_number(ip, narg, c); 640cae1120aSPeter Wemm print_number(ip, narg, c); 64109307b25SDag-Erling Smørgrav putchar(','); 64295bb676aSDag-Erling Smørgrav mmapprotname(*ip); 64309307b25SDag-Erling Smørgrav putchar(','); 644cae1120aSPeter Wemm ip++; 645cae1120aSPeter Wemm narg--; 64695bb676aSDag-Erling Smørgrav mmapflagsname(*ip); 647cae1120aSPeter Wemm ip++; 648cae1120aSPeter Wemm narg--; 64973430055SDag-Erling Smørgrav break; 650cae1120aSPeter Wemm #endif 65173430055SDag-Erling Smørgrav case SYS_mmap: 65298a68a58SAlexander Leidinger print_number(ip, narg, c); 65398a68a58SAlexander Leidinger print_number(ip, narg, c); 65409307b25SDag-Erling Smørgrav putchar(','); 65595bb676aSDag-Erling Smørgrav mmapprotname(*ip); 65609307b25SDag-Erling Smørgrav putchar(','); 65798a68a58SAlexander Leidinger ip++; 65898a68a58SAlexander Leidinger narg--; 65995bb676aSDag-Erling Smørgrav mmapflagsname(*ip); 66098a68a58SAlexander Leidinger ip++; 66198a68a58SAlexander Leidinger narg--; 66273430055SDag-Erling Smørgrav break; 66373430055SDag-Erling Smørgrav case SYS_mprotect: 66498a68a58SAlexander Leidinger print_number(ip, narg, c); 66598a68a58SAlexander Leidinger print_number(ip, narg, c); 66609307b25SDag-Erling Smørgrav putchar(','); 66795bb676aSDag-Erling Smørgrav mmapprotname(*ip); 66898a68a58SAlexander Leidinger ip++; 66998a68a58SAlexander Leidinger narg--; 67073430055SDag-Erling Smørgrav break; 67173430055SDag-Erling Smørgrav case SYS_madvise: 67298a68a58SAlexander Leidinger print_number(ip, narg, c); 67398a68a58SAlexander Leidinger print_number(ip, narg, c); 67409307b25SDag-Erling Smørgrav putchar(','); 67595bb676aSDag-Erling Smørgrav madvisebehavname(*ip); 67698a68a58SAlexander Leidinger ip++; 67798a68a58SAlexander Leidinger narg--; 67873430055SDag-Erling Smørgrav break; 67973430055SDag-Erling Smørgrav case SYS_setpriority: 68098a68a58SAlexander Leidinger print_number(ip, narg, c); 68198a68a58SAlexander Leidinger print_number(ip, narg, c); 68209307b25SDag-Erling Smørgrav putchar(','); 68395bb676aSDag-Erling Smørgrav prioname(*ip); 68498a68a58SAlexander Leidinger ip++; 68598a68a58SAlexander Leidinger narg--; 68673430055SDag-Erling Smørgrav break; 68773430055SDag-Erling Smørgrav case SYS_fcntl: 68898a68a58SAlexander Leidinger print_number(ip, narg, c); 68909307b25SDag-Erling Smørgrav putchar(','); 69095bb676aSDag-Erling Smørgrav fcntlcmdname(ip[0], ip[1], decimal); 69173430055SDag-Erling Smørgrav ip += 2; 69298a68a58SAlexander Leidinger narg -= 2; 69373430055SDag-Erling Smørgrav break; 69473430055SDag-Erling Smørgrav case SYS_socket: { 6958bc31d83SCraig Rodrigues int sockdomain; 69609307b25SDag-Erling Smørgrav putchar('('); 69795bb676aSDag-Erling Smørgrav sockdomain = *ip; 6988bc31d83SCraig Rodrigues sockdomainname(sockdomain); 69998a68a58SAlexander Leidinger ip++; 70098a68a58SAlexander Leidinger narg--; 70109307b25SDag-Erling Smørgrav putchar(','); 70295bb676aSDag-Erling Smørgrav socktypename(*ip); 70398a68a58SAlexander Leidinger ip++; 70498a68a58SAlexander Leidinger narg--; 7058bc31d83SCraig Rodrigues if (sockdomain == PF_INET || 7068bc31d83SCraig Rodrigues sockdomain == PF_INET6) { 70709307b25SDag-Erling Smørgrav putchar(','); 70895bb676aSDag-Erling Smørgrav sockipprotoname(*ip); 7098bc31d83SCraig Rodrigues ip++; 7108bc31d83SCraig Rodrigues narg--; 7118bc31d83SCraig Rodrigues } 71298a68a58SAlexander Leidinger c = ','; 71373430055SDag-Erling Smørgrav break; 71473430055SDag-Erling Smørgrav } 71573430055SDag-Erling Smørgrav case SYS_setsockopt: 71673430055SDag-Erling Smørgrav case SYS_getsockopt: 71798a68a58SAlexander Leidinger print_number(ip, narg, c); 71809307b25SDag-Erling Smørgrav putchar(','); 71995bb676aSDag-Erling Smørgrav sockoptlevelname(*ip, decimal); 720e4bb45b1SDag-Erling Smørgrav if (*ip == SOL_SOCKET) { 72198a68a58SAlexander Leidinger ip++; 72298a68a58SAlexander Leidinger narg--; 72309307b25SDag-Erling Smørgrav putchar(','); 72495bb676aSDag-Erling Smørgrav sockoptname(*ip); 7250460d351SJohn Baldwin } 72698a68a58SAlexander Leidinger ip++; 72798a68a58SAlexander Leidinger narg--; 72873430055SDag-Erling Smørgrav break; 729cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek 73073430055SDag-Erling Smørgrav case SYS_freebsd6_lseek: 73198a68a58SAlexander Leidinger print_number(ip, narg, c); 73298a68a58SAlexander Leidinger /* Hidden 'pad' argument, not in lseek(2) */ 73398a68a58SAlexander Leidinger print_number(ip, narg, c); 73498a68a58SAlexander Leidinger print_number(ip, narg, c); 73509307b25SDag-Erling Smørgrav putchar(','); 73695bb676aSDag-Erling Smørgrav whencename(*ip); 73798a68a58SAlexander Leidinger ip++; 73898a68a58SAlexander Leidinger narg--; 73973430055SDag-Erling Smørgrav break; 740cae1120aSPeter Wemm #endif 74173430055SDag-Erling Smørgrav case SYS_lseek: 742cae1120aSPeter Wemm print_number(ip, narg, c); 743cae1120aSPeter Wemm /* Hidden 'pad' argument, not in lseek(2) */ 744cae1120aSPeter Wemm print_number(ip, narg, c); 74509307b25SDag-Erling Smørgrav putchar(','); 74695bb676aSDag-Erling Smørgrav whencename(*ip); 747cae1120aSPeter Wemm ip++; 748cae1120aSPeter Wemm narg--; 74973430055SDag-Erling Smørgrav break; 75073430055SDag-Erling Smørgrav case SYS_flock: 75198a68a58SAlexander Leidinger print_number(ip, narg, c); 75209307b25SDag-Erling Smørgrav putchar(','); 75395bb676aSDag-Erling Smørgrav flockname(*ip); 75498a68a58SAlexander Leidinger ip++; 75598a68a58SAlexander Leidinger narg--; 75673430055SDag-Erling Smørgrav break; 75773430055SDag-Erling Smørgrav case SYS_mkfifo: 75873430055SDag-Erling Smørgrav case SYS_mkdir: 75998a68a58SAlexander Leidinger print_number(ip, narg, c); 76009307b25SDag-Erling Smørgrav putchar(','); 76195bb676aSDag-Erling Smørgrav modename(*ip); 76298a68a58SAlexander Leidinger ip++; 76398a68a58SAlexander Leidinger narg--; 76473430055SDag-Erling Smørgrav break; 76573430055SDag-Erling Smørgrav case SYS_shutdown: 76698a68a58SAlexander Leidinger print_number(ip, narg, c); 76709307b25SDag-Erling Smørgrav putchar(','); 76895bb676aSDag-Erling Smørgrav shutdownhowname(*ip); 76998a68a58SAlexander Leidinger ip++; 77098a68a58SAlexander Leidinger narg--; 77173430055SDag-Erling Smørgrav break; 77273430055SDag-Erling Smørgrav case SYS_socketpair: 77309307b25SDag-Erling Smørgrav putchar('('); 77495bb676aSDag-Erling Smørgrav sockdomainname(*ip); 77598a68a58SAlexander Leidinger ip++; 77698a68a58SAlexander Leidinger narg--; 77709307b25SDag-Erling Smørgrav putchar(','); 77895bb676aSDag-Erling Smørgrav socktypename(*ip); 77998a68a58SAlexander Leidinger ip++; 78098a68a58SAlexander Leidinger narg--; 78198a68a58SAlexander Leidinger c = ','; 78273430055SDag-Erling Smørgrav break; 78373430055SDag-Erling Smørgrav case SYS_getrlimit: 78473430055SDag-Erling Smørgrav case SYS_setrlimit: 78509307b25SDag-Erling Smørgrav putchar('('); 78695bb676aSDag-Erling Smørgrav rlimitname(*ip); 78798a68a58SAlexander Leidinger ip++; 78898a68a58SAlexander Leidinger narg--; 78998a68a58SAlexander Leidinger c = ','; 79073430055SDag-Erling Smørgrav break; 79173430055SDag-Erling Smørgrav case SYS_quotactl: 79298a68a58SAlexander Leidinger print_number(ip, narg, c); 79309307b25SDag-Erling Smørgrav putchar(','); 79495bb676aSDag-Erling Smørgrav quotactlname(*ip); 79598a68a58SAlexander Leidinger ip++; 79698a68a58SAlexander Leidinger narg--; 79798a68a58SAlexander Leidinger c = ','; 79873430055SDag-Erling Smørgrav break; 79973430055SDag-Erling Smørgrav case SYS_nfssvc: 80009307b25SDag-Erling Smørgrav putchar('('); 80195bb676aSDag-Erling Smørgrav nfssvcname(*ip); 80298a68a58SAlexander Leidinger ip++; 80398a68a58SAlexander Leidinger narg--; 80498a68a58SAlexander Leidinger c = ','; 80573430055SDag-Erling Smørgrav break; 80673430055SDag-Erling Smørgrav case SYS_rtprio: 80709307b25SDag-Erling Smørgrav putchar('('); 80895bb676aSDag-Erling Smørgrav rtprioname(*ip); 80998a68a58SAlexander Leidinger ip++; 81098a68a58SAlexander Leidinger narg--; 81198a68a58SAlexander Leidinger c = ','; 81273430055SDag-Erling Smørgrav break; 81373430055SDag-Erling Smørgrav case SYS___semctl: 81498a68a58SAlexander Leidinger print_number(ip, narg, c); 81598a68a58SAlexander Leidinger print_number(ip, narg, c); 81609307b25SDag-Erling Smørgrav putchar(','); 81795bb676aSDag-Erling Smørgrav semctlname(*ip); 81898a68a58SAlexander Leidinger ip++; 81998a68a58SAlexander Leidinger narg--; 82073430055SDag-Erling Smørgrav break; 82173430055SDag-Erling Smørgrav case SYS_semget: 82298a68a58SAlexander Leidinger print_number(ip, narg, c); 82398a68a58SAlexander Leidinger print_number(ip, narg, c); 82409307b25SDag-Erling Smørgrav putchar(','); 82595bb676aSDag-Erling Smørgrav semgetname(*ip); 82698a68a58SAlexander Leidinger ip++; 82798a68a58SAlexander Leidinger narg--; 82873430055SDag-Erling Smørgrav break; 82973430055SDag-Erling Smørgrav case SYS_msgctl: 83098a68a58SAlexander Leidinger print_number(ip, narg, c); 83109307b25SDag-Erling Smørgrav putchar(','); 83295bb676aSDag-Erling Smørgrav shmctlname(*ip); 83398a68a58SAlexander Leidinger ip++; 83498a68a58SAlexander Leidinger narg--; 83573430055SDag-Erling Smørgrav break; 83673430055SDag-Erling Smørgrav case SYS_shmat: 83798a68a58SAlexander Leidinger print_number(ip, narg, c); 83898a68a58SAlexander Leidinger print_number(ip, narg, c); 83909307b25SDag-Erling Smørgrav putchar(','); 84095bb676aSDag-Erling Smørgrav shmatname(*ip); 84198a68a58SAlexander Leidinger ip++; 84298a68a58SAlexander Leidinger narg--; 84373430055SDag-Erling Smørgrav break; 84473430055SDag-Erling Smørgrav case SYS_shmctl: 84598a68a58SAlexander Leidinger print_number(ip, narg, c); 84609307b25SDag-Erling Smørgrav putchar(','); 84795bb676aSDag-Erling Smørgrav shmctlname(*ip); 84898a68a58SAlexander Leidinger ip++; 84998a68a58SAlexander Leidinger narg--; 85073430055SDag-Erling Smørgrav break; 85173430055SDag-Erling Smørgrav case SYS_minherit: 85298a68a58SAlexander Leidinger print_number(ip, narg, c); 85398a68a58SAlexander Leidinger print_number(ip, narg, c); 85409307b25SDag-Erling Smørgrav putchar(','); 85595bb676aSDag-Erling Smørgrav minheritname(*ip); 85698a68a58SAlexander Leidinger ip++; 85798a68a58SAlexander Leidinger narg--; 85873430055SDag-Erling Smørgrav break; 85973430055SDag-Erling Smørgrav case SYS_rfork: 86009307b25SDag-Erling Smørgrav putchar('('); 86195bb676aSDag-Erling Smørgrav rforkname(*ip); 86298a68a58SAlexander Leidinger ip++; 86398a68a58SAlexander Leidinger narg--; 86498a68a58SAlexander Leidinger c = ','; 86573430055SDag-Erling Smørgrav break; 86673430055SDag-Erling Smørgrav case SYS_lio_listio: 86709307b25SDag-Erling Smørgrav putchar('('); 86895bb676aSDag-Erling Smørgrav lio_listioname(*ip); 86998a68a58SAlexander Leidinger ip++; 87098a68a58SAlexander Leidinger narg--; 87198a68a58SAlexander Leidinger c = ','; 87273430055SDag-Erling Smørgrav break; 87373430055SDag-Erling Smørgrav case SYS_mlockall: 87409307b25SDag-Erling Smørgrav putchar('('); 87595bb676aSDag-Erling Smørgrav mlockallname(*ip); 87698a68a58SAlexander Leidinger ip++; 87798a68a58SAlexander Leidinger narg--; 87873430055SDag-Erling Smørgrav break; 87973430055SDag-Erling Smørgrav case SYS_sched_setscheduler: 88098a68a58SAlexander Leidinger print_number(ip, narg, c); 88109307b25SDag-Erling Smørgrav putchar(','); 88295bb676aSDag-Erling Smørgrav schedpolicyname(*ip); 88398a68a58SAlexander Leidinger ip++; 88498a68a58SAlexander Leidinger narg--; 88573430055SDag-Erling Smørgrav break; 88673430055SDag-Erling Smørgrav case SYS_sched_get_priority_max: 88773430055SDag-Erling Smørgrav case SYS_sched_get_priority_min: 88809307b25SDag-Erling Smørgrav putchar('('); 88995bb676aSDag-Erling Smørgrav schedpolicyname(*ip); 89098a68a58SAlexander Leidinger ip++; 89198a68a58SAlexander Leidinger narg--; 89273430055SDag-Erling Smørgrav break; 89373430055SDag-Erling Smørgrav case SYS_sendfile: 89498a68a58SAlexander Leidinger print_number(ip, narg, c); 89598a68a58SAlexander Leidinger print_number(ip, narg, c); 89698a68a58SAlexander Leidinger print_number(ip, narg, c); 89798a68a58SAlexander Leidinger print_number(ip, narg, c); 89898a68a58SAlexander Leidinger print_number(ip, narg, c); 89998a68a58SAlexander Leidinger print_number(ip, narg, c); 90009307b25SDag-Erling Smørgrav putchar(','); 90195bb676aSDag-Erling Smørgrav sendfileflagsname(*ip); 90298a68a58SAlexander Leidinger ip++; 90398a68a58SAlexander Leidinger narg--; 90473430055SDag-Erling Smørgrav break; 90573430055SDag-Erling Smørgrav case SYS_kldsym: 90698a68a58SAlexander Leidinger print_number(ip, narg, c); 90709307b25SDag-Erling Smørgrav putchar(','); 90895bb676aSDag-Erling Smørgrav kldsymcmdname(*ip); 90998a68a58SAlexander Leidinger ip++; 91098a68a58SAlexander Leidinger narg--; 91173430055SDag-Erling Smørgrav break; 91273430055SDag-Erling Smørgrav case SYS_sigprocmask: 91309307b25SDag-Erling Smørgrav putchar('('); 91495bb676aSDag-Erling Smørgrav sigprocmaskhowname(*ip); 91598a68a58SAlexander Leidinger ip++; 91698a68a58SAlexander Leidinger narg--; 91798a68a58SAlexander Leidinger c = ','; 91873430055SDag-Erling Smørgrav break; 91973430055SDag-Erling Smørgrav case SYS___acl_get_file: 92073430055SDag-Erling Smørgrav case SYS___acl_set_file: 92173430055SDag-Erling Smørgrav case SYS___acl_get_fd: 92273430055SDag-Erling Smørgrav case SYS___acl_set_fd: 92373430055SDag-Erling Smørgrav case SYS___acl_delete_file: 92473430055SDag-Erling Smørgrav case SYS___acl_delete_fd: 92573430055SDag-Erling Smørgrav case SYS___acl_aclcheck_file: 92673430055SDag-Erling Smørgrav case SYS___acl_aclcheck_fd: 92773430055SDag-Erling Smørgrav case SYS___acl_get_link: 92873430055SDag-Erling Smørgrav case SYS___acl_set_link: 92973430055SDag-Erling Smørgrav case SYS___acl_delete_link: 93073430055SDag-Erling Smørgrav case SYS___acl_aclcheck_link: 93198a68a58SAlexander Leidinger print_number(ip, narg, c); 93209307b25SDag-Erling Smørgrav putchar(','); 93395bb676aSDag-Erling Smørgrav acltypename(*ip); 93498a68a58SAlexander Leidinger ip++; 93598a68a58SAlexander Leidinger narg--; 93673430055SDag-Erling Smørgrav break; 93773430055SDag-Erling Smørgrav case SYS_sigaction: 93809307b25SDag-Erling Smørgrav putchar('('); 93995bb676aSDag-Erling Smørgrav signame(*ip); 94098a68a58SAlexander Leidinger ip++; 94198a68a58SAlexander Leidinger narg--; 94298a68a58SAlexander Leidinger c = ','; 94373430055SDag-Erling Smørgrav break; 94473430055SDag-Erling Smørgrav case SYS_extattrctl: 94598a68a58SAlexander Leidinger print_number(ip, narg, c); 94609307b25SDag-Erling Smørgrav putchar(','); 94795bb676aSDag-Erling Smørgrav extattrctlname(*ip); 94898a68a58SAlexander Leidinger ip++; 94998a68a58SAlexander Leidinger narg--; 95073430055SDag-Erling Smørgrav break; 95173430055SDag-Erling Smørgrav case SYS_nmount: 95298a68a58SAlexander Leidinger print_number(ip, narg, c); 95398a68a58SAlexander Leidinger print_number(ip, narg, c); 95409307b25SDag-Erling Smørgrav putchar(','); 95595bb676aSDag-Erling Smørgrav mountflagsname(*ip); 95698a68a58SAlexander Leidinger ip++; 95798a68a58SAlexander Leidinger narg--; 95873430055SDag-Erling Smørgrav break; 95973430055SDag-Erling Smørgrav case SYS_thr_create: 96098a68a58SAlexander Leidinger print_number(ip, narg, c); 96198a68a58SAlexander Leidinger print_number(ip, narg, c); 96209307b25SDag-Erling Smørgrav putchar(','); 96395bb676aSDag-Erling Smørgrav thrcreateflagsname(*ip); 96498a68a58SAlexander Leidinger ip++; 96598a68a58SAlexander Leidinger narg--; 96673430055SDag-Erling Smørgrav break; 96773430055SDag-Erling Smørgrav case SYS_thr_kill: 96898a68a58SAlexander Leidinger print_number(ip, narg, c); 96909307b25SDag-Erling Smørgrav putchar(','); 97095bb676aSDag-Erling Smørgrav signame(*ip); 97198a68a58SAlexander Leidinger ip++; 97298a68a58SAlexander Leidinger narg--; 97373430055SDag-Erling Smørgrav break; 97473430055SDag-Erling Smørgrav case SYS_kldunloadf: 97598a68a58SAlexander Leidinger print_number(ip, narg, c); 97609307b25SDag-Erling Smørgrav putchar(','); 97795bb676aSDag-Erling Smørgrav kldunloadfflagsname(*ip); 97898a68a58SAlexander Leidinger ip++; 97998a68a58SAlexander Leidinger narg--; 98073430055SDag-Erling Smørgrav break; 981515dfc23SDag-Erling Smørgrav case SYS_cap_new: 982515dfc23SDag-Erling Smørgrav print_number(ip, narg, c); 983515dfc23SDag-Erling Smørgrav putchar(','); 98495bb676aSDag-Erling Smørgrav capname(*ip); 985515dfc23SDag-Erling Smørgrav ip++; 986515dfc23SDag-Erling Smørgrav narg--; 987515dfc23SDag-Erling Smørgrav break; 9889b50d902SRodney W. Grimes } 9899b50d902SRodney W. Grimes } 99048f6dd8aSAttilio Rao while (narg > 0) { 99198a68a58SAlexander Leidinger print_number(ip, narg, c); 9929b50d902SRodney W. Grimes } 99309307b25SDag-Erling Smørgrav putchar(')'); 9949b50d902SRodney W. Grimes } 99509307b25SDag-Erling Smørgrav putchar('\n'); 9969b50d902SRodney W. Grimes } 9979b50d902SRodney W. Grimes 99891fbb9c1SDavid Malone void 9997144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags) 10009b50d902SRodney W. Grimes { 100191fbb9c1SDavid Malone register_t ret = ktr->ktr_retval; 100291fbb9c1SDavid Malone int error = ktr->ktr_error; 100391fbb9c1SDavid Malone int code = ktr->ktr_code; 10049b50d902SRodney W. Grimes 10057144d36fSDmitry Chagin if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) || 10067144d36fSDmitry Chagin (code >= nsyscalls || code < 0)) 100709307b25SDag-Erling Smørgrav printf("[%d] ", code); 10089b50d902SRodney W. Grimes else 100909307b25SDag-Erling Smørgrav printf("%s ", syscallnames[code]); 10109b50d902SRodney W. Grimes 10119b50d902SRodney W. Grimes if (error == 0) { 10129b50d902SRodney W. Grimes if (fancy) { 101309307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 10149b50d902SRodney W. Grimes if (ret < 0 || ret > 9) 101509307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 10169b50d902SRodney W. Grimes } else { 10179b50d902SRodney W. Grimes if (decimal) 101809307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 10199b50d902SRodney W. Grimes else 102009307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 10219b50d902SRodney W. Grimes } 10229b50d902SRodney W. Grimes } else if (error == ERESTART) 102309307b25SDag-Erling Smørgrav printf("RESTART"); 10249b50d902SRodney W. Grimes else if (error == EJUSTRETURN) 102509307b25SDag-Erling Smørgrav printf("JUSTRETURN"); 10269b50d902SRodney W. Grimes else { 102709307b25SDag-Erling Smørgrav printf("-1 errno %d", ktr->ktr_error); 10289b50d902SRodney W. Grimes if (fancy) 102909307b25SDag-Erling Smørgrav printf(" %s", strerror(ktr->ktr_error)); 10309b50d902SRodney W. Grimes } 103109307b25SDag-Erling Smørgrav putchar('\n'); 10329b50d902SRodney W. Grimes } 10339b50d902SRodney W. Grimes 103491fbb9c1SDavid Malone void 103591fbb9c1SDavid Malone ktrnamei(char *cp, int len) 10369b50d902SRodney W. Grimes { 103709307b25SDag-Erling Smørgrav printf("\"%.*s\"\n", len, cp); 10389b50d902SRodney W. Grimes } 10399b50d902SRodney W. Grimes 104091fbb9c1SDavid Malone void 1041ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth) 10429b50d902SRodney W. Grimes { 1043ec4beb5dSPeter Wemm int n, i; 1044ec4beb5dSPeter Wemm int width; 1045ec4beb5dSPeter Wemm 1046ec4beb5dSPeter Wemm width = 0; 1047ec4beb5dSPeter Wemm do { 1048ec4beb5dSPeter Wemm width += 2; 1049ec4beb5dSPeter Wemm i = 13; /* base offset */ 1050ec4beb5dSPeter Wemm i += (width / 2) + 1; /* spaces every second byte */ 1051ec4beb5dSPeter Wemm i += (width * 2); /* width of bytes */ 1052ec4beb5dSPeter Wemm i += 3; /* " |" */ 1053ec4beb5dSPeter Wemm i += width; /* each byte */ 1054ec4beb5dSPeter Wemm i += 1; /* "|" */ 1055ec4beb5dSPeter Wemm } while (i < screenwidth); 1056ec4beb5dSPeter Wemm width -= 2; 1057ec4beb5dSPeter Wemm 1058ec4beb5dSPeter Wemm for (n = 0; n < len; n += width) { 1059ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1060ec4beb5dSPeter Wemm if ((i % width) == 0) { /* beginning of line */ 1061ec4beb5dSPeter Wemm printf(" 0x%04x", i); 1062ec4beb5dSPeter Wemm } 1063ec4beb5dSPeter Wemm if ((i % 2) == 0) { 1064ec4beb5dSPeter Wemm printf(" "); 1065ec4beb5dSPeter Wemm } 1066ec4beb5dSPeter Wemm if (i < len) 1067ec4beb5dSPeter Wemm printf("%02x", p[i] & 0xff); 1068ec4beb5dSPeter Wemm else 1069ec4beb5dSPeter Wemm printf(" "); 1070ec4beb5dSPeter Wemm } 1071ec4beb5dSPeter Wemm printf(" |"); 1072ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1073ec4beb5dSPeter Wemm if (i >= len) 1074ec4beb5dSPeter Wemm break; 1075ec4beb5dSPeter Wemm if (p[i] >= ' ' && p[i] <= '~') 1076ec4beb5dSPeter Wemm printf("%c", p[i]); 1077ec4beb5dSPeter Wemm else 1078ec4beb5dSPeter Wemm printf("."); 1079ec4beb5dSPeter Wemm } 1080ec4beb5dSPeter Wemm printf("|\n"); 1081ec4beb5dSPeter Wemm } 1082ec4beb5dSPeter Wemm if ((i % width) != 0) 1083ec4beb5dSPeter Wemm printf("\n"); 1084ec4beb5dSPeter Wemm } 1085ec4beb5dSPeter Wemm 1086ec4beb5dSPeter Wemm void 1087ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth) 1088ec4beb5dSPeter Wemm { 108991fbb9c1SDavid Malone int col = 0; 1090ec4beb5dSPeter Wemm char *cp; 109191fbb9c1SDavid Malone int width; 10929b50d902SRodney W. Grimes char visbuf[5]; 10939b50d902SRodney W. Grimes 109409307b25SDag-Erling Smørgrav printf(" \""); 10959b50d902SRodney W. Grimes col = 8; 10969b50d902SRodney W. Grimes for (;datalen > 0; datalen--, dp++) { 109709307b25SDag-Erling Smørgrav vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 10989b50d902SRodney W. Grimes cp = visbuf; 10999b50d902SRodney W. Grimes /* 11009b50d902SRodney W. Grimes * Keep track of printables and 11019b50d902SRodney W. Grimes * space chars (like fold(1)). 11029b50d902SRodney W. Grimes */ 11039b50d902SRodney W. Grimes if (col == 0) { 110409307b25SDag-Erling Smørgrav putchar('\t'); 11059b50d902SRodney W. Grimes col = 8; 11069b50d902SRodney W. Grimes } 11079b50d902SRodney W. Grimes switch(*cp) { 11089b50d902SRodney W. Grimes case '\n': 11099b50d902SRodney W. Grimes col = 0; 111009307b25SDag-Erling Smørgrav putchar('\n'); 11119b50d902SRodney W. Grimes continue; 11129b50d902SRodney W. Grimes case '\t': 11139b50d902SRodney W. Grimes width = 8 - (col&07); 11149b50d902SRodney W. Grimes break; 11159b50d902SRodney W. Grimes default: 11169b50d902SRodney W. Grimes width = strlen(cp); 11179b50d902SRodney W. Grimes } 11189b50d902SRodney W. Grimes if (col + width > (screenwidth-2)) { 111909307b25SDag-Erling Smørgrav printf("\\\n\t"); 11209b50d902SRodney W. Grimes col = 8; 11219b50d902SRodney W. Grimes } 11229b50d902SRodney W. Grimes col += width; 11239b50d902SRodney W. Grimes do { 112409307b25SDag-Erling Smørgrav putchar(*cp++); 11259b50d902SRodney W. Grimes } while (*cp); 11269b50d902SRodney W. Grimes } 11279b50d902SRodney W. Grimes if (col == 0) 112809307b25SDag-Erling Smørgrav printf(" "); 112909307b25SDag-Erling Smørgrav printf("\"\n"); 11309b50d902SRodney W. Grimes } 11319b50d902SRodney W. Grimes 1132ec4beb5dSPeter Wemm void 1133ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len) 1134ec4beb5dSPeter Wemm { 1135ec4beb5dSPeter Wemm int datalen = len - sizeof (struct ktr_genio); 1136ec4beb5dSPeter Wemm char *dp = (char *)ktr + sizeof (struct ktr_genio); 1137ec4beb5dSPeter Wemm static int screenwidth = 0; 1138ec4beb5dSPeter Wemm int i, binary; 1139ec4beb5dSPeter Wemm 1140ec4beb5dSPeter Wemm if (screenwidth == 0) { 1141ec4beb5dSPeter Wemm struct winsize ws; 1142ec4beb5dSPeter Wemm 1143ec4beb5dSPeter Wemm if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 1144ec4beb5dSPeter Wemm ws.ws_col > 8) 1145ec4beb5dSPeter Wemm screenwidth = ws.ws_col; 1146ec4beb5dSPeter Wemm else 1147ec4beb5dSPeter Wemm screenwidth = 80; 1148ec4beb5dSPeter Wemm } 1149ec4beb5dSPeter Wemm printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 1150ec4beb5dSPeter Wemm ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 1151ec4beb5dSPeter Wemm datalen == 1 ? "" : "s"); 1152df0c8868SRobert Watson if (suppressdata) 1153df0c8868SRobert Watson return; 1154ec4beb5dSPeter Wemm if (maxdata && datalen > maxdata) 1155ec4beb5dSPeter Wemm datalen = maxdata; 1156ec4beb5dSPeter Wemm 1157ec4beb5dSPeter Wemm for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 1158ec4beb5dSPeter Wemm if (dp[i] >= 32 && dp[i] < 127) 1159ec4beb5dSPeter Wemm continue; 1160ec4beb5dSPeter Wemm if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 1161ec4beb5dSPeter Wemm continue; 1162ec4beb5dSPeter Wemm binary = 1; 1163ec4beb5dSPeter Wemm } 1164ec4beb5dSPeter Wemm if (binary) 1165ec4beb5dSPeter Wemm hexdump(dp, datalen, screenwidth); 1166ec4beb5dSPeter Wemm else 1167ec4beb5dSPeter Wemm visdump(dp, datalen, screenwidth); 1168ec4beb5dSPeter Wemm } 1169ec4beb5dSPeter Wemm 117091fbb9c1SDavid Malone const char *signames[] = { 11719b50d902SRodney W. Grimes "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */ 11729b50d902SRodney W. Grimes "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */ 11739b50d902SRodney W. Grimes "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */ 11749b50d902SRodney W. Grimes "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */ 11759b50d902SRodney W. Grimes "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */ 11769b50d902SRodney W. Grimes "USR2", NULL, /* 31 - 32 */ 11779b50d902SRodney W. Grimes }; 11789b50d902SRodney W. Grimes 117991fbb9c1SDavid Malone void 1180dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig) 11819b50d902SRodney W. Grimes { 1182dde5f9b9SDmitry Chagin if (psig->signo > 0 && psig->signo < NSIG) 118309307b25SDag-Erling Smørgrav printf("SIG%s ", signames[psig->signo]); 1184fd6afe79SKonstantin Belousov else 118509307b25SDag-Erling Smørgrav printf("SIG %d ", psig->signo); 11869b50d902SRodney W. Grimes if (psig->action == SIG_DFL) 118709307b25SDag-Erling Smørgrav printf("SIG_DFL code=0x%x\n", psig->code); 118891fbb9c1SDavid Malone else { 118909307b25SDag-Erling Smørgrav printf("caught handler=0x%lx mask=0x%x code=0x%x\n", 119091fbb9c1SDavid Malone (u_long)psig->action, psig->mask.__bits[0], psig->code); 119191fbb9c1SDavid Malone } 11929b50d902SRodney W. Grimes } 11939b50d902SRodney W. Grimes 119491fbb9c1SDavid Malone void 119591fbb9c1SDavid Malone ktrcsw(struct ktr_csw *cs) 11969b50d902SRodney W. Grimes { 119709307b25SDag-Erling Smørgrav printf("%s %s\n", cs->out ? "stop" : "resume", 11989b50d902SRodney W. Grimes cs->user ? "user" : "kernel"); 11999b50d902SRodney W. Grimes } 12009b50d902SRodney W. Grimes 12011f4b63f8SJohn Baldwin #define UTRACE_DLOPEN_START 1 12021f4b63f8SJohn Baldwin #define UTRACE_DLOPEN_STOP 2 12031f4b63f8SJohn Baldwin #define UTRACE_DLCLOSE_START 3 12041f4b63f8SJohn Baldwin #define UTRACE_DLCLOSE_STOP 4 12051f4b63f8SJohn Baldwin #define UTRACE_LOAD_OBJECT 5 12061f4b63f8SJohn Baldwin #define UTRACE_UNLOAD_OBJECT 6 12071f4b63f8SJohn Baldwin #define UTRACE_ADD_RUNDEP 7 12081f4b63f8SJohn Baldwin #define UTRACE_PRELOAD_FINISHED 8 12091f4b63f8SJohn Baldwin #define UTRACE_INIT_CALL 9 12101f4b63f8SJohn Baldwin #define UTRACE_FINI_CALL 10 12111f4b63f8SJohn Baldwin 12121f4b63f8SJohn Baldwin struct utrace_rtld { 12131f4b63f8SJohn Baldwin char sig[4]; /* 'RTLD' */ 12141f4b63f8SJohn Baldwin int event; 12151f4b63f8SJohn Baldwin void *handle; 12161f4b63f8SJohn Baldwin void *mapbase; 12171f4b63f8SJohn Baldwin size_t mapsize; 12181f4b63f8SJohn Baldwin int refcnt; 12191f4b63f8SJohn Baldwin char name[MAXPATHLEN]; 12201f4b63f8SJohn Baldwin }; 12211f4b63f8SJohn Baldwin 12221f4b63f8SJohn Baldwin void 12231f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p) 12241f4b63f8SJohn Baldwin { 12251f4b63f8SJohn Baldwin struct utrace_rtld *ut = (struct utrace_rtld *)p; 12261f4b63f8SJohn Baldwin void *parent; 12271f4b63f8SJohn Baldwin int mode; 12281f4b63f8SJohn Baldwin 12291f4b63f8SJohn Baldwin switch (ut->event) { 12301f4b63f8SJohn Baldwin case UTRACE_DLOPEN_START: 12311f4b63f8SJohn Baldwin mode = ut->refcnt; 12321f4b63f8SJohn Baldwin printf("dlopen(%s, ", ut->name); 12331f4b63f8SJohn Baldwin switch (mode & RTLD_MODEMASK) { 12341f4b63f8SJohn Baldwin case RTLD_NOW: 12351f4b63f8SJohn Baldwin printf("RTLD_NOW"); 12361f4b63f8SJohn Baldwin break; 12371f4b63f8SJohn Baldwin case RTLD_LAZY: 12381f4b63f8SJohn Baldwin printf("RTLD_LAZY"); 12391f4b63f8SJohn Baldwin break; 12401f4b63f8SJohn Baldwin default: 12411f4b63f8SJohn Baldwin printf("%#x", mode & RTLD_MODEMASK); 12421f4b63f8SJohn Baldwin } 12431f4b63f8SJohn Baldwin if (mode & RTLD_GLOBAL) 12441f4b63f8SJohn Baldwin printf(" | RTLD_GLOBAL"); 12451f4b63f8SJohn Baldwin if (mode & RTLD_TRACE) 12461f4b63f8SJohn Baldwin printf(" | RTLD_TRACE"); 12471f4b63f8SJohn Baldwin if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)) 12481f4b63f8SJohn Baldwin printf(" | %#x", mode & 12491f4b63f8SJohn Baldwin ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)); 12501f4b63f8SJohn Baldwin printf(")\n"); 12511f4b63f8SJohn Baldwin break; 12521f4b63f8SJohn Baldwin case UTRACE_DLOPEN_STOP: 12531f4b63f8SJohn Baldwin printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name, 12541f4b63f8SJohn Baldwin ut->refcnt); 12551f4b63f8SJohn Baldwin break; 12561f4b63f8SJohn Baldwin case UTRACE_DLCLOSE_START: 12571f4b63f8SJohn Baldwin printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name, 12581f4b63f8SJohn Baldwin ut->refcnt); 12591f4b63f8SJohn Baldwin break; 12601f4b63f8SJohn Baldwin case UTRACE_DLCLOSE_STOP: 12611f4b63f8SJohn Baldwin printf("dlclose(%p) finished\n", ut->handle); 12621f4b63f8SJohn Baldwin break; 12631f4b63f8SJohn Baldwin case UTRACE_LOAD_OBJECT: 12641f4b63f8SJohn Baldwin printf("RTLD: loaded %p @ %p - %p (%s)\n", ut->handle, 12651f4b63f8SJohn Baldwin ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 12661f4b63f8SJohn Baldwin ut->name); 12671f4b63f8SJohn Baldwin break; 12681f4b63f8SJohn Baldwin case UTRACE_UNLOAD_OBJECT: 12691f4b63f8SJohn Baldwin printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle, 12701f4b63f8SJohn Baldwin ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 12711f4b63f8SJohn Baldwin ut->name); 12721f4b63f8SJohn Baldwin break; 12731f4b63f8SJohn Baldwin case UTRACE_ADD_RUNDEP: 12741f4b63f8SJohn Baldwin parent = ut->mapbase; 12751f4b63f8SJohn Baldwin printf("RTLD: %p now depends on %p (%s, %d)\n", parent, 12761f4b63f8SJohn Baldwin ut->handle, ut->name, ut->refcnt); 12771f4b63f8SJohn Baldwin break; 12781f4b63f8SJohn Baldwin case UTRACE_PRELOAD_FINISHED: 12791f4b63f8SJohn Baldwin printf("RTLD: LD_PRELOAD finished\n"); 12801f4b63f8SJohn Baldwin break; 12811f4b63f8SJohn Baldwin case UTRACE_INIT_CALL: 12821f4b63f8SJohn Baldwin printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle, 12831f4b63f8SJohn Baldwin ut->name); 12841f4b63f8SJohn Baldwin break; 12851f4b63f8SJohn Baldwin case UTRACE_FINI_CALL: 12861f4b63f8SJohn Baldwin printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle, 12871f4b63f8SJohn Baldwin ut->name); 12881f4b63f8SJohn Baldwin break; 12891f4b63f8SJohn Baldwin default: 12901f4b63f8SJohn Baldwin p += 4; 12911f4b63f8SJohn Baldwin len -= 4; 12921f4b63f8SJohn Baldwin printf("RTLD: %d ", len); 12931f4b63f8SJohn Baldwin while (len--) 12941f4b63f8SJohn Baldwin if (decimal) 12951f4b63f8SJohn Baldwin printf(" %d", *p++); 12961f4b63f8SJohn Baldwin else 12971f4b63f8SJohn Baldwin printf(" %02x", *p++); 12981f4b63f8SJohn Baldwin printf("\n"); 12991f4b63f8SJohn Baldwin } 13001f4b63f8SJohn Baldwin } 13011f4b63f8SJohn Baldwin 1302670b9e9fSJohn Baldwin struct utrace_malloc { 1303670b9e9fSJohn Baldwin void *p; 1304670b9e9fSJohn Baldwin size_t s; 1305670b9e9fSJohn Baldwin void *r; 1306670b9e9fSJohn Baldwin }; 1307670b9e9fSJohn Baldwin 1308670b9e9fSJohn Baldwin void 1309670b9e9fSJohn Baldwin ktruser_malloc(int len, unsigned char *p) 1310670b9e9fSJohn Baldwin { 1311670b9e9fSJohn Baldwin struct utrace_malloc *ut = (struct utrace_malloc *)p; 1312670b9e9fSJohn Baldwin 131322ce05c9SColin Percival if (ut->p == (void *)(intptr_t)(-1)) 1314670b9e9fSJohn Baldwin printf("malloc_init()\n"); 131522ce05c9SColin Percival else if (ut->s == 0) 1316670b9e9fSJohn Baldwin printf("free(%p)\n", ut->p); 131722ce05c9SColin Percival else if (ut->p == NULL) 131822ce05c9SColin Percival printf("%p = malloc(%zu)\n", ut->r, ut->s); 1319670b9e9fSJohn Baldwin else 1320670b9e9fSJohn Baldwin printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s); 1321670b9e9fSJohn Baldwin } 1322670b9e9fSJohn Baldwin 132391fbb9c1SDavid Malone void 132491fbb9c1SDavid Malone ktruser(int len, unsigned char *p) 132582e2dd32SPoul-Henning Kamp { 1326670b9e9fSJohn Baldwin 13271f4b63f8SJohn Baldwin if (len >= 8 && bcmp(p, "RTLD", 4) == 0) { 13281f4b63f8SJohn Baldwin ktruser_rtld(len, p); 13291f4b63f8SJohn Baldwin return; 13301f4b63f8SJohn Baldwin } 13311f4b63f8SJohn Baldwin 1332670b9e9fSJohn Baldwin if (len == sizeof(struct utrace_malloc)) { 1333670b9e9fSJohn Baldwin ktruser_malloc(len, p); 1334670b9e9fSJohn Baldwin return; 1335670b9e9fSJohn Baldwin } 1336670b9e9fSJohn Baldwin 133709307b25SDag-Erling Smørgrav printf("%d ", len); 13383f8ba9aeSPoul-Henning Kamp while (len--) 1339743f9174SPoul-Henning Kamp if (decimal) 134009307b25SDag-Erling Smørgrav printf(" %d", *p++); 1341743f9174SPoul-Henning Kamp else 134209307b25SDag-Erling Smørgrav printf(" %02x", *p++); 134309307b25SDag-Erling Smørgrav printf("\n"); 134482e2dd32SPoul-Henning Kamp } 134582e2dd32SPoul-Henning Kamp 134691fbb9c1SDavid Malone void 134760e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa) 134860e15db9SDag-Erling Smørgrav { 134960e15db9SDag-Erling Smørgrav /* 135060e15db9SDag-Erling Smørgrav TODO: Support additional address families 135160e15db9SDag-Erling Smørgrav #include <netnatm/natm.h> 135260e15db9SDag-Erling Smørgrav struct sockaddr_natm *natm; 135360e15db9SDag-Erling Smørgrav #include <netsmb/netbios.h> 135460e15db9SDag-Erling Smørgrav struct sockaddr_nb *nb; 135560e15db9SDag-Erling Smørgrav */ 135660e15db9SDag-Erling Smørgrav char addr[64]; 135760e15db9SDag-Erling Smørgrav 135860e15db9SDag-Erling Smørgrav /* 135960e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that sa points to a 136060e15db9SDag-Erling Smørgrav * buffer at least sizeof(struct sockaddr) bytes long and exactly 136160e15db9SDag-Erling Smørgrav * sa->sa_len bytes long. 136260e15db9SDag-Erling Smørgrav */ 136360e15db9SDag-Erling Smørgrav printf("struct sockaddr { "); 136460e15db9SDag-Erling Smørgrav sockfamilyname(sa->sa_family); 136560e15db9SDag-Erling Smørgrav printf(", "); 136660e15db9SDag-Erling Smørgrav 136760e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n) \ 136860e15db9SDag-Erling Smørgrav if (sa_##n->s##n##_len < sizeof(struct sockaddr_##n)) { \ 136960e15db9SDag-Erling Smørgrav printf("invalid"); \ 137060e15db9SDag-Erling Smørgrav break; \ 137160e15db9SDag-Erling Smørgrav } 137260e15db9SDag-Erling Smørgrav 137360e15db9SDag-Erling Smørgrav switch(sa->sa_family) { 137460e15db9SDag-Erling Smørgrav case AF_INET: { 137560e15db9SDag-Erling Smørgrav struct sockaddr_in *sa_in; 137660e15db9SDag-Erling Smørgrav 137760e15db9SDag-Erling Smørgrav sa_in = (struct sockaddr_in *)sa; 137860e15db9SDag-Erling Smørgrav check_sockaddr_len(in); 137960e15db9SDag-Erling Smørgrav inet_ntop(AF_INET, &sa_in->sin_addr, addr, sizeof addr); 138060e15db9SDag-Erling Smørgrav printf("%s:%u", addr, ntohs(sa_in->sin_port)); 138160e15db9SDag-Erling Smørgrav break; 138260e15db9SDag-Erling Smørgrav } 138360e15db9SDag-Erling Smørgrav #ifdef NETATALK 138460e15db9SDag-Erling Smørgrav case AF_APPLETALK: { 138560e15db9SDag-Erling Smørgrav struct sockaddr_at *sa_at; 138660e15db9SDag-Erling Smørgrav struct netrange *nr; 138760e15db9SDag-Erling Smørgrav 138860e15db9SDag-Erling Smørgrav sa_at = (struct sockaddr_at *)sa; 138960e15db9SDag-Erling Smørgrav check_sockaddr_len(at); 139060e15db9SDag-Erling Smørgrav nr = &sa_at->sat_range.r_netrange; 139160e15db9SDag-Erling Smørgrav printf("%d.%d, %d-%d, %d", ntohs(sa_at->sat_addr.s_net), 139260e15db9SDag-Erling Smørgrav sa_at->sat_addr.s_node, ntohs(nr->nr_firstnet), 139360e15db9SDag-Erling Smørgrav ntohs(nr->nr_lastnet), nr->nr_phase); 139460e15db9SDag-Erling Smørgrav break; 139560e15db9SDag-Erling Smørgrav } 139660e15db9SDag-Erling Smørgrav #endif 139760e15db9SDag-Erling Smørgrav case AF_INET6: { 139860e15db9SDag-Erling Smørgrav struct sockaddr_in6 *sa_in6; 139960e15db9SDag-Erling Smørgrav 140060e15db9SDag-Erling Smørgrav sa_in6 = (struct sockaddr_in6 *)sa; 140160e15db9SDag-Erling Smørgrav check_sockaddr_len(in6); 140260e15db9SDag-Erling Smørgrav inet_ntop(AF_INET6, &sa_in6->sin6_addr, addr, sizeof addr); 140360e15db9SDag-Erling Smørgrav printf("[%s]:%u", addr, htons(sa_in6->sin6_port)); 140460e15db9SDag-Erling Smørgrav break; 140560e15db9SDag-Erling Smørgrav } 140660e15db9SDag-Erling Smørgrav #ifdef IPX 140760e15db9SDag-Erling Smørgrav case AF_IPX: { 140860e15db9SDag-Erling Smørgrav struct sockaddr_ipx *sa_ipx; 140960e15db9SDag-Erling Smørgrav 141060e15db9SDag-Erling Smørgrav sa_ipx = (struct sockaddr_ipx *)sa; 141160e15db9SDag-Erling Smørgrav check_sockaddr_len(ipx); 141260e15db9SDag-Erling Smørgrav /* XXX wish we had ipx_ntop */ 141360e15db9SDag-Erling Smørgrav printf("%s", ipx_ntoa(sa_ipx->sipx_addr)); 141460e15db9SDag-Erling Smørgrav break; 141560e15db9SDag-Erling Smørgrav } 141660e15db9SDag-Erling Smørgrav #endif 141760e15db9SDag-Erling Smørgrav case AF_UNIX: { 141860e15db9SDag-Erling Smørgrav struct sockaddr_un *sa_un; 141960e15db9SDag-Erling Smørgrav 142060e15db9SDag-Erling Smørgrav sa_un = (struct sockaddr_un *)sa; 142160e15db9SDag-Erling Smørgrav check_sockaddr_len(un); 142260e15db9SDag-Erling Smørgrav printf("%.*s", (int)sizeof(sa_un->sun_path), sa_un->sun_path); 142360e15db9SDag-Erling Smørgrav break; 142460e15db9SDag-Erling Smørgrav } 142560e15db9SDag-Erling Smørgrav default: 142660e15db9SDag-Erling Smørgrav printf("unknown address family"); 142760e15db9SDag-Erling Smørgrav } 142860e15db9SDag-Erling Smørgrav printf(" }\n"); 142960e15db9SDag-Erling Smørgrav } 143060e15db9SDag-Erling Smørgrav 143160e15db9SDag-Erling Smørgrav void 143260e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp) 143360e15db9SDag-Erling Smørgrav { 143460e15db9SDag-Erling Smørgrav char mode[12], timestr[PATH_MAX + 4]; 143560e15db9SDag-Erling Smørgrav struct passwd *pwd; 143660e15db9SDag-Erling Smørgrav struct group *grp; 143760e15db9SDag-Erling Smørgrav struct tm *tm; 143860e15db9SDag-Erling Smørgrav 143960e15db9SDag-Erling Smørgrav /* 144060e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that statp points to a 144160e15db9SDag-Erling Smørgrav * buffer exactly sizeof(struct stat) bytes long. 144260e15db9SDag-Erling Smørgrav */ 144360e15db9SDag-Erling Smørgrav printf("struct stat {"); 144460e15db9SDag-Erling Smørgrav strmode(statp->st_mode, mode); 144560e15db9SDag-Erling Smørgrav printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ", 144660e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode, 144760e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_nlink); 144860e15db9SDag-Erling Smørgrav if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL) 144960e15db9SDag-Erling Smørgrav printf("uid=%ju, ", (uintmax_t)statp->st_uid); 145060e15db9SDag-Erling Smørgrav else 145160e15db9SDag-Erling Smørgrav printf("uid=\"%s\", ", pwd->pw_name); 145260e15db9SDag-Erling Smørgrav if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL) 145360e15db9SDag-Erling Smørgrav printf("gid=%ju, ", (uintmax_t)statp->st_gid); 145460e15db9SDag-Erling Smørgrav else 145560e15db9SDag-Erling Smørgrav printf("gid=\"%s\", ", grp->gr_name); 145660e15db9SDag-Erling Smørgrav printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); 145760e15db9SDag-Erling Smørgrav printf("atime="); 145860e15db9SDag-Erling Smørgrav if (resolv == 0) 145999742a23SEd Schouten printf("%jd", (intmax_t)statp->st_atim.tv_sec); 146060e15db9SDag-Erling Smørgrav else { 146199742a23SEd Schouten tm = localtime(&statp->st_atim.tv_sec); 146209307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 146360e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 146460e15db9SDag-Erling Smørgrav } 146599742a23SEd Schouten if (statp->st_atim.tv_nsec != 0) 146699742a23SEd Schouten printf(".%09ld, ", statp->st_atim.tv_nsec); 146760e15db9SDag-Erling Smørgrav else 146860e15db9SDag-Erling Smørgrav printf(", "); 146960e15db9SDag-Erling Smørgrav printf("stime="); 147060e15db9SDag-Erling Smørgrav if (resolv == 0) 147199742a23SEd Schouten printf("%jd", (intmax_t)statp->st_mtim.tv_sec); 147260e15db9SDag-Erling Smørgrav else { 147399742a23SEd Schouten tm = localtime(&statp->st_mtim.tv_sec); 147409307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 147560e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 147660e15db9SDag-Erling Smørgrav } 147799742a23SEd Schouten if (statp->st_mtim.tv_nsec != 0) 147899742a23SEd Schouten printf(".%09ld, ", statp->st_mtim.tv_nsec); 147960e15db9SDag-Erling Smørgrav else 148060e15db9SDag-Erling Smørgrav printf(", "); 148160e15db9SDag-Erling Smørgrav printf("ctime="); 148260e15db9SDag-Erling Smørgrav if (resolv == 0) 148399742a23SEd Schouten printf("%jd", (intmax_t)statp->st_ctim.tv_sec); 148460e15db9SDag-Erling Smørgrav else { 148599742a23SEd Schouten tm = localtime(&statp->st_ctim.tv_sec); 148609307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 148760e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 148860e15db9SDag-Erling Smørgrav } 148999742a23SEd Schouten if (statp->st_ctim.tv_nsec != 0) 149099742a23SEd Schouten printf(".%09ld, ", statp->st_ctim.tv_nsec); 149160e15db9SDag-Erling Smørgrav else 149260e15db9SDag-Erling Smørgrav printf(", "); 149360e15db9SDag-Erling Smørgrav printf("birthtime="); 149460e15db9SDag-Erling Smørgrav if (resolv == 0) 149599742a23SEd Schouten printf("%jd", (intmax_t)statp->st_birthtim.tv_sec); 149660e15db9SDag-Erling Smørgrav else { 149799742a23SEd Schouten tm = localtime(&statp->st_birthtim.tv_sec); 149809307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 149960e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 150060e15db9SDag-Erling Smørgrav } 150199742a23SEd Schouten if (statp->st_birthtim.tv_nsec != 0) 150299742a23SEd Schouten printf(".%09ld, ", statp->st_birthtim.tv_nsec); 150360e15db9SDag-Erling Smørgrav else 150460e15db9SDag-Erling Smørgrav printf(", "); 150560e15db9SDag-Erling Smørgrav printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x", 150660e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize, 150760e15db9SDag-Erling Smørgrav (intmax_t)statp->st_blocks, statp->st_flags); 150860e15db9SDag-Erling Smørgrav printf(" }\n"); 150960e15db9SDag-Erling Smørgrav } 151060e15db9SDag-Erling Smørgrav 151160e15db9SDag-Erling Smørgrav void 151260e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen) 151360e15db9SDag-Erling Smørgrav { 151460e15db9SDag-Erling Smørgrav char *name, *data; 151560e15db9SDag-Erling Smørgrav size_t namelen, datalen; 151660e15db9SDag-Erling Smørgrav int i; 151730c1278fSWarner Losh struct stat sb; 151830c1278fSWarner Losh struct sockaddr_storage ss; 151960e15db9SDag-Erling Smørgrav 152060e15db9SDag-Erling Smørgrav for (name = buf, namelen = 0; 152160e15db9SDag-Erling Smørgrav namelen < buflen && name[namelen] != '\0'; 152260e15db9SDag-Erling Smørgrav ++namelen) 152360e15db9SDag-Erling Smørgrav /* nothing */; 152460e15db9SDag-Erling Smørgrav if (namelen == buflen) 152560e15db9SDag-Erling Smørgrav goto invalid; 152660e15db9SDag-Erling Smørgrav if (name[namelen] != '\0') 152760e15db9SDag-Erling Smørgrav goto invalid; 152860e15db9SDag-Erling Smørgrav data = buf + namelen + 1; 152960e15db9SDag-Erling Smørgrav datalen = buflen - namelen - 1; 153060e15db9SDag-Erling Smørgrav if (datalen == 0) 153160e15db9SDag-Erling Smørgrav goto invalid; 153260e15db9SDag-Erling Smørgrav /* sanity check */ 153360e15db9SDag-Erling Smørgrav for (i = 0; i < namelen; ++i) 153460e15db9SDag-Erling Smørgrav if (!isalpha((unsigned char)name[i])) 153560e15db9SDag-Erling Smørgrav goto invalid; 153660e15db9SDag-Erling Smørgrav if (strcmp(name, "stat") == 0) { 153760e15db9SDag-Erling Smørgrav if (datalen != sizeof(struct stat)) 153860e15db9SDag-Erling Smørgrav goto invalid; 153930c1278fSWarner Losh memcpy(&sb, data, datalen); 154030c1278fSWarner Losh ktrstat(&sb); 154160e15db9SDag-Erling Smørgrav } else if (strcmp(name, "sockaddr") == 0) { 154230c1278fSWarner Losh if (datalen > sizeof(ss)) 154360e15db9SDag-Erling Smørgrav goto invalid; 154430c1278fSWarner Losh memcpy(&ss, data, datalen); 154530c1278fSWarner Losh if (datalen < sizeof(struct sockaddr) || 154630c1278fSWarner Losh datalen != ss.ss_len) 154730c1278fSWarner Losh goto invalid; 154830c1278fSWarner Losh ktrsockaddr((struct sockaddr *)&ss); 154960e15db9SDag-Erling Smørgrav } else { 155060e15db9SDag-Erling Smørgrav printf("unknown structure\n"); 155160e15db9SDag-Erling Smørgrav } 155260e15db9SDag-Erling Smørgrav return; 155360e15db9SDag-Erling Smørgrav invalid: 155460e15db9SDag-Erling Smørgrav printf("invalid record\n"); 155560e15db9SDag-Erling Smørgrav } 155660e15db9SDag-Erling Smørgrav 1557dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 1558dde5f9b9SDmitry Chagin void 1559dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr) 1560dde5f9b9SDmitry Chagin { 1561dde5f9b9SDmitry Chagin int narg = ktr->ktr_narg; 1562dde5f9b9SDmitry Chagin register_t *ip; 1563dde5f9b9SDmitry Chagin 1564dde5f9b9SDmitry Chagin if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0) 1565dde5f9b9SDmitry Chagin printf("[%d]", ktr->ktr_code); 1566dde5f9b9SDmitry Chagin else 1567dde5f9b9SDmitry Chagin printf("%s", linux_syscallnames[ktr->ktr_code]); 1568dde5f9b9SDmitry Chagin ip = &ktr->ktr_args[0]; 1569dde5f9b9SDmitry Chagin if (narg) { 1570dde5f9b9SDmitry Chagin char c = '('; 1571dde5f9b9SDmitry Chagin while (narg > 0) 1572dde5f9b9SDmitry Chagin print_number(ip, narg, c); 1573dde5f9b9SDmitry Chagin putchar(')'); 1574dde5f9b9SDmitry Chagin } 1575dde5f9b9SDmitry Chagin putchar('\n'); 1576dde5f9b9SDmitry Chagin } 1577dde5f9b9SDmitry Chagin 1578dde5f9b9SDmitry Chagin void 1579dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr) 1580dde5f9b9SDmitry Chagin { 1581dde5f9b9SDmitry Chagin register_t ret = ktr->ktr_retval; 1582dde5f9b9SDmitry Chagin int error = ktr->ktr_error; 1583dde5f9b9SDmitry Chagin int code = ktr->ktr_code; 1584dde5f9b9SDmitry Chagin 1585dde5f9b9SDmitry Chagin if (code >= nlinux_syscalls || code < 0) 1586dde5f9b9SDmitry Chagin printf("[%d] ", code); 1587dde5f9b9SDmitry Chagin else 1588dde5f9b9SDmitry Chagin printf("%s ", linux_syscallnames[code]); 1589dde5f9b9SDmitry Chagin 1590dde5f9b9SDmitry Chagin if (error == 0) { 1591dde5f9b9SDmitry Chagin if (fancy) { 1592dde5f9b9SDmitry Chagin printf("%ld", (long)ret); 1593dde5f9b9SDmitry Chagin if (ret < 0 || ret > 9) 159409307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 1595dde5f9b9SDmitry Chagin } else { 1596dde5f9b9SDmitry Chagin if (decimal) 1597dde5f9b9SDmitry Chagin printf("%ld", (long)ret); 1598dde5f9b9SDmitry Chagin else 159909307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 1600dde5f9b9SDmitry Chagin } 1601dde5f9b9SDmitry Chagin } else if (error == ERESTART) 1602dde5f9b9SDmitry Chagin printf("RESTART"); 1603dde5f9b9SDmitry Chagin else if (error == EJUSTRETURN) 1604dde5f9b9SDmitry Chagin printf("JUSTRETURN"); 1605dde5f9b9SDmitry Chagin else { 1606dde5f9b9SDmitry Chagin if (ktr->ktr_error <= ELAST + 1) 1607dde5f9b9SDmitry Chagin error = abs(bsd_to_linux_errno[ktr->ktr_error]); 1608dde5f9b9SDmitry Chagin else 1609dde5f9b9SDmitry Chagin error = 999; 1610dde5f9b9SDmitry Chagin printf("-1 errno %d", error); 1611dde5f9b9SDmitry Chagin if (fancy) 1612dde5f9b9SDmitry Chagin printf(" %s", strerror(ktr->ktr_error)); 1613dde5f9b9SDmitry Chagin } 1614dde5f9b9SDmitry Chagin putchar('\n'); 1615dde5f9b9SDmitry Chagin } 1616dde5f9b9SDmitry Chagin #endif 1617dde5f9b9SDmitry Chagin 161860e15db9SDag-Erling Smørgrav void 161991fbb9c1SDavid Malone usage(void) 16209b50d902SRodney W. Grimes { 16217144d36fSDmitry Chagin fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] " 1622da647ae9SRuslan Ermilov "[-m maxdata] [-p pid] [-t trstr]\n"); 16239b50d902SRodney W. Grimes exit(1); 16249b50d902SRodney W. Grimes } 1625