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> 6234763d1cSJohn Baldwin #include <sys/wait.h> 6360e15db9SDag-Erling Smørgrav #ifdef IPX 6460e15db9SDag-Erling Smørgrav #include <sys/types.h> 6560e15db9SDag-Erling Smørgrav #include <netipx/ipx.h> 6660e15db9SDag-Erling Smørgrav #endif 6760e15db9SDag-Erling Smørgrav #ifdef NETATALK 6860e15db9SDag-Erling Smørgrav #include <netatalk/at.h> 6960e15db9SDag-Erling Smørgrav #endif 701a604cfaSXin LI #include <arpa/inet.h> 7160e15db9SDag-Erling Smørgrav #include <netinet/in.h> 721a604cfaSXin LI #include <ctype.h> 731f4b63f8SJohn Baldwin #include <dlfcn.h> 7415fc002bSPhilippe Charnier #include <err.h> 7560e15db9SDag-Erling Smørgrav #include <grp.h> 7660e15db9SDag-Erling Smørgrav #include <inttypes.h> 7715fc002bSPhilippe Charnier #include <locale.h> 78b9ef8051SAndrey V. Elsukov #include <netdb.h> 79f9b20fc8SPawel Jakub Dawidek #include <nl_types.h> 8060e15db9SDag-Erling Smørgrav #include <pwd.h> 819b50d902SRodney W. Grimes #include <stdio.h> 829b50d902SRodney W. Grimes #include <stdlib.h> 839b50d902SRodney W. Grimes #include <string.h> 84f9b20fc8SPawel Jakub Dawidek #include <termios.h> 8560e15db9SDag-Erling Smørgrav #include <time.h> 8615fc002bSPhilippe Charnier #include <unistd.h> 8715fc002bSPhilippe Charnier #include <vis.h> 889b50d902SRodney W. Grimes #include "ktrace.h" 8998a68a58SAlexander Leidinger #include "kdump_subr.h" 909b50d902SRodney W. Grimes 917144d36fSDmitry Chagin u_int abidump(struct ktr_header *); 927144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *); 9391fbb9c1SDavid Malone int fread_tail(void *, int, int); 9491fbb9c1SDavid Malone void dumpheader(struct ktr_header *); 957144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int); 967144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int); 9791fbb9c1SDavid Malone void ktrnamei(char *, int); 98ec4beb5dSPeter Wemm void hexdump(char *, int, int); 99ec4beb5dSPeter Wemm void visdump(char *, int, int); 10091fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int); 101dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *); 10291fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *); 10388bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *); 10481a31394SDag-Erling Smørgrav void ktruser_malloc(unsigned char *); 10581a31394SDag-Erling Smørgrav void ktruser_rtld(int, unsigned char *); 10691fbb9c1SDavid Malone void ktruser(int, unsigned char *); 1077008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *); 10860e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *); 10960e15db9SDag-Erling Smørgrav void ktrstat(struct stat *); 11060e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t); 111c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *); 11235818d2eSJohn Baldwin void ktrfault(struct ktr_fault *); 11335818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *); 114f9b20fc8SPawel Jakub Dawidek void limitfd(int fd); 11591fbb9c1SDavid Malone void usage(void); 116d09e66beSDag-Erling Smørgrav void ioctlname(unsigned long, int); 11791fbb9c1SDavid Malone 11860e15db9SDag-Erling Smørgrav int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, 1197144d36fSDmitry Chagin resolv = 0, abiflag = 0; 12091fbb9c1SDavid Malone const char *tracefile = DEF_TRACEFILE; 1219b50d902SRodney W. Grimes struct ktr_header ktr_header; 1229b50d902SRodney W. Grimes 12360e15db9SDag-Erling Smørgrav #define TIME_FORMAT "%b %e %T %Y" 1249b50d902SRodney W. Grimes #define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 1259b50d902SRodney W. Grimes 12695bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do { \ 127dde5f9b9SDmitry Chagin if (decimal) \ 128e4bb45b1SDag-Erling Smørgrav printf("%c%jd", c, (intmax_t)*i); \ 129dde5f9b9SDmitry Chagin else \ 130661522f5SDag-Erling Smørgrav printf("%c%#jx", c, (uintmax_t)(u_register_t)*i); \ 131dde5f9b9SDmitry Chagin i++; \ 132dde5f9b9SDmitry Chagin n--; \ 133dde5f9b9SDmitry Chagin c = ','; \ 134e4bb45b1SDag-Erling Smørgrav } while (0) 135dde5f9b9SDmitry Chagin 136dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 137dde5f9b9SDmitry Chagin 138dde5f9b9SDmitry Chagin void linux_ktrsyscall(struct ktr_syscall *); 139dde5f9b9SDmitry Chagin void linux_ktrsysret(struct ktr_sysret *); 140dde5f9b9SDmitry Chagin extern char *linux_syscallnames[]; 141dde5f9b9SDmitry Chagin extern int nlinux_syscalls; 142dde5f9b9SDmitry Chagin 143dde5f9b9SDmitry Chagin /* 144dde5f9b9SDmitry Chagin * from linux.h 145dde5f9b9SDmitry Chagin * Linux syscalls return negative errno's, we do positive and map them 146dde5f9b9SDmitry Chagin */ 147dde5f9b9SDmitry Chagin static int bsd_to_linux_errno[ELAST + 1] = { 148dde5f9b9SDmitry Chagin -0, -1, -2, -3, -4, -5, -6, -7, -8, -9, 149dde5f9b9SDmitry Chagin -10, -35, -12, -13, -14, -15, -16, -17, -18, -19, 150dde5f9b9SDmitry Chagin -20, -21, -22, -23, -24, -25, -26, -27, -28, -29, 151dde5f9b9SDmitry Chagin -30, -31, -32, -33, -34, -11,-115,-114, -88, -89, 152dde5f9b9SDmitry Chagin -90, -91, -92, -93, -94, -95, -96, -97, -98, -99, 153dde5f9b9SDmitry Chagin -100,-101,-102,-103,-104,-105,-106,-107,-108,-109, 154dde5f9b9SDmitry Chagin -110,-111, -40, -36,-112,-113, -39, -11, -87,-122, 155dde5f9b9SDmitry Chagin -116, -66, -6, -6, -6, -6, -6, -37, -38, -9, 156dde5f9b9SDmitry Chagin -6, -6, -43, -42, -75,-125, -84, -95, -16, -74, 157dde5f9b9SDmitry Chagin -72, -67, -71 158dde5f9b9SDmitry Chagin }; 159dde5f9b9SDmitry Chagin #endif 160dde5f9b9SDmitry Chagin 1617144d36fSDmitry Chagin struct proc_info 1627144d36fSDmitry Chagin { 1637144d36fSDmitry Chagin TAILQ_ENTRY(proc_info) info; 1647144d36fSDmitry Chagin u_int sv_flags; 1657144d36fSDmitry Chagin pid_t pid; 1667144d36fSDmitry Chagin }; 1677144d36fSDmitry Chagin 1687144d36fSDmitry Chagin TAILQ_HEAD(trace_procs, proc_info) trace_procs; 1697144d36fSDmitry Chagin 170e14da991SPawel Jakub Dawidek static void 171e14da991SPawel Jakub Dawidek strerror_init(void) 172e14da991SPawel Jakub Dawidek { 173e14da991SPawel Jakub Dawidek 174e14da991SPawel Jakub Dawidek /* 175e14da991SPawel Jakub Dawidek * Cache NLS data before entering capability mode. 176e14da991SPawel Jakub Dawidek * XXXPJD: There should be strerror_init() and strsignal_init() in libc. 177e14da991SPawel Jakub Dawidek */ 178e14da991SPawel Jakub Dawidek (void)catopen("libc", NL_CAT_LOCALE); 179e14da991SPawel Jakub Dawidek } 180e14da991SPawel Jakub Dawidek 181e14da991SPawel Jakub Dawidek static void 182e14da991SPawel Jakub Dawidek localtime_init(void) 183e14da991SPawel Jakub Dawidek { 184e14da991SPawel Jakub Dawidek time_t ltime; 185e14da991SPawel Jakub Dawidek 186e14da991SPawel Jakub Dawidek /* 187e14da991SPawel Jakub Dawidek * Allow localtime(3) to cache /etc/localtime content before entering 188e14da991SPawel Jakub Dawidek * capability mode. 189e14da991SPawel Jakub Dawidek * XXXPJD: There should be localtime_init() in libc. 190e14da991SPawel Jakub Dawidek */ 191e14da991SPawel Jakub Dawidek (void)time(<ime); 192e14da991SPawel Jakub Dawidek (void)localtime(<ime); 193e14da991SPawel Jakub Dawidek } 194e14da991SPawel Jakub Dawidek 19591fbb9c1SDavid Malone int 19691fbb9c1SDavid Malone main(int argc, char *argv[]) 1979b50d902SRodney W. Grimes { 1989b50d902SRodney W. Grimes int ch, ktrlen, size; 19991fbb9c1SDavid Malone void *m; 2009b50d902SRodney W. Grimes int trpoints = ALL_POINTS; 201db53f66bSJohn Baldwin int drop_logged; 202ec4beb5dSPeter Wemm pid_t pid = 0; 2037144d36fSDmitry Chagin u_int sv_flags; 2049b50d902SRodney W. Grimes 20509307b25SDag-Erling Smørgrav setlocale(LC_CTYPE, ""); 2065ccbfb26SAndrey A. Chernov 2077144d36fSDmitry Chagin while ((ch = getopt(argc,argv,"f:dElm:np:AHRrsTt:")) != -1) 20809307b25SDag-Erling Smørgrav switch (ch) { 2097144d36fSDmitry Chagin case 'A': 2107144d36fSDmitry Chagin abiflag = 1; 2117144d36fSDmitry Chagin break; 2129b50d902SRodney W. Grimes case 'f': 2139b50d902SRodney W. Grimes tracefile = optarg; 2149b50d902SRodney W. Grimes break; 2159b50d902SRodney W. Grimes case 'd': 2169b50d902SRodney W. Grimes decimal = 1; 2179b50d902SRodney W. Grimes break; 2189b50d902SRodney W. Grimes case 'l': 2199b50d902SRodney W. Grimes tail = 1; 2209b50d902SRodney W. Grimes break; 2219b50d902SRodney W. Grimes case 'm': 2229b50d902SRodney W. Grimes maxdata = atoi(optarg); 2239b50d902SRodney W. Grimes break; 2249b50d902SRodney W. Grimes case 'n': 2259b50d902SRodney W. Grimes fancy = 0; 2269b50d902SRodney W. Grimes break; 227ec4beb5dSPeter Wemm case 'p': 228ec4beb5dSPeter Wemm pid = atoi(optarg); 229ec4beb5dSPeter Wemm break; 23060e15db9SDag-Erling Smørgrav case 'r': 23160e15db9SDag-Erling Smørgrav resolv = 1; 23260e15db9SDag-Erling Smørgrav break; 233df0c8868SRobert Watson case 's': 234df0c8868SRobert Watson suppressdata = 1; 235df0c8868SRobert Watson break; 236ec131914SPeter Wemm case 'E': 237ec131914SPeter Wemm timestamp = 3; /* elapsed timestamp */ 238ec131914SPeter Wemm break; 239a9ac598bSRobert Watson case 'H': 240a9ac598bSRobert Watson threads = 1; 241a9ac598bSRobert Watson break; 2429b50d902SRodney W. Grimes case 'R': 2439b50d902SRodney W. Grimes timestamp = 2; /* relative timestamp */ 2449b50d902SRodney W. Grimes break; 2459b50d902SRodney W. Grimes case 'T': 2469b50d902SRodney W. Grimes timestamp = 1; 2479b50d902SRodney W. Grimes break; 2489b50d902SRodney W. Grimes case 't': 2499b50d902SRodney W. Grimes trpoints = getpoints(optarg); 25015fc002bSPhilippe Charnier if (trpoints < 0) 25115fc002bSPhilippe Charnier errx(1, "unknown trace point in %s", optarg); 2529b50d902SRodney W. Grimes break; 2539b50d902SRodney W. Grimes default: 2549b50d902SRodney W. Grimes usage(); 2559b50d902SRodney W. Grimes } 2569b50d902SRodney W. Grimes 25780844fd1SBill Fenner if (argc > optind) 2589b50d902SRodney W. Grimes usage(); 2599b50d902SRodney W. Grimes 26009307b25SDag-Erling Smørgrav m = malloc(size = 1025); 26115fc002bSPhilippe Charnier if (m == NULL) 26215fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 26315fc002bSPhilippe Charnier if (!freopen(tracefile, "r", stdin)) 26415fc002bSPhilippe Charnier err(1, "%s", tracefile); 265f9b20fc8SPawel Jakub Dawidek 266e14da991SPawel Jakub Dawidek strerror_init(); 267e14da991SPawel Jakub Dawidek localtime_init(); 268e14da991SPawel Jakub Dawidek 269d2c9ca44SPawel Jakub Dawidek if (resolv == 0) { 270f9b20fc8SPawel Jakub Dawidek if (cap_enter() < 0 && errno != ENOSYS) 271f9b20fc8SPawel Jakub Dawidek err(1, "unable to enter capability mode"); 272d2c9ca44SPawel Jakub Dawidek } 273f9b20fc8SPawel Jakub Dawidek limitfd(STDIN_FILENO); 274f9b20fc8SPawel Jakub Dawidek limitfd(STDOUT_FILENO); 275f9b20fc8SPawel Jakub Dawidek limitfd(STDERR_FILENO); 276f9b20fc8SPawel Jakub Dawidek 2777144d36fSDmitry Chagin TAILQ_INIT(&trace_procs); 278db53f66bSJohn Baldwin drop_logged = 0; 2799b50d902SRodney W. Grimes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 280db53f66bSJohn Baldwin if (ktr_header.ktr_type & KTR_DROP) { 281db53f66bSJohn Baldwin ktr_header.ktr_type &= ~KTR_DROP; 282a9ac598bSRobert Watson if (!drop_logged && threads) { 28309307b25SDag-Erling Smørgrav printf( 284c065c0b8SJaakko Heinonen "%6jd %6jd %-8.*s Events dropped.\n", 285c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, 286c065c0b8SJaakko Heinonen ktr_header.ktr_tid > 0 ? 287c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_tid : 0, 288c065c0b8SJaakko Heinonen MAXCOMLEN, ktr_header.ktr_comm); 289a9ac598bSRobert Watson drop_logged = 1; 290a9ac598bSRobert Watson } else if (!drop_logged) { 29109307b25SDag-Erling Smørgrav printf("%6jd %-8.*s Events dropped.\n", 292c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, MAXCOMLEN, 293db53f66bSJohn Baldwin ktr_header.ktr_comm); 294db53f66bSJohn Baldwin drop_logged = 1; 295db53f66bSJohn Baldwin } 296db53f66bSJohn Baldwin } 2979b50d902SRodney W. Grimes if (trpoints & (1<<ktr_header.ktr_type)) 29801a36e29SJohn Baldwin if (pid == 0 || ktr_header.ktr_pid == pid || 29901a36e29SJohn Baldwin ktr_header.ktr_tid == pid) 3009b50d902SRodney W. Grimes dumpheader(&ktr_header); 30115fc002bSPhilippe Charnier if ((ktrlen = ktr_header.ktr_len) < 0) 30215fc002bSPhilippe Charnier errx(1, "bogus length 0x%x", ktrlen); 3039b50d902SRodney W. Grimes if (ktrlen > size) { 30409307b25SDag-Erling Smørgrav m = realloc(m, ktrlen+1); 30515fc002bSPhilippe Charnier if (m == NULL) 30615fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 3079b50d902SRodney W. Grimes size = ktrlen; 3089b50d902SRodney W. Grimes } 30915fc002bSPhilippe Charnier if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 31015fc002bSPhilippe Charnier errx(1, "data too short"); 3117144d36fSDmitry Chagin if (fetchprocinfo(&ktr_header, (u_int *)m) != 0) 3127144d36fSDmitry Chagin continue; 3137144d36fSDmitry Chagin sv_flags = abidump(&ktr_header); 31401a36e29SJohn Baldwin if (pid && ktr_header.ktr_pid != pid && 31501a36e29SJohn Baldwin ktr_header.ktr_tid != pid) 316ec4beb5dSPeter Wemm continue; 3179b50d902SRodney W. Grimes if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 3189b50d902SRodney W. Grimes continue; 319db53f66bSJohn Baldwin drop_logged = 0; 3209b50d902SRodney W. Grimes switch (ktr_header.ktr_type) { 3219b50d902SRodney W. Grimes case KTR_SYSCALL: 322dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 323dde5f9b9SDmitry Chagin if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX) 324dde5f9b9SDmitry Chagin linux_ktrsyscall((struct ktr_syscall *)m); 325dde5f9b9SDmitry Chagin else 326dde5f9b9SDmitry Chagin #endif 3277144d36fSDmitry Chagin ktrsyscall((struct ktr_syscall *)m, sv_flags); 3289b50d902SRodney W. Grimes break; 3299b50d902SRodney W. Grimes case KTR_SYSRET: 330dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 331dde5f9b9SDmitry Chagin if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX) 332dde5f9b9SDmitry Chagin linux_ktrsysret((struct ktr_sysret *)m); 333dde5f9b9SDmitry Chagin else 334dde5f9b9SDmitry Chagin #endif 3357144d36fSDmitry Chagin ktrsysret((struct ktr_sysret *)m, sv_flags); 3369b50d902SRodney W. Grimes break; 3379b50d902SRodney W. Grimes case KTR_NAMEI: 338a56be37eSJohn Baldwin case KTR_SYSCTL: 3399b50d902SRodney W. Grimes ktrnamei(m, ktrlen); 3409b50d902SRodney W. Grimes break; 3419b50d902SRodney W. Grimes case KTR_GENIO: 3429b50d902SRodney W. Grimes ktrgenio((struct ktr_genio *)m, ktrlen); 3439b50d902SRodney W. Grimes break; 3449b50d902SRodney W. Grimes case KTR_PSIG: 345dde5f9b9SDmitry Chagin ktrpsig((struct ktr_psig *)m); 3469b50d902SRodney W. Grimes break; 3479b50d902SRodney W. Grimes case KTR_CSW: 34888bf5036SJohn Baldwin if (ktrlen == sizeof(struct ktr_csw_old)) 34988bf5036SJohn Baldwin ktrcsw_old((struct ktr_csw_old *)m); 35088bf5036SJohn Baldwin else 3519b50d902SRodney W. Grimes ktrcsw((struct ktr_csw *)m); 3529b50d902SRodney W. Grimes break; 35382e2dd32SPoul-Henning Kamp case KTR_USER: 3543f8ba9aeSPoul-Henning Kamp ktruser(ktrlen, m); 35582e2dd32SPoul-Henning Kamp break; 35660e15db9SDag-Erling Smørgrav case KTR_STRUCT: 35760e15db9SDag-Erling Smørgrav ktrstruct(m, ktrlen); 35860e15db9SDag-Erling Smørgrav break; 359c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 360c601ad8eSDag-Erling Smørgrav ktrcapfail((struct ktr_cap_fail *)m); 36135818d2eSJohn Baldwin break; 36235818d2eSJohn Baldwin case KTR_FAULT: 36335818d2eSJohn Baldwin ktrfault((struct ktr_fault *)m); 36435818d2eSJohn Baldwin break; 36535818d2eSJohn Baldwin case KTR_FAULTEND: 36635818d2eSJohn Baldwin ktrfaultend((struct ktr_faultend *)m); 36735818d2eSJohn Baldwin break; 368b9609ab1SJohn Baldwin default: 369b9609ab1SJohn Baldwin printf("\n"); 370b9609ab1SJohn Baldwin break; 3719b50d902SRodney W. Grimes } 3729b50d902SRodney W. Grimes if (tail) 37309307b25SDag-Erling Smørgrav fflush(stdout); 3749b50d902SRodney W. Grimes } 37591fbb9c1SDavid Malone return 0; 3769b50d902SRodney W. Grimes } 3779b50d902SRodney W. Grimes 378f9b20fc8SPawel Jakub Dawidek void 379f9b20fc8SPawel Jakub Dawidek limitfd(int fd) 380f9b20fc8SPawel Jakub Dawidek { 381f9b20fc8SPawel Jakub Dawidek cap_rights_t rights; 382f9b20fc8SPawel Jakub Dawidek unsigned long cmd; 383f9b20fc8SPawel Jakub Dawidek 3847008be5bSPawel Jakub Dawidek cap_rights_init(&rights, CAP_FSTAT); 385f9b20fc8SPawel Jakub Dawidek cmd = -1; 386f9b20fc8SPawel Jakub Dawidek 387f9b20fc8SPawel Jakub Dawidek switch (fd) { 388f9b20fc8SPawel Jakub Dawidek case STDIN_FILENO: 3897008be5bSPawel Jakub Dawidek cap_rights_set(&rights, CAP_READ); 390f9b20fc8SPawel Jakub Dawidek break; 391f9b20fc8SPawel Jakub Dawidek case STDOUT_FILENO: 3927008be5bSPawel Jakub Dawidek cap_rights_set(&rights, CAP_IOCTL, CAP_WRITE); 393f9b20fc8SPawel Jakub Dawidek cmd = TIOCGETA; /* required by isatty(3) in printf(3) */ 394f9b20fc8SPawel Jakub Dawidek break; 395f9b20fc8SPawel Jakub Dawidek case STDERR_FILENO: 3967008be5bSPawel Jakub Dawidek cap_rights_set(&rights, CAP_WRITE); 397f9b20fc8SPawel Jakub Dawidek if (!suppressdata) { 3987008be5bSPawel Jakub Dawidek cap_rights_set(&rights, CAP_IOCTL); 399f9b20fc8SPawel Jakub Dawidek cmd = TIOCGWINSZ; 400f9b20fc8SPawel Jakub Dawidek } 401f9b20fc8SPawel Jakub Dawidek break; 402f9b20fc8SPawel Jakub Dawidek default: 403f9b20fc8SPawel Jakub Dawidek abort(); 404f9b20fc8SPawel Jakub Dawidek } 405f9b20fc8SPawel Jakub Dawidek 4067008be5bSPawel Jakub Dawidek if (cap_rights_limit(fd, &rights) < 0 && errno != ENOSYS) 407f9b20fc8SPawel Jakub Dawidek err(1, "unable to limit rights for descriptor %d", fd); 408f9b20fc8SPawel Jakub Dawidek if (cmd != -1 && cap_ioctls_limit(fd, &cmd, 1) < 0 && errno != ENOSYS) 409f9b20fc8SPawel Jakub Dawidek err(1, "unable to limit ioctls for descriptor %d", fd); 410f9b20fc8SPawel Jakub Dawidek } 411f9b20fc8SPawel Jakub Dawidek 41291fbb9c1SDavid Malone int 41391fbb9c1SDavid Malone fread_tail(void *buf, int size, int num) 4149b50d902SRodney W. Grimes { 4159b50d902SRodney W. Grimes int i; 4169b50d902SRodney W. Grimes 4179b50d902SRodney W. Grimes while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 41809307b25SDag-Erling Smørgrav sleep(1); 4199b50d902SRodney W. Grimes clearerr(stdin); 4209b50d902SRodney W. Grimes } 4219b50d902SRodney W. Grimes return (i); 4229b50d902SRodney W. Grimes } 4239b50d902SRodney W. Grimes 4247144d36fSDmitry Chagin int 4257144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags) 4267144d36fSDmitry Chagin { 4277144d36fSDmitry Chagin struct proc_info *pi; 4287144d36fSDmitry Chagin 4297144d36fSDmitry Chagin switch (kth->ktr_type) { 4307144d36fSDmitry Chagin case KTR_PROCCTOR: 4317144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 4327144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 4337144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 4347144d36fSDmitry Chagin break; 4357144d36fSDmitry Chagin } 4367144d36fSDmitry Chagin } 4377144d36fSDmitry Chagin pi = malloc(sizeof(struct proc_info)); 4387144d36fSDmitry Chagin if (pi == NULL) 4397144d36fSDmitry Chagin errx(1, "%s", strerror(ENOMEM)); 4407144d36fSDmitry Chagin pi->sv_flags = *flags; 4417144d36fSDmitry Chagin pi->pid = kth->ktr_pid; 4427144d36fSDmitry Chagin TAILQ_INSERT_TAIL(&trace_procs, pi, info); 4437144d36fSDmitry Chagin return (1); 4447144d36fSDmitry Chagin 4457144d36fSDmitry Chagin case KTR_PROCDTOR: 4467144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 4477144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 4487144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 4497144d36fSDmitry Chagin free(pi); 4507144d36fSDmitry Chagin break; 4517144d36fSDmitry Chagin } 4527144d36fSDmitry Chagin } 4537144d36fSDmitry Chagin return (1); 4547144d36fSDmitry Chagin } 4557144d36fSDmitry Chagin 4567144d36fSDmitry Chagin return (0); 4577144d36fSDmitry Chagin } 4587144d36fSDmitry Chagin 4597144d36fSDmitry Chagin u_int 4607144d36fSDmitry Chagin abidump(struct ktr_header *kth) 4617144d36fSDmitry Chagin { 4627144d36fSDmitry Chagin struct proc_info *pi; 4637144d36fSDmitry Chagin const char *abi; 4647144d36fSDmitry Chagin const char *arch; 4657144d36fSDmitry Chagin u_int flags = 0; 4667144d36fSDmitry Chagin 4677144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 4687144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 4697144d36fSDmitry Chagin flags = pi->sv_flags; 4707144d36fSDmitry Chagin break; 4717144d36fSDmitry Chagin } 4727144d36fSDmitry Chagin } 4737144d36fSDmitry Chagin 4747144d36fSDmitry Chagin if (abiflag == 0) 4757144d36fSDmitry Chagin return (flags); 4767144d36fSDmitry Chagin 4777144d36fSDmitry Chagin switch (flags & SV_ABI_MASK) { 4787144d36fSDmitry Chagin case SV_ABI_LINUX: 4797144d36fSDmitry Chagin abi = "L"; 4807144d36fSDmitry Chagin break; 4817144d36fSDmitry Chagin case SV_ABI_FREEBSD: 4827144d36fSDmitry Chagin abi = "F"; 4837144d36fSDmitry Chagin break; 4847144d36fSDmitry Chagin default: 4857144d36fSDmitry Chagin abi = "U"; 4867144d36fSDmitry Chagin break; 4877144d36fSDmitry Chagin } 4887144d36fSDmitry Chagin 4897144d36fSDmitry Chagin if (flags != 0) { 4907144d36fSDmitry Chagin if (flags & SV_LP64) 4917144d36fSDmitry Chagin arch = "64"; 4927144d36fSDmitry Chagin else 4937144d36fSDmitry Chagin arch = "32"; 4947144d36fSDmitry Chagin } else 4957144d36fSDmitry Chagin arch = "00"; 4967144d36fSDmitry Chagin 4977144d36fSDmitry Chagin printf("%s%s ", abi, arch); 4987144d36fSDmitry Chagin 4997144d36fSDmitry Chagin return (flags); 5007144d36fSDmitry Chagin } 5017144d36fSDmitry Chagin 50291fbb9c1SDavid Malone void 50391fbb9c1SDavid Malone dumpheader(struct ktr_header *kth) 5049b50d902SRodney W. Grimes { 5059b50d902SRodney W. Grimes static char unknown[64]; 5069b50d902SRodney W. Grimes static struct timeval prevtime, temp; 50791fbb9c1SDavid Malone const char *type; 5089b50d902SRodney W. Grimes 5099b50d902SRodney W. Grimes switch (kth->ktr_type) { 5109b50d902SRodney W. Grimes case KTR_SYSCALL: 5119b50d902SRodney W. Grimes type = "CALL"; 5129b50d902SRodney W. Grimes break; 5139b50d902SRodney W. Grimes case KTR_SYSRET: 5149b50d902SRodney W. Grimes type = "RET "; 5159b50d902SRodney W. Grimes break; 5169b50d902SRodney W. Grimes case KTR_NAMEI: 5179b50d902SRodney W. Grimes type = "NAMI"; 5189b50d902SRodney W. Grimes break; 5199b50d902SRodney W. Grimes case KTR_GENIO: 5209b50d902SRodney W. Grimes type = "GIO "; 5219b50d902SRodney W. Grimes break; 5229b50d902SRodney W. Grimes case KTR_PSIG: 5239b50d902SRodney W. Grimes type = "PSIG"; 5249b50d902SRodney W. Grimes break; 5259b50d902SRodney W. Grimes case KTR_CSW: 5269b50d902SRodney W. Grimes type = "CSW "; 5279b50d902SRodney W. Grimes break; 52882e2dd32SPoul-Henning Kamp case KTR_USER: 52982e2dd32SPoul-Henning Kamp type = "USER"; 53082e2dd32SPoul-Henning Kamp break; 53160e15db9SDag-Erling Smørgrav case KTR_STRUCT: 53260e15db9SDag-Erling Smørgrav type = "STRU"; 53360e15db9SDag-Erling Smørgrav break; 534a56be37eSJohn Baldwin case KTR_SYSCTL: 535a56be37eSJohn Baldwin type = "SCTL"; 536a56be37eSJohn Baldwin break; 5377144d36fSDmitry Chagin case KTR_PROCCTOR: 5387144d36fSDmitry Chagin /* FALLTHROUGH */ 5397144d36fSDmitry Chagin case KTR_PROCDTOR: 5407144d36fSDmitry Chagin return; 541c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 542c601ad8eSDag-Erling Smørgrav type = "CAP "; 543c601ad8eSDag-Erling Smørgrav break; 54435818d2eSJohn Baldwin case KTR_FAULT: 54535818d2eSJohn Baldwin type = "PFLT"; 54635818d2eSJohn Baldwin break; 54735818d2eSJohn Baldwin case KTR_FAULTEND: 54835818d2eSJohn Baldwin type = "PRET"; 54935818d2eSJohn Baldwin break; 5509b50d902SRodney W. Grimes default: 55109307b25SDag-Erling Smørgrav sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 5529b50d902SRodney W. Grimes type = unknown; 5539b50d902SRodney W. Grimes } 5549b50d902SRodney W. Grimes 555a9ac598bSRobert Watson /* 556a9ac598bSRobert Watson * The ktr_tid field was previously the ktr_buffer field, which held 557a9ac598bSRobert Watson * the kernel pointer value for the buffer associated with data 558a9ac598bSRobert Watson * following the record header. It now holds a threadid, but only 559a9ac598bSRobert Watson * for trace files after the change. Older trace files still contain 560a9ac598bSRobert Watson * kernel pointers. Detect this and suppress the results by printing 561a9ac598bSRobert Watson * negative tid's as 0. 562a9ac598bSRobert Watson */ 563a9ac598bSRobert Watson if (threads) 56409307b25SDag-Erling Smørgrav printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid, 565c065c0b8SJaakko Heinonen kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0, 566c065c0b8SJaakko Heinonen MAXCOMLEN, kth->ktr_comm); 567a9ac598bSRobert Watson else 56809307b25SDag-Erling Smørgrav printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN, 569a9ac598bSRobert Watson kth->ktr_comm); 5709b50d902SRodney W. Grimes if (timestamp) { 571ec131914SPeter Wemm if (timestamp == 3) { 572ec131914SPeter Wemm if (prevtime.tv_sec == 0) 573ec131914SPeter Wemm prevtime = kth->ktr_time; 574ec131914SPeter Wemm timevalsub(&kth->ktr_time, &prevtime); 575ec131914SPeter Wemm } 5769b50d902SRodney W. Grimes if (timestamp == 2) { 5779b50d902SRodney W. Grimes temp = kth->ktr_time; 5789b50d902SRodney W. Grimes timevalsub(&kth->ktr_time, &prevtime); 5799b50d902SRodney W. Grimes prevtime = temp; 5809b50d902SRodney W. Grimes } 58109307b25SDag-Erling Smørgrav printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec, 582c065c0b8SJaakko Heinonen kth->ktr_time.tv_usec); 5839b50d902SRodney W. Grimes } 58409307b25SDag-Erling Smørgrav printf("%s ", type); 5859b50d902SRodney W. Grimes } 5869b50d902SRodney W. Grimes 5879b50d902SRodney W. Grimes #include <sys/syscall.h> 5889b50d902SRodney W. Grimes #define KTRACE 58955229b56SPoul-Henning Kamp #include <sys/kern/syscalls.c> 5909b50d902SRodney W. Grimes #undef KTRACE 5919b50d902SRodney W. Grimes int nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]); 5929b50d902SRodney W. Grimes 59391fbb9c1SDavid Malone void 5947144d36fSDmitry Chagin ktrsyscall(struct ktr_syscall *ktr, u_int flags) 5959b50d902SRodney W. Grimes { 59691fbb9c1SDavid Malone int narg = ktr->ktr_narg; 59791fbb9c1SDavid Malone register_t *ip; 598c601ad8eSDag-Erling Smørgrav intmax_t arg; 5999b50d902SRodney W. Grimes 6007144d36fSDmitry Chagin if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) || 6017144d36fSDmitry Chagin (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0)) 60209307b25SDag-Erling Smørgrav printf("[%d]", ktr->ktr_code); 6039b50d902SRodney W. Grimes else 60409307b25SDag-Erling Smørgrav printf("%s", syscallnames[ktr->ktr_code]); 6057a6ec4cfSDmitrij Tejblum ip = &ktr->ktr_args[0]; 6069b50d902SRodney W. Grimes if (narg) { 6079b50d902SRodney W. Grimes char c = '('; 6087144d36fSDmitry Chagin if (fancy && 6097144d36fSDmitry Chagin (flags == 0 || (flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) { 61073430055SDag-Erling Smørgrav switch (ktr->ktr_code) { 6111ca6c7fcSJilles Tjoelker case SYS_bindat: 6121ca6c7fcSJilles Tjoelker case SYS_connectat: 6138447b7cdSJilles Tjoelker case SYS_faccessat: 6148447b7cdSJilles Tjoelker case SYS_fchmodat: 6158447b7cdSJilles Tjoelker case SYS_fchownat: 6168447b7cdSJilles Tjoelker case SYS_fstatat: 6178447b7cdSJilles Tjoelker case SYS_futimesat: 6188447b7cdSJilles Tjoelker case SYS_linkat: 6198447b7cdSJilles Tjoelker case SYS_mkdirat: 6208447b7cdSJilles Tjoelker case SYS_mkfifoat: 6218447b7cdSJilles Tjoelker case SYS_mknodat: 6228447b7cdSJilles Tjoelker case SYS_openat: 6238447b7cdSJilles Tjoelker case SYS_readlinkat: 6248447b7cdSJilles Tjoelker case SYS_renameat: 6258447b7cdSJilles Tjoelker case SYS_unlinkat: 6268447b7cdSJilles Tjoelker putchar('('); 6278447b7cdSJilles Tjoelker atfdname(*ip, decimal); 6288447b7cdSJilles Tjoelker c = ','; 6298447b7cdSJilles Tjoelker ip++; 6308447b7cdSJilles Tjoelker narg--; 6318447b7cdSJilles Tjoelker break; 6328447b7cdSJilles Tjoelker } 6338447b7cdSJilles Tjoelker switch (ktr->ktr_code) { 63473430055SDag-Erling Smørgrav case SYS_ioctl: { 63598a68a58SAlexander Leidinger print_number(ip, narg, c); 636d09e66beSDag-Erling Smørgrav putchar(c); 637d09e66beSDag-Erling Smørgrav ioctlname(*ip, decimal); 6389b50d902SRodney W. Grimes c = ','; 6399b50d902SRodney W. Grimes ip++; 6409b50d902SRodney W. Grimes narg--; 64173430055SDag-Erling Smørgrav break; 64273430055SDag-Erling Smørgrav } 64373430055SDag-Erling Smørgrav case SYS_ptrace: 64409307b25SDag-Erling Smørgrav putchar('('); 64595bb676aSDag-Erling Smørgrav ptraceopname(*ip); 6469b50d902SRodney W. Grimes c = ','; 6479b50d902SRodney W. Grimes ip++; 6489b50d902SRodney W. Grimes narg--; 64973430055SDag-Erling Smørgrav break; 65073430055SDag-Erling Smørgrav case SYS_access: 65173430055SDag-Erling Smørgrav case SYS_eaccess: 6528447b7cdSJilles Tjoelker case SYS_faccessat: 65398a68a58SAlexander Leidinger print_number(ip, narg, c); 65409307b25SDag-Erling Smørgrav putchar(','); 65595bb676aSDag-Erling Smørgrav accessmodename(*ip); 65698a68a58SAlexander Leidinger ip++; 65798a68a58SAlexander Leidinger narg--; 65873430055SDag-Erling Smørgrav break; 65973430055SDag-Erling Smørgrav case SYS_open: 6608447b7cdSJilles Tjoelker case SYS_openat: 66198a68a58SAlexander Leidinger print_number(ip, narg, c); 66209307b25SDag-Erling Smørgrav putchar(','); 66395bb676aSDag-Erling Smørgrav flagsandmodename(ip[0], ip[1], decimal); 66473430055SDag-Erling Smørgrav ip += 2; 66598a68a58SAlexander Leidinger narg -= 2; 66673430055SDag-Erling Smørgrav break; 66773430055SDag-Erling Smørgrav case SYS_wait4: 66898a68a58SAlexander Leidinger print_number(ip, narg, c); 66998a68a58SAlexander Leidinger print_number(ip, narg, c); 67034763d1cSJohn Baldwin /* 67134763d1cSJohn Baldwin * A flags value of zero is valid for 67234763d1cSJohn Baldwin * wait4() but not for wait6(), so 67334763d1cSJohn Baldwin * handle zero special here. 67434763d1cSJohn Baldwin */ 67534763d1cSJohn Baldwin if (*ip == 0) { 67634763d1cSJohn Baldwin print_number(ip, narg, c); 67734763d1cSJohn Baldwin } else { 67809307b25SDag-Erling Smørgrav putchar(','); 67934763d1cSJohn Baldwin wait6optname(*ip); 68034763d1cSJohn Baldwin ip++; 68134763d1cSJohn Baldwin narg--; 68234763d1cSJohn Baldwin } 68334763d1cSJohn Baldwin break; 68434763d1cSJohn Baldwin case SYS_wait6: 68534763d1cSJohn Baldwin putchar('('); 68634763d1cSJohn Baldwin idtypename(*ip, decimal); 68734763d1cSJohn Baldwin c = ','; 68834763d1cSJohn Baldwin ip++; 68934763d1cSJohn Baldwin narg--; 69034763d1cSJohn Baldwin print_number(ip, narg, c); 69134763d1cSJohn Baldwin print_number(ip, narg, c); 69234763d1cSJohn Baldwin putchar(','); 69334763d1cSJohn Baldwin wait6optname(*ip); 69498a68a58SAlexander Leidinger ip++; 69598a68a58SAlexander Leidinger narg--; 69673430055SDag-Erling Smørgrav break; 69773430055SDag-Erling Smørgrav case SYS_chmod: 69873430055SDag-Erling Smørgrav case SYS_fchmod: 69973430055SDag-Erling Smørgrav case SYS_lchmod: 70098a68a58SAlexander Leidinger print_number(ip, narg, c); 70109307b25SDag-Erling Smørgrav putchar(','); 70295bb676aSDag-Erling Smørgrav modename(*ip); 70398a68a58SAlexander Leidinger ip++; 70498a68a58SAlexander Leidinger narg--; 70573430055SDag-Erling Smørgrav break; 70673430055SDag-Erling Smørgrav case SYS_mknod: 7078447b7cdSJilles Tjoelker case SYS_mknodat: 70898a68a58SAlexander Leidinger print_number(ip, narg, c); 70909307b25SDag-Erling Smørgrav putchar(','); 71095bb676aSDag-Erling Smørgrav modename(*ip); 71198a68a58SAlexander Leidinger ip++; 71298a68a58SAlexander Leidinger narg--; 71373430055SDag-Erling Smørgrav break; 71473430055SDag-Erling Smørgrav case SYS_getfsstat: 71598a68a58SAlexander Leidinger print_number(ip, narg, c); 71698a68a58SAlexander Leidinger print_number(ip, narg, c); 71709307b25SDag-Erling Smørgrav putchar(','); 71895bb676aSDag-Erling Smørgrav getfsstatflagsname(*ip); 71998a68a58SAlexander Leidinger ip++; 72098a68a58SAlexander Leidinger narg--; 72173430055SDag-Erling Smørgrav break; 72273430055SDag-Erling Smørgrav case SYS_mount: 72398a68a58SAlexander Leidinger print_number(ip, narg, c); 72498a68a58SAlexander Leidinger print_number(ip, narg, c); 72509307b25SDag-Erling Smørgrav putchar(','); 72695bb676aSDag-Erling Smørgrav mountflagsname(*ip); 72798a68a58SAlexander Leidinger ip++; 72898a68a58SAlexander Leidinger narg--; 72973430055SDag-Erling Smørgrav break; 73073430055SDag-Erling Smørgrav case SYS_unmount: 73198a68a58SAlexander Leidinger print_number(ip, narg, c); 73209307b25SDag-Erling Smørgrav putchar(','); 73395bb676aSDag-Erling Smørgrav mountflagsname(*ip); 73498a68a58SAlexander Leidinger ip++; 73598a68a58SAlexander Leidinger narg--; 73673430055SDag-Erling Smørgrav break; 73773430055SDag-Erling Smørgrav case SYS_recvmsg: 73873430055SDag-Erling Smørgrav case SYS_sendmsg: 73998a68a58SAlexander Leidinger print_number(ip, narg, c); 74098a68a58SAlexander Leidinger print_number(ip, narg, c); 74109307b25SDag-Erling Smørgrav putchar(','); 74295bb676aSDag-Erling Smørgrav sendrecvflagsname(*ip); 74398a68a58SAlexander Leidinger ip++; 74498a68a58SAlexander Leidinger narg--; 74573430055SDag-Erling Smørgrav break; 74673430055SDag-Erling Smørgrav case SYS_recvfrom: 74773430055SDag-Erling Smørgrav case SYS_sendto: 74898a68a58SAlexander Leidinger print_number(ip, narg, c); 74998a68a58SAlexander Leidinger print_number(ip, narg, c); 75098a68a58SAlexander Leidinger print_number(ip, narg, c); 75109307b25SDag-Erling Smørgrav putchar(','); 75295bb676aSDag-Erling Smørgrav sendrecvflagsname(*ip); 75398a68a58SAlexander Leidinger ip++; 75498a68a58SAlexander Leidinger narg--; 75573430055SDag-Erling Smørgrav break; 75673430055SDag-Erling Smørgrav case SYS_chflags: 75773430055SDag-Erling Smørgrav case SYS_fchflags: 75873430055SDag-Erling Smørgrav case SYS_lchflags: 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_kill: 76698a68a58SAlexander Leidinger print_number(ip, narg, c); 76709307b25SDag-Erling Smørgrav putchar(','); 76895bb676aSDag-Erling Smørgrav signame(*ip); 76998a68a58SAlexander Leidinger ip++; 77098a68a58SAlexander Leidinger narg--; 77173430055SDag-Erling Smørgrav break; 77273430055SDag-Erling Smørgrav case SYS_reboot: 77309307b25SDag-Erling Smørgrav putchar('('); 77495bb676aSDag-Erling Smørgrav rebootoptname(*ip); 77598a68a58SAlexander Leidinger ip++; 77698a68a58SAlexander Leidinger narg--; 77773430055SDag-Erling Smørgrav break; 77873430055SDag-Erling Smørgrav case SYS_umask: 77909307b25SDag-Erling Smørgrav putchar('('); 78095bb676aSDag-Erling Smørgrav modename(*ip); 78198a68a58SAlexander Leidinger ip++; 78298a68a58SAlexander Leidinger narg--; 78373430055SDag-Erling Smørgrav break; 78473430055SDag-Erling Smørgrav case SYS_msync: 78598a68a58SAlexander Leidinger print_number(ip, narg, c); 78698a68a58SAlexander Leidinger print_number(ip, narg, c); 78709307b25SDag-Erling Smørgrav putchar(','); 78895bb676aSDag-Erling Smørgrav msyncflagsname(*ip); 78998a68a58SAlexander Leidinger ip++; 79098a68a58SAlexander Leidinger narg--; 79173430055SDag-Erling Smørgrav break; 792cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap 79373430055SDag-Erling Smørgrav case SYS_freebsd6_mmap: 794cae1120aSPeter Wemm print_number(ip, narg, c); 795cae1120aSPeter Wemm print_number(ip, narg, c); 79609307b25SDag-Erling Smørgrav putchar(','); 79795bb676aSDag-Erling Smørgrav mmapprotname(*ip); 79809307b25SDag-Erling Smørgrav putchar(','); 799cae1120aSPeter Wemm ip++; 800cae1120aSPeter Wemm narg--; 80195bb676aSDag-Erling Smørgrav mmapflagsname(*ip); 802cae1120aSPeter Wemm ip++; 803cae1120aSPeter Wemm narg--; 80473430055SDag-Erling Smørgrav break; 805cae1120aSPeter Wemm #endif 80673430055SDag-Erling Smørgrav case SYS_mmap: 80798a68a58SAlexander Leidinger print_number(ip, narg, c); 80898a68a58SAlexander Leidinger print_number(ip, narg, c); 80909307b25SDag-Erling Smørgrav putchar(','); 81095bb676aSDag-Erling Smørgrav mmapprotname(*ip); 81109307b25SDag-Erling Smørgrav putchar(','); 81298a68a58SAlexander Leidinger ip++; 81398a68a58SAlexander Leidinger narg--; 81495bb676aSDag-Erling Smørgrav mmapflagsname(*ip); 81598a68a58SAlexander Leidinger ip++; 81698a68a58SAlexander Leidinger narg--; 81773430055SDag-Erling Smørgrav break; 81873430055SDag-Erling Smørgrav case SYS_mprotect: 81998a68a58SAlexander Leidinger print_number(ip, narg, c); 82098a68a58SAlexander Leidinger print_number(ip, narg, c); 82109307b25SDag-Erling Smørgrav putchar(','); 82295bb676aSDag-Erling Smørgrav mmapprotname(*ip); 82398a68a58SAlexander Leidinger ip++; 82498a68a58SAlexander Leidinger narg--; 82573430055SDag-Erling Smørgrav break; 82673430055SDag-Erling Smørgrav case SYS_madvise: 82798a68a58SAlexander Leidinger print_number(ip, narg, c); 82898a68a58SAlexander Leidinger print_number(ip, narg, c); 82909307b25SDag-Erling Smørgrav putchar(','); 83095bb676aSDag-Erling Smørgrav madvisebehavname(*ip); 83198a68a58SAlexander Leidinger ip++; 83298a68a58SAlexander Leidinger narg--; 83373430055SDag-Erling Smørgrav break; 83473430055SDag-Erling Smørgrav case SYS_setpriority: 83598a68a58SAlexander Leidinger print_number(ip, narg, c); 83698a68a58SAlexander Leidinger print_number(ip, narg, c); 83709307b25SDag-Erling Smørgrav putchar(','); 83895bb676aSDag-Erling Smørgrav prioname(*ip); 83998a68a58SAlexander Leidinger ip++; 84098a68a58SAlexander Leidinger narg--; 84173430055SDag-Erling Smørgrav break; 84273430055SDag-Erling Smørgrav case SYS_fcntl: 84398a68a58SAlexander Leidinger print_number(ip, narg, c); 84409307b25SDag-Erling Smørgrav putchar(','); 84595bb676aSDag-Erling Smørgrav fcntlcmdname(ip[0], ip[1], decimal); 84673430055SDag-Erling Smørgrav ip += 2; 84798a68a58SAlexander Leidinger narg -= 2; 84873430055SDag-Erling Smørgrav break; 84973430055SDag-Erling Smørgrav case SYS_socket: { 8508bc31d83SCraig Rodrigues int sockdomain; 85109307b25SDag-Erling Smørgrav putchar('('); 85295bb676aSDag-Erling Smørgrav sockdomain = *ip; 8538bc31d83SCraig Rodrigues sockdomainname(sockdomain); 85498a68a58SAlexander Leidinger ip++; 85598a68a58SAlexander Leidinger narg--; 85609307b25SDag-Erling Smørgrav putchar(','); 857f92f062eSJilles Tjoelker socktypenamewithflags(*ip); 85898a68a58SAlexander Leidinger ip++; 85998a68a58SAlexander Leidinger narg--; 8608bc31d83SCraig Rodrigues if (sockdomain == PF_INET || 8618bc31d83SCraig Rodrigues sockdomain == PF_INET6) { 86209307b25SDag-Erling Smørgrav putchar(','); 86395bb676aSDag-Erling Smørgrav sockipprotoname(*ip); 8648bc31d83SCraig Rodrigues ip++; 8658bc31d83SCraig Rodrigues narg--; 8668bc31d83SCraig Rodrigues } 86798a68a58SAlexander Leidinger c = ','; 86873430055SDag-Erling Smørgrav break; 86973430055SDag-Erling Smørgrav } 87073430055SDag-Erling Smørgrav case SYS_setsockopt: 87173430055SDag-Erling Smørgrav case SYS_getsockopt: 87298a68a58SAlexander Leidinger print_number(ip, narg, c); 87309307b25SDag-Erling Smørgrav putchar(','); 87495bb676aSDag-Erling Smørgrav sockoptlevelname(*ip, decimal); 875e4bb45b1SDag-Erling Smørgrav if (*ip == SOL_SOCKET) { 87698a68a58SAlexander Leidinger ip++; 87798a68a58SAlexander Leidinger narg--; 87809307b25SDag-Erling Smørgrav putchar(','); 87995bb676aSDag-Erling Smørgrav sockoptname(*ip); 8800460d351SJohn Baldwin } 88198a68a58SAlexander Leidinger ip++; 88298a68a58SAlexander Leidinger narg--; 88373430055SDag-Erling Smørgrav break; 884cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek 88573430055SDag-Erling Smørgrav case SYS_freebsd6_lseek: 88698a68a58SAlexander Leidinger print_number(ip, narg, c); 88798a68a58SAlexander Leidinger /* Hidden 'pad' argument, not in lseek(2) */ 88898a68a58SAlexander Leidinger print_number(ip, narg, c); 88998a68a58SAlexander Leidinger print_number(ip, narg, c); 89009307b25SDag-Erling Smørgrav putchar(','); 89195bb676aSDag-Erling Smørgrav whencename(*ip); 89298a68a58SAlexander Leidinger ip++; 89398a68a58SAlexander Leidinger narg--; 89473430055SDag-Erling Smørgrav break; 895cae1120aSPeter Wemm #endif 89673430055SDag-Erling Smørgrav case SYS_lseek: 897cae1120aSPeter Wemm print_number(ip, narg, c); 898cae1120aSPeter Wemm /* Hidden 'pad' argument, not in lseek(2) */ 899cae1120aSPeter Wemm print_number(ip, narg, c); 90009307b25SDag-Erling Smørgrav putchar(','); 90195bb676aSDag-Erling Smørgrav whencename(*ip); 902cae1120aSPeter Wemm ip++; 903cae1120aSPeter Wemm narg--; 90473430055SDag-Erling Smørgrav break; 90573430055SDag-Erling Smørgrav case SYS_flock: 90698a68a58SAlexander Leidinger print_number(ip, narg, c); 90709307b25SDag-Erling Smørgrav putchar(','); 90895bb676aSDag-Erling Smørgrav flockname(*ip); 90998a68a58SAlexander Leidinger ip++; 91098a68a58SAlexander Leidinger narg--; 91173430055SDag-Erling Smørgrav break; 91273430055SDag-Erling Smørgrav case SYS_mkfifo: 9138447b7cdSJilles Tjoelker case SYS_mkfifoat: 91473430055SDag-Erling Smørgrav case SYS_mkdir: 9158447b7cdSJilles Tjoelker case SYS_mkdirat: 91698a68a58SAlexander Leidinger print_number(ip, narg, c); 91709307b25SDag-Erling Smørgrav putchar(','); 91895bb676aSDag-Erling Smørgrav modename(*ip); 91998a68a58SAlexander Leidinger ip++; 92098a68a58SAlexander Leidinger narg--; 92173430055SDag-Erling Smørgrav break; 92273430055SDag-Erling Smørgrav case SYS_shutdown: 92398a68a58SAlexander Leidinger print_number(ip, narg, c); 92409307b25SDag-Erling Smørgrav putchar(','); 92595bb676aSDag-Erling Smørgrav shutdownhowname(*ip); 92698a68a58SAlexander Leidinger ip++; 92798a68a58SAlexander Leidinger narg--; 92873430055SDag-Erling Smørgrav break; 92973430055SDag-Erling Smørgrav case SYS_socketpair: 93009307b25SDag-Erling Smørgrav putchar('('); 93195bb676aSDag-Erling Smørgrav sockdomainname(*ip); 93298a68a58SAlexander Leidinger ip++; 93398a68a58SAlexander Leidinger narg--; 93409307b25SDag-Erling Smørgrav putchar(','); 935f92f062eSJilles Tjoelker socktypenamewithflags(*ip); 93698a68a58SAlexander Leidinger ip++; 93798a68a58SAlexander Leidinger narg--; 93898a68a58SAlexander Leidinger c = ','; 93973430055SDag-Erling Smørgrav break; 94073430055SDag-Erling Smørgrav case SYS_getrlimit: 94173430055SDag-Erling Smørgrav case SYS_setrlimit: 94209307b25SDag-Erling Smørgrav putchar('('); 94395bb676aSDag-Erling Smørgrav rlimitname(*ip); 94498a68a58SAlexander Leidinger ip++; 94598a68a58SAlexander Leidinger narg--; 94698a68a58SAlexander Leidinger c = ','; 94773430055SDag-Erling Smørgrav break; 94873430055SDag-Erling Smørgrav case SYS_quotactl: 94998a68a58SAlexander Leidinger print_number(ip, narg, c); 95009307b25SDag-Erling Smørgrav putchar(','); 95195bb676aSDag-Erling Smørgrav quotactlname(*ip); 95298a68a58SAlexander Leidinger ip++; 95398a68a58SAlexander Leidinger narg--; 95498a68a58SAlexander Leidinger c = ','; 95573430055SDag-Erling Smørgrav break; 95673430055SDag-Erling Smørgrav case SYS_nfssvc: 95709307b25SDag-Erling Smørgrav putchar('('); 95895bb676aSDag-Erling Smørgrav nfssvcname(*ip); 95998a68a58SAlexander Leidinger ip++; 96098a68a58SAlexander Leidinger narg--; 96198a68a58SAlexander Leidinger c = ','; 96273430055SDag-Erling Smørgrav break; 96373430055SDag-Erling Smørgrav case SYS_rtprio: 96409307b25SDag-Erling Smørgrav putchar('('); 96595bb676aSDag-Erling Smørgrav rtprioname(*ip); 96698a68a58SAlexander Leidinger ip++; 96798a68a58SAlexander Leidinger narg--; 96898a68a58SAlexander Leidinger c = ','; 96973430055SDag-Erling Smørgrav break; 97073430055SDag-Erling Smørgrav case SYS___semctl: 97198a68a58SAlexander Leidinger print_number(ip, narg, c); 97298a68a58SAlexander Leidinger print_number(ip, narg, c); 97309307b25SDag-Erling Smørgrav putchar(','); 97495bb676aSDag-Erling Smørgrav semctlname(*ip); 97598a68a58SAlexander Leidinger ip++; 97698a68a58SAlexander Leidinger narg--; 97773430055SDag-Erling Smørgrav break; 97873430055SDag-Erling Smørgrav case SYS_semget: 97998a68a58SAlexander Leidinger print_number(ip, narg, c); 98098a68a58SAlexander Leidinger print_number(ip, narg, c); 98109307b25SDag-Erling Smørgrav putchar(','); 98295bb676aSDag-Erling Smørgrav semgetname(*ip); 98398a68a58SAlexander Leidinger ip++; 98498a68a58SAlexander Leidinger narg--; 98573430055SDag-Erling Smørgrav break; 98673430055SDag-Erling Smørgrav case SYS_msgctl: 98798a68a58SAlexander Leidinger print_number(ip, narg, c); 98809307b25SDag-Erling Smørgrav putchar(','); 98995bb676aSDag-Erling Smørgrav shmctlname(*ip); 99098a68a58SAlexander Leidinger ip++; 99198a68a58SAlexander Leidinger narg--; 99273430055SDag-Erling Smørgrav break; 99373430055SDag-Erling Smørgrav case SYS_shmat: 99498a68a58SAlexander Leidinger print_number(ip, narg, c); 99598a68a58SAlexander Leidinger print_number(ip, narg, c); 99609307b25SDag-Erling Smørgrav putchar(','); 99795bb676aSDag-Erling Smørgrav shmatname(*ip); 99898a68a58SAlexander Leidinger ip++; 99998a68a58SAlexander Leidinger narg--; 100073430055SDag-Erling Smørgrav break; 100173430055SDag-Erling Smørgrav case SYS_shmctl: 100298a68a58SAlexander Leidinger print_number(ip, narg, c); 100309307b25SDag-Erling Smørgrav putchar(','); 100495bb676aSDag-Erling Smørgrav shmctlname(*ip); 100598a68a58SAlexander Leidinger ip++; 100698a68a58SAlexander Leidinger narg--; 100773430055SDag-Erling Smørgrav break; 100873430055SDag-Erling Smørgrav case SYS_minherit: 100998a68a58SAlexander Leidinger print_number(ip, narg, c); 101098a68a58SAlexander Leidinger print_number(ip, narg, c); 101109307b25SDag-Erling Smørgrav putchar(','); 101295bb676aSDag-Erling Smørgrav minheritname(*ip); 101398a68a58SAlexander Leidinger ip++; 101498a68a58SAlexander Leidinger narg--; 101573430055SDag-Erling Smørgrav break; 101673430055SDag-Erling Smørgrav case SYS_rfork: 101709307b25SDag-Erling Smørgrav putchar('('); 101895bb676aSDag-Erling Smørgrav rforkname(*ip); 101998a68a58SAlexander Leidinger ip++; 102098a68a58SAlexander Leidinger narg--; 102198a68a58SAlexander Leidinger c = ','; 102273430055SDag-Erling Smørgrav break; 102373430055SDag-Erling Smørgrav case SYS_lio_listio: 102409307b25SDag-Erling Smørgrav putchar('('); 102595bb676aSDag-Erling Smørgrav lio_listioname(*ip); 102698a68a58SAlexander Leidinger ip++; 102798a68a58SAlexander Leidinger narg--; 102898a68a58SAlexander Leidinger c = ','; 102973430055SDag-Erling Smørgrav break; 103073430055SDag-Erling Smørgrav case SYS_mlockall: 103109307b25SDag-Erling Smørgrav putchar('('); 103295bb676aSDag-Erling Smørgrav mlockallname(*ip); 103398a68a58SAlexander Leidinger ip++; 103498a68a58SAlexander Leidinger narg--; 103573430055SDag-Erling Smørgrav break; 103673430055SDag-Erling Smørgrav case SYS_sched_setscheduler: 103798a68a58SAlexander Leidinger print_number(ip, narg, c); 103809307b25SDag-Erling Smørgrav putchar(','); 103995bb676aSDag-Erling Smørgrav schedpolicyname(*ip); 104098a68a58SAlexander Leidinger ip++; 104198a68a58SAlexander Leidinger narg--; 104273430055SDag-Erling Smørgrav break; 104373430055SDag-Erling Smørgrav case SYS_sched_get_priority_max: 104473430055SDag-Erling Smørgrav case SYS_sched_get_priority_min: 104509307b25SDag-Erling Smørgrav putchar('('); 104695bb676aSDag-Erling Smørgrav schedpolicyname(*ip); 104798a68a58SAlexander Leidinger ip++; 104898a68a58SAlexander Leidinger narg--; 104973430055SDag-Erling Smørgrav break; 105073430055SDag-Erling Smørgrav case SYS_sendfile: 105198a68a58SAlexander Leidinger print_number(ip, narg, c); 105298a68a58SAlexander Leidinger print_number(ip, narg, c); 105398a68a58SAlexander Leidinger print_number(ip, narg, c); 105498a68a58SAlexander Leidinger print_number(ip, narg, c); 105598a68a58SAlexander Leidinger print_number(ip, narg, c); 105698a68a58SAlexander Leidinger print_number(ip, narg, c); 105709307b25SDag-Erling Smørgrav putchar(','); 105895bb676aSDag-Erling Smørgrav sendfileflagsname(*ip); 105998a68a58SAlexander Leidinger ip++; 106098a68a58SAlexander Leidinger narg--; 106173430055SDag-Erling Smørgrav break; 106273430055SDag-Erling Smørgrav case SYS_kldsym: 106398a68a58SAlexander Leidinger print_number(ip, narg, c); 106409307b25SDag-Erling Smørgrav putchar(','); 106595bb676aSDag-Erling Smørgrav kldsymcmdname(*ip); 106698a68a58SAlexander Leidinger ip++; 106798a68a58SAlexander Leidinger narg--; 106873430055SDag-Erling Smørgrav break; 106973430055SDag-Erling Smørgrav case SYS_sigprocmask: 107009307b25SDag-Erling Smørgrav putchar('('); 107195bb676aSDag-Erling Smørgrav sigprocmaskhowname(*ip); 107298a68a58SAlexander Leidinger ip++; 107398a68a58SAlexander Leidinger narg--; 107498a68a58SAlexander Leidinger c = ','; 107573430055SDag-Erling Smørgrav break; 107673430055SDag-Erling Smørgrav case SYS___acl_get_file: 107773430055SDag-Erling Smørgrav case SYS___acl_set_file: 107873430055SDag-Erling Smørgrav case SYS___acl_get_fd: 107973430055SDag-Erling Smørgrav case SYS___acl_set_fd: 108073430055SDag-Erling Smørgrav case SYS___acl_delete_file: 108173430055SDag-Erling Smørgrav case SYS___acl_delete_fd: 108273430055SDag-Erling Smørgrav case SYS___acl_aclcheck_file: 108373430055SDag-Erling Smørgrav case SYS___acl_aclcheck_fd: 108473430055SDag-Erling Smørgrav case SYS___acl_get_link: 108573430055SDag-Erling Smørgrav case SYS___acl_set_link: 108673430055SDag-Erling Smørgrav case SYS___acl_delete_link: 108773430055SDag-Erling Smørgrav case SYS___acl_aclcheck_link: 108898a68a58SAlexander Leidinger print_number(ip, narg, c); 108909307b25SDag-Erling Smørgrav putchar(','); 109095bb676aSDag-Erling Smørgrav acltypename(*ip); 109198a68a58SAlexander Leidinger ip++; 109298a68a58SAlexander Leidinger narg--; 109373430055SDag-Erling Smørgrav break; 109473430055SDag-Erling Smørgrav case SYS_sigaction: 109509307b25SDag-Erling Smørgrav putchar('('); 109695bb676aSDag-Erling Smørgrav signame(*ip); 109798a68a58SAlexander Leidinger ip++; 109898a68a58SAlexander Leidinger narg--; 109998a68a58SAlexander Leidinger c = ','; 110073430055SDag-Erling Smørgrav break; 110173430055SDag-Erling Smørgrav case SYS_extattrctl: 110298a68a58SAlexander Leidinger print_number(ip, narg, c); 110309307b25SDag-Erling Smørgrav putchar(','); 110495bb676aSDag-Erling Smørgrav extattrctlname(*ip); 110598a68a58SAlexander Leidinger ip++; 110698a68a58SAlexander Leidinger narg--; 110773430055SDag-Erling Smørgrav break; 110873430055SDag-Erling Smørgrav case SYS_nmount: 110998a68a58SAlexander Leidinger print_number(ip, narg, c); 111098a68a58SAlexander Leidinger print_number(ip, narg, c); 111109307b25SDag-Erling Smørgrav putchar(','); 111295bb676aSDag-Erling Smørgrav mountflagsname(*ip); 111398a68a58SAlexander Leidinger ip++; 111498a68a58SAlexander Leidinger narg--; 111573430055SDag-Erling Smørgrav break; 111673430055SDag-Erling Smørgrav case SYS_thr_create: 111798a68a58SAlexander Leidinger print_number(ip, narg, c); 111898a68a58SAlexander Leidinger print_number(ip, narg, c); 111909307b25SDag-Erling Smørgrav putchar(','); 112095bb676aSDag-Erling Smørgrav thrcreateflagsname(*ip); 112198a68a58SAlexander Leidinger ip++; 112298a68a58SAlexander Leidinger narg--; 112373430055SDag-Erling Smørgrav break; 112473430055SDag-Erling Smørgrav case SYS_thr_kill: 112598a68a58SAlexander Leidinger print_number(ip, narg, c); 112609307b25SDag-Erling Smørgrav putchar(','); 112795bb676aSDag-Erling Smørgrav signame(*ip); 112898a68a58SAlexander Leidinger ip++; 112998a68a58SAlexander Leidinger narg--; 113073430055SDag-Erling Smørgrav break; 113173430055SDag-Erling Smørgrav case SYS_kldunloadf: 113298a68a58SAlexander Leidinger print_number(ip, narg, c); 113309307b25SDag-Erling Smørgrav putchar(','); 113495bb676aSDag-Erling Smørgrav kldunloadfflagsname(*ip); 113598a68a58SAlexander Leidinger ip++; 113698a68a58SAlexander Leidinger narg--; 113773430055SDag-Erling Smørgrav break; 11388447b7cdSJilles Tjoelker case SYS_linkat: 11398447b7cdSJilles Tjoelker case SYS_renameat: 11408447b7cdSJilles Tjoelker case SYS_symlinkat: 11418447b7cdSJilles Tjoelker print_number(ip, narg, c); 11428447b7cdSJilles Tjoelker putchar(','); 11438447b7cdSJilles Tjoelker atfdname(*ip, decimal); 11448447b7cdSJilles Tjoelker ip++; 11458447b7cdSJilles Tjoelker narg--; 11468447b7cdSJilles Tjoelker break; 11472609222aSPawel Jakub Dawidek case SYS_cap_fcntls_limit: 11482609222aSPawel Jakub Dawidek print_number(ip, narg, c); 11492609222aSPawel Jakub Dawidek putchar(','); 11502609222aSPawel Jakub Dawidek arg = *ip; 11512609222aSPawel Jakub Dawidek ip++; 11522609222aSPawel Jakub Dawidek narg--; 11532609222aSPawel Jakub Dawidek capfcntlname(arg); 11542609222aSPawel Jakub Dawidek break; 1155145e6aa9SJohn Baldwin case SYS_posix_fadvise: 1156145e6aa9SJohn Baldwin print_number(ip, narg, c); 1157145e6aa9SJohn Baldwin print_number(ip, narg, c); 1158145e6aa9SJohn Baldwin print_number(ip, narg, c); 1159145e6aa9SJohn Baldwin (void)putchar(','); 1160145e6aa9SJohn Baldwin fadvisebehavname((int)*ip); 1161145e6aa9SJohn Baldwin ip++; 1162145e6aa9SJohn Baldwin narg--; 1163145e6aa9SJohn Baldwin break; 116455648840SJohn Baldwin case SYS_procctl: 116555648840SJohn Baldwin putchar('('); 116655648840SJohn Baldwin idtypename(*ip, decimal); 116755648840SJohn Baldwin c = ','; 116855648840SJohn Baldwin ip++; 116955648840SJohn Baldwin narg--; 117055648840SJohn Baldwin print_number(ip, narg, c); 117155648840SJohn Baldwin putchar(','); 117255648840SJohn Baldwin procctlcmdname(*ip); 117355648840SJohn Baldwin ip++; 117455648840SJohn Baldwin narg--; 117555648840SJohn Baldwin break; 11769b50d902SRodney W. Grimes } 11779b50d902SRodney W. Grimes } 117848f6dd8aSAttilio Rao while (narg > 0) { 117998a68a58SAlexander Leidinger print_number(ip, narg, c); 11809b50d902SRodney W. Grimes } 118109307b25SDag-Erling Smørgrav putchar(')'); 11829b50d902SRodney W. Grimes } 118309307b25SDag-Erling Smørgrav putchar('\n'); 11849b50d902SRodney W. Grimes } 11859b50d902SRodney W. Grimes 118691fbb9c1SDavid Malone void 11877144d36fSDmitry Chagin ktrsysret(struct ktr_sysret *ktr, u_int flags) 11889b50d902SRodney W. Grimes { 118991fbb9c1SDavid Malone register_t ret = ktr->ktr_retval; 119091fbb9c1SDavid Malone int error = ktr->ktr_error; 119191fbb9c1SDavid Malone int code = ktr->ktr_code; 11929b50d902SRodney W. Grimes 11937144d36fSDmitry Chagin if ((flags != 0 && ((flags & SV_ABI_MASK) != SV_ABI_FREEBSD)) || 11947144d36fSDmitry Chagin (code >= nsyscalls || code < 0)) 119509307b25SDag-Erling Smørgrav printf("[%d] ", code); 11969b50d902SRodney W. Grimes else 119709307b25SDag-Erling Smørgrav printf("%s ", syscallnames[code]); 11989b50d902SRodney W. Grimes 11999b50d902SRodney W. Grimes if (error == 0) { 12009b50d902SRodney W. Grimes if (fancy) { 120109307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 12029b50d902SRodney W. Grimes if (ret < 0 || ret > 9) 120309307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 12049b50d902SRodney W. Grimes } else { 12059b50d902SRodney W. Grimes if (decimal) 120609307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 12079b50d902SRodney W. Grimes else 120809307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 12099b50d902SRodney W. Grimes } 12109b50d902SRodney W. Grimes } else if (error == ERESTART) 121109307b25SDag-Erling Smørgrav printf("RESTART"); 12129b50d902SRodney W. Grimes else if (error == EJUSTRETURN) 121309307b25SDag-Erling Smørgrav printf("JUSTRETURN"); 12149b50d902SRodney W. Grimes else { 121509307b25SDag-Erling Smørgrav printf("-1 errno %d", ktr->ktr_error); 12169b50d902SRodney W. Grimes if (fancy) 121709307b25SDag-Erling Smørgrav printf(" %s", strerror(ktr->ktr_error)); 12189b50d902SRodney W. Grimes } 121909307b25SDag-Erling Smørgrav putchar('\n'); 12209b50d902SRodney W. Grimes } 12219b50d902SRodney W. Grimes 122291fbb9c1SDavid Malone void 122391fbb9c1SDavid Malone ktrnamei(char *cp, int len) 12249b50d902SRodney W. Grimes { 122509307b25SDag-Erling Smørgrav printf("\"%.*s\"\n", len, cp); 12269b50d902SRodney W. Grimes } 12279b50d902SRodney W. Grimes 122891fbb9c1SDavid Malone void 1229ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth) 12309b50d902SRodney W. Grimes { 1231ec4beb5dSPeter Wemm int n, i; 1232ec4beb5dSPeter Wemm int width; 1233ec4beb5dSPeter Wemm 1234ec4beb5dSPeter Wemm width = 0; 1235ec4beb5dSPeter Wemm do { 1236ec4beb5dSPeter Wemm width += 2; 1237ec4beb5dSPeter Wemm i = 13; /* base offset */ 1238ec4beb5dSPeter Wemm i += (width / 2) + 1; /* spaces every second byte */ 1239ec4beb5dSPeter Wemm i += (width * 2); /* width of bytes */ 1240ec4beb5dSPeter Wemm i += 3; /* " |" */ 1241ec4beb5dSPeter Wemm i += width; /* each byte */ 1242ec4beb5dSPeter Wemm i += 1; /* "|" */ 1243ec4beb5dSPeter Wemm } while (i < screenwidth); 1244ec4beb5dSPeter Wemm width -= 2; 1245ec4beb5dSPeter Wemm 1246ec4beb5dSPeter Wemm for (n = 0; n < len; n += width) { 1247ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1248ec4beb5dSPeter Wemm if ((i % width) == 0) { /* beginning of line */ 1249ec4beb5dSPeter Wemm printf(" 0x%04x", i); 1250ec4beb5dSPeter Wemm } 1251ec4beb5dSPeter Wemm if ((i % 2) == 0) { 1252ec4beb5dSPeter Wemm printf(" "); 1253ec4beb5dSPeter Wemm } 1254ec4beb5dSPeter Wemm if (i < len) 1255ec4beb5dSPeter Wemm printf("%02x", p[i] & 0xff); 1256ec4beb5dSPeter Wemm else 1257ec4beb5dSPeter Wemm printf(" "); 1258ec4beb5dSPeter Wemm } 1259ec4beb5dSPeter Wemm printf(" |"); 1260ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1261ec4beb5dSPeter Wemm if (i >= len) 1262ec4beb5dSPeter Wemm break; 1263ec4beb5dSPeter Wemm if (p[i] >= ' ' && p[i] <= '~') 1264ec4beb5dSPeter Wemm printf("%c", p[i]); 1265ec4beb5dSPeter Wemm else 1266ec4beb5dSPeter Wemm printf("."); 1267ec4beb5dSPeter Wemm } 1268ec4beb5dSPeter Wemm printf("|\n"); 1269ec4beb5dSPeter Wemm } 1270ec4beb5dSPeter Wemm if ((i % width) != 0) 1271ec4beb5dSPeter Wemm printf("\n"); 1272ec4beb5dSPeter Wemm } 1273ec4beb5dSPeter Wemm 1274ec4beb5dSPeter Wemm void 1275ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth) 1276ec4beb5dSPeter Wemm { 127791fbb9c1SDavid Malone int col = 0; 1278ec4beb5dSPeter Wemm char *cp; 127991fbb9c1SDavid Malone int width; 12809b50d902SRodney W. Grimes char visbuf[5]; 12819b50d902SRodney W. Grimes 128209307b25SDag-Erling Smørgrav printf(" \""); 12839b50d902SRodney W. Grimes col = 8; 12849b50d902SRodney W. Grimes for (;datalen > 0; datalen--, dp++) { 128509307b25SDag-Erling Smørgrav vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 12869b50d902SRodney W. Grimes cp = visbuf; 12879b50d902SRodney W. Grimes /* 12889b50d902SRodney W. Grimes * Keep track of printables and 12899b50d902SRodney W. Grimes * space chars (like fold(1)). 12909b50d902SRodney W. Grimes */ 12919b50d902SRodney W. Grimes if (col == 0) { 129209307b25SDag-Erling Smørgrav putchar('\t'); 12939b50d902SRodney W. Grimes col = 8; 12949b50d902SRodney W. Grimes } 12959b50d902SRodney W. Grimes switch(*cp) { 12969b50d902SRodney W. Grimes case '\n': 12979b50d902SRodney W. Grimes col = 0; 129809307b25SDag-Erling Smørgrav putchar('\n'); 12999b50d902SRodney W. Grimes continue; 13009b50d902SRodney W. Grimes case '\t': 13019b50d902SRodney W. Grimes width = 8 - (col&07); 13029b50d902SRodney W. Grimes break; 13039b50d902SRodney W. Grimes default: 13049b50d902SRodney W. Grimes width = strlen(cp); 13059b50d902SRodney W. Grimes } 13069b50d902SRodney W. Grimes if (col + width > (screenwidth-2)) { 130709307b25SDag-Erling Smørgrav printf("\\\n\t"); 13089b50d902SRodney W. Grimes col = 8; 13099b50d902SRodney W. Grimes } 13109b50d902SRodney W. Grimes col += width; 13119b50d902SRodney W. Grimes do { 131209307b25SDag-Erling Smørgrav putchar(*cp++); 13139b50d902SRodney W. Grimes } while (*cp); 13149b50d902SRodney W. Grimes } 13159b50d902SRodney W. Grimes if (col == 0) 131609307b25SDag-Erling Smørgrav printf(" "); 131709307b25SDag-Erling Smørgrav printf("\"\n"); 13189b50d902SRodney W. Grimes } 13199b50d902SRodney W. Grimes 1320ec4beb5dSPeter Wemm void 1321ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len) 1322ec4beb5dSPeter Wemm { 1323ec4beb5dSPeter Wemm int datalen = len - sizeof (struct ktr_genio); 1324ec4beb5dSPeter Wemm char *dp = (char *)ktr + sizeof (struct ktr_genio); 1325ec4beb5dSPeter Wemm static int screenwidth = 0; 1326ec4beb5dSPeter Wemm int i, binary; 1327ec4beb5dSPeter Wemm 13284b0ae512SPawel Jakub Dawidek printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 13294b0ae512SPawel Jakub Dawidek ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 13304b0ae512SPawel Jakub Dawidek datalen == 1 ? "" : "s"); 13314b0ae512SPawel Jakub Dawidek if (suppressdata) 13324b0ae512SPawel Jakub Dawidek return; 1333ec4beb5dSPeter Wemm if (screenwidth == 0) { 1334ec4beb5dSPeter Wemm struct winsize ws; 1335ec4beb5dSPeter Wemm 1336ec4beb5dSPeter Wemm if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 1337ec4beb5dSPeter Wemm ws.ws_col > 8) 1338ec4beb5dSPeter Wemm screenwidth = ws.ws_col; 1339ec4beb5dSPeter Wemm else 1340ec4beb5dSPeter Wemm screenwidth = 80; 1341ec4beb5dSPeter Wemm } 1342ec4beb5dSPeter Wemm if (maxdata && datalen > maxdata) 1343ec4beb5dSPeter Wemm datalen = maxdata; 1344ec4beb5dSPeter Wemm 1345ec4beb5dSPeter Wemm for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 1346ec4beb5dSPeter Wemm if (dp[i] >= 32 && dp[i] < 127) 1347ec4beb5dSPeter Wemm continue; 1348ec4beb5dSPeter Wemm if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 1349ec4beb5dSPeter Wemm continue; 1350ec4beb5dSPeter Wemm binary = 1; 1351ec4beb5dSPeter Wemm } 1352ec4beb5dSPeter Wemm if (binary) 1353ec4beb5dSPeter Wemm hexdump(dp, datalen, screenwidth); 1354ec4beb5dSPeter Wemm else 1355ec4beb5dSPeter Wemm visdump(dp, datalen, screenwidth); 1356ec4beb5dSPeter Wemm } 1357ec4beb5dSPeter Wemm 135891fbb9c1SDavid Malone const char *signames[] = { 13599b50d902SRodney W. Grimes "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */ 13609b50d902SRodney W. Grimes "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */ 13619b50d902SRodney W. Grimes "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */ 13629b50d902SRodney W. Grimes "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */ 13639b50d902SRodney W. Grimes "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */ 13649b50d902SRodney W. Grimes "USR2", NULL, /* 31 - 32 */ 13659b50d902SRodney W. Grimes }; 13669b50d902SRodney W. Grimes 136791fbb9c1SDavid Malone void 1368dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig) 13699b50d902SRodney W. Grimes { 1370dde5f9b9SDmitry Chagin if (psig->signo > 0 && psig->signo < NSIG) 137109307b25SDag-Erling Smørgrav printf("SIG%s ", signames[psig->signo]); 1372fd6afe79SKonstantin Belousov else 137309307b25SDag-Erling Smørgrav printf("SIG %d ", psig->signo); 13745677eef9SJilles Tjoelker if (psig->action == SIG_DFL) { 13755677eef9SJilles Tjoelker printf("SIG_DFL code="); 13765677eef9SJilles Tjoelker sigcodename(psig->signo, psig->code); 13775677eef9SJilles Tjoelker putchar('\n'); 13785677eef9SJilles Tjoelker } else { 13795677eef9SJilles Tjoelker printf("caught handler=0x%lx mask=0x%x code=", 13805677eef9SJilles Tjoelker (u_long)psig->action, psig->mask.__bits[0]); 13815677eef9SJilles Tjoelker sigcodename(psig->signo, psig->code); 13825677eef9SJilles Tjoelker putchar('\n'); 138391fbb9c1SDavid Malone } 13849b50d902SRodney W. Grimes } 13859b50d902SRodney W. Grimes 138691fbb9c1SDavid Malone void 138788bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs) 13889b50d902SRodney W. Grimes { 138909307b25SDag-Erling Smørgrav printf("%s %s\n", cs->out ? "stop" : "resume", 13909b50d902SRodney W. Grimes cs->user ? "user" : "kernel"); 13919b50d902SRodney W. Grimes } 13929b50d902SRodney W. Grimes 139388bf5036SJohn Baldwin void 139488bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs) 139588bf5036SJohn Baldwin { 139688bf5036SJohn Baldwin printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume", 139788bf5036SJohn Baldwin cs->user ? "user" : "kernel", cs->wmesg); 139888bf5036SJohn Baldwin } 139988bf5036SJohn Baldwin 14001f4b63f8SJohn Baldwin #define UTRACE_DLOPEN_START 1 14011f4b63f8SJohn Baldwin #define UTRACE_DLOPEN_STOP 2 14021f4b63f8SJohn Baldwin #define UTRACE_DLCLOSE_START 3 14031f4b63f8SJohn Baldwin #define UTRACE_DLCLOSE_STOP 4 14041f4b63f8SJohn Baldwin #define UTRACE_LOAD_OBJECT 5 14051f4b63f8SJohn Baldwin #define UTRACE_UNLOAD_OBJECT 6 14061f4b63f8SJohn Baldwin #define UTRACE_ADD_RUNDEP 7 14071f4b63f8SJohn Baldwin #define UTRACE_PRELOAD_FINISHED 8 14081f4b63f8SJohn Baldwin #define UTRACE_INIT_CALL 9 14091f4b63f8SJohn Baldwin #define UTRACE_FINI_CALL 10 14101f4b63f8SJohn Baldwin 14111f4b63f8SJohn Baldwin struct utrace_rtld { 14121f4b63f8SJohn Baldwin char sig[4]; /* 'RTLD' */ 14131f4b63f8SJohn Baldwin int event; 14141f4b63f8SJohn Baldwin void *handle; 14151f4b63f8SJohn Baldwin void *mapbase; 14161f4b63f8SJohn Baldwin size_t mapsize; 14171f4b63f8SJohn Baldwin int refcnt; 14181f4b63f8SJohn Baldwin char name[MAXPATHLEN]; 14191f4b63f8SJohn Baldwin }; 14201f4b63f8SJohn Baldwin 14211f4b63f8SJohn Baldwin void 14221f4b63f8SJohn Baldwin ktruser_rtld(int len, unsigned char *p) 14231f4b63f8SJohn Baldwin { 14241f4b63f8SJohn Baldwin struct utrace_rtld *ut = (struct utrace_rtld *)p; 14251f4b63f8SJohn Baldwin void *parent; 14261f4b63f8SJohn Baldwin int mode; 14271f4b63f8SJohn Baldwin 14281f4b63f8SJohn Baldwin switch (ut->event) { 14291f4b63f8SJohn Baldwin case UTRACE_DLOPEN_START: 14301f4b63f8SJohn Baldwin mode = ut->refcnt; 14311f4b63f8SJohn Baldwin printf("dlopen(%s, ", ut->name); 14321f4b63f8SJohn Baldwin switch (mode & RTLD_MODEMASK) { 14331f4b63f8SJohn Baldwin case RTLD_NOW: 14341f4b63f8SJohn Baldwin printf("RTLD_NOW"); 14351f4b63f8SJohn Baldwin break; 14361f4b63f8SJohn Baldwin case RTLD_LAZY: 14371f4b63f8SJohn Baldwin printf("RTLD_LAZY"); 14381f4b63f8SJohn Baldwin break; 14391f4b63f8SJohn Baldwin default: 14401f4b63f8SJohn Baldwin printf("%#x", mode & RTLD_MODEMASK); 14411f4b63f8SJohn Baldwin } 14421f4b63f8SJohn Baldwin if (mode & RTLD_GLOBAL) 14431f4b63f8SJohn Baldwin printf(" | RTLD_GLOBAL"); 14441f4b63f8SJohn Baldwin if (mode & RTLD_TRACE) 14451f4b63f8SJohn Baldwin printf(" | RTLD_TRACE"); 14461f4b63f8SJohn Baldwin if (mode & ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)) 14471f4b63f8SJohn Baldwin printf(" | %#x", mode & 14481f4b63f8SJohn Baldwin ~(RTLD_MODEMASK | RTLD_GLOBAL | RTLD_TRACE)); 14491f4b63f8SJohn Baldwin printf(")\n"); 14501f4b63f8SJohn Baldwin break; 14511f4b63f8SJohn Baldwin case UTRACE_DLOPEN_STOP: 14521f4b63f8SJohn Baldwin printf("%p = dlopen(%s) ref %d\n", ut->handle, ut->name, 14531f4b63f8SJohn Baldwin ut->refcnt); 14541f4b63f8SJohn Baldwin break; 14551f4b63f8SJohn Baldwin case UTRACE_DLCLOSE_START: 14561f4b63f8SJohn Baldwin printf("dlclose(%p) (%s, %d)\n", ut->handle, ut->name, 14571f4b63f8SJohn Baldwin ut->refcnt); 14581f4b63f8SJohn Baldwin break; 14591f4b63f8SJohn Baldwin case UTRACE_DLCLOSE_STOP: 14601f4b63f8SJohn Baldwin printf("dlclose(%p) finished\n", ut->handle); 14611f4b63f8SJohn Baldwin break; 14621f4b63f8SJohn Baldwin case UTRACE_LOAD_OBJECT: 14631f4b63f8SJohn Baldwin printf("RTLD: loaded %p @ %p - %p (%s)\n", ut->handle, 14641f4b63f8SJohn Baldwin ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 14651f4b63f8SJohn Baldwin ut->name); 14661f4b63f8SJohn Baldwin break; 14671f4b63f8SJohn Baldwin case UTRACE_UNLOAD_OBJECT: 14681f4b63f8SJohn Baldwin printf("RTLD: unloaded %p @ %p - %p (%s)\n", ut->handle, 14691f4b63f8SJohn Baldwin ut->mapbase, (char *)ut->mapbase + ut->mapsize - 1, 14701f4b63f8SJohn Baldwin ut->name); 14711f4b63f8SJohn Baldwin break; 14721f4b63f8SJohn Baldwin case UTRACE_ADD_RUNDEP: 14731f4b63f8SJohn Baldwin parent = ut->mapbase; 14741f4b63f8SJohn Baldwin printf("RTLD: %p now depends on %p (%s, %d)\n", parent, 14751f4b63f8SJohn Baldwin ut->handle, ut->name, ut->refcnt); 14761f4b63f8SJohn Baldwin break; 14771f4b63f8SJohn Baldwin case UTRACE_PRELOAD_FINISHED: 14781f4b63f8SJohn Baldwin printf("RTLD: LD_PRELOAD finished\n"); 14791f4b63f8SJohn Baldwin break; 14801f4b63f8SJohn Baldwin case UTRACE_INIT_CALL: 14811f4b63f8SJohn Baldwin printf("RTLD: init %p for %p (%s)\n", ut->mapbase, ut->handle, 14821f4b63f8SJohn Baldwin ut->name); 14831f4b63f8SJohn Baldwin break; 14841f4b63f8SJohn Baldwin case UTRACE_FINI_CALL: 14851f4b63f8SJohn Baldwin printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle, 14861f4b63f8SJohn Baldwin ut->name); 14871f4b63f8SJohn Baldwin break; 14881f4b63f8SJohn Baldwin default: 14891f4b63f8SJohn Baldwin p += 4; 14901f4b63f8SJohn Baldwin len -= 4; 14911f4b63f8SJohn Baldwin printf("RTLD: %d ", len); 14921f4b63f8SJohn Baldwin while (len--) 14931f4b63f8SJohn Baldwin if (decimal) 14941f4b63f8SJohn Baldwin printf(" %d", *p++); 14951f4b63f8SJohn Baldwin else 14961f4b63f8SJohn Baldwin printf(" %02x", *p++); 14971f4b63f8SJohn Baldwin printf("\n"); 14981f4b63f8SJohn Baldwin } 14991f4b63f8SJohn Baldwin } 15001f4b63f8SJohn Baldwin 1501670b9e9fSJohn Baldwin struct utrace_malloc { 1502670b9e9fSJohn Baldwin void *p; 1503670b9e9fSJohn Baldwin size_t s; 1504670b9e9fSJohn Baldwin void *r; 1505670b9e9fSJohn Baldwin }; 1506670b9e9fSJohn Baldwin 1507670b9e9fSJohn Baldwin void 150881a31394SDag-Erling Smørgrav ktruser_malloc(unsigned char *p) 1509670b9e9fSJohn Baldwin { 1510670b9e9fSJohn Baldwin struct utrace_malloc *ut = (struct utrace_malloc *)p; 1511670b9e9fSJohn Baldwin 151222ce05c9SColin Percival if (ut->p == (void *)(intptr_t)(-1)) 1513670b9e9fSJohn Baldwin printf("malloc_init()\n"); 151422ce05c9SColin Percival else if (ut->s == 0) 1515670b9e9fSJohn Baldwin printf("free(%p)\n", ut->p); 151622ce05c9SColin Percival else if (ut->p == NULL) 151722ce05c9SColin Percival printf("%p = malloc(%zu)\n", ut->r, ut->s); 1518670b9e9fSJohn Baldwin else 1519670b9e9fSJohn Baldwin printf("%p = realloc(%p, %zu)\n", ut->r, ut->p, ut->s); 1520670b9e9fSJohn Baldwin } 1521670b9e9fSJohn Baldwin 152291fbb9c1SDavid Malone void 152391fbb9c1SDavid Malone ktruser(int len, unsigned char *p) 152482e2dd32SPoul-Henning Kamp { 1525670b9e9fSJohn Baldwin 15261f4b63f8SJohn Baldwin if (len >= 8 && bcmp(p, "RTLD", 4) == 0) { 15271f4b63f8SJohn Baldwin ktruser_rtld(len, p); 15281f4b63f8SJohn Baldwin return; 15291f4b63f8SJohn Baldwin } 15301f4b63f8SJohn Baldwin 1531670b9e9fSJohn Baldwin if (len == sizeof(struct utrace_malloc)) { 153281a31394SDag-Erling Smørgrav ktruser_malloc(p); 1533670b9e9fSJohn Baldwin return; 1534670b9e9fSJohn Baldwin } 1535670b9e9fSJohn Baldwin 153609307b25SDag-Erling Smørgrav printf("%d ", len); 15373f8ba9aeSPoul-Henning Kamp while (len--) 1538743f9174SPoul-Henning Kamp if (decimal) 153909307b25SDag-Erling Smørgrav printf(" %d", *p++); 1540743f9174SPoul-Henning Kamp else 154109307b25SDag-Erling Smørgrav printf(" %02x", *p++); 154209307b25SDag-Erling Smørgrav printf("\n"); 154382e2dd32SPoul-Henning Kamp } 154482e2dd32SPoul-Henning Kamp 154591fbb9c1SDavid Malone void 15467008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp) 15477008be5bSPawel Jakub Dawidek { 15487008be5bSPawel Jakub Dawidek 15497008be5bSPawel Jakub Dawidek printf("cap_rights_t "); 15507008be5bSPawel Jakub Dawidek capname(rightsp); 15517008be5bSPawel Jakub Dawidek printf("\n"); 15527008be5bSPawel Jakub Dawidek } 15537008be5bSPawel Jakub Dawidek 15547008be5bSPawel Jakub Dawidek void 155560e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa) 155660e15db9SDag-Erling Smørgrav { 155760e15db9SDag-Erling Smørgrav /* 155860e15db9SDag-Erling Smørgrav TODO: Support additional address families 155960e15db9SDag-Erling Smørgrav #include <netnatm/natm.h> 156060e15db9SDag-Erling Smørgrav struct sockaddr_natm *natm; 1561237abf0cSDavide Italiano #include <netsmb/netbios.h> 1562237abf0cSDavide Italiano struct sockaddr_nb *nb; 156360e15db9SDag-Erling Smørgrav */ 156460e15db9SDag-Erling Smørgrav char addr[64]; 156560e15db9SDag-Erling Smørgrav 156660e15db9SDag-Erling Smørgrav /* 156760e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that sa points to a 156860e15db9SDag-Erling Smørgrav * buffer at least sizeof(struct sockaddr) bytes long and exactly 156960e15db9SDag-Erling Smørgrav * sa->sa_len bytes long. 157060e15db9SDag-Erling Smørgrav */ 157160e15db9SDag-Erling Smørgrav printf("struct sockaddr { "); 157260e15db9SDag-Erling Smørgrav sockfamilyname(sa->sa_family); 157360e15db9SDag-Erling Smørgrav printf(", "); 157460e15db9SDag-Erling Smørgrav 157560e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n) \ 157681a31394SDag-Erling Smørgrav if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) { \ 157760e15db9SDag-Erling Smørgrav printf("invalid"); \ 157860e15db9SDag-Erling Smørgrav break; \ 157960e15db9SDag-Erling Smørgrav } 158060e15db9SDag-Erling Smørgrav 158160e15db9SDag-Erling Smørgrav switch(sa->sa_family) { 158260e15db9SDag-Erling Smørgrav case AF_INET: { 158381a31394SDag-Erling Smørgrav struct sockaddr_in sa_in; 158460e15db9SDag-Erling Smørgrav 158581a31394SDag-Erling Smørgrav memset(&sa_in, 0, sizeof(sa_in)); 1586449df4ecSAndrey Zonov memcpy(&sa_in, sa, sa->sa_len); 158760e15db9SDag-Erling Smørgrav check_sockaddr_len(in); 158881a31394SDag-Erling Smørgrav inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr); 158981a31394SDag-Erling Smørgrav printf("%s:%u", addr, ntohs(sa_in.sin_port)); 159060e15db9SDag-Erling Smørgrav break; 159160e15db9SDag-Erling Smørgrav } 159260e15db9SDag-Erling Smørgrav #ifdef NETATALK 159360e15db9SDag-Erling Smørgrav case AF_APPLETALK: { 159481a31394SDag-Erling Smørgrav struct sockaddr_at sa_at; 159560e15db9SDag-Erling Smørgrav struct netrange *nr; 159660e15db9SDag-Erling Smørgrav 159781a31394SDag-Erling Smørgrav memset(&sa_at, 0, sizeof(sa_at)); 1598449df4ecSAndrey Zonov memcpy(&sa_at, sa, sa->sa_len); 159960e15db9SDag-Erling Smørgrav check_sockaddr_len(at); 160081a31394SDag-Erling Smørgrav nr = &sa_at.sat_range.r_netrange; 160181a31394SDag-Erling Smørgrav printf("%d.%d, %d-%d, %d", ntohs(sa_at.sat_addr.s_net), 160281a31394SDag-Erling Smørgrav sa_at.sat_addr.s_node, ntohs(nr->nr_firstnet), 160360e15db9SDag-Erling Smørgrav ntohs(nr->nr_lastnet), nr->nr_phase); 160460e15db9SDag-Erling Smørgrav break; 160560e15db9SDag-Erling Smørgrav } 160660e15db9SDag-Erling Smørgrav #endif 160760e15db9SDag-Erling Smørgrav case AF_INET6: { 160881a31394SDag-Erling Smørgrav struct sockaddr_in6 sa_in6; 160960e15db9SDag-Erling Smørgrav 161081a31394SDag-Erling Smørgrav memset(&sa_in6, 0, sizeof(sa_in6)); 1611449df4ecSAndrey Zonov memcpy(&sa_in6, sa, sa->sa_len); 161260e15db9SDag-Erling Smørgrav check_sockaddr_len(in6); 1613b9ef8051SAndrey V. Elsukov getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6), 1614b9ef8051SAndrey V. Elsukov addr, sizeof(addr), NULL, 0, NI_NUMERICHOST); 161581a31394SDag-Erling Smørgrav printf("[%s]:%u", addr, htons(sa_in6.sin6_port)); 161660e15db9SDag-Erling Smørgrav break; 161760e15db9SDag-Erling Smørgrav } 161860e15db9SDag-Erling Smørgrav #ifdef IPX 161960e15db9SDag-Erling Smørgrav case AF_IPX: { 162081a31394SDag-Erling Smørgrav struct sockaddr_ipx sa_ipx; 162160e15db9SDag-Erling Smørgrav 162281a31394SDag-Erling Smørgrav memset(&sa_ipx, 0, sizeof(sa_ipx)); 1623449df4ecSAndrey Zonov memcpy(&sa_ipx, sa, sa->sa_len); 162460e15db9SDag-Erling Smørgrav check_sockaddr_len(ipx); 162560e15db9SDag-Erling Smørgrav /* XXX wish we had ipx_ntop */ 162681a31394SDag-Erling Smørgrav printf("%s", ipx_ntoa(sa_ipx.sipx_addr)); 162781a31394SDag-Erling Smørgrav free(sa_ipx); 162860e15db9SDag-Erling Smørgrav break; 162960e15db9SDag-Erling Smørgrav } 163060e15db9SDag-Erling Smørgrav #endif 163160e15db9SDag-Erling Smørgrav case AF_UNIX: { 163281a31394SDag-Erling Smørgrav struct sockaddr_un sa_un; 163360e15db9SDag-Erling Smørgrav 163481a31394SDag-Erling Smørgrav memset(&sa_un, 0, sizeof(sa_un)); 1635449df4ecSAndrey Zonov memcpy(&sa_un, sa, sa->sa_len); 163681a31394SDag-Erling Smørgrav printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path); 163760e15db9SDag-Erling Smørgrav break; 163860e15db9SDag-Erling Smørgrav } 163960e15db9SDag-Erling Smørgrav default: 164060e15db9SDag-Erling Smørgrav printf("unknown address family"); 164160e15db9SDag-Erling Smørgrav } 164260e15db9SDag-Erling Smørgrav printf(" }\n"); 164360e15db9SDag-Erling Smørgrav } 164460e15db9SDag-Erling Smørgrav 164560e15db9SDag-Erling Smørgrav void 164660e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp) 164760e15db9SDag-Erling Smørgrav { 164860e15db9SDag-Erling Smørgrav char mode[12], timestr[PATH_MAX + 4]; 164960e15db9SDag-Erling Smørgrav struct passwd *pwd; 165060e15db9SDag-Erling Smørgrav struct group *grp; 165160e15db9SDag-Erling Smørgrav struct tm *tm; 165260e15db9SDag-Erling Smørgrav 165360e15db9SDag-Erling Smørgrav /* 165460e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that statp points to a 165560e15db9SDag-Erling Smørgrav * buffer exactly sizeof(struct stat) bytes long. 165660e15db9SDag-Erling Smørgrav */ 165760e15db9SDag-Erling Smørgrav printf("struct stat {"); 165860e15db9SDag-Erling Smørgrav strmode(statp->st_mode, mode); 165960e15db9SDag-Erling Smørgrav printf("dev=%ju, ino=%ju, mode=%s, nlink=%ju, ", 166060e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino, mode, 166160e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_nlink); 166260e15db9SDag-Erling Smørgrav if (resolv == 0 || (pwd = getpwuid(statp->st_uid)) == NULL) 166360e15db9SDag-Erling Smørgrav printf("uid=%ju, ", (uintmax_t)statp->st_uid); 166460e15db9SDag-Erling Smørgrav else 166560e15db9SDag-Erling Smørgrav printf("uid=\"%s\", ", pwd->pw_name); 166660e15db9SDag-Erling Smørgrav if (resolv == 0 || (grp = getgrgid(statp->st_gid)) == NULL) 166760e15db9SDag-Erling Smørgrav printf("gid=%ju, ", (uintmax_t)statp->st_gid); 166860e15db9SDag-Erling Smørgrav else 166960e15db9SDag-Erling Smørgrav printf("gid=\"%s\", ", grp->gr_name); 167060e15db9SDag-Erling Smørgrav printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); 167160e15db9SDag-Erling Smørgrav printf("atime="); 167260e15db9SDag-Erling Smørgrav if (resolv == 0) 167399742a23SEd Schouten printf("%jd", (intmax_t)statp->st_atim.tv_sec); 167460e15db9SDag-Erling Smørgrav else { 167599742a23SEd Schouten tm = localtime(&statp->st_atim.tv_sec); 167609307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 167760e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 167860e15db9SDag-Erling Smørgrav } 167999742a23SEd Schouten if (statp->st_atim.tv_nsec != 0) 168099742a23SEd Schouten printf(".%09ld, ", statp->st_atim.tv_nsec); 168160e15db9SDag-Erling Smørgrav else 168260e15db9SDag-Erling Smørgrav printf(", "); 168360e15db9SDag-Erling Smørgrav printf("stime="); 168460e15db9SDag-Erling Smørgrav if (resolv == 0) 168599742a23SEd Schouten printf("%jd", (intmax_t)statp->st_mtim.tv_sec); 168660e15db9SDag-Erling Smørgrav else { 168799742a23SEd Schouten tm = localtime(&statp->st_mtim.tv_sec); 168809307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 168960e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 169060e15db9SDag-Erling Smørgrav } 169199742a23SEd Schouten if (statp->st_mtim.tv_nsec != 0) 169299742a23SEd Schouten printf(".%09ld, ", statp->st_mtim.tv_nsec); 169360e15db9SDag-Erling Smørgrav else 169460e15db9SDag-Erling Smørgrav printf(", "); 169560e15db9SDag-Erling Smørgrav printf("ctime="); 169660e15db9SDag-Erling Smørgrav if (resolv == 0) 169799742a23SEd Schouten printf("%jd", (intmax_t)statp->st_ctim.tv_sec); 169860e15db9SDag-Erling Smørgrav else { 169999742a23SEd Schouten tm = localtime(&statp->st_ctim.tv_sec); 170009307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 170160e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 170260e15db9SDag-Erling Smørgrav } 170399742a23SEd Schouten if (statp->st_ctim.tv_nsec != 0) 170499742a23SEd Schouten printf(".%09ld, ", statp->st_ctim.tv_nsec); 170560e15db9SDag-Erling Smørgrav else 170660e15db9SDag-Erling Smørgrav printf(", "); 170760e15db9SDag-Erling Smørgrav printf("birthtime="); 170860e15db9SDag-Erling Smørgrav if (resolv == 0) 170999742a23SEd Schouten printf("%jd", (intmax_t)statp->st_birthtim.tv_sec); 171060e15db9SDag-Erling Smørgrav else { 171199742a23SEd Schouten tm = localtime(&statp->st_birthtim.tv_sec); 171209307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 171360e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 171460e15db9SDag-Erling Smørgrav } 171599742a23SEd Schouten if (statp->st_birthtim.tv_nsec != 0) 171699742a23SEd Schouten printf(".%09ld, ", statp->st_birthtim.tv_nsec); 171760e15db9SDag-Erling Smørgrav else 171860e15db9SDag-Erling Smørgrav printf(", "); 171960e15db9SDag-Erling Smørgrav printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x", 172060e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize, 172160e15db9SDag-Erling Smørgrav (intmax_t)statp->st_blocks, statp->st_flags); 172260e15db9SDag-Erling Smørgrav printf(" }\n"); 172360e15db9SDag-Erling Smørgrav } 172460e15db9SDag-Erling Smørgrav 172560e15db9SDag-Erling Smørgrav void 172660e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen) 172760e15db9SDag-Erling Smørgrav { 172860e15db9SDag-Erling Smørgrav char *name, *data; 172960e15db9SDag-Erling Smørgrav size_t namelen, datalen; 173060e15db9SDag-Erling Smørgrav int i; 17317008be5bSPawel Jakub Dawidek cap_rights_t rights; 173230c1278fSWarner Losh struct stat sb; 173330c1278fSWarner Losh struct sockaddr_storage ss; 173460e15db9SDag-Erling Smørgrav 173560e15db9SDag-Erling Smørgrav for (name = buf, namelen = 0; 173660e15db9SDag-Erling Smørgrav namelen < buflen && name[namelen] != '\0'; 173760e15db9SDag-Erling Smørgrav ++namelen) 173860e15db9SDag-Erling Smørgrav /* nothing */; 173960e15db9SDag-Erling Smørgrav if (namelen == buflen) 174060e15db9SDag-Erling Smørgrav goto invalid; 174160e15db9SDag-Erling Smørgrav if (name[namelen] != '\0') 174260e15db9SDag-Erling Smørgrav goto invalid; 174360e15db9SDag-Erling Smørgrav data = buf + namelen + 1; 174460e15db9SDag-Erling Smørgrav datalen = buflen - namelen - 1; 174560e15db9SDag-Erling Smørgrav if (datalen == 0) 174660e15db9SDag-Erling Smørgrav goto invalid; 174760e15db9SDag-Erling Smørgrav /* sanity check */ 174881a31394SDag-Erling Smørgrav for (i = 0; i < (int)namelen; ++i) 174981a31394SDag-Erling Smørgrav if (!isalpha(name[i])) 175060e15db9SDag-Erling Smørgrav goto invalid; 17517008be5bSPawel Jakub Dawidek if (strcmp(name, "caprights") == 0) { 17527008be5bSPawel Jakub Dawidek if (datalen != sizeof(cap_rights_t)) 17537008be5bSPawel Jakub Dawidek goto invalid; 17547008be5bSPawel Jakub Dawidek memcpy(&rights, data, datalen); 17557008be5bSPawel Jakub Dawidek ktrcaprights(&rights); 17567008be5bSPawel Jakub Dawidek } else if (strcmp(name, "stat") == 0) { 175760e15db9SDag-Erling Smørgrav if (datalen != sizeof(struct stat)) 175860e15db9SDag-Erling Smørgrav goto invalid; 175930c1278fSWarner Losh memcpy(&sb, data, datalen); 176030c1278fSWarner Losh ktrstat(&sb); 176160e15db9SDag-Erling Smørgrav } else if (strcmp(name, "sockaddr") == 0) { 176230c1278fSWarner Losh if (datalen > sizeof(ss)) 176360e15db9SDag-Erling Smørgrav goto invalid; 176430c1278fSWarner Losh memcpy(&ss, data, datalen); 17654b03484fSAndrey Zonov if (datalen != ss.ss_len) 176630c1278fSWarner Losh goto invalid; 176730c1278fSWarner Losh ktrsockaddr((struct sockaddr *)&ss); 176860e15db9SDag-Erling Smørgrav } else { 176960e15db9SDag-Erling Smørgrav printf("unknown structure\n"); 177060e15db9SDag-Erling Smørgrav } 177160e15db9SDag-Erling Smørgrav return; 177260e15db9SDag-Erling Smørgrav invalid: 177360e15db9SDag-Erling Smørgrav printf("invalid record\n"); 177460e15db9SDag-Erling Smørgrav } 177560e15db9SDag-Erling Smørgrav 1776c601ad8eSDag-Erling Smørgrav void 1777c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr) 1778c601ad8eSDag-Erling Smørgrav { 1779e141be6fSDag-Erling Smørgrav switch (ktr->cap_type) { 1780e141be6fSDag-Erling Smørgrav case CAPFAIL_NOTCAPABLE: 1781e141be6fSDag-Erling Smørgrav /* operation on fd with insufficient capabilities */ 1782e141be6fSDag-Erling Smørgrav printf("operation requires "); 17837008be5bSPawel Jakub Dawidek capname(&ktr->cap_needed); 1784e141be6fSDag-Erling Smørgrav printf(", process holds "); 17857008be5bSPawel Jakub Dawidek capname(&ktr->cap_held); 1786e141be6fSDag-Erling Smørgrav break; 1787e141be6fSDag-Erling Smørgrav case CAPFAIL_INCREASE: 1788e141be6fSDag-Erling Smørgrav /* requested more capabilities than fd already has */ 1789e141be6fSDag-Erling Smørgrav printf("attempt to increase capabilities from "); 17907008be5bSPawel Jakub Dawidek capname(&ktr->cap_held); 179160e45df8SDag-Erling Smørgrav printf(" to "); 17927008be5bSPawel Jakub Dawidek capname(&ktr->cap_needed); 1793e141be6fSDag-Erling Smørgrav break; 1794e141be6fSDag-Erling Smørgrav case CAPFAIL_SYSCALL: 1795e141be6fSDag-Erling Smørgrav /* called restricted syscall */ 1796e141be6fSDag-Erling Smørgrav printf("disallowed system call"); 1797e141be6fSDag-Erling Smørgrav break; 1798e141be6fSDag-Erling Smørgrav case CAPFAIL_LOOKUP: 1799e141be6fSDag-Erling Smørgrav /* used ".." in strict-relative mode */ 1800e141be6fSDag-Erling Smørgrav printf("restricted VFS lookup"); 1801e141be6fSDag-Erling Smørgrav break; 1802e141be6fSDag-Erling Smørgrav default: 1803e141be6fSDag-Erling Smørgrav printf("unknown capability failure: "); 18047008be5bSPawel Jakub Dawidek capname(&ktr->cap_needed); 1805e141be6fSDag-Erling Smørgrav printf(" "); 18067008be5bSPawel Jakub Dawidek capname(&ktr->cap_held); 1807e141be6fSDag-Erling Smørgrav break; 1808e141be6fSDag-Erling Smørgrav } 180935818d2eSJohn Baldwin printf("\n"); 181035818d2eSJohn Baldwin } 181135818d2eSJohn Baldwin 181235818d2eSJohn Baldwin void 181335818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr) 181435818d2eSJohn Baldwin { 181535818d2eSJohn Baldwin 181635818d2eSJohn Baldwin printf("0x%jx ", ktr->vaddr); 181735818d2eSJohn Baldwin vmprotname(ktr->type); 181835818d2eSJohn Baldwin printf("\n"); 181935818d2eSJohn Baldwin } 182035818d2eSJohn Baldwin 182135818d2eSJohn Baldwin void 182235818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr) 182335818d2eSJohn Baldwin { 182435818d2eSJohn Baldwin 182535818d2eSJohn Baldwin vmresultname(ktr->result); 182635818d2eSJohn Baldwin printf("\n"); 1827c601ad8eSDag-Erling Smørgrav } 1828c601ad8eSDag-Erling Smørgrav 1829dde5f9b9SDmitry Chagin #if defined(__amd64__) || defined(__i386__) 1830dde5f9b9SDmitry Chagin void 1831dde5f9b9SDmitry Chagin linux_ktrsyscall(struct ktr_syscall *ktr) 1832dde5f9b9SDmitry Chagin { 1833dde5f9b9SDmitry Chagin int narg = ktr->ktr_narg; 1834dde5f9b9SDmitry Chagin register_t *ip; 1835dde5f9b9SDmitry Chagin 1836dde5f9b9SDmitry Chagin if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0) 1837dde5f9b9SDmitry Chagin printf("[%d]", ktr->ktr_code); 1838dde5f9b9SDmitry Chagin else 1839dde5f9b9SDmitry Chagin printf("%s", linux_syscallnames[ktr->ktr_code]); 1840dde5f9b9SDmitry Chagin ip = &ktr->ktr_args[0]; 1841dde5f9b9SDmitry Chagin if (narg) { 1842dde5f9b9SDmitry Chagin char c = '('; 1843dde5f9b9SDmitry Chagin while (narg > 0) 1844dde5f9b9SDmitry Chagin print_number(ip, narg, c); 1845dde5f9b9SDmitry Chagin putchar(')'); 1846dde5f9b9SDmitry Chagin } 1847dde5f9b9SDmitry Chagin putchar('\n'); 1848dde5f9b9SDmitry Chagin } 1849dde5f9b9SDmitry Chagin 1850dde5f9b9SDmitry Chagin void 1851dde5f9b9SDmitry Chagin linux_ktrsysret(struct ktr_sysret *ktr) 1852dde5f9b9SDmitry Chagin { 1853dde5f9b9SDmitry Chagin register_t ret = ktr->ktr_retval; 1854dde5f9b9SDmitry Chagin int error = ktr->ktr_error; 1855dde5f9b9SDmitry Chagin int code = ktr->ktr_code; 1856dde5f9b9SDmitry Chagin 1857dde5f9b9SDmitry Chagin if (code >= nlinux_syscalls || code < 0) 1858dde5f9b9SDmitry Chagin printf("[%d] ", code); 1859dde5f9b9SDmitry Chagin else 1860dde5f9b9SDmitry Chagin printf("%s ", linux_syscallnames[code]); 1861dde5f9b9SDmitry Chagin 1862dde5f9b9SDmitry Chagin if (error == 0) { 1863dde5f9b9SDmitry Chagin if (fancy) { 1864dde5f9b9SDmitry Chagin printf("%ld", (long)ret); 1865dde5f9b9SDmitry Chagin if (ret < 0 || ret > 9) 186609307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 1867dde5f9b9SDmitry Chagin } else { 1868dde5f9b9SDmitry Chagin if (decimal) 1869dde5f9b9SDmitry Chagin printf("%ld", (long)ret); 1870dde5f9b9SDmitry Chagin else 187109307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 1872dde5f9b9SDmitry Chagin } 1873dde5f9b9SDmitry Chagin } else if (error == ERESTART) 1874dde5f9b9SDmitry Chagin printf("RESTART"); 1875dde5f9b9SDmitry Chagin else if (error == EJUSTRETURN) 1876dde5f9b9SDmitry Chagin printf("JUSTRETURN"); 1877dde5f9b9SDmitry Chagin else { 1878dde5f9b9SDmitry Chagin if (ktr->ktr_error <= ELAST + 1) 1879dde5f9b9SDmitry Chagin error = abs(bsd_to_linux_errno[ktr->ktr_error]); 1880dde5f9b9SDmitry Chagin else 1881dde5f9b9SDmitry Chagin error = 999; 1882dde5f9b9SDmitry Chagin printf("-1 errno %d", error); 1883dde5f9b9SDmitry Chagin if (fancy) 1884dde5f9b9SDmitry Chagin printf(" %s", strerror(ktr->ktr_error)); 1885dde5f9b9SDmitry Chagin } 1886dde5f9b9SDmitry Chagin putchar('\n'); 1887dde5f9b9SDmitry Chagin } 1888dde5f9b9SDmitry Chagin #endif 1889dde5f9b9SDmitry Chagin 189060e15db9SDag-Erling Smørgrav void 189191fbb9c1SDavid Malone usage(void) 18929b50d902SRodney W. Grimes { 18937144d36fSDmitry Chagin fprintf(stderr, "usage: kdump [-dEnlHRrsTA] [-f trfile] " 1894da647ae9SRuslan Ermilov "[-m maxdata] [-p pid] [-t trstr]\n"); 18959b50d902SRodney W. Grimes exit(1); 18969b50d902SRodney W. Grimes } 1897