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> 49f9b20fc8SPawel Jakub Dawidek #include <sys/capability.h> 509b50d902SRodney W. Grimes #include <sys/errno.h> 5191fbb9c1SDavid Malone #define _KERNEL 529b50d902SRodney W. Grimes #include <sys/time.h> 5391fbb9c1SDavid Malone #undef _KERNEL 549b50d902SRodney W. Grimes #include <sys/uio.h> 559b50d902SRodney W. Grimes #include <sys/ktrace.h> 569b50d902SRodney W. Grimes #include <sys/ioctl.h> 578bc31d83SCraig Rodrigues #include <sys/socket.h> 5860e15db9SDag-Erling Smørgrav #include <sys/stat.h> 597144d36fSDmitry Chagin #include <sys/sysent.h> 6060e15db9SDag-Erling Smørgrav #include <sys/un.h> 617144d36fSDmitry Chagin #include <sys/queue.h> 6260e15db9SDag-Erling Smørgrav #ifdef IPX 6360e15db9SDag-Erling Smørgrav #include <sys/types.h> 6460e15db9SDag-Erling Smørgrav #include <netipx/ipx.h> 6560e15db9SDag-Erling Smørgrav #endif 6660e15db9SDag-Erling Smørgrav #ifdef NETATALK 6760e15db9SDag-Erling Smørgrav #include <netatalk/at.h> 6860e15db9SDag-Erling Smørgrav #endif 691a604cfaSXin LI #include <arpa/inet.h> 7060e15db9SDag-Erling Smørgrav #include <netinet/in.h> 711a604cfaSXin LI #include <ctype.h> 721f4b63f8SJohn Baldwin #include <dlfcn.h> 7315fc002bSPhilippe Charnier #include <err.h> 7460e15db9SDag-Erling Smørgrav #include <grp.h> 7560e15db9SDag-Erling Smørgrav #include <inttypes.h> 7615fc002bSPhilippe Charnier #include <locale.h> 77b9ef8051SAndrey V. Elsukov #include <netdb.h> 78f9b20fc8SPawel Jakub Dawidek #include <nl_types.h> 7960e15db9SDag-Erling Smørgrav #include <pwd.h> 809b50d902SRodney W. Grimes #include <stdio.h> 819b50d902SRodney W. Grimes #include <stdlib.h> 829b50d902SRodney W. Grimes #include <string.h> 83f9b20fc8SPawel Jakub Dawidek #include <termios.h> 8460e15db9SDag-Erling Smørgrav #include <time.h> 8515fc002bSPhilippe Charnier #include <unistd.h> 8615fc002bSPhilippe Charnier #include <vis.h> 879b50d902SRodney W. Grimes #include "ktrace.h" 8898a68a58SAlexander Leidinger #include "kdump_subr.h" 899b50d902SRodney W. Grimes 907144d36fSDmitry Chagin u_int abidump(struct ktr_header *); 917144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *); 9291fbb9c1SDavid Malone int fread_tail(void *, int, int); 9391fbb9c1SDavid Malone void dumpheader(struct ktr_header *); 947144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int); 957144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int); 9691fbb9c1SDavid Malone void ktrnamei(char *, int); 97ec4beb5dSPeter Wemm void hexdump(char *, int, int); 98ec4beb5dSPeter Wemm void visdump(char *, int, int); 9991fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int); 100dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *); 10191fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *); 10288bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *); 10381a31394SDag-Erling Smørgrav void ktruser_malloc(unsigned char *); 10481a31394SDag-Erling Smørgrav void ktruser_rtld(int, unsigned char *); 10591fbb9c1SDavid Malone void ktruser(int, unsigned char *); 10660e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *); 10760e15db9SDag-Erling Smørgrav void ktrstat(struct stat *); 10860e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t); 109c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *); 11035818d2eSJohn Baldwin void ktrfault(struct ktr_fault *); 11135818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *); 112f9b20fc8SPawel Jakub Dawidek void limitfd(int fd); 11391fbb9c1SDavid Malone void usage(void); 114d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int); 11591fbb9c1SDavid Malone 11660e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, 1177144d36fSDmitry Chagin resolv = 0, abiflag = 0; 11891fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE; 1199b50d902SRodney W. Grimes struct ktr_header ktr_header; 1209b50d902SRodney W. Grimes 12160e15db9SDag-Erling Smørgrav #define TIME_FORMAT "%b %e %T %Y" 1229b50d902SRodney W. Grimes #define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 1239b50d902SRodney W. Grimes 12495bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do { \ 125dde5f9b9SDmitry Chagin if (decimal) \ 126e4bb45b1SDag-Erling Smørgrav printf("%c%jd", c, (intmax_t)*i); \ 127dde5f9b9SDmitry Chagin else \ 128661522f5SDag-Erling Smørgrav printf("%c%#jx", c, (uintmax_t)(u_register_t)*i); \ 129dde5f9b9SDmitry Chagin i++; \ 130dde5f9b9SDmitry Chagin n--; \ 131dde5f9b9SDmitry Chagin c = ','; \ 132e4bb45b1SDag-Erling Smørgrav } while (0) 133dde5f9b9SDmitry Chagin 134dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 135dde5f9b9SDmitry Chagin 136dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *); 137dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *); 138dde5f9b9SDmitry Chagin extern char *linux_syscallnames[]; 139dde5f9b9SDmitry Chagin extern int nlinux_syscalls; 140dde5f9b9SDmitry Chagin 141dde5f9b9SDmitry Chagin /* 142dde5f9b9SDmitry Chagin * from linux.h 143dde5f9b9SDmitry Chagin * Linux syscalls return negative errno's, we do positive and map them 144dde5f9b9SDmitry Chagin */ 145dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = { 146dde5f9b9SDmitry Chagin -0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 147dde5f9b9SDmitry Chagin -10, -35, -12, -13, -14, -15, -16, -17, -18, -19, 148dde5f9b9SDmitry Chagin -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, 149dde5f9b9SDmitry Chagin -30, -31, -32, -33, -34, -11,-115,-114, -88, -89, 150dde5f9b9SDmitry Chagin -90, -91, -92, -93, -94, -95, -96, -97, -98, -99, 151dde5f9b9SDmitry Chagin -100,-101,-102,-103,-104,-105,-106,-107,-108,-109, 152dde5f9b9SDmitry Chagin -110,-111, -40, -36,-112,-113, -39, -11, -87,-122, 153dde5f9b9SDmitry Chagin -116, -66, -6, -6, -6, -6, -6, -37, -38, -9, 154dde5f9b9SDmitry Chagin -6, -6, -43, -42, -75,-125, -84, -95, -16, -74, 155dde5f9b9SDmitry Chagin -72, -67, -71 156dde5f9b9SDmitry Chagin }; 157dde5f9b9SDmitry Chagin #endif 158dde5f9b9SDmitry Chagin 1597144d36fSDmitry Chagin struct proc_info 1607144d36fSDmitry Chagin { 1617144d36fSDmitry Chagin TAILQ_ENTRY(proc_info) info; 1627144d36fSDmitry Chagin u_int sv_flags; 1637144d36fSDmitry Chagin pid_t pid; 1647144d36fSDmitry Chagin }; 1657144d36fSDmitry Chagin 1667144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs; 1677144d36fSDmitry Chagin 16891fbb9c1SDavid Malone int 16991fbb9c1SDavid Malone main(int argc, char *argv[]) 1709b50d902SRodney W. Grimes { 1719b50d902SRodney W. Grimes int ch, ktrlen, size; 17291fbb9c1SDavid Malone void *m; 1739b50d902SRodney W. Grimes int trpoints = ALL_POINTS; 174db53f66bSJohn Baldwin int drop_logged; 175ec4beb5dSPeter Wemm pid_t pid = 0; 1767144d36fSDmitry Chagin u_int sv_flags; 1779b50d902SRodney W. Grimes 17809307b25SDag-Erling Smørgrav setlocale(LC_CTYPE, ""); 1795ccbfb26SAndrey A. Chernov 1807144d36fSDmitry Chagin while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1) 18109307b25SDag-Erling Smørgrav switch (ch) { 1827144d36fSDmitry Chagin case 'A': 1837144d36fSDmitry Chagin abiflag = 1; 1847144d36fSDmitry Chagin break; 1859b50d902SRodney W. Grimes case 'f': 1869b50d902SRodney W. Grimes tracefile = optarg; 1879b50d902SRodney W. Grimes break; 1889b50d902SRodney W. Grimes case 'd': 1899b50d902SRodney W. Grimes decimal = 1; 1909b50d902SRodney W. Grimes break; 1919b50d902SRodney W. Grimes case 'l': 1929b50d902SRodney W. Grimes tail = 1; 1939b50d902SRodney W. Grimes break; 1949b50d902SRodney W. Grimes case 'm': 1959b50d902SRodney W. Grimes maxdata = atoi(optarg); 1969b50d902SRodney W. Grimes break; 1979b50d902SRodney W. Grimes case 'n': 1989b50d902SRodney W. Grimes fancy = 0; 1999b50d902SRodney W. Grimes break; 200ec4beb5dSPeter Wemm case 'p': 201ec4beb5dSPeter Wemm pid = atoi(optarg); 202ec4beb5dSPeter Wemm break; 20360e15db9SDag-Erling Smørgrav case 'r': 20460e15db9SDag-Erling Smørgrav resolv = 1; 20560e15db9SDag-Erling Smørgrav break; 206df0c8868SRobert Watson case 's': 207df0c8868SRobert Watson suppressdata = 1; 208df0c8868SRobert Watson break; 209ec131914SPeter Wemm case 'E': 210ec131914SPeter Wemm timestamp = 3; /* elapsed timestamp */ 211ec131914SPeter Wemm break; 212a9ac598bSRobert Watson case 'H': 213a9ac598bSRobert Watson threads = 1; 214a9ac598bSRobert Watson break; 2159b50d902SRodney W. Grimes case 'R': 2169b50d902SRodney W. Grimes timestamp = 2; /* relative timestamp */ 2179b50d902SRodney W. Grimes break; 2189b50d902SRodney W. Grimes case 'T': 2199b50d902SRodney W. Grimes timestamp = 1; 2209b50d902SRodney W. Grimes break; 2219b50d902SRodney W. Grimes case 't': 2229b50d902SRodney W. Grimes trpoints = getpoints(optarg); 22315fc002bSPhilippe Charnier if (trpoints < 0) 22415fc002bSPhilippe Charnier errx(1, "unknown trace point in %s", optarg); 2259b50d902SRodney W. Grimes break; 2269b50d902SRodney W. Grimes default: 2279b50d902SRodney W. Grimes usage(); 2289b50d902SRodney W. Grimes } 2299b50d902SRodney W. Grimes 23080844fd1SBill Fenner if (argc > optind) 2319b50d902SRodney W. Grimes usage(); 2329b50d902SRodney W. Grimes 23309307b25SDag-Erling Smørgrav m = malloc(size = 1025); 23415fc002bSPhilippe Charnier if (m == NULL) 23515fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 23615fc002bSPhilippe Charnier if (!freopen(tracefile, "r", stdin)) 23715fc002bSPhilippe Charnier err(1, "%s", tracefile); 238f9b20fc8SPawel Jakub Dawidek 239f9b20fc8SPawel Jakub Dawidek /* 240f9b20fc8SPawel Jakub Dawidek * Cache NLS data before entering capability mode. 241f9b20fc8SPawel Jakub Dawidek * XXXPJD: There should be strerror_init() and strsignal_init() in libc. 242f9b20fc8SPawel Jakub Dawidek */ 243f9b20fc8SPawel Jakub Dawidek (void)catopen("libc", NL_CAT_LOCALE); 244d2c9ca44SPawel Jakub Dawidek if (resolv == 0) { 245f9b20fc8SPawel Jakub Dawidek if (cap_enter() < 0 && errno != ENOSYS) 246f9b20fc8SPawel Jakub Dawidek err(1, "unable to enter capability mode"); 247d2c9ca44SPawel Jakub Dawidek } 248f9b20fc8SPawel Jakub Dawidek limitfd(STDIN_FILENO); 249f9b20fc8SPawel Jakub Dawidek limitfd(STDOUT_FILENO); 250f9b20fc8SPawel Jakub Dawidek limitfd(STDERR_FILENO); 251f9b20fc8SPawel Jakub Dawidek 2527144d36fSDmitry Chagin TAILQ_INIT(&trace_procs); 253db53f66bSJohn Baldwin drop_logged = 0; 2549b50d902SRodney W. Grimes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 255db53f66bSJohn Baldwin if (ktr_header.ktr_type & KTR_DROP) { 256db53f66bSJohn Baldwin ktr_header.ktr_type &= ~KTR_DROP; 257a9ac598bSRobert Watson if (!drop_logged && threads) { 25809307b25SDag-Erling Smørgrav printf( 259c065c0b8SJaakko Heinonen "%6jd %6jd %-8.*s Events dropped.\n", 260c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, 261c065c0b8SJaakko Heinonen ktr_header.ktr_tid > 0 ? 262c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_tid : 0, 263c065c0b8SJaakko Heinonen MAXCOMLEN, ktr_header.ktr_comm); 264a9ac598bSRobert Watson drop_logged = 1; 265a9ac598bSRobert Watson } else if (!drop_logged) { 26609307b25SDag-Erling Smørgrav printf("%6jd %-8.*s Events dropped.\n", 267c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, MAXCOMLEN, 268db53f66bSJohn Baldwin ktr_header.ktr_comm); 269db53f66bSJohn Baldwin drop_logged = 1; 270db53f66bSJohn Baldwin } 271db53f66bSJohn Baldwin } 2729b50d902SRodney W. Grimes if (trpoints & (1<<ktr_header.ktr_type)) 27301a36e29SJohn Baldwin if (pid == 0 || ktr_header.ktr_pid == pid || 27401a36e29SJohn Baldwin ktr_header.ktr_tid == pid) 2759b50d902SRodney W. Grimes dumpheader(&ktr_header); 27615fc002bSPhilippe Charnier if ((ktrlen = ktr_header.ktr_len) < 0) 27715fc002bSPhilippe Charnier errx(1, "bogus length 0x%x", ktrlen); 2789b50d902SRodney W. Grimes if (ktrlen > size) { 27909307b25SDag-Erling Smørgrav m = realloc(m, ktrlen+1); 28015fc002bSPhilippe Charnier if (m == NULL) 28115fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 2829b50d902SRodney W. Grimes size = ktrlen; 2839b50d902SRodney W. Grimes } 28415fc002bSPhilippe Charnier if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 28515fc002bSPhilippe Charnier errx(1, "data too short"); 2867144d36fSDmitry Chagin if (fetchprocinfo(&ktr_header, (u_int *)m) != 0) 2877144d36fSDmitry Chagin continue; 2887144d36fSDmitry Chagin sv_flags = abidump(&ktr_header); 28901a36e29SJohn Baldwin if (pid && ktr_header.ktr_pid != pid && 29001a36e29SJohn Baldwin ktr_header.ktr_tid != pid) 291ec4beb5dSPeter Wemm continue; 2929b50d902SRodney W. Grimes if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 2939b50d902SRodney W. Grimes continue; 294db53f66bSJohn Baldwin drop_logged = 0; 2959b50d902SRodney W. Grimes switch (ktr_header.ktr_type) { 2969b50d902SRodney W. Grimes case KTR_SYSCALL: 297dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 298dde5f9b9SDmitry Chagin if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX) 299dde5f9b9SDmitry Chagin linux_ktrsyscall((struct ktr_syscall *)m); 300dde5f9b9SDmitry Chagin else 301dde5f9b9SDmitry Chagin #endif 3027144d36fSDmitry Chagin ktrsyscall((struct ktr_syscall *)m, sv_flags); 3039b50d902SRodney W. Grimes break; 3049b50d902SRodney W. Grimes case KTR_SYSRET: 305dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 306dde5f9b9SDmitry Chagin if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX) 307dde5f9b9SDmitry Chagin linux_ktrsysret((struct ktr_sysret *)m); 308dde5f9b9SDmitry Chagin else 309dde5f9b9SDmitry Chagin #endif 3107144d36fSDmitry Chagin ktrsysret((struct ktr_sysret *)m, sv_flags); 3119b50d902SRodney W. Grimes break; 3129b50d902SRodney W. Grimes case KTR_NAMEI: 313a56be37eSJohn Baldwin case KTR_SYSCTL: 3149b50d902SRodney W. Grimes ktrnamei(m, ktrlen); 3159b50d902SRodney W. Grimes break; 3169b50d902SRodney W. Grimes case KTR_GENIO: 3179b50d902SRodney W. Grimes ktrgenio((struct ktr_genio *)m, ktrlen); 3189b50d902SRodney W. Grimes break; 3199b50d902SRodney W. Grimes case KTR_PSIG: 320dde5f9b9SDmitry Chagin ktrpsig((struct ktr_psig *)m); 3219b50d902SRodney W. Grimes break; 3229b50d902SRodney W. Grimes case KTR_CSW: 32388bf5036SJohn Baldwin if (ktrlen == sizeof(struct ktr_csw_old)) 32488bf5036SJohn Baldwin ktrcsw_old((struct ktr_csw_old *)m); 32588bf5036SJohn Baldwin else 3269b50d902SRodney W. Grimes ktrcsw((struct ktr_csw *)m); 3279b50d902SRodney W. Grimes break; 32882e2dd32SPoul-Henning Kamp case KTR_USER: 3293f8ba9aeSPoul-Henning Kamp ktruser(ktrlen, m); 33082e2dd32SPoul-Henning Kamp break; 33160e15db9SDag-Erling Smørgrav case KTR_STRUCT: 33260e15db9SDag-Erling Smørgrav ktrstruct(m, ktrlen); 33360e15db9SDag-Erling Smørgrav break; 334c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 335c601ad8eSDag-Erling Smørgrav ktrcapfail((struct ktr_cap_fail *)m); 33635818d2eSJohn Baldwin break; 33735818d2eSJohn Baldwin case KTR_FAULT: 33835818d2eSJohn Baldwin ktrfault((struct ktr_fault *)m); 33935818d2eSJohn Baldwin break; 34035818d2eSJohn Baldwin case KTR_FAULTEND: 34135818d2eSJohn Baldwin ktrfaultend((struct ktr_faultend *)m); 34235818d2eSJohn Baldwin break; 343b9609ab1SJohn Baldwin default: 344b9609ab1SJohn Baldwin printf("\n"); 345b9609ab1SJohn Baldwin break; 3469b50d902SRodney W. Grimes } 3479b50d902SRodney W. Grimes if (tail) 34809307b25SDag-Erling Smørgrav fflush(stdout); 3499b50d902SRodney W. Grimes } 35091fbb9c1SDavid Malone return 0; 3519b50d902SRodney W. Grimes } 3529b50d902SRodney W. Grimes 353f9b20fc8SPawel Jakub Dawidek void 354f9b20fc8SPawel Jakub Dawidek limitfd(int fd) 355f9b20fc8SPawel Jakub Dawidek { 356f9b20fc8SPawel Jakub Dawidek cap_rights_t rights; 357f9b20fc8SPawel Jakub Dawidek unsigned long cmd; 358f9b20fc8SPawel Jakub Dawidek 359f9b20fc8SPawel Jakub Dawidek rights = CAP_FSTAT; 360f9b20fc8SPawel Jakub Dawidek cmd = -1; 361f9b20fc8SPawel Jakub Dawidek 362f9b20fc8SPawel Jakub Dawidek switch (fd) { 363f9b20fc8SPawel Jakub Dawidek case STDIN_FILENO: 364f9b20fc8SPawel Jakub Dawidek rights |= CAP_READ; 365f9b20fc8SPawel Jakub Dawidek break; 366f9b20fc8SPawel Jakub Dawidek case STDOUT_FILENO: 367f9b20fc8SPawel Jakub Dawidek rights |= CAP_IOCTL | CAP_WRITE; 368f9b20fc8SPawel Jakub Dawidek cmd = TIOCGETA; /* required by isatty(3) in printf(3) */ 369f9b20fc8SPawel Jakub Dawidek break; 370f9b20fc8SPawel Jakub Dawidek case STDERR_FILENO: 371f9b20fc8SPawel Jakub Dawidek rights |= CAP_WRITE; 372f9b20fc8SPawel Jakub Dawidek if (!suppressdata) { 373f9b20fc8SPawel Jakub Dawidek rights |= CAP_IOCTL; 374f9b20fc8SPawel Jakub Dawidek cmd = TIOCGWINSZ; 375f9b20fc8SPawel Jakub Dawidek } 376f9b20fc8SPawel Jakub Dawidek break; 377f9b20fc8SPawel Jakub Dawidek default: 378f9b20fc8SPawel Jakub Dawidek abort(); 379f9b20fc8SPawel Jakub Dawidek } 380f9b20fc8SPawel Jakub Dawidek 381f9b20fc8SPawel Jakub Dawidek if (cap_rights_limit(fd, rights) < 0 && errno != ENOSYS) 382f9b20fc8SPawel Jakub Dawidek err(1, "unable to limit rights for descriptor %d", fd); 383f9b20fc8SPawel Jakub Dawidek if (cmd != -1 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS) 384f9b20fc8SPawel Jakub Dawidek err(1, "unable to limit ioctls for descriptor %d", fd); 385f9b20fc8SPawel Jakub Dawidek } 386f9b20fc8SPawel Jakub Dawidek 38791fbb9c1SDavid Malone int 38891fbb9c1SDavid Malone fread_tail(void *buf, int size, int num) 3899b50d902SRodney W. Grimes { 3909b50d902SRodney W. Grimes int i; 3919b50d902SRodney W. Grimes 3929b50d902SRodney W. Grimes while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 39309307b25SDag-Erling Smørgrav sleep(1); 3949b50d902SRodney W. Grimes clearerr(stdin); 3959b50d902SRodney W. Grimes } 3969b50d902SRodney W. Grimes return (i); 3979b50d902SRodney W. Grimes } 3989b50d902SRodney W. Grimes 3997144d36fSDmitry Chagin int 4007144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags) 4017144d36fSDmitry Chagin { 4027144d36fSDmitry Chagin struct proc_info *pi; 4037144d36fSDmitry Chagin 4047144d36fSDmitry Chagin switch (kth->ktr_type) { 4057144d36fSDmitry Chagin case KTR_PROCCTOR: 4067144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 4077144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 4087144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 4097144d36fSDmitry Chagin break; 4107144d36fSDmitry Chagin } 4117144d36fSDmitry Chagin } 4127144d36fSDmitry Chagin pi = malloc(sizeof(struct proc_info)); 4137144d36fSDmitry Chagin if (pi == NULL) 4147144d36fSDmitry Chagin errx(1, "%s", strerror(ENOMEM)); 4157144d36fSDmitry Chagin pi->sv_flags = *flags; 4167144d36fSDmitry Chagin pi->pid = kth->ktr_pid; 4177144d36fSDmitry Chagin TAILQ_INSERT_TAIL(&trace_procs, pi, info); 4187144d36fSDmitry Chagin return (1); 4197144d36fSDmitry Chagin 4207144d36fSDmitry Chagin case KTR_PROCDTOR: 4217144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 4227144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 4237144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 4247144d36fSDmitry Chagin free(pi); 4257144d36fSDmitry Chagin break; 4267144d36fSDmitry Chagin } 4277144d36fSDmitry Chagin } 4287144d36fSDmitry Chagin return (1); 4297144d36fSDmitry Chagin } 4307144d36fSDmitry Chagin 4317144d36fSDmitry Chagin return (0); 4327144d36fSDmitry Chagin } 4337144d36fSDmitry Chagin 4347144d36fSDmitry Chagin u_int 4357144d36fSDmitry Chagin abidump(struct ktr_header *kth) 4367144d36fSDmitry Chagin { 4377144d36fSDmitry Chagin struct proc_info *pi; 4387144d36fSDmitry Chagin const char *abi; 4397144d36fSDmitry Chagin const char *arch; 4407144d36fSDmitry Chagin u_int flags = 0; 4417144d36fSDmitry Chagin 4427144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 4437144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 4447144d36fSDmitry Chagin flags = pi->sv_flags; 4457144d36fSDmitry Chagin break; 4467144d36fSDmitry Chagin } 4477144d36fSDmitry Chagin } 4487144d36fSDmitry Chagin 4497144d36fSDmitry Chagin if (abiflag == 0) 4507144d36fSDmitry Chagin return (flags); 4517144d36fSDmitry Chagin 4527144d36fSDmitry Chagin switch (flags & SV_ABI_MASK) { 4537144d36fSDmitry Chagin case SV_ABI_LINUX: 4547144d36fSDmitry Chagin abi = "L"; 4557144d36fSDmitry Chagin break; 4567144d36fSDmitry Chagin case SV_ABI_FREEBSD: 4577144d36fSDmitry Chagin abi = "F"; 4587144d36fSDmitry Chagin break; 4597144d36fSDmitry Chagin default: 4607144d36fSDmitry Chagin abi = "U"; 4617144d36fSDmitry Chagin break; 4627144d36fSDmitry Chagin } 4637144d36fSDmitry Chagin 4647144d36fSDmitry Chagin if (flags != 0) { 4657144d36fSDmitry Chagin if (flags & SV_LP64) 4667144d36fSDmitry Chagin arch = "64"; 4677144d36fSDmitry Chagin else 4687144d36fSDmitry Chagin arch = "32"; 4697144d36fSDmitry Chagin } else 4707144d36fSDmitry Chagin arch = "00"; 4717144d36fSDmitry Chagin 4727144d36fSDmitry Chagin printf("%s%s ", abi, arch); 4737144d36fSDmitry Chagin 4747144d36fSDmitry Chagin return (flags); 4757144d36fSDmitry Chagin } 4767144d36fSDmitry Chagin 47791fbb9c1SDavid Malone void 47891fbb9c1SDavid Malone dumpheader(struct ktr_header *kth) 4799b50d902SRodney W. Grimes { 4809b50d902SRodney W. Grimes static char unknown[64]; 4819b50d902SRodney W. Grimes static struct timeval prevtime, temp; 48291fbb9c1SDavid Malone const char *type; 4839b50d902SRodney W. Grimes 4849b50d902SRodney W. Grimes switch (kth->ktr_type) { 4859b50d902SRodney W. Grimes case KTR_SYSCALL: 4869b50d902SRodney W. Grimes type = "CALL"; 4879b50d902SRodney W. Grimes break; 4889b50d902SRodney W. Grimes case KTR_SYSRET: 4899b50d902SRodney W. Grimes type = "RET "; 4909b50d902SRodney W. Grimes break; 4919b50d902SRodney W. Grimes case KTR_NAMEI: 4929b50d902SRodney W. Grimes type = "NAMI"; 4939b50d902SRodney W. Grimes break; 4949b50d902SRodney W. Grimes case KTR_GENIO: 4959b50d902SRodney W. Grimes type = "GIO "; 4969b50d902SRodney W. Grimes break; 4979b50d902SRodney W. Grimes case KTR_PSIG: 4989b50d902SRodney W. Grimes type = "PSIG"; 4999b50d902SRodney W. Grimes break; 5009b50d902SRodney W. Grimes case KTR_CSW: 5019b50d902SRodney W. Grimes type = "CSW "; 5029b50d902SRodney W. Grimes break; 50382e2dd32SPoul-Henning Kamp case KTR_USER: 50482e2dd32SPoul-Henning Kamp type = "USER"; 50582e2dd32SPoul-Henning Kamp break; 50660e15db9SDag-Erling Smørgrav case KTR_STRUCT: 50760e15db9SDag-Erling Smørgrav type = "STRU"; 50860e15db9SDag-Erling Smørgrav break; 509a56be37eSJohn Baldwin case KTR_SYSCTL: 510a56be37eSJohn Baldwin type = "SCTL"; 511a56be37eSJohn Baldwin break; 5127144d36fSDmitry Chagin case KTR_PROCCTOR: 5137144d36fSDmitry Chagin /* FALLTHROUGH */ 5147144d36fSDmitry Chagin case KTR_PROCDTOR: 5157144d36fSDmitry Chagin return; 516c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 517c601ad8eSDag-Erling Smørgrav type = "CAP "; 518c601ad8eSDag-Erling Smørgrav break; 51935818d2eSJohn Baldwin case KTR_FAULT: 52035818d2eSJohn Baldwin type = "PFLT"; 52135818d2eSJohn Baldwin break; 52235818d2eSJohn Baldwin case KTR_FAULTEND: 52335818d2eSJohn Baldwin type = "PRET"; 52435818d2eSJohn Baldwin break; 5259b50d902SRodney W. Grimes default: 52609307b25SDag-Erling Smørgrav sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 5279b50d902SRodney W. Grimes type = unknown; 5289b50d902SRodney W. Grimes } 5299b50d902SRodney W. Grimes 530a9ac598bSRobert Watson /* 531a9ac598bSRobert Watson * The ktr_tid field was previously the ktr_buffer field, which held 532a9ac598bSRobert Watson * the kernel pointer value for the buffer associated with data 533a9ac598bSRobert Watson * following the record header. It now holds a threadid, but only 534a9ac598bSRobert Watson * for trace files after the change. Older trace files still contain 535a9ac598bSRobert Watson * kernel pointers. Detect this and suppress the results by printing 536a9ac598bSRobert Watson * negative tid's as 0. 537a9ac598bSRobert Watson */ 538a9ac598bSRobert Watson if (threads) 53909307b25SDag-Erling Smørgrav printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid, 540c065c0b8SJaakko Heinonen kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0, 541c065c0b8SJaakko Heinonen MAXCOMLEN, kth->ktr_comm); 542a9ac598bSRobert Watson else 54309307b25SDag-Erling Smørgrav printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN, 544a9ac598bSRobert Watson kth->ktr_comm); 5459b50d902SRodney W. Grimes if (timestamp) { 546ec131914SPeter Wemm if (timestamp == 3) { 547ec131914SPeter Wemm if (prevtime.tv_sec == 0) 548ec131914SPeter Wemm prevtime = kth->ktr_time; 549ec131914SPeter Wemm timevalsub(&kth->ktr_time, &prevtime); 550ec131914SPeter Wemm } 5519b50d902SRodney W. Grimes if (timestamp == 2) { 5529b50d902SRodney W. Grimes temp = kth->ktr_time; 5539b50d902SRodney W. Grimes timevalsub(&kth->ktr_time, &prevtime); 5549b50d902SRodney W. Grimes prevtime = temp; 5559b50d902SRodney W. Grimes } 55609307b25SDag-Erling Smørgrav printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec, 557c065c0b8SJaakko Heinonen kth->ktr_time.tv_usec); 5589b50d902SRodney W. Grimes } 55909307b25SDag-Erling Smørgrav printf("%s ", type); 5609b50d902SRodney W. Grimes } 5619b50d902SRodney W. Grimes 5629b50d902SRodney W. Grimes #include <sys/syscall.h> 5639b50d902SRodney W. Grimes #define KTRACE 56455229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c> 5659b50d902SRodney W. Grimes #undef KTRACE 5669b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]); 5679b50d902SRodney W. Grimes 56891fbb9c1SDavid Malone void 5697144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags) 5709b50d902SRodney W. Grimes { 57191fbb9c1SDavid Malone int narg = ktr->ktr_narg; 57291fbb9c1SDavid Malone register_t *ip; 573c601ad8eSDag-Erling Smørgrav intmax_t arg; 5749b50d902SRodney W. Grimes 5757144d36fSDmitry Chagin if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) || 5767144d36fSDmitry Chagin (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)) 57709307b25SDag-Erling Smørgrav printf("[%d]", ktr->ktr_code); 5789b50d902SRodney W. Grimes else 57909307b25SDag-Erling Smørgrav printf("%s", syscallnames[ktr->ktr_code]); 5807a6ec4cfSDmitrij Tejblum ip = &ktr->ktr_args[0]; 5819b50d902SRodney W. Grimes if (narg) { 5829b50d902SRodney W. Grimes char c = '('; 5837144d36fSDmitry Chagin if (fancy && 5847144d36fSDmitry Chagin (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) { 58573430055SDag-Erling Smørgrav switch (ktr->ktr_code) { 58673430055SDag-Erling Smørgrav case SYS_ioctl: { 58798a68a58SAlexander Leidinger print_number(ip, narg, c); 588d09e66beSDag-Erling Smørgrav putchar(c); 589d09e66beSDag-Erling Smørgrav ioctlname(*ip, decimal); 5909b50d902SRodney W. Grimes c = ','; 5919b50d902SRodney W. Grimes ip++; 5929b50d902SRodney W. Grimes narg--; 59373430055SDag-Erling Smørgrav break; 59473430055SDag-Erling Smørgrav } 59573430055SDag-Erling Smørgrav case SYS_ptrace: 59609307b25SDag-Erling Smørgrav putchar('('); 59795bb676aSDag-Erling Smørgrav ptraceopname(*ip); 5989b50d902SRodney W. Grimes c = ','; 5999b50d902SRodney W. Grimes ip++; 6009b50d902SRodney W. Grimes narg--; 60173430055SDag-Erling Smørgrav break; 60273430055SDag-Erling Smørgrav case SYS_access: 60373430055SDag-Erling Smørgrav case SYS_eaccess: 60498a68a58SAlexander Leidinger print_number(ip, narg, c); 60509307b25SDag-Erling Smørgrav putchar(','); 60695bb676aSDag-Erling Smørgrav accessmodename(*ip); 60798a68a58SAlexander Leidinger ip++; 60898a68a58SAlexander Leidinger narg--; 60973430055SDag-Erling Smørgrav break; 61073430055SDag-Erling Smørgrav case SYS_open: 61198a68a58SAlexander Leidinger print_number(ip, narg, c); 61209307b25SDag-Erling Smørgrav putchar(','); 61395bb676aSDag-Erling Smørgrav flagsandmodename(ip[0], ip[1], decimal); 61473430055SDag-Erling Smørgrav ip += 2; 61598a68a58SAlexander Leidinger narg -= 2; 61673430055SDag-Erling Smørgrav break; 61773430055SDag-Erling Smørgrav case SYS_wait4: 61898a68a58SAlexander Leidinger print_number(ip, narg, c); 61998a68a58SAlexander Leidinger print_number(ip, narg, c); 62009307b25SDag-Erling Smørgrav putchar(','); 62195bb676aSDag-Erling Smørgrav wait4optname(*ip); 62298a68a58SAlexander Leidinger ip++; 62398a68a58SAlexander Leidinger narg--; 62473430055SDag-Erling Smørgrav break; 62573430055SDag-Erling Smørgrav case SYS_chmod: 62673430055SDag-Erling Smørgrav case SYS_fchmod: 62773430055SDag-Erling Smørgrav case SYS_lchmod: 62898a68a58SAlexander Leidinger print_number(ip, narg, c); 62909307b25SDag-Erling Smørgrav putchar(','); 63095bb676aSDag-Erling Smørgrav modename(*ip); 63198a68a58SAlexander Leidinger ip++; 63298a68a58SAlexander Leidinger narg--; 63373430055SDag-Erling Smørgrav break; 63473430055SDag-Erling Smørgrav case SYS_mknod: 63598a68a58SAlexander Leidinger print_number(ip, narg, c); 63609307b25SDag-Erling Smørgrav putchar(','); 63795bb676aSDag-Erling Smørgrav modename(*ip); 63898a68a58SAlexander Leidinger ip++; 63998a68a58SAlexander Leidinger narg--; 64073430055SDag-Erling Smørgrav break; 64173430055SDag-Erling Smørgrav case SYS_getfsstat: 64298a68a58SAlexander Leidinger print_number(ip, narg, c); 64398a68a58SAlexander Leidinger print_number(ip, narg, c); 64409307b25SDag-Erling Smørgrav putchar(','); 64595bb676aSDag-Erling Smørgrav getfsstatflagsname(*ip); 64698a68a58SAlexander Leidinger ip++; 64798a68a58SAlexander Leidinger narg--; 64873430055SDag-Erling Smørgrav break; 64973430055SDag-Erling Smørgrav case SYS_mount: 65098a68a58SAlexander Leidinger print_number(ip, narg, c); 65198a68a58SAlexander Leidinger print_number(ip, narg, c); 65209307b25SDag-Erling Smørgrav putchar(','); 65395bb676aSDag-Erling Smørgrav mountflagsname(*ip); 65498a68a58SAlexander Leidinger ip++; 65598a68a58SAlexander Leidinger narg--; 65673430055SDag-Erling Smørgrav break; 65773430055SDag-Erling Smørgrav case SYS_unmount: 65898a68a58SAlexander Leidinger print_number(ip, narg, c); 65909307b25SDag-Erling Smørgrav putchar(','); 66095bb676aSDag-Erling Smørgrav mountflagsname(*ip); 66198a68a58SAlexander Leidinger ip++; 66298a68a58SAlexander Leidinger narg--; 66373430055SDag-Erling Smørgrav break; 66473430055SDag-Erling Smørgrav case SYS_recvmsg: 66573430055SDag-Erling Smørgrav case SYS_sendmsg: 66698a68a58SAlexander Leidinger print_number(ip, narg, c); 66798a68a58SAlexander Leidinger print_number(ip, narg, c); 66809307b25SDag-Erling Smørgrav putchar(','); 66995bb676aSDag-Erling Smørgrav sendrecvflagsname(*ip); 67098a68a58SAlexander Leidinger ip++; 67198a68a58SAlexander Leidinger narg--; 67273430055SDag-Erling Smørgrav break; 67373430055SDag-Erling Smørgrav case SYS_recvfrom: 67473430055SDag-Erling Smørgrav case SYS_sendto: 67598a68a58SAlexander Leidinger print_number(ip, narg, c); 67698a68a58SAlexander Leidinger print_number(ip, narg, c); 67798a68a58SAlexander Leidinger print_number(ip, narg, c); 67809307b25SDag-Erling Smørgrav putchar(','); 67995bb676aSDag-Erling Smørgrav sendrecvflagsname(*ip); 68098a68a58SAlexander Leidinger ip++; 68198a68a58SAlexander Leidinger narg--; 68273430055SDag-Erling Smørgrav break; 68373430055SDag-Erling Smørgrav case SYS_chflags: 68473430055SDag-Erling Smørgrav case SYS_fchflags: 68573430055SDag-Erling Smørgrav case SYS_lchflags: 68698a68a58SAlexander Leidinger print_number(ip, narg, c); 68709307b25SDag-Erling Smørgrav putchar(','); 68895bb676aSDag-Erling Smørgrav modename(*ip); 68998a68a58SAlexander Leidinger ip++; 69098a68a58SAlexander Leidinger narg--; 69173430055SDag-Erling Smørgrav break; 69273430055SDag-Erling Smørgrav case SYS_kill: 69398a68a58SAlexander Leidinger print_number(ip, narg, c); 69409307b25SDag-Erling Smørgrav putchar(','); 69595bb676aSDag-Erling Smørgrav signame(*ip); 69698a68a58SAlexander Leidinger ip++; 69798a68a58SAlexander Leidinger narg--; 69873430055SDag-Erling Smørgrav break; 69973430055SDag-Erling Smørgrav case SYS_reboot: 70009307b25SDag-Erling Smørgrav putchar('('); 70195bb676aSDag-Erling Smørgrav rebootoptname(*ip); 70298a68a58SAlexander Leidinger ip++; 70398a68a58SAlexander Leidinger narg--; 70473430055SDag-Erling Smørgrav break; 70573430055SDag-Erling Smørgrav case SYS_umask: 70609307b25SDag-Erling Smørgrav putchar('('); 70795bb676aSDag-Erling Smørgrav modename(*ip); 70898a68a58SAlexander Leidinger ip++; 70998a68a58SAlexander Leidinger narg--; 71073430055SDag-Erling Smørgrav break; 71173430055SDag-Erling Smørgrav case SYS_msync: 71298a68a58SAlexander Leidinger print_number(ip, narg, c); 71398a68a58SAlexander Leidinger print_number(ip, narg, c); 71409307b25SDag-Erling Smørgrav putchar(','); 71595bb676aSDag-Erling Smørgrav msyncflagsname(*ip); 71698a68a58SAlexander Leidinger ip++; 71798a68a58SAlexander Leidinger narg--; 71873430055SDag-Erling Smørgrav break; 719cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap 72073430055SDag-Erling Smørgrav case SYS_freebsd6_mmap: 721cae1120aSPeter Wemm print_number(ip, narg, c); 722cae1120aSPeter Wemm print_number(ip, narg, c); 72309307b25SDag-Erling Smørgrav putchar(','); 72495bb676aSDag-Erling Smørgrav mmapprotname(*ip); 72509307b25SDag-Erling Smørgrav putchar(','); 726cae1120aSPeter Wemm ip++; 727cae1120aSPeter Wemm narg--; 72895bb676aSDag-Erling Smørgrav mmapflagsname(*ip); 729cae1120aSPeter Wemm ip++; 730cae1120aSPeter Wemm narg--; 73173430055SDag-Erling Smørgrav break; 732cae1120aSPeter Wemm #endif 73373430055SDag-Erling Smørgrav case SYS_mmap: 73498a68a58SAlexander Leidinger print_number(ip, narg, c); 73598a68a58SAlexander Leidinger print_number(ip, narg, c); 73609307b25SDag-Erling Smørgrav putchar(','); 73795bb676aSDag-Erling Smørgrav mmapprotname(*ip); 73809307b25SDag-Erling Smørgrav putchar(','); 73998a68a58SAlexander Leidinger ip++; 74098a68a58SAlexander Leidinger narg--; 74195bb676aSDag-Erling Smørgrav mmapflagsname(*ip); 74298a68a58SAlexander Leidinger ip++; 74398a68a58SAlexander Leidinger narg--; 74473430055SDag-Erling Smørgrav break; 74573430055SDag-Erling Smørgrav case SYS_mprotect: 74698a68a58SAlexander Leidinger print_number(ip, narg, c); 74798a68a58SAlexander Leidinger print_number(ip, narg, c); 74809307b25SDag-Erling Smørgrav putchar(','); 74995bb676aSDag-Erling Smørgrav mmapprotname(*ip); 75098a68a58SAlexander Leidinger ip++; 75198a68a58SAlexander Leidinger narg--; 75273430055SDag-Erling Smørgrav break; 75373430055SDag-Erling Smørgrav case SYS_madvise: 75498a68a58SAlexander Leidinger print_number(ip, narg, c); 75598a68a58SAlexander Leidinger print_number(ip, narg, c); 75609307b25SDag-Erling Smørgrav putchar(','); 75795bb676aSDag-Erling Smørgrav madvisebehavname(*ip); 75898a68a58SAlexander Leidinger ip++; 75998a68a58SAlexander Leidinger narg--; 76073430055SDag-Erling Smørgrav break; 76173430055SDag-Erling Smørgrav case SYS_setpriority: 76298a68a58SAlexander Leidinger print_number(ip, narg, c); 76398a68a58SAlexander Leidinger print_number(ip, narg, c); 76409307b25SDag-Erling Smørgrav putchar(','); 76595bb676aSDag-Erling Smørgrav prioname(*ip); 76698a68a58SAlexander Leidinger ip++; 76798a68a58SAlexander Leidinger narg--; 76873430055SDag-Erling Smørgrav break; 76973430055SDag-Erling Smørgrav case SYS_fcntl: 77098a68a58SAlexander Leidinger print_number(ip, narg, c); 77109307b25SDag-Erling Smørgrav putchar(','); 77295bb676aSDag-Erling Smørgrav fcntlcmdname(ip[0], ip[1], decimal); 77373430055SDag-Erling Smørgrav ip += 2; 77498a68a58SAlexander Leidinger narg -= 2; 77573430055SDag-Erling Smørgrav break; 77673430055SDag-Erling Smørgrav case SYS_socket: { 7778bc31d83SCraig Rodrigues int sockdomain; 77809307b25SDag-Erling Smørgrav putchar('('); 77995bb676aSDag-Erling Smørgrav sockdomain = *ip; 7808bc31d83SCraig Rodrigues sockdomainname(sockdomain); 78198a68a58SAlexander Leidinger ip++; 78298a68a58SAlexander Leidinger narg--; 78309307b25SDag-Erling Smørgrav putchar(','); 78495bb676aSDag-Erling Smørgrav socktypename(*ip); 78598a68a58SAlexander Leidinger ip++; 78698a68a58SAlexander Leidinger narg--; 7878bc31d83SCraig Rodrigues if (sockdomain == PF_INET || 7888bc31d83SCraig Rodrigues sockdomain == PF_INET6) { 78909307b25SDag-Erling Smørgrav putchar(','); 79095bb676aSDag-Erling Smørgrav sockipprotoname(*ip); 7918bc31d83SCraig Rodrigues ip++; 7928bc31d83SCraig Rodrigues narg--; 7938bc31d83SCraig Rodrigues } 79498a68a58SAlexander Leidinger c = ','; 79573430055SDag-Erling Smørgrav break; 79673430055SDag-Erling Smørgrav } 79773430055SDag-Erling Smørgrav case SYS_setsockopt: 79873430055SDag-Erling Smørgrav case SYS_getsockopt: 79998a68a58SAlexander Leidinger print_number(ip, narg, c); 80009307b25SDag-Erling Smørgrav putchar(','); 80195bb676aSDag-Erling Smørgrav sockoptlevelname(*ip, decimal); 802e4bb45b1SDag-Erling Smørgrav if (*ip == SOL_SOCKET) { 80398a68a58SAlexander Leidinger ip++; 80498a68a58SAlexander Leidinger narg--; 80509307b25SDag-Erling Smørgrav putchar(','); 80695bb676aSDag-Erling Smørgrav sockoptname(*ip); 8070460d351SJohn Baldwin } 80898a68a58SAlexander Leidinger ip++; 80998a68a58SAlexander Leidinger narg--; 81073430055SDag-Erling Smørgrav break; 811cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek 81273430055SDag-Erling Smørgrav case SYS_freebsd6_lseek: 81398a68a58SAlexander Leidinger print_number(ip, narg, c); 81498a68a58SAlexander Leidinger /* Hidden 'pad' argument, not in lseek(2) */ 81598a68a58SAlexander Leidinger print_number(ip, narg, c); 81698a68a58SAlexander Leidinger print_number(ip, narg, c); 81709307b25SDag-Erling Smørgrav putchar(','); 81895bb676aSDag-Erling Smørgrav whencename(*ip); 81998a68a58SAlexander Leidinger ip++; 82098a68a58SAlexander Leidinger narg--; 82173430055SDag-Erling Smørgrav break; 822cae1120aSPeter Wemm #endif 82373430055SDag-Erling Smørgrav case SYS_lseek: 824cae1120aSPeter Wemm print_number(ip, narg, c); 825cae1120aSPeter Wemm /* Hidden 'pad' argument, not in lseek(2) */ 826cae1120aSPeter Wemm print_number(ip, narg, c); 82709307b25SDag-Erling Smørgrav putchar(','); 82895bb676aSDag-Erling Smørgrav whencename(*ip); 829cae1120aSPeter Wemm ip++; 830cae1120aSPeter Wemm narg--; 83173430055SDag-Erling Smørgrav break; 83273430055SDag-Erling Smørgrav case SYS_flock: 83398a68a58SAlexander Leidinger print_number(ip, narg, c); 83409307b25SDag-Erling Smørgrav putchar(','); 83595bb676aSDag-Erling Smørgrav flockname(*ip); 83698a68a58SAlexander Leidinger ip++; 83798a68a58SAlexander Leidinger narg--; 83873430055SDag-Erling Smørgrav break; 83973430055SDag-Erling Smørgrav case SYS_mkfifo: 84073430055SDag-Erling Smørgrav case SYS_mkdir: 84198a68a58SAlexander Leidinger print_number(ip, narg, c); 84209307b25SDag-Erling Smørgrav putchar(','); 84395bb676aSDag-Erling Smørgrav modename(*ip); 84498a68a58SAlexander Leidinger ip++; 84598a68a58SAlexander Leidinger narg--; 84673430055SDag-Erling Smørgrav break; 84773430055SDag-Erling Smørgrav case SYS_shutdown: 84898a68a58SAlexander Leidinger print_number(ip, narg, c); 84909307b25SDag-Erling Smørgrav putchar(','); 85095bb676aSDag-Erling Smørgrav shutdownhowname(*ip); 85198a68a58SAlexander Leidinger ip++; 85298a68a58SAlexander Leidinger narg--; 85373430055SDag-Erling Smørgrav break; 85473430055SDag-Erling Smørgrav case SYS_socketpair: 85509307b25SDag-Erling Smørgrav putchar('('); 85695bb676aSDag-Erling Smørgrav sockdomainname(*ip); 85798a68a58SAlexander Leidinger ip++; 85898a68a58SAlexander Leidinger narg--; 85909307b25SDag-Erling Smørgrav putchar(','); 86095bb676aSDag-Erling Smørgrav socktypename(*ip); 86198a68a58SAlexander Leidinger ip++; 86298a68a58SAlexander Leidinger narg--; 86398a68a58SAlexander Leidinger c = ','; 86473430055SDag-Erling Smørgrav break; 86573430055SDag-Erling Smørgrav case SYS_getrlimit: 86673430055SDag-Erling Smørgrav case SYS_setrlimit: 86709307b25SDag-Erling Smørgrav putchar('('); 86895bb676aSDag-Erling Smørgrav rlimitname(*ip); 86998a68a58SAlexander Leidinger ip++; 87098a68a58SAlexander Leidinger narg--; 87198a68a58SAlexander Leidinger c = ','; 87273430055SDag-Erling Smørgrav break; 87373430055SDag-Erling Smørgrav case SYS_quotactl: 87498a68a58SAlexander Leidinger print_number(ip, narg, c); 87509307b25SDag-Erling Smørgrav putchar(','); 87695bb676aSDag-Erling Smørgrav quotactlname(*ip); 87798a68a58SAlexander Leidinger ip++; 87898a68a58SAlexander Leidinger narg--; 87998a68a58SAlexander Leidinger c = ','; 88073430055SDag-Erling Smørgrav break; 88173430055SDag-Erling Smørgrav case SYS_nfssvc: 88209307b25SDag-Erling Smørgrav putchar('('); 88395bb676aSDag-Erling Smørgrav nfssvcname(*ip); 88498a68a58SAlexander Leidinger ip++; 88598a68a58SAlexander Leidinger narg--; 88698a68a58SAlexander Leidinger c = ','; 88773430055SDag-Erling Smørgrav break; 88873430055SDag-Erling Smørgrav case SYS_rtprio: 88909307b25SDag-Erling Smørgrav putchar('('); 89095bb676aSDag-Erling Smørgrav rtprioname(*ip); 89198a68a58SAlexander Leidinger ip++; 89298a68a58SAlexander Leidinger narg--; 89398a68a58SAlexander Leidinger c = ','; 89473430055SDag-Erling Smørgrav break; 89573430055SDag-Erling Smørgrav case SYS___semctl: 89698a68a58SAlexander Leidinger print_number(ip, narg, c); 89798a68a58SAlexander Leidinger print_number(ip, narg, c); 89809307b25SDag-Erling Smørgrav putchar(','); 89995bb676aSDag-Erling Smørgrav semctlname(*ip); 90098a68a58SAlexander Leidinger ip++; 90198a68a58SAlexander Leidinger narg--; 90273430055SDag-Erling Smørgrav break; 90373430055SDag-Erling Smørgrav case SYS_semget: 90498a68a58SAlexander Leidinger print_number(ip, narg, c); 90598a68a58SAlexander Leidinger print_number(ip, narg, c); 90609307b25SDag-Erling Smørgrav putchar(','); 90795bb676aSDag-Erling Smørgrav semgetname(*ip); 90898a68a58SAlexander Leidinger ip++; 90998a68a58SAlexander Leidinger narg--; 91073430055SDag-Erling Smørgrav break; 91173430055SDag-Erling Smørgrav case SYS_msgctl: 91298a68a58SAlexander Leidinger print_number(ip, narg, c); 91309307b25SDag-Erling Smørgrav putchar(','); 91495bb676aSDag-Erling Smørgrav shmctlname(*ip); 91598a68a58SAlexander Leidinger ip++; 91698a68a58SAlexander Leidinger narg--; 91773430055SDag-Erling Smørgrav break; 91873430055SDag-Erling Smørgrav case SYS_shmat: 91998a68a58SAlexander Leidinger print_number(ip, narg, c); 92098a68a58SAlexander Leidinger print_number(ip, narg, c); 92109307b25SDag-Erling Smørgrav putchar(','); 92295bb676aSDag-Erling Smørgrav shmatname(*ip); 92398a68a58SAlexander Leidinger ip++; 92498a68a58SAlexander Leidinger narg--; 92573430055SDag-Erling Smørgrav break; 92673430055SDag-Erling Smørgrav case SYS_shmctl: 92798a68a58SAlexander Leidinger print_number(ip, narg, c); 92809307b25SDag-Erling Smørgrav putchar(','); 92995bb676aSDag-Erling Smørgrav shmctlname(*ip); 93098a68a58SAlexander Leidinger ip++; 93198a68a58SAlexander Leidinger narg--; 93273430055SDag-Erling Smørgrav break; 93373430055SDag-Erling Smørgrav case SYS_minherit: 93498a68a58SAlexander Leidinger print_number(ip, narg, c); 93598a68a58SAlexander Leidinger print_number(ip, narg, c); 93609307b25SDag-Erling Smørgrav putchar(','); 93795bb676aSDag-Erling Smørgrav minheritname(*ip); 93898a68a58SAlexander Leidinger ip++; 93998a68a58SAlexander Leidinger narg--; 94073430055SDag-Erling Smørgrav break; 94173430055SDag-Erling Smørgrav case SYS_rfork: 94209307b25SDag-Erling Smørgrav putchar('('); 94395bb676aSDag-Erling Smørgrav rforkname(*ip); 94498a68a58SAlexander Leidinger ip++; 94598a68a58SAlexander Leidinger narg--; 94698a68a58SAlexander Leidinger c = ','; 94773430055SDag-Erling Smørgrav break; 94873430055SDag-Erling Smørgrav case SYS_lio_listio: 94909307b25SDag-Erling Smørgrav putchar('('); 95095bb676aSDag-Erling Smørgrav lio_listioname(*ip); 95198a68a58SAlexander Leidinger ip++; 95298a68a58SAlexander Leidinger narg--; 95398a68a58SAlexander Leidinger c = ','; 95473430055SDag-Erling Smørgrav break; 95573430055SDag-Erling Smørgrav case SYS_mlockall: 95609307b25SDag-Erling Smørgrav putchar('('); 95795bb676aSDag-Erling Smørgrav mlockallname(*ip); 95898a68a58SAlexander Leidinger ip++; 95998a68a58SAlexander Leidinger narg--; 96073430055SDag-Erling Smørgrav break; 96173430055SDag-Erling Smørgrav case SYS_sched_setscheduler: 96298a68a58SAlexander Leidinger print_number(ip, narg, c); 96309307b25SDag-Erling Smørgrav putchar(','); 96495bb676aSDag-Erling Smørgrav schedpolicyname(*ip); 96598a68a58SAlexander Leidinger ip++; 96698a68a58SAlexander Leidinger narg--; 96773430055SDag-Erling Smørgrav break; 96873430055SDag-Erling Smørgrav case SYS_sched_get_priority_max: 96973430055SDag-Erling Smørgrav case SYS_sched_get_priority_min: 97009307b25SDag-Erling Smørgrav putchar('('); 97195bb676aSDag-Erling Smørgrav schedpolicyname(*ip); 97298a68a58SAlexander Leidinger ip++; 97398a68a58SAlexander Leidinger narg--; 97473430055SDag-Erling Smørgrav break; 97573430055SDag-Erling Smørgrav case SYS_sendfile: 97698a68a58SAlexander Leidinger print_number(ip, narg, c); 97798a68a58SAlexander Leidinger print_number(ip, narg, c); 97898a68a58SAlexander Leidinger print_number(ip, narg, c); 97998a68a58SAlexander Leidinger print_number(ip, narg, c); 98098a68a58SAlexander Leidinger print_number(ip, narg, c); 98198a68a58SAlexander Leidinger print_number(ip, narg, c); 98209307b25SDag-Erling Smørgrav putchar(','); 98395bb676aSDag-Erling Smørgrav sendfileflagsname(*ip); 98498a68a58SAlexander Leidinger ip++; 98598a68a58SAlexander Leidinger narg--; 98673430055SDag-Erling Smørgrav break; 98773430055SDag-Erling Smørgrav case SYS_kldsym: 98898a68a58SAlexander Leidinger print_number(ip, narg, c); 98909307b25SDag-Erling Smørgrav putchar(','); 99095bb676aSDag-Erling Smørgrav kldsymcmdname(*ip); 99198a68a58SAlexander Leidinger ip++; 99298a68a58SAlexander Leidinger narg--; 99373430055SDag-Erling Smørgrav break; 99473430055SDag-Erling Smørgrav case SYS_sigprocmask: 99509307b25SDag-Erling Smørgrav putchar('('); 99695bb676aSDag-Erling Smørgrav sigprocmaskhowname(*ip); 99798a68a58SAlexander Leidinger ip++; 99898a68a58SAlexander Leidinger narg--; 99998a68a58SAlexander Leidinger c = ','; 100073430055SDag-Erling Smørgrav break; 100173430055SDag-Erling Smørgrav case SYS___acl_get_file: 100273430055SDag-Erling Smørgrav case SYS___acl_set_file: 100373430055SDag-Erling Smørgrav case SYS___acl_get_fd: 100473430055SDag-Erling Smørgrav case SYS___acl_set_fd: 100573430055SDag-Erling Smørgrav case SYS___acl_delete_file: 100673430055SDag-Erling Smørgrav case SYS___acl_delete_fd: 100773430055SDag-Erling Smørgrav case SYS___acl_aclcheck_file: 100873430055SDag-Erling Smørgrav case SYS___acl_aclcheck_fd: 100973430055SDag-Erling Smørgrav case SYS___acl_get_link: 101073430055SDag-Erling Smørgrav case SYS___acl_set_link: 101173430055SDag-Erling Smørgrav case SYS___acl_delete_link: 101273430055SDag-Erling Smørgrav case SYS___acl_aclcheck_link: 101398a68a58SAlexander Leidinger print_number(ip, narg, c); 101409307b25SDag-Erling Smørgrav putchar(','); 101595bb676aSDag-Erling Smørgrav acltypename(*ip); 101698a68a58SAlexander Leidinger ip++; 101798a68a58SAlexander Leidinger narg--; 101873430055SDag-Erling Smørgrav break; 101973430055SDag-Erling Smørgrav case SYS_sigaction: 102009307b25SDag-Erling Smørgrav putchar('('); 102195bb676aSDag-Erling Smørgrav signame(*ip); 102298a68a58SAlexander Leidinger ip++; 102398a68a58SAlexander Leidinger narg--; 102498a68a58SAlexander Leidinger c = ','; 102573430055SDag-Erling Smørgrav break; 102673430055SDag-Erling Smørgrav case SYS_extattrctl: 102798a68a58SAlexander Leidinger print_number(ip, narg, c); 102809307b25SDag-Erling Smørgrav putchar(','); 102995bb676aSDag-Erling Smørgrav extattrctlname(*ip); 103098a68a58SAlexander Leidinger ip++; 103198a68a58SAlexander Leidinger narg--; 103273430055SDag-Erling Smørgrav break; 103373430055SDag-Erling Smørgrav case SYS_nmount: 103498a68a58SAlexander Leidinger print_number(ip, narg, c); 103598a68a58SAlexander Leidinger print_number(ip, narg, c); 103609307b25SDag-Erling Smørgrav putchar(','); 103795bb676aSDag-Erling Smørgrav mountflagsname(*ip); 103898a68a58SAlexander Leidinger ip++; 103998a68a58SAlexander Leidinger narg--; 104073430055SDag-Erling Smørgrav break; 104173430055SDag-Erling Smørgrav case SYS_thr_create: 104298a68a58SAlexander Leidinger print_number(ip, narg, c); 104398a68a58SAlexander Leidinger print_number(ip, narg, c); 104409307b25SDag-Erling Smørgrav putchar(','); 104595bb676aSDag-Erling Smørgrav thrcreateflagsname(*ip); 104698a68a58SAlexander Leidinger ip++; 104798a68a58SAlexander Leidinger narg--; 104873430055SDag-Erling Smørgrav break; 104973430055SDag-Erling Smørgrav case SYS_thr_kill: 105098a68a58SAlexander Leidinger print_number(ip, narg, c); 105109307b25SDag-Erling Smørgrav putchar(','); 105295bb676aSDag-Erling Smørgrav signame(*ip); 105398a68a58SAlexander Leidinger ip++; 105498a68a58SAlexander Leidinger narg--; 105573430055SDag-Erling Smørgrav break; 105673430055SDag-Erling Smørgrav case SYS_kldunloadf: 105798a68a58SAlexander Leidinger print_number(ip, narg, c); 105809307b25SDag-Erling Smørgrav putchar(','); 105995bb676aSDag-Erling Smørgrav kldunloadfflagsname(*ip); 106098a68a58SAlexander Leidinger ip++; 106198a68a58SAlexander Leidinger narg--; 106273430055SDag-Erling Smørgrav break; 1063515dfc23SDag-Erling Smørgrav case SYS_cap_new: 10642609222aSPawel Jakub Dawidek case SYS_cap_rights_limit: 1065515dfc23SDag-Erling Smørgrav print_number(ip, narg, c); 1066515dfc23SDag-Erling Smørgrav putchar(','); 1067c601ad8eSDag-Erling Smørgrav arg = *ip; 1068515dfc23SDag-Erling Smørgrav ip++; 1069515dfc23SDag-Erling Smørgrav narg--; 1070c601ad8eSDag-Erling Smørgrav /* 1071c601ad8eSDag-Erling Smørgrav * Hack: the second argument is a 1072c601ad8eSDag-Erling Smørgrav * cap_rights_t, which 64 bits wide, so on 1073c601ad8eSDag-Erling Smørgrav * 32-bit systems, it is split between two 1074c601ad8eSDag-Erling Smørgrav * registers. 1075c601ad8eSDag-Erling Smørgrav * 1076c601ad8eSDag-Erling Smørgrav * Since sizeof() is not evaluated by the 1077c601ad8eSDag-Erling Smørgrav * preprocessor, we can't use an #ifdef, 1078c601ad8eSDag-Erling Smørgrav * but the compiler will probably optimize 1079c601ad8eSDag-Erling Smørgrav * the code out anyway. 1080c601ad8eSDag-Erling Smørgrav */ 1081c601ad8eSDag-Erling Smørgrav if (sizeof(cap_rights_t) > sizeof(register_t)) { 1082c601ad8eSDag-Erling Smørgrav #if _BYTE_ORDER == _LITTLE_ENDIAN 1083c601ad8eSDag-Erling Smørgrav arg = ((intmax_t)*ip << 32) + arg; 1084c601ad8eSDag-Erling Smørgrav #else 1085c601ad8eSDag-Erling Smørgrav arg = (arg << 32) + *ip; 1086c601ad8eSDag-Erling Smørgrav #endif 1087c601ad8eSDag-Erling Smørgrav ip++; 1088c601ad8eSDag-Erling Smørgrav narg--; 1089c601ad8eSDag-Erling Smørgrav } 1090c601ad8eSDag-Erling Smørgrav capname(arg); 1091515dfc23SDag-Erling Smørgrav break; 10922609222aSPawel Jakub Dawidek case SYS_cap_fcntls_limit: 10932609222aSPawel Jakub Dawidek print_number(ip, narg, c); 10942609222aSPawel Jakub Dawidek putchar(','); 10952609222aSPawel Jakub Dawidek arg = *ip; 10962609222aSPawel Jakub Dawidek ip++; 10972609222aSPawel Jakub Dawidek narg--; 10982609222aSPawel Jakub Dawidek capfcntlname(arg); 10992609222aSPawel Jakub Dawidek break; 1100145e6aa9SJohn Baldwin case SYS_posix_fadvise: 1101145e6aa9SJohn Baldwin print_number(ip, narg, c); 1102145e6aa9SJohn Baldwin print_number(ip, narg, c); 1103145e6aa9SJohn Baldwin print_number(ip, narg, c); 1104145e6aa9SJohn Baldwin (void)putchar(','); 1105145e6aa9SJohn Baldwin fadvisebehavname((int)*ip); 1106145e6aa9SJohn Baldwin ip++; 1107145e6aa9SJohn Baldwin narg--; 1108145e6aa9SJohn Baldwin break; 11099b50d902SRodney W. Grimes } 11109b50d902SRodney W. Grimes } 111148f6dd8aSAttilio Rao while (narg > 0) { 111298a68a58SAlexander Leidinger print_number(ip, narg, c); 11139b50d902SRodney W. Grimes } 111409307b25SDag-Erling Smørgrav putchar(')'); 11159b50d902SRodney W. Grimes } 111609307b25SDag-Erling Smørgrav putchar('\n'); 11179b50d902SRodney W. Grimes } 11189b50d902SRodney W. Grimes 111991fbb9c1SDavid Malone void 11207144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags) 11219b50d902SRodney W. Grimes { 112291fbb9c1SDavid Malone register_t ret = ktr->ktr_retval; 112391fbb9c1SDavid Malone int error = ktr->ktr_error; 112491fbb9c1SDavid Malone int code = ktr->ktr_code; 11259b50d902SRodney W. Grimes 11267144d36fSDmitry Chagin if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) || 11277144d36fSDmitry Chagin (code >= nsyscalls || code < 0)) 112809307b25SDag-Erling Smørgrav printf("[%d] ", code); 11299b50d902SRodney W. Grimes else 113009307b25SDag-Erling Smørgrav printf("%s ", syscallnames[code]); 11319b50d902SRodney W. Grimes 11329b50d902SRodney W. Grimes if (error == 0) { 11339b50d902SRodney W. Grimes if (fancy) { 113409307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 11359b50d902SRodney W. Grimes if (ret < 0 || ret > 9) 113609307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 11379b50d902SRodney W. Grimes } else { 11389b50d902SRodney W. Grimes if (decimal) 113909307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 11409b50d902SRodney W. Grimes else 114109307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 11429b50d902SRodney W. Grimes } 11439b50d902SRodney W. Grimes } else if (error == ERESTART) 114409307b25SDag-Erling Smørgrav printf("RESTART"); 11459b50d902SRodney W. Grimes else if (error == EJUSTRETURN) 114609307b25SDag-Erling Smørgrav printf("JUSTRETURN"); 11479b50d902SRodney W. Grimes else { 114809307b25SDag-Erling Smørgrav printf("-1 errno %d", ktr->ktr_error); 11499b50d902SRodney W. Grimes if (fancy) 115009307b25SDag-Erling Smørgrav printf(" %s", strerror(ktr->ktr_error)); 11519b50d902SRodney W. Grimes } 115209307b25SDag-Erling Smørgrav putchar('\n'); 11539b50d902SRodney W. Grimes } 11549b50d902SRodney W. Grimes 115591fbb9c1SDavid Malone void 115691fbb9c1SDavid Malone ktrnamei(char *cp, int len) 11579b50d902SRodney W. Grimes { 115809307b25SDag-Erling Smørgrav printf("\"%.*s\"\n", len, cp); 11599b50d902SRodney W. Grimes } 11609b50d902SRodney W. Grimes 116191fbb9c1SDavid Malone void 1162ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth) 11639b50d902SRodney W. Grimes { 1164ec4beb5dSPeter Wemm int n, i; 1165ec4beb5dSPeter Wemm int width; 1166ec4beb5dSPeter Wemm 1167ec4beb5dSPeter Wemm width = 0; 1168ec4beb5dSPeter Wemm do { 1169ec4beb5dSPeter Wemm width += 2; 1170ec4beb5dSPeter Wemm i = 13; /* base offset */ 1171ec4beb5dSPeter Wemm i += (width / 2) + 1; /* spaces every second byte */ 1172ec4beb5dSPeter Wemm i += (width * 2); /* width of bytes */ 1173ec4beb5dSPeter Wemm i += 3; /* " |" */ 1174ec4beb5dSPeter Wemm i += width; /* each byte */ 1175ec4beb5dSPeter Wemm i += 1; /* "|" */ 1176ec4beb5dSPeter Wemm } while (i < screenwidth); 1177ec4beb5dSPeter Wemm width -= 2; 1178ec4beb5dSPeter Wemm 1179ec4beb5dSPeter Wemm for (n = 0; n < len; n += width) { 1180ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1181ec4beb5dSPeter Wemm if ((i % width) == 0) { /* beginning of line */ 1182ec4beb5dSPeter Wemm printf(" 0x%04x", i); 1183ec4beb5dSPeter Wemm } 1184ec4beb5dSPeter Wemm if ((i % 2) == 0) { 1185ec4beb5dSPeter Wemm printf(" "); 1186ec4beb5dSPeter Wemm } 1187ec4beb5dSPeter Wemm if (i < len) 1188ec4beb5dSPeter Wemm printf("%02x", p[i] & 0xff); 1189ec4beb5dSPeter Wemm else 1190ec4beb5dSPeter Wemm printf(" "); 1191ec4beb5dSPeter Wemm } 1192ec4beb5dSPeter Wemm printf(" |"); 1193ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1194ec4beb5dSPeter Wemm if (i >= len) 1195ec4beb5dSPeter Wemm break; 1196ec4beb5dSPeter Wemm if (p[i] >= ' ' && p[i] <= '~') 1197ec4beb5dSPeter Wemm printf("%c", p[i]); 1198ec4beb5dSPeter Wemm else 1199ec4beb5dSPeter Wemm printf("."); 1200ec4beb5dSPeter Wemm } 1201ec4beb5dSPeter Wemm printf("|\n"); 1202ec4beb5dSPeter Wemm } 1203ec4beb5dSPeter Wemm if ((i % width) != 0) 1204ec4beb5dSPeter Wemm printf("\n"); 1205ec4beb5dSPeter Wemm } 1206ec4beb5dSPeter Wemm 1207ec4beb5dSPeter Wemm void 1208ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth) 1209ec4beb5dSPeter Wemm { 121091fbb9c1SDavid Malone int col = 0; 1211ec4beb5dSPeter Wemm char *cp; 121291fbb9c1SDavid Malone int width; 12139b50d902SRodney W. Grimes char visbuf[5]; 12149b50d902SRodney W. Grimes 121509307b25SDag-Erling Smørgrav printf(" \""); 12169b50d902SRodney W. Grimes col = 8; 12179b50d902SRodney W. Grimes for (;datalen > 0; datalen--, dp++) { 121809307b25SDag-Erling Smørgrav vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 12199b50d902SRodney W. Grimes cp = visbuf; 12209b50d902SRodney W. Grimes /* 12219b50d902SRodney W. Grimes * Keep track of printables and 12229b50d902SRodney W. Grimes * space chars (like fold(1)). 12239b50d902SRodney W. Grimes */ 12249b50d902SRodney W. Grimes if (col == 0) { 122509307b25SDag-Erling Smørgrav putchar('\t'); 12269b50d902SRodney W. Grimes col = 8; 12279b50d902SRodney W. Grimes } 12289b50d902SRodney W. Grimes switch(*cp) { 12299b50d902SRodney W. Grimes case '\n': 12309b50d902SRodney W. Grimes col = 0; 123109307b25SDag-Erling Smørgrav putchar('\n'); 12329b50d902SRodney W. Grimes continue; 12339b50d902SRodney W. Grimes case '\t': 12349b50d902SRodney W. Grimes width = 8 - (col&07); 12359b50d902SRodney W. Grimes break; 12369b50d902SRodney W. Grimes default: 12379b50d902SRodney W. Grimes width = strlen(cp); 12389b50d902SRodney W. Grimes } 12399b50d902SRodney W. Grimes if (col + width > (screenwidth-2)) { 124009307b25SDag-Erling Smørgrav printf("\\\n\t"); 12419b50d902SRodney W. Grimes col = 8; 12429b50d902SRodney W. Grimes } 12439b50d902SRodney W. Grimes col += width; 12449b50d902SRodney W. Grimes do { 124509307b25SDag-Erling Smørgrav putchar(*cp++); 12469b50d902SRodney W. Grimes } while (*cp); 12479b50d902SRodney W. Grimes } 12489b50d902SRodney W. Grimes if (col == 0) 124909307b25SDag-Erling Smørgrav printf(" "); 125009307b25SDag-Erling Smørgrav printf("\"\n"); 12519b50d902SRodney W. Grimes } 12529b50d902SRodney W. Grimes 1253ec4beb5dSPeter Wemm void 1254ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len) 1255ec4beb5dSPeter Wemm { 1256ec4beb5dSPeter Wemm int datalen = len - sizeof (struct ktr_genio); 1257ec4beb5dSPeter Wemm char *dp = (char *)ktr + sizeof (struct ktr_genio); 1258ec4beb5dSPeter Wemm static int screenwidth = 0; 1259ec4beb5dSPeter Wemm int i, binary; 1260ec4beb5dSPeter Wemm 12614b0ae512SPawel Jakub Dawidek printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 12624b0ae512SPawel Jakub Dawidek ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 12634b0ae512SPawel Jakub Dawidek datalen == 1 ? "" : "s"); 12644b0ae512SPawel Jakub Dawidek if (suppressdata) 12654b0ae512SPawel Jakub Dawidek return; 1266ec4beb5dSPeter Wemm if (screenwidth == 0) { 1267ec4beb5dSPeter Wemm struct winsize ws; 1268ec4beb5dSPeter Wemm 1269ec4beb5dSPeter Wemm if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 1270ec4beb5dSPeter Wemm ws.ws_col > 8) 1271ec4beb5dSPeter Wemm screenwidth = ws.ws_col; 1272ec4beb5dSPeter Wemm else 1273ec4beb5dSPeter Wemm screenwidth = 80; 1274ec4beb5dSPeter Wemm } 1275ec4beb5dSPeter Wemm if (maxdata && datalen > maxdata) 1276ec4beb5dSPeter Wemm datalen = maxdata; 1277ec4beb5dSPeter Wemm 1278ec4beb5dSPeter Wemm for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 1279ec4beb5dSPeter Wemm if (dp[i] >= 32 && dp[i] < 127) 1280ec4beb5dSPeter Wemm continue; 1281ec4beb5dSPeter Wemm if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 1282ec4beb5dSPeter Wemm continue; 1283ec4beb5dSPeter Wemm binary = 1; 1284ec4beb5dSPeter Wemm } 1285ec4beb5dSPeter Wemm if (binary) 1286ec4beb5dSPeter Wemm hexdump(dp, datalen, screenwidth); 1287ec4beb5dSPeter Wemm else 1288ec4beb5dSPeter Wemm visdump(dp, datalen, screenwidth); 1289ec4beb5dSPeter Wemm } 1290ec4beb5dSPeter Wemm 129191fbb9c1SDavid Malone const char *signames[] = { 12929b50d902SRodney W. Grimes "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */ 12939b50d902SRodney W. Grimes "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */ 12949b50d902SRodney W. Grimes "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */ 12959b50d902SRodney W. Grimes "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */ 12969b50d902SRodney W. Grimes "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */ 12979b50d902SRodney W. Grimes "USR2", NULL, /* 31 - 32 */ 12989b50d902SRodney W. Grimes }; 12999b50d902SRodney W. Grimes 130091fbb9c1SDavid Malone void 1301dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig) 13029b50d902SRodney W. Grimes { 1303dde5f9b9SDmitry Chagin if (psig->signo > 0 && psig->signo < NSIG) 130409307b25SDag-Erling Smørgrav printf("SIG%s ", signames[psig->signo]); 1305fd6afe79SKonstantin Belousov else 130609307b25SDag-Erling Smørgrav printf("SIG %d ", psig->signo); 13075677eef9SJilles Tjoelker if (psig->action == SIG_DFL) { 13085677eef9SJilles Tjoelker printf("SIG_DFL code="); 13095677eef9SJilles Tjoelker sigcodename(psig->signo, psig->code); 13105677eef9SJilles Tjoelker putchar('\n'); 13115677eef9SJilles Tjoelker } else { 13125677eef9SJilles Tjoelker printf("caught handler=0x%lx mask=0x%x code=", 13135677eef9SJilles Tjoelker (u_long)psig->action, psig->mask.__bits[0]); 13145677eef9SJilles Tjoelker sigcodename(psig->signo, psig->code); 13155677eef9SJilles Tjoelker putchar('\n'); 131691fbb9c1SDavid Malone } 13179b50d902SRodney W. Grimes } 13189b50d902SRodney W. Grimes 131991fbb9c1SDavid Malone void 132088bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs) 13219b50d902SRodney W. Grimes { 132209307b25SDag-Erling Smørgrav printf("%s %s\n", cs->out ? "stop" : "resume", 13239b50d902SRodney W. Grimes cs->user ? "user" : "kernel"); 13249b50d902SRodney W. Grimes } 13259b50d902SRodney W. Grimes 132688bf5036SJohn Baldwin void 132788bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs) 132888bf5036SJohn Baldwin { 132988bf5036SJohn Baldwin printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume", 133088bf5036SJohn Baldwin cs->user ? "user" : "kernel", cs->wmesg); 133188bf5036SJohn Baldwin } 133288bf5036SJohn Baldwin 13331f4b63f8SJohn Baldwin #define UTRACE_DLOPEN_START 1 13341f4b63f8SJohn Baldwin #define UTRACE_DLOPEN_STOP 2 13351f4b63f8SJohn Baldwin #define UTRACE_DLCLOSE_START 3 13361f4b63f8SJohn Baldwin #define UTRACE_DLCLOSE_STOP 4 13371f4b63f8SJohn Baldwin #define UTRACE_LOAD_OBJECT 5 13381f4b63f8SJohn Baldwin #define UTRACE_UNLOAD_OBJECT 6 13391f4b63f8SJohn Baldwin #define UTRACE_ADD_RUNDEP 7 13401f4b63f8SJohn Baldwin #define UTRACE_PRELOAD_FINISHED 8 13411f4b63f8SJohn Baldwin #define UTRACE_INIT_CALL 9 13421f4b63f8SJohn Baldwin #define UTRACE_FINI_CALL 10 13431f4b63f8SJohn Baldwin 13441f4b63f8SJohn Baldwin struct utrace_rtld { 13451f4b63f8SJohn Baldwin char sig[4]; /* 'RTLD' */ 13461f4b63f8SJohn Baldwin int event; 13471f4b63f8SJohn Baldwin void *handle; 13481f4b63f8SJohn Baldwin void *mapbase; 13491f4b63f8SJohn Baldwin size_t mapsize; 13501f4b63f8SJohn Baldwin int refcnt; 13511f4b63f8SJohn Baldwin char name[MAXPATHLEN]; 13521f4b63f8SJohn Baldwin }; 13531f4b63f8SJohn Baldwin 13541f4b63f8SJohn Baldwin void 13551f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p) 13561f4b63f8SJohn Baldwin { 13571f4b63f8SJohn Baldwin struct utrace_rtld *ut = (struct utrace_rtld *)p; 13581f4b63f8SJohn Baldwin void *parent; 13591f4b63f8SJohn Baldwin int mode; 13601f4b63f8SJohn Baldwin 13611f4b63f8SJohn Baldwin switch (ut->event) { 13621f4b63f8SJohn Baldwin case UTRACE_DLOPEN_START: 13631f4b63f8SJohn Baldwin mode = ut->refcnt; 13641f4b63f8SJohn Baldwin printf("dlopen(%s, ", ut->name); 13651f4b63f8SJohn Baldwin switch (mode & RTLD_MODEMASK) { 13661f4b63f8SJohn Baldwin case RTLD_NOW: 13671f4b63f8SJohn Baldwin printf("RTLD_NOW"); 13681f4b63f8SJohn Baldwin break; 13691f4b63f8SJohn Baldwin case RTLD_LAZY: 13701f4b63f8SJohn Baldwin printf("RTLD_LAZY"); 13711f4b63f8SJohn Baldwin break; 13721f4b63f8SJohn Baldwin default: 13731f4b63f8SJohn Baldwin printf("%#x", mode & RTLD_MODEMASK); 13741f4b63f8SJohn Baldwin } 13751f4b63f8SJohn Baldwin if (mode & RTLD_GLOBAL) 13761f4b63f8SJohn Baldwin printf(" | RTLD_GLOBAL"); 13771f4b63f8SJohn Baldwin if (mode & RTLD_TRACE) 13781f4b63f8SJohn Baldwin printf(" | RTLD_TRACE"); 13791f4b63f8SJohn Baldwin if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)) 13801f4b63f8SJohn Baldwin printf(" | %#x", mode & 13811f4b63f8SJohn Baldwin ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)); 13821f4b63f8SJohn Baldwin printf(")\n"); 13831f4b63f8SJohn Baldwin break; 13841f4b63f8SJohn Baldwin case UTRACE_DLOPEN_STOP: 13851f4b63f8SJohn Baldwin printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name, 13861f4b63f8SJohn Baldwin ut->refcnt); 13871f4b63f8SJohn Baldwin break; 13881f4b63f8SJohn Baldwin case UTRACE_DLCLOSE_START: 13891f4b63f8SJohn Baldwin printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name, 13901f4b63f8SJohn Baldwin ut->refcnt); 13911f4b63f8SJohn Baldwin break; 13921f4b63f8SJohn Baldwin case UTRACE_DLCLOSE_STOP: 13931f4b63f8SJohn Baldwin printf("dlclose(%p) finished\n", ut->handle); 13941f4b63f8SJohn Baldwin break; 13951f4b63f8SJohn Baldwin case UTRACE_LOAD_OBJECT: 13961f4b63f8SJohn Baldwin printf("RTLD: loaded %p @ %p - %p (%s)\n", ut->handle, 13971f4b63f8SJohn Baldwin ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 13981f4b63f8SJohn Baldwin ut->name); 13991f4b63f8SJohn Baldwin break; 14001f4b63f8SJohn Baldwin case UTRACE_UNLOAD_OBJECT: 14011f4b63f8SJohn Baldwin printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle, 14021f4b63f8SJohn Baldwin ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 14031f4b63f8SJohn Baldwin ut->name); 14041f4b63f8SJohn Baldwin break; 14051f4b63f8SJohn Baldwin case UTRACE_ADD_RUNDEP: 14061f4b63f8SJohn Baldwin parent = ut->mapbase; 14071f4b63f8SJohn Baldwin printf("RTLD: %p now depends on %p (%s, %d)\n", parent, 14081f4b63f8SJohn Baldwin ut->handle, ut->name, ut->refcnt); 14091f4b63f8SJohn Baldwin break; 14101f4b63f8SJohn Baldwin case UTRACE_PRELOAD_FINISHED: 14111f4b63f8SJohn Baldwin printf("RTLD: LD_PRELOAD finished\n"); 14121f4b63f8SJohn Baldwin break; 14131f4b63f8SJohn Baldwin case UTRACE_INIT_CALL: 14141f4b63f8SJohn Baldwin printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle, 14151f4b63f8SJohn Baldwin ut->name); 14161f4b63f8SJohn Baldwin break; 14171f4b63f8SJohn Baldwin case UTRACE_FINI_CALL: 14181f4b63f8SJohn Baldwin printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle, 14191f4b63f8SJohn Baldwin ut->name); 14201f4b63f8SJohn Baldwin break; 14211f4b63f8SJohn Baldwin default: 14221f4b63f8SJohn Baldwin p += 4; 14231f4b63f8SJohn Baldwin len -= 4; 14241f4b63f8SJohn Baldwin printf("RTLD: %d ", len); 14251f4b63f8SJohn Baldwin while (len--) 14261f4b63f8SJohn Baldwin if (decimal) 14271f4b63f8SJohn Baldwin printf(" %d", *p++); 14281f4b63f8SJohn Baldwin else 14291f4b63f8SJohn Baldwin printf(" %02x", *p++); 14301f4b63f8SJohn Baldwin printf("\n"); 14311f4b63f8SJohn Baldwin } 14321f4b63f8SJohn Baldwin } 14331f4b63f8SJohn Baldwin 1434670b9e9fSJohn Baldwin struct utrace_malloc { 1435670b9e9fSJohn Baldwin void *p; 1436670b9e9fSJohn Baldwin size_t s; 1437670b9e9fSJohn Baldwin void *r; 1438670b9e9fSJohn Baldwin }; 1439670b9e9fSJohn Baldwin 1440670b9e9fSJohn Baldwin void 144181a31394SDag-Erling Smørgrav ktruser_malloc(unsigned char *p) 1442670b9e9fSJohn Baldwin { 1443670b9e9fSJohn Baldwin struct utrace_malloc *ut = (struct utrace_malloc *)p; 1444670b9e9fSJohn Baldwin 144522ce05c9SColin Percival if (ut->p == (void *)(intptr_t)(-1)) 1446670b9e9fSJohn Baldwin printf("malloc_init()\n"); 144722ce05c9SColin Percival else if (ut->s == 0) 1448670b9e9fSJohn Baldwin printf("free(%p)\n", ut->p); 144922ce05c9SColin Percival else if (ut->p == NULL) 145022ce05c9SColin Percival printf("%p = malloc(%zu)\n", ut->r, ut->s); 1451670b9e9fSJohn Baldwin else 1452670b9e9fSJohn Baldwin printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s); 1453670b9e9fSJohn Baldwin } 1454670b9e9fSJohn Baldwin 145591fbb9c1SDavid Malone void 145691fbb9c1SDavid Malone ktruser(int len, unsigned char *p) 145782e2dd32SPoul-Henning Kamp { 1458670b9e9fSJohn Baldwin 14591f4b63f8SJohn Baldwin if (len >= 8 && bcmp(p, "RTLD", 4) == 0) { 14601f4b63f8SJohn Baldwin ktruser_rtld(len, p); 14611f4b63f8SJohn Baldwin return; 14621f4b63f8SJohn Baldwin } 14631f4b63f8SJohn Baldwin 1464670b9e9fSJohn Baldwin if (len == sizeof(struct utrace_malloc)) { 146581a31394SDag-Erling Smørgrav ktruser_malloc(p); 1466670b9e9fSJohn Baldwin return; 1467670b9e9fSJohn Baldwin } 1468670b9e9fSJohn Baldwin 146909307b25SDag-Erling Smørgrav printf("%d ", len); 14703f8ba9aeSPoul-Henning Kamp while (len--) 1471743f9174SPoul-Henning Kamp if (decimal) 147209307b25SDag-Erling Smørgrav printf(" %d", *p++); 1473743f9174SPoul-Henning Kamp else 147409307b25SDag-Erling Smørgrav printf(" %02x", *p++); 147509307b25SDag-Erling Smørgrav printf("\n"); 147682e2dd32SPoul-Henning Kamp } 147782e2dd32SPoul-Henning Kamp 147891fbb9c1SDavid Malone void 147960e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa) 148060e15db9SDag-Erling Smørgrav { 148160e15db9SDag-Erling Smørgrav /* 148260e15db9SDag-Erling Smørgrav TODO: Support additional address families 148360e15db9SDag-Erling Smørgrav #include <netnatm/natm.h> 148460e15db9SDag-Erling Smørgrav struct sockaddr_natm *natm; 1485237abf0cSDavide Italiano #include <netsmb/netbios.h> 1486237abf0cSDavide Italiano struct sockaddr_nb *nb; 148760e15db9SDag-Erling Smørgrav */ 148860e15db9SDag-Erling Smørgrav char addr[64]; 148960e15db9SDag-Erling Smørgrav 149060e15db9SDag-Erling Smørgrav /* 149160e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that sa points to a 149260e15db9SDag-Erling Smørgrav * buffer at least sizeof(struct sockaddr) bytes long and exactly 149360e15db9SDag-Erling Smørgrav * sa->sa_len bytes long. 149460e15db9SDag-Erling Smørgrav */ 149560e15db9SDag-Erling Smørgrav printf("struct sockaddr { "); 149660e15db9SDag-Erling Smørgrav sockfamilyname(sa->sa_family); 149760e15db9SDag-Erling Smørgrav printf(", "); 149860e15db9SDag-Erling Smørgrav 149960e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n) \ 150081a31394SDag-Erling Smørgrav if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) { \ 150160e15db9SDag-Erling Smørgrav printf("invalid"); \ 150260e15db9SDag-Erling Smørgrav break; \ 150360e15db9SDag-Erling Smørgrav } 150460e15db9SDag-Erling Smørgrav 150560e15db9SDag-Erling Smørgrav switch(sa->sa_family) { 150660e15db9SDag-Erling Smørgrav case AF_INET: { 150781a31394SDag-Erling Smørgrav struct sockaddr_in sa_in; 150860e15db9SDag-Erling Smørgrav 150981a31394SDag-Erling Smørgrav memset(&sa_in, 0, sizeof(sa_in)); 1510449df4ecSAndrey Zonov memcpy(&sa_in, sa, sa->sa_len); 151160e15db9SDag-Erling Smørgrav check_sockaddr_len(in); 151281a31394SDag-Erling Smørgrav inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr); 151381a31394SDag-Erling Smørgrav printf("%s:%u", addr, ntohs(sa_in.sin_port)); 151460e15db9SDag-Erling Smørgrav break; 151560e15db9SDag-Erling Smørgrav } 151660e15db9SDag-Erling Smørgrav #ifdef NETATALK 151760e15db9SDag-Erling Smørgrav case AF_APPLETALK: { 151881a31394SDag-Erling Smørgrav struct sockaddr_at sa_at; 151960e15db9SDag-Erling Smørgrav struct netrange *nr; 152060e15db9SDag-Erling Smørgrav 152181a31394SDag-Erling Smørgrav memset(&sa_at, 0, sizeof(sa_at)); 1522449df4ecSAndrey Zonov memcpy(&sa_at, sa, sa->sa_len); 152360e15db9SDag-Erling Smørgrav check_sockaddr_len(at); 152481a31394SDag-Erling Smørgrav nr = &sa_at.sat_range.r_netrange; 152581a31394SDag-Erling Smørgrav printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net), 152681a31394SDag-Erling Smørgrav sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet), 152760e15db9SDag-Erling Smørgrav ntohs(nr->nr_lastnet), nr->nr_phase); 152860e15db9SDag-Erling Smørgrav break; 152960e15db9SDag-Erling Smørgrav } 153060e15db9SDag-Erling Smørgrav #endif 153160e15db9SDag-Erling Smørgrav case AF_INET6: { 153281a31394SDag-Erling Smørgrav struct sockaddr_in6 sa_in6; 153360e15db9SDag-Erling Smørgrav 153481a31394SDag-Erling Smørgrav memset(&sa_in6, 0, sizeof(sa_in6)); 1535449df4ecSAndrey Zonov memcpy(&sa_in6, sa, sa->sa_len); 153660e15db9SDag-Erling Smørgrav check_sockaddr_len(in6); 1537b9ef8051SAndrey V. Elsukov getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6), 1538b9ef8051SAndrey V. Elsukov addr, sizeof(addr), NULL, 0, NI_NUMERICHOST); 153981a31394SDag-Erling Smørgrav printf("[%s]:%u", addr, htons(sa_in6.sin6_port)); 154060e15db9SDag-Erling Smørgrav break; 154160e15db9SDag-Erling Smørgrav } 154260e15db9SDag-Erling Smørgrav #ifdef IPX 154360e15db9SDag-Erling Smørgrav case AF_IPX: { 154481a31394SDag-Erling Smørgrav struct sockaddr_ipx sa_ipx; 154560e15db9SDag-Erling Smørgrav 154681a31394SDag-Erling Smørgrav memset(&sa_ipx, 0, sizeof(sa_ipx)); 1547449df4ecSAndrey Zonov memcpy(&sa_ipx, sa, sa->sa_len); 154860e15db9SDag-Erling Smørgrav check_sockaddr_len(ipx); 154960e15db9SDag-Erling Smørgrav /* XXX wish we had ipx_ntop */ 155081a31394SDag-Erling Smørgrav printf("%s", ipx_ntoa(sa_ipx.sipx_addr)); 155181a31394SDag-Erling Smørgrav free(sa_ipx); 155260e15db9SDag-Erling Smørgrav break; 155360e15db9SDag-Erling Smørgrav } 155460e15db9SDag-Erling Smørgrav #endif 155560e15db9SDag-Erling Smørgrav case AF_UNIX: { 155681a31394SDag-Erling Smørgrav struct sockaddr_un sa_un; 155760e15db9SDag-Erling Smørgrav 155881a31394SDag-Erling Smørgrav memset(&sa_un, 0, sizeof(sa_un)); 1559449df4ecSAndrey Zonov memcpy(&sa_un, sa, sa->sa_len); 156081a31394SDag-Erling Smørgrav printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path); 156160e15db9SDag-Erling Smørgrav break; 156260e15db9SDag-Erling Smørgrav } 156360e15db9SDag-Erling Smørgrav default: 156460e15db9SDag-Erling Smørgrav printf("unknown address family"); 156560e15db9SDag-Erling Smørgrav } 156660e15db9SDag-Erling Smørgrav printf(" }\n"); 156760e15db9SDag-Erling Smørgrav } 156860e15db9SDag-Erling Smørgrav 156960e15db9SDag-Erling Smørgrav void 157060e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp) 157160e15db9SDag-Erling Smørgrav { 157260e15db9SDag-Erling Smørgrav char mode[12], timestr[PATH_MAX + 4]; 157360e15db9SDag-Erling Smørgrav struct passwd *pwd; 157460e15db9SDag-Erling Smørgrav struct group *grp; 157560e15db9SDag-Erling Smørgrav struct tm *tm; 157660e15db9SDag-Erling Smørgrav 157760e15db9SDag-Erling Smørgrav /* 157860e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that statp points to a 157960e15db9SDag-Erling Smørgrav * buffer exactly sizeof(struct stat) bytes long. 158060e15db9SDag-Erling Smørgrav */ 158160e15db9SDag-Erling Smørgrav printf("struct stat {"); 158260e15db9SDag-Erling Smørgrav strmode(statp->st_mode, mode); 158360e15db9SDag-Erling Smørgrav printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ", 158460e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode, 158560e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_nlink); 158660e15db9SDag-Erling Smørgrav if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL) 158760e15db9SDag-Erling Smørgrav printf("uid=%ju, ", (uintmax_t)statp->st_uid); 158860e15db9SDag-Erling Smørgrav else 158960e15db9SDag-Erling Smørgrav printf("uid=\"%s\", ", pwd->pw_name); 159060e15db9SDag-Erling Smørgrav if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL) 159160e15db9SDag-Erling Smørgrav printf("gid=%ju, ", (uintmax_t)statp->st_gid); 159260e15db9SDag-Erling Smørgrav else 159360e15db9SDag-Erling Smørgrav printf("gid=\"%s\", ", grp->gr_name); 159460e15db9SDag-Erling Smørgrav printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); 159560e15db9SDag-Erling Smørgrav printf("atime="); 159660e15db9SDag-Erling Smørgrav if (resolv == 0) 159799742a23SEd Schouten printf("%jd", (intmax_t)statp->st_atim.tv_sec); 159860e15db9SDag-Erling Smørgrav else { 159999742a23SEd Schouten tm = localtime(&statp->st_atim.tv_sec); 160009307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 160160e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 160260e15db9SDag-Erling Smørgrav } 160399742a23SEd Schouten if (statp->st_atim.tv_nsec != 0) 160499742a23SEd Schouten printf(".%09ld, ", statp->st_atim.tv_nsec); 160560e15db9SDag-Erling Smørgrav else 160660e15db9SDag-Erling Smørgrav printf(", "); 160760e15db9SDag-Erling Smørgrav printf("stime="); 160860e15db9SDag-Erling Smørgrav if (resolv == 0) 160999742a23SEd Schouten printf("%jd", (intmax_t)statp->st_mtim.tv_sec); 161060e15db9SDag-Erling Smørgrav else { 161199742a23SEd Schouten tm = localtime(&statp->st_mtim.tv_sec); 161209307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 161360e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 161460e15db9SDag-Erling Smørgrav } 161599742a23SEd Schouten if (statp->st_mtim.tv_nsec != 0) 161699742a23SEd Schouten printf(".%09ld, ", statp->st_mtim.tv_nsec); 161760e15db9SDag-Erling Smørgrav else 161860e15db9SDag-Erling Smørgrav printf(", "); 161960e15db9SDag-Erling Smørgrav printf("ctime="); 162060e15db9SDag-Erling Smørgrav if (resolv == 0) 162199742a23SEd Schouten printf("%jd", (intmax_t)statp->st_ctim.tv_sec); 162260e15db9SDag-Erling Smørgrav else { 162399742a23SEd Schouten tm = localtime(&statp->st_ctim.tv_sec); 162409307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 162560e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 162660e15db9SDag-Erling Smørgrav } 162799742a23SEd Schouten if (statp->st_ctim.tv_nsec != 0) 162899742a23SEd Schouten printf(".%09ld, ", statp->st_ctim.tv_nsec); 162960e15db9SDag-Erling Smørgrav else 163060e15db9SDag-Erling Smørgrav printf(", "); 163160e15db9SDag-Erling Smørgrav printf("birthtime="); 163260e15db9SDag-Erling Smørgrav if (resolv == 0) 163399742a23SEd Schouten printf("%jd", (intmax_t)statp->st_birthtim.tv_sec); 163460e15db9SDag-Erling Smørgrav else { 163599742a23SEd Schouten tm = localtime(&statp->st_birthtim.tv_sec); 163609307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 163760e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 163860e15db9SDag-Erling Smørgrav } 163999742a23SEd Schouten if (statp->st_birthtim.tv_nsec != 0) 164099742a23SEd Schouten printf(".%09ld, ", statp->st_birthtim.tv_nsec); 164160e15db9SDag-Erling Smørgrav else 164260e15db9SDag-Erling Smørgrav printf(", "); 164360e15db9SDag-Erling Smørgrav printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x", 164460e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize, 164560e15db9SDag-Erling Smørgrav (intmax_t)statp->st_blocks, statp->st_flags); 164660e15db9SDag-Erling Smørgrav printf(" }\n"); 164760e15db9SDag-Erling Smørgrav } 164860e15db9SDag-Erling Smørgrav 164960e15db9SDag-Erling Smørgrav void 165060e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen) 165160e15db9SDag-Erling Smørgrav { 165260e15db9SDag-Erling Smørgrav char *name, *data; 165360e15db9SDag-Erling Smørgrav size_t namelen, datalen; 165460e15db9SDag-Erling Smørgrav int i; 165530c1278fSWarner Losh struct stat sb; 165630c1278fSWarner Losh struct sockaddr_storage ss; 165760e15db9SDag-Erling Smørgrav 165860e15db9SDag-Erling Smørgrav for (name = buf, namelen = 0; 165960e15db9SDag-Erling Smørgrav namelen < buflen && name[namelen] != '\0'; 166060e15db9SDag-Erling Smørgrav ++namelen) 166160e15db9SDag-Erling Smørgrav /* nothing */; 166260e15db9SDag-Erling Smørgrav if (namelen == buflen) 166360e15db9SDag-Erling Smørgrav goto invalid; 166460e15db9SDag-Erling Smørgrav if (name[namelen] != '\0') 166560e15db9SDag-Erling Smørgrav goto invalid; 166660e15db9SDag-Erling Smørgrav data = buf + namelen + 1; 166760e15db9SDag-Erling Smørgrav datalen = buflen - namelen - 1; 166860e15db9SDag-Erling Smørgrav if (datalen == 0) 166960e15db9SDag-Erling Smørgrav goto invalid; 167060e15db9SDag-Erling Smørgrav /* sanity check */ 167181a31394SDag-Erling Smørgrav for (i = 0; i < (int)namelen; ++i) 167281a31394SDag-Erling Smørgrav if (!isalpha(name[i])) 167360e15db9SDag-Erling Smørgrav goto invalid; 167460e15db9SDag-Erling Smørgrav if (strcmp(name, "stat") == 0) { 167560e15db9SDag-Erling Smørgrav if (datalen != sizeof(struct stat)) 167660e15db9SDag-Erling Smørgrav goto invalid; 167730c1278fSWarner Losh memcpy(&sb, data, datalen); 167830c1278fSWarner Losh ktrstat(&sb); 167960e15db9SDag-Erling Smørgrav } else if (strcmp(name, "sockaddr") == 0) { 168030c1278fSWarner Losh if (datalen > sizeof(ss)) 168160e15db9SDag-Erling Smørgrav goto invalid; 168230c1278fSWarner Losh memcpy(&ss, data, datalen); 16834b03484fSAndrey Zonov if (datalen != ss.ss_len) 168430c1278fSWarner Losh goto invalid; 168530c1278fSWarner Losh ktrsockaddr((struct sockaddr *)&ss); 168660e15db9SDag-Erling Smørgrav } else { 168760e15db9SDag-Erling Smørgrav printf("unknown structure\n"); 168860e15db9SDag-Erling Smørgrav } 168960e15db9SDag-Erling Smørgrav return; 169060e15db9SDag-Erling Smørgrav invalid: 169160e15db9SDag-Erling Smørgrav printf("invalid record\n"); 169260e15db9SDag-Erling Smørgrav } 169360e15db9SDag-Erling Smørgrav 1694c601ad8eSDag-Erling Smørgrav void 1695c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr) 1696c601ad8eSDag-Erling Smørgrav { 1697e141be6fSDag-Erling Smørgrav switch (ktr->cap_type) { 1698e141be6fSDag-Erling Smørgrav case CAPFAIL_NOTCAPABLE: 1699e141be6fSDag-Erling Smørgrav /* operation on fd with insufficient capabilities */ 1700e141be6fSDag-Erling Smørgrav printf("operation requires "); 1701c601ad8eSDag-Erling Smørgrav capname((intmax_t)ktr->cap_needed); 1702e141be6fSDag-Erling Smørgrav printf(", process holds "); 1703c601ad8eSDag-Erling Smørgrav capname((intmax_t)ktr->cap_held); 1704e141be6fSDag-Erling Smørgrav break; 1705e141be6fSDag-Erling Smørgrav case CAPFAIL_INCREASE: 1706e141be6fSDag-Erling Smørgrav /* requested more capabilities than fd already has */ 1707e141be6fSDag-Erling Smørgrav printf("attempt to increase capabilities from "); 1708e141be6fSDag-Erling Smørgrav capname((intmax_t)ktr->cap_held); 170960e45df8SDag-Erling Smørgrav printf(" to "); 171060e45df8SDag-Erling Smørgrav capname((intmax_t)ktr->cap_needed); 1711e141be6fSDag-Erling Smørgrav break; 1712e141be6fSDag-Erling Smørgrav case CAPFAIL_SYSCALL: 1713e141be6fSDag-Erling Smørgrav /* called restricted syscall */ 1714e141be6fSDag-Erling Smørgrav printf("disallowed system call"); 1715e141be6fSDag-Erling Smørgrav break; 1716e141be6fSDag-Erling Smørgrav case CAPFAIL_LOOKUP: 1717e141be6fSDag-Erling Smørgrav /* used ".." in strict-relative mode */ 1718e141be6fSDag-Erling Smørgrav printf("restricted VFS lookup"); 1719e141be6fSDag-Erling Smørgrav break; 1720e141be6fSDag-Erling Smørgrav default: 1721e141be6fSDag-Erling Smørgrav printf("unknown capability failure: "); 1722e141be6fSDag-Erling Smørgrav capname((intmax_t)ktr->cap_needed); 1723e141be6fSDag-Erling Smørgrav printf(" "); 1724e141be6fSDag-Erling Smørgrav capname((intmax_t)ktr->cap_held); 1725e141be6fSDag-Erling Smørgrav break; 1726e141be6fSDag-Erling Smørgrav } 172735818d2eSJohn Baldwin printf("\n"); 172835818d2eSJohn Baldwin } 172935818d2eSJohn Baldwin 173035818d2eSJohn Baldwin void 173135818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr) 173235818d2eSJohn Baldwin { 173335818d2eSJohn Baldwin 173435818d2eSJohn Baldwin printf("0x%jx ", ktr->vaddr); 173535818d2eSJohn Baldwin vmprotname(ktr->type); 173635818d2eSJohn Baldwin printf("\n"); 173735818d2eSJohn Baldwin } 173835818d2eSJohn Baldwin 173935818d2eSJohn Baldwin void 174035818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr) 174135818d2eSJohn Baldwin { 174235818d2eSJohn Baldwin 174335818d2eSJohn Baldwin vmresultname(ktr->result); 174435818d2eSJohn Baldwin printf("\n"); 1745c601ad8eSDag-Erling Smørgrav } 1746c601ad8eSDag-Erling Smørgrav 1747dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 1748dde5f9b9SDmitry Chagin void 1749dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr) 1750dde5f9b9SDmitry Chagin { 1751dde5f9b9SDmitry Chagin int narg = ktr->ktr_narg; 1752dde5f9b9SDmitry Chagin register_t *ip; 1753dde5f9b9SDmitry Chagin 1754dde5f9b9SDmitry Chagin if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0) 1755dde5f9b9SDmitry Chagin printf("[%d]", ktr->ktr_code); 1756dde5f9b9SDmitry Chagin else 1757dde5f9b9SDmitry Chagin printf("%s", linux_syscallnames[ktr->ktr_code]); 1758dde5f9b9SDmitry Chagin ip = &ktr->ktr_args[0]; 1759dde5f9b9SDmitry Chagin if (narg) { 1760dde5f9b9SDmitry Chagin char c = '('; 1761dde5f9b9SDmitry Chagin while (narg > 0) 1762dde5f9b9SDmitry Chagin print_number(ip, narg, c); 1763dde5f9b9SDmitry Chagin putchar(')'); 1764dde5f9b9SDmitry Chagin } 1765dde5f9b9SDmitry Chagin putchar('\n'); 1766dde5f9b9SDmitry Chagin } 1767dde5f9b9SDmitry Chagin 1768dde5f9b9SDmitry Chagin void 1769dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr) 1770dde5f9b9SDmitry Chagin { 1771dde5f9b9SDmitry Chagin register_t ret = ktr->ktr_retval; 1772dde5f9b9SDmitry Chagin int error = ktr->ktr_error; 1773dde5f9b9SDmitry Chagin int code = ktr->ktr_code; 1774dde5f9b9SDmitry Chagin 1775dde5f9b9SDmitry Chagin if (code >= nlinux_syscalls || code < 0) 1776dde5f9b9SDmitry Chagin printf("[%d] ", code); 1777dde5f9b9SDmitry Chagin else 1778dde5f9b9SDmitry Chagin printf("%s ", linux_syscallnames[code]); 1779dde5f9b9SDmitry Chagin 1780dde5f9b9SDmitry Chagin if (error == 0) { 1781dde5f9b9SDmitry Chagin if (fancy) { 1782dde5f9b9SDmitry Chagin printf("%ld", (long)ret); 1783dde5f9b9SDmitry Chagin if (ret < 0 || ret > 9) 178409307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 1785dde5f9b9SDmitry Chagin } else { 1786dde5f9b9SDmitry Chagin if (decimal) 1787dde5f9b9SDmitry Chagin printf("%ld", (long)ret); 1788dde5f9b9SDmitry Chagin else 178909307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 1790dde5f9b9SDmitry Chagin } 1791dde5f9b9SDmitry Chagin } else if (error == ERESTART) 1792dde5f9b9SDmitry Chagin printf("RESTART"); 1793dde5f9b9SDmitry Chagin else if (error == EJUSTRETURN) 1794dde5f9b9SDmitry Chagin printf("JUSTRETURN"); 1795dde5f9b9SDmitry Chagin else { 1796dde5f9b9SDmitry Chagin if (ktr->ktr_error <= ELAST + 1) 1797dde5f9b9SDmitry Chagin error = abs(bsd_to_linux_errno[ktr->ktr_error]); 1798dde5f9b9SDmitry Chagin else 1799dde5f9b9SDmitry Chagin error = 999; 1800dde5f9b9SDmitry Chagin printf("-1 errno %d", error); 1801dde5f9b9SDmitry Chagin if (fancy) 1802dde5f9b9SDmitry Chagin printf(" %s", strerror(ktr->ktr_error)); 1803dde5f9b9SDmitry Chagin } 1804dde5f9b9SDmitry Chagin putchar('\n'); 1805dde5f9b9SDmitry Chagin } 1806dde5f9b9SDmitry Chagin #endif 1807dde5f9b9SDmitry Chagin 180860e15db9SDag-Erling Smørgrav void 180991fbb9c1SDavid Malone usage(void) 18109b50d902SRodney W. Grimes { 18117144d36fSDmitry Chagin fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] " 1812da647ae9SRuslan Ermilov "[-m maxdata] [-p pid] [-t trstr]\n"); 18139b50d902SRodney W. Grimes exit(1); 18149b50d902SRodney W. Grimes } 1815