19b50d902SRodney W. Grimes /*- 28a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 38a16b7a1SPedro F. Giffuni * 49b50d902SRodney W. Grimes * Copyright (c) 1988, 1993 59b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 69b50d902SRodney W. Grimes * 79b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 89b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 99b50d902SRodney W. Grimes * are met: 109b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 119b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 129b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 139b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 149b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 15fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 169b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 179b50d902SRodney W. Grimes * without specific prior written permission. 189b50d902SRodney W. Grimes * 199b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 209b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 219b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 229b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 239b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 249b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 259b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 269b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 279b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 289b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 299b50d902SRodney W. Grimes * SUCH DAMAGE. 309b50d902SRodney W. Grimes */ 319b50d902SRodney W. Grimes 329b50d902SRodney W. Grimes #ifndef lint 3315fc002bSPhilippe Charnier static const char copyright[] = 349b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\ 359b50d902SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 369b50d902SRodney W. Grimes #endif /* not lint */ 379b50d902SRodney W. Grimes 389b50d902SRodney W. Grimes #ifndef lint 3915fc002bSPhilippe Charnier #if 0 409b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; 4115fc002bSPhilippe Charnier #endif 429b50d902SRodney W. Grimes #endif /* not lint */ 43e026a48cSDavid E. O'Brien #include <sys/cdefs.h> 44e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$"); 459b50d902SRodney W. Grimes 46406d2926SJohn Baldwin #define _WANT_KERNEL_ERRNO 47ffb66079SJohn Baldwin #ifdef __LP64__ 48ffb66079SJohn Baldwin #define _WANT_KEVENT32 49ffb66079SJohn Baldwin #endif 50ffb66079SJohn Baldwin #define _WANT_FREEBSD11_KEVENT 519b50d902SRodney W. Grimes #include <sys/param.h> 52b881b8beSRobert Watson #include <sys/capsicum.h> 539b50d902SRodney W. Grimes #include <sys/errno.h> 549b50d902SRodney W. Grimes #include <sys/time.h> 559b50d902SRodney W. Grimes #include <sys/uio.h> 56ffb66079SJohn Baldwin #include <sys/event.h> 579b50d902SRodney W. Grimes #include <sys/ktrace.h> 589b50d902SRodney W. Grimes #include <sys/ioctl.h> 598bc31d83SCraig Rodrigues #include <sys/socket.h> 6060e15db9SDag-Erling Smørgrav #include <sys/stat.h> 617144d36fSDmitry Chagin #include <sys/sysent.h> 62fdb5bf37SJohn Baldwin #include <sys/umtx.h> 6360e15db9SDag-Erling Smørgrav #include <sys/un.h> 647144d36fSDmitry Chagin #include <sys/queue.h> 6534763d1cSJohn Baldwin #include <sys/wait.h> 662560d181SMariusz Zaborski #ifdef WITH_CASPER 67c36e54bbSMariusz Zaborski #include <sys/nv.h> 68c36e54bbSMariusz Zaborski #endif 691a604cfaSXin LI #include <arpa/inet.h> 7060e15db9SDag-Erling Smørgrav #include <netinet/in.h> 711a604cfaSXin LI #include <ctype.h> 72a4e3fc54SMariusz Zaborski #include <capsicum_helpers.h> 7315fc002bSPhilippe Charnier #include <err.h> 7460e15db9SDag-Erling Smørgrav #include <grp.h> 7560e15db9SDag-Erling Smørgrav #include <inttypes.h> 7615fc002bSPhilippe Charnier #include <locale.h> 77b9ef8051SAndrey V. Elsukov #include <netdb.h> 78f9b20fc8SPawel Jakub Dawidek #include <nl_types.h> 7960e15db9SDag-Erling Smørgrav #include <pwd.h> 8071ed318eSJohn Baldwin #include <stddef.h> 819b50d902SRodney W. Grimes #include <stdio.h> 829b50d902SRodney W. Grimes #include <stdlib.h> 839b50d902SRodney W. Grimes #include <string.h> 84d6fb4894SJohn Baldwin #include <sysdecode.h> 8560e15db9SDag-Erling Smørgrav #include <time.h> 8615fc002bSPhilippe Charnier #include <unistd.h> 8715fc002bSPhilippe Charnier #include <vis.h> 889b50d902SRodney W. Grimes #include "ktrace.h" 899b50d902SRodney W. Grimes 902560d181SMariusz Zaborski #ifdef WITH_CASPER 91c501d73cSMariusz Zaborski #include <libcasper.h> 92c501d73cSMariusz Zaborski 93c501d73cSMariusz Zaborski #include <casper/cap_grp.h> 94c501d73cSMariusz Zaborski #include <casper/cap_pwd.h> 95c501d73cSMariusz Zaborski #endif 96c501d73cSMariusz Zaborski 977144d36fSDmitry Chagin u_int abidump(struct ktr_header *); 987144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *); 9991fbb9c1SDavid Malone int fread_tail(void *, int, int); 10091fbb9c1SDavid Malone void dumpheader(struct ktr_header *); 1017144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int); 1027144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int); 10391fbb9c1SDavid Malone void ktrnamei(char *, int); 104ec4beb5dSPeter Wemm void hexdump(char *, int, int); 105ec4beb5dSPeter Wemm void visdump(char *, int, int); 10691fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int); 107dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *); 10891fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *); 10988bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *); 110bb1a2d4aSJohn Baldwin void ktruser(int, void *); 1117008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *); 112de56aee0SKonstantin Belousov void ktritimerval(struct itimerval *it); 11360e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *); 11460e15db9SDag-Erling Smørgrav void ktrstat(struct stat *); 11560e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t); 116c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *); 11735818d2eSJohn Baldwin void ktrfault(struct ktr_fault *); 11835818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *); 119ffb66079SJohn Baldwin void ktrkevent(struct kevent *); 120ffb66079SJohn Baldwin void ktrstructarray(struct ktr_struct_array *, size_t); 12191fbb9c1SDavid Malone void usage(void); 12291fbb9c1SDavid Malone 123c1269d20SMaxim Sobolev #define TIMESTAMP_NONE 0x0 124c1269d20SMaxim Sobolev #define TIMESTAMP_ABSOLUTE 0x1 125c1269d20SMaxim Sobolev #define TIMESTAMP_ELAPSED 0x2 126c1269d20SMaxim Sobolev #define TIMESTAMP_RELATIVE 0x4 127c1269d20SMaxim Sobolev 128bb1a2d4aSJohn Baldwin static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, 129b9034ce2SBryan Drewery resolv = 0, abiflag = 0, syscallno = 0; 130bb1a2d4aSJohn Baldwin static const char *tracefile = DEF_TRACEFILE; 131bb1a2d4aSJohn Baldwin static struct ktr_header ktr_header; 1329b50d902SRodney W. Grimes 13360e15db9SDag-Erling Smørgrav #define TIME_FORMAT "%b %e %T %Y" 1349b50d902SRodney W. Grimes #define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 1359b50d902SRodney W. Grimes 13671ed318eSJohn Baldwin #define print_number64(first,i,n,c) do { \ 13771ed318eSJohn Baldwin uint64_t __v; \ 13871ed318eSJohn Baldwin \ 13971ed318eSJohn Baldwin if (quad_align && (((ptrdiff_t)((i) - (first))) & 1) == 1) { \ 14071ed318eSJohn Baldwin (i)++; \ 14171ed318eSJohn Baldwin (n)--; \ 14271ed318eSJohn Baldwin } \ 14371ed318eSJohn Baldwin if (quad_slots == 2) \ 14471ed318eSJohn Baldwin __v = (uint64_t)(uint32_t)(i)[0] | \ 14571ed318eSJohn Baldwin ((uint64_t)(uint32_t)(i)[1]) << 32; \ 14671ed318eSJohn Baldwin else \ 14771ed318eSJohn Baldwin __v = (uint64_t)*(i); \ 14871ed318eSJohn Baldwin if (decimal) \ 14971ed318eSJohn Baldwin printf("%c%jd", (c), (intmax_t)__v); \ 15071ed318eSJohn Baldwin else \ 15171ed318eSJohn Baldwin printf("%c%#jx", (c), (uintmax_t)__v); \ 15271ed318eSJohn Baldwin (i) += quad_slots; \ 15371ed318eSJohn Baldwin (n) -= quad_slots; \ 15471ed318eSJohn Baldwin (c) = ','; \ 15571ed318eSJohn Baldwin } while (0) 15671ed318eSJohn Baldwin 15795bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do { \ 158dde5f9b9SDmitry Chagin if (decimal) \ 159e4bb45b1SDag-Erling Smørgrav printf("%c%jd", c, (intmax_t)*i); \ 160dde5f9b9SDmitry Chagin else \ 161661522f5SDag-Erling Smørgrav printf("%c%#jx", c, (uintmax_t)(u_register_t)*i); \ 162dde5f9b9SDmitry Chagin i++; \ 163dde5f9b9SDmitry Chagin n--; \ 164dde5f9b9SDmitry Chagin c = ','; \ 165e4bb45b1SDag-Erling Smørgrav } while (0) 166dde5f9b9SDmitry Chagin 1677144d36fSDmitry Chagin struct proc_info 1687144d36fSDmitry Chagin { 1697144d36fSDmitry Chagin TAILQ_ENTRY(proc_info) info; 1707144d36fSDmitry Chagin u_int sv_flags; 1717144d36fSDmitry Chagin pid_t pid; 1727144d36fSDmitry Chagin }; 1737144d36fSDmitry Chagin 174bb1a2d4aSJohn Baldwin static TAILQ_HEAD(trace_procs, proc_info) trace_procs; 1757144d36fSDmitry Chagin 1762560d181SMariusz Zaborski #ifdef WITH_CASPER 1774622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp; 1784622f0e1SPawel Jakub Dawidek 1794622f0e1SPawel Jakub Dawidek static int 1804622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp) 1814622f0e1SPawel Jakub Dawidek { 1824622f0e1SPawel Jakub Dawidek cap_channel_t *capcas, *cappwdloc, *capgrploc; 1834622f0e1SPawel Jakub Dawidek const char *cmds[1], *fields[1]; 1844622f0e1SPawel Jakub Dawidek 1854622f0e1SPawel Jakub Dawidek capcas = cap_init(); 1864622f0e1SPawel Jakub Dawidek if (capcas == NULL) { 187c501d73cSMariusz Zaborski err(1, "unable to create casper process"); 188c501d73cSMariusz Zaborski exit(1); 1894622f0e1SPawel Jakub Dawidek } 1904622f0e1SPawel Jakub Dawidek cappwdloc = cap_service_open(capcas, "system.pwd"); 1914622f0e1SPawel Jakub Dawidek capgrploc = cap_service_open(capcas, "system.grp"); 1924622f0e1SPawel Jakub Dawidek /* Casper capability no longer needed. */ 1934622f0e1SPawel Jakub Dawidek cap_close(capcas); 1944622f0e1SPawel Jakub Dawidek if (cappwdloc == NULL || capgrploc == NULL) { 1954622f0e1SPawel Jakub Dawidek if (cappwdloc == NULL) 1964622f0e1SPawel Jakub Dawidek warn("unable to open system.pwd service"); 1974622f0e1SPawel Jakub Dawidek if (capgrploc == NULL) 1984622f0e1SPawel Jakub Dawidek warn("unable to open system.grp service"); 1998ff3952bSPawel Jakub Dawidek exit(1); 2004622f0e1SPawel Jakub Dawidek } 2014622f0e1SPawel Jakub Dawidek /* Limit system.pwd to only getpwuid() function and pw_name field. */ 2024622f0e1SPawel Jakub Dawidek cmds[0] = "getpwuid"; 2038ff3952bSPawel Jakub Dawidek if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0) 2048ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.pwd service"); 2054622f0e1SPawel Jakub Dawidek fields[0] = "pw_name"; 2068ff3952bSPawel Jakub Dawidek if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0) 2078ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.pwd service"); 2084622f0e1SPawel Jakub Dawidek /* Limit system.grp to only getgrgid() function and gr_name field. */ 2094622f0e1SPawel Jakub Dawidek cmds[0] = "getgrgid"; 2108ff3952bSPawel Jakub Dawidek if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0) 2118ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.grp service"); 2124622f0e1SPawel Jakub Dawidek fields[0] = "gr_name"; 2138ff3952bSPawel Jakub Dawidek if (cap_grp_limit_fields(capgrploc, fields, 1) < 0) 2148ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.grp service"); 2154622f0e1SPawel Jakub Dawidek 2164622f0e1SPawel Jakub Dawidek *cappwdp = cappwdloc; 2174622f0e1SPawel Jakub Dawidek *capgrpp = capgrploc; 2184622f0e1SPawel Jakub Dawidek return (0); 2194622f0e1SPawel Jakub Dawidek } 2202560d181SMariusz Zaborski #endif /* WITH_CASPER */ 2214622f0e1SPawel Jakub Dawidek 2229289f547SJohn Baldwin static void 2239289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), int value) 2249289f547SJohn Baldwin { 2259289f547SJohn Baldwin const char *str; 2269289f547SJohn Baldwin 2279289f547SJohn Baldwin str = decoder(value); 2289289f547SJohn Baldwin if (str != NULL) 2299289f547SJohn Baldwin printf("%s", str); 2309289f547SJohn Baldwin else { 2319289f547SJohn Baldwin if (decimal) 2329289f547SJohn Baldwin printf("<invalid=%d>", value); 2339289f547SJohn Baldwin else 2349289f547SJohn Baldwin printf("<invalid=%#x>", value); 2359289f547SJohn Baldwin } 2369289f547SJohn Baldwin } 2379289f547SJohn Baldwin 2389289f547SJohn Baldwin /* Like print_integer_arg but unknown values are treated as valid. */ 2399289f547SJohn Baldwin static void 2409289f547SJohn Baldwin print_integer_arg_valid(const char *(*decoder)(int), int value) 2419289f547SJohn Baldwin { 2429289f547SJohn Baldwin const char *str; 2439289f547SJohn Baldwin 2449289f547SJohn Baldwin str = decoder(value); 2459289f547SJohn Baldwin if (str != NULL) 2469289f547SJohn Baldwin printf("%s", str); 2479289f547SJohn Baldwin else { 2489289f547SJohn Baldwin if (decimal) 2499289f547SJohn Baldwin printf("%d", value); 2509289f547SJohn Baldwin else 2519289f547SJohn Baldwin printf("%#x", value); 2529289f547SJohn Baldwin } 2539289f547SJohn Baldwin } 2549289f547SJohn Baldwin 2559289f547SJohn Baldwin static void 2569289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), int value) 2579289f547SJohn Baldwin { 2589289f547SJohn Baldwin bool invalid; 2599289f547SJohn Baldwin int rem; 2609289f547SJohn Baldwin 2619289f547SJohn Baldwin printf("%#x<", value); 2629289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 2639289f547SJohn Baldwin printf(">"); 2649289f547SJohn Baldwin if (invalid) 2659289f547SJohn Baldwin printf("<invalid>%u", rem); 2669289f547SJohn Baldwin } 2679289f547SJohn Baldwin 2689289f547SJohn Baldwin static void 2699289f547SJohn Baldwin print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value) 2709289f547SJohn Baldwin { 2719289f547SJohn Baldwin bool invalid; 2729289f547SJohn Baldwin int rem; 2739289f547SJohn Baldwin 2749289f547SJohn Baldwin if (value == 0) { 2759289f547SJohn Baldwin printf("0"); 2769289f547SJohn Baldwin return; 2779289f547SJohn Baldwin } 2789289f547SJohn Baldwin printf("%#x<", value); 2799289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 2809289f547SJohn Baldwin printf(">"); 2819289f547SJohn Baldwin if (invalid) 2829289f547SJohn Baldwin printf("<invalid>%u", rem); 2839289f547SJohn Baldwin } 2849289f547SJohn Baldwin 2859289f547SJohn Baldwin static void 2869289f547SJohn Baldwin decode_fileflags(fflags_t value) 2879289f547SJohn Baldwin { 2889289f547SJohn Baldwin bool invalid; 2899289f547SJohn Baldwin fflags_t rem; 2909289f547SJohn Baldwin 2919289f547SJohn Baldwin if (value == 0) { 2929289f547SJohn Baldwin printf("0"); 2939289f547SJohn Baldwin return; 2949289f547SJohn Baldwin } 2959289f547SJohn Baldwin printf("%#x<", value); 2969289f547SJohn Baldwin invalid = !sysdecode_fileflags(stdout, value, &rem); 2979289f547SJohn Baldwin printf(">"); 2989289f547SJohn Baldwin if (invalid) 2999289f547SJohn Baldwin printf("<invalid>%u", rem); 3009289f547SJohn Baldwin } 3019289f547SJohn Baldwin 3029289f547SJohn Baldwin static void 3039289f547SJohn Baldwin decode_filemode(int value) 3049289f547SJohn Baldwin { 3059289f547SJohn Baldwin bool invalid; 3069289f547SJohn Baldwin int rem; 3079289f547SJohn Baldwin 3089289f547SJohn Baldwin if (value == 0) { 3099289f547SJohn Baldwin printf("0"); 3109289f547SJohn Baldwin return; 3119289f547SJohn Baldwin } 3129289f547SJohn Baldwin printf("%#o<", value); 3139289f547SJohn Baldwin invalid = !sysdecode_filemode(stdout, value, &rem); 3149289f547SJohn Baldwin printf(">"); 3159289f547SJohn Baldwin if (invalid) 3169289f547SJohn Baldwin printf("<invalid>%u", rem); 3179289f547SJohn Baldwin } 3189289f547SJohn Baldwin 3199289f547SJohn Baldwin static void 3209289f547SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value) 3219289f547SJohn Baldwin { 3229289f547SJohn Baldwin bool invalid; 3239289f547SJohn Baldwin uint32_t rem; 3249289f547SJohn Baldwin 3259289f547SJohn Baldwin printf("%#x<", value); 3269289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 3279289f547SJohn Baldwin printf(">"); 3289289f547SJohn Baldwin if (invalid) 3299289f547SJohn Baldwin printf("<invalid>%u", rem); 3309289f547SJohn Baldwin } 3319289f547SJohn Baldwin 3329289f547SJohn Baldwin static void 3339289f547SJohn Baldwin print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value) 3349289f547SJohn Baldwin { 3359289f547SJohn Baldwin bool invalid; 3369289f547SJohn Baldwin u_long rem; 3379289f547SJohn Baldwin 3389289f547SJohn Baldwin if (value == 0) { 3399289f547SJohn Baldwin printf("0"); 3409289f547SJohn Baldwin return; 3419289f547SJohn Baldwin } 3429289f547SJohn Baldwin printf("%#lx<", value); 3439289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 3449289f547SJohn Baldwin printf(">"); 3459289f547SJohn Baldwin if (invalid) 3469289f547SJohn Baldwin printf("<invalid>%lu", rem); 3479289f547SJohn Baldwin } 3489289f547SJohn Baldwin 34991fbb9c1SDavid Malone int 35091fbb9c1SDavid Malone main(int argc, char *argv[]) 3519b50d902SRodney W. Grimes { 3529b50d902SRodney W. Grimes int ch, ktrlen, size; 35391fbb9c1SDavid Malone void *m; 3549b50d902SRodney W. Grimes int trpoints = ALL_POINTS; 355db53f66bSJohn Baldwin int drop_logged; 356ec4beb5dSPeter Wemm pid_t pid = 0; 3577144d36fSDmitry Chagin u_int sv_flags; 3589b50d902SRodney W. Grimes 35909307b25SDag-Erling Smørgrav setlocale(LC_CTYPE, ""); 3605ccbfb26SAndrey A. Chernov 361c1269d20SMaxim Sobolev timestamp = TIMESTAMP_NONE; 362c1269d20SMaxim Sobolev 363b9034ce2SBryan Drewery while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1) 36409307b25SDag-Erling Smørgrav switch (ch) { 3657144d36fSDmitry Chagin case 'A': 3667144d36fSDmitry Chagin abiflag = 1; 3677144d36fSDmitry Chagin break; 3689b50d902SRodney W. Grimes case 'f': 3699b50d902SRodney W. Grimes tracefile = optarg; 3709b50d902SRodney W. Grimes break; 3719b50d902SRodney W. Grimes case 'd': 3729b50d902SRodney W. Grimes decimal = 1; 3739b50d902SRodney W. Grimes break; 3749b50d902SRodney W. Grimes case 'l': 3759b50d902SRodney W. Grimes tail = 1; 3769b50d902SRodney W. Grimes break; 3779b50d902SRodney W. Grimes case 'm': 3789b50d902SRodney W. Grimes maxdata = atoi(optarg); 3799b50d902SRodney W. Grimes break; 3809b50d902SRodney W. Grimes case 'n': 3819b50d902SRodney W. Grimes fancy = 0; 3829b50d902SRodney W. Grimes break; 383ec4beb5dSPeter Wemm case 'p': 384ec4beb5dSPeter Wemm pid = atoi(optarg); 385ec4beb5dSPeter Wemm break; 38660e15db9SDag-Erling Smørgrav case 'r': 38760e15db9SDag-Erling Smørgrav resolv = 1; 38860e15db9SDag-Erling Smørgrav break; 389b9034ce2SBryan Drewery case 'S': 390b9034ce2SBryan Drewery syscallno = 1; 391b9034ce2SBryan Drewery break; 392df0c8868SRobert Watson case 's': 393df0c8868SRobert Watson suppressdata = 1; 394df0c8868SRobert Watson break; 395ec131914SPeter Wemm case 'E': 396c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_ELAPSED; 397ec131914SPeter Wemm break; 398a9ac598bSRobert Watson case 'H': 399a9ac598bSRobert Watson threads = 1; 400a9ac598bSRobert Watson break; 4019b50d902SRodney W. Grimes case 'R': 402c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_RELATIVE; 4039b50d902SRodney W. Grimes break; 4049b50d902SRodney W. Grimes case 'T': 405c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_ABSOLUTE; 4069b50d902SRodney W. Grimes break; 4079b50d902SRodney W. Grimes case 't': 4089b50d902SRodney W. Grimes trpoints = getpoints(optarg); 40915fc002bSPhilippe Charnier if (trpoints < 0) 41015fc002bSPhilippe Charnier errx(1, "unknown trace point in %s", optarg); 4119b50d902SRodney W. Grimes break; 4129b50d902SRodney W. Grimes default: 4139b50d902SRodney W. Grimes usage(); 4149b50d902SRodney W. Grimes } 4159b50d902SRodney W. Grimes 41680844fd1SBill Fenner if (argc > optind) 4179b50d902SRodney W. Grimes usage(); 4189b50d902SRodney W. Grimes 41909307b25SDag-Erling Smørgrav m = malloc(size = 1025); 42015fc002bSPhilippe Charnier if (m == NULL) 42115fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 4229d0fa50eSSimon J. Gerraty if (strcmp(tracefile, "-") != 0) 42315fc002bSPhilippe Charnier if (!freopen(tracefile, "r", stdin)) 42415fc002bSPhilippe Charnier err(1, "%s", tracefile); 425f9b20fc8SPawel Jakub Dawidek 426c5033697SMariusz Zaborski caph_cache_catpages(); 427c5033697SMariusz Zaborski caph_cache_tzdata(); 428c5033697SMariusz Zaborski 4292560d181SMariusz Zaborski #ifdef WITH_CASPER 4304622f0e1SPawel Jakub Dawidek if (resolv != 0) { 4314622f0e1SPawel Jakub Dawidek if (cappwdgrp_setup(&cappwd, &capgrp) < 0) { 4324622f0e1SPawel Jakub Dawidek cappwd = NULL; 4334622f0e1SPawel Jakub Dawidek capgrp = NULL; 4344622f0e1SPawel Jakub Dawidek } 4354622f0e1SPawel Jakub Dawidek } 4364622f0e1SPawel Jakub Dawidek if (resolv == 0 || (cappwd != NULL && capgrp != NULL)) { 4377672a014SMariusz Zaborski if (caph_enter() < 0) 4384622f0e1SPawel Jakub Dawidek err(1, "unable to enter capability mode"); 4394622f0e1SPawel Jakub Dawidek } 4404622f0e1SPawel Jakub Dawidek #else 441d2c9ca44SPawel Jakub Dawidek if (resolv == 0) { 4427672a014SMariusz Zaborski if (caph_enter() < 0) 443f9b20fc8SPawel Jakub Dawidek err(1, "unable to enter capability mode"); 444d2c9ca44SPawel Jakub Dawidek } 4454622f0e1SPawel Jakub Dawidek #endif 446a4e3fc54SMariusz Zaborski if (caph_limit_stdio() == -1) 447a4e3fc54SMariusz Zaborski err(1, "unable to limit stdio"); 448f9b20fc8SPawel Jakub Dawidek 4497144d36fSDmitry Chagin TAILQ_INIT(&trace_procs); 450db53f66bSJohn Baldwin drop_logged = 0; 4519b50d902SRodney W. Grimes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 452db53f66bSJohn Baldwin if (ktr_header.ktr_type & KTR_DROP) { 453db53f66bSJohn Baldwin ktr_header.ktr_type &= ~KTR_DROP; 454a9ac598bSRobert Watson if (!drop_logged && threads) { 45509307b25SDag-Erling Smørgrav printf( 456c065c0b8SJaakko Heinonen "%6jd %6jd %-8.*s Events dropped.\n", 457c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, 458c065c0b8SJaakko Heinonen ktr_header.ktr_tid > 0 ? 459c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_tid : 0, 460c065c0b8SJaakko Heinonen MAXCOMLEN, ktr_header.ktr_comm); 461a9ac598bSRobert Watson drop_logged = 1; 462a9ac598bSRobert Watson } else if (!drop_logged) { 46309307b25SDag-Erling Smørgrav printf("%6jd %-8.*s Events dropped.\n", 464c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, MAXCOMLEN, 465db53f66bSJohn Baldwin ktr_header.ktr_comm); 466db53f66bSJohn Baldwin drop_logged = 1; 467db53f66bSJohn Baldwin } 468db53f66bSJohn Baldwin } 4699b50d902SRodney W. Grimes if (trpoints & (1<<ktr_header.ktr_type)) 47001a36e29SJohn Baldwin if (pid == 0 || ktr_header.ktr_pid == pid || 47101a36e29SJohn Baldwin ktr_header.ktr_tid == pid) 4729b50d902SRodney W. Grimes dumpheader(&ktr_header); 47315fc002bSPhilippe Charnier if ((ktrlen = ktr_header.ktr_len) < 0) 47415fc002bSPhilippe Charnier errx(1, "bogus length 0x%x", ktrlen); 4759b50d902SRodney W. Grimes if (ktrlen > size) { 47609307b25SDag-Erling Smørgrav m = realloc(m, ktrlen+1); 47715fc002bSPhilippe Charnier if (m == NULL) 47815fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 4799b50d902SRodney W. Grimes size = ktrlen; 4809b50d902SRodney W. Grimes } 48115fc002bSPhilippe Charnier if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 48215fc002bSPhilippe Charnier errx(1, "data too short"); 4837144d36fSDmitry Chagin if (fetchprocinfo(&ktr_header, (u_int *)m) != 0) 4847144d36fSDmitry Chagin continue; 4857144d36fSDmitry Chagin sv_flags = abidump(&ktr_header); 48601a36e29SJohn Baldwin if (pid && ktr_header.ktr_pid != pid && 48701a36e29SJohn Baldwin ktr_header.ktr_tid != pid) 488ec4beb5dSPeter Wemm continue; 4899b50d902SRodney W. Grimes if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 4909b50d902SRodney W. Grimes continue; 491db53f66bSJohn Baldwin drop_logged = 0; 4929b50d902SRodney W. Grimes switch (ktr_header.ktr_type) { 4939b50d902SRodney W. Grimes case KTR_SYSCALL: 4947144d36fSDmitry Chagin ktrsyscall((struct ktr_syscall *)m, sv_flags); 4959b50d902SRodney W. Grimes break; 4969b50d902SRodney W. Grimes case KTR_SYSRET: 4977144d36fSDmitry Chagin ktrsysret((struct ktr_sysret *)m, sv_flags); 4989b50d902SRodney W. Grimes break; 4999b50d902SRodney W. Grimes case KTR_NAMEI: 500a56be37eSJohn Baldwin case KTR_SYSCTL: 5019b50d902SRodney W. Grimes ktrnamei(m, ktrlen); 5029b50d902SRodney W. Grimes break; 5039b50d902SRodney W. Grimes case KTR_GENIO: 5049b50d902SRodney W. Grimes ktrgenio((struct ktr_genio *)m, ktrlen); 5059b50d902SRodney W. Grimes break; 5069b50d902SRodney W. Grimes case KTR_PSIG: 507dde5f9b9SDmitry Chagin ktrpsig((struct ktr_psig *)m); 5089b50d902SRodney W. Grimes break; 5099b50d902SRodney W. Grimes case KTR_CSW: 51088bf5036SJohn Baldwin if (ktrlen == sizeof(struct ktr_csw_old)) 51188bf5036SJohn Baldwin ktrcsw_old((struct ktr_csw_old *)m); 51288bf5036SJohn Baldwin else 5139b50d902SRodney W. Grimes ktrcsw((struct ktr_csw *)m); 5149b50d902SRodney W. Grimes break; 51582e2dd32SPoul-Henning Kamp case KTR_USER: 5163f8ba9aeSPoul-Henning Kamp ktruser(ktrlen, m); 51782e2dd32SPoul-Henning Kamp break; 51860e15db9SDag-Erling Smørgrav case KTR_STRUCT: 51960e15db9SDag-Erling Smørgrav ktrstruct(m, ktrlen); 52060e15db9SDag-Erling Smørgrav break; 521c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 522c601ad8eSDag-Erling Smørgrav ktrcapfail((struct ktr_cap_fail *)m); 52335818d2eSJohn Baldwin break; 52435818d2eSJohn Baldwin case KTR_FAULT: 52535818d2eSJohn Baldwin ktrfault((struct ktr_fault *)m); 52635818d2eSJohn Baldwin break; 52735818d2eSJohn Baldwin case KTR_FAULTEND: 52835818d2eSJohn Baldwin ktrfaultend((struct ktr_faultend *)m); 52935818d2eSJohn Baldwin break; 530ffb66079SJohn Baldwin case KTR_STRUCT_ARRAY: 531ffb66079SJohn Baldwin ktrstructarray((struct ktr_struct_array *)m, ktrlen); 532ffb66079SJohn Baldwin break; 533b9609ab1SJohn Baldwin default: 534b9609ab1SJohn Baldwin printf("\n"); 535b9609ab1SJohn Baldwin break; 5369b50d902SRodney W. Grimes } 5379b50d902SRodney W. Grimes if (tail) 53809307b25SDag-Erling Smørgrav fflush(stdout); 5399b50d902SRodney W. Grimes } 54091fbb9c1SDavid Malone return 0; 5419b50d902SRodney W. Grimes } 5429b50d902SRodney W. Grimes 54391fbb9c1SDavid Malone int 54491fbb9c1SDavid Malone fread_tail(void *buf, int size, int num) 5459b50d902SRodney W. Grimes { 5469b50d902SRodney W. Grimes int i; 5479b50d902SRodney W. Grimes 5489b50d902SRodney W. Grimes while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 54909307b25SDag-Erling Smørgrav sleep(1); 5509b50d902SRodney W. Grimes clearerr(stdin); 5519b50d902SRodney W. Grimes } 5529b50d902SRodney W. Grimes return (i); 5539b50d902SRodney W. Grimes } 5549b50d902SRodney W. Grimes 5557144d36fSDmitry Chagin int 5567144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags) 5577144d36fSDmitry Chagin { 5587144d36fSDmitry Chagin struct proc_info *pi; 5597144d36fSDmitry Chagin 5607144d36fSDmitry Chagin switch (kth->ktr_type) { 5617144d36fSDmitry Chagin case KTR_PROCCTOR: 5627144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 5637144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 5647144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 5657144d36fSDmitry Chagin break; 5667144d36fSDmitry Chagin } 5677144d36fSDmitry Chagin } 5687144d36fSDmitry Chagin pi = malloc(sizeof(struct proc_info)); 5697144d36fSDmitry Chagin if (pi == NULL) 5707144d36fSDmitry Chagin errx(1, "%s", strerror(ENOMEM)); 5717144d36fSDmitry Chagin pi->sv_flags = *flags; 5727144d36fSDmitry Chagin pi->pid = kth->ktr_pid; 5737144d36fSDmitry Chagin TAILQ_INSERT_TAIL(&trace_procs, pi, info); 5747144d36fSDmitry Chagin return (1); 5757144d36fSDmitry Chagin 5767144d36fSDmitry Chagin case KTR_PROCDTOR: 5777144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 5787144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 5797144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 5807144d36fSDmitry Chagin free(pi); 5817144d36fSDmitry Chagin break; 5827144d36fSDmitry Chagin } 5837144d36fSDmitry Chagin } 5847144d36fSDmitry Chagin return (1); 5857144d36fSDmitry Chagin } 5867144d36fSDmitry Chagin 5877144d36fSDmitry Chagin return (0); 5887144d36fSDmitry Chagin } 5897144d36fSDmitry Chagin 5907144d36fSDmitry Chagin u_int 5917144d36fSDmitry Chagin abidump(struct ktr_header *kth) 5927144d36fSDmitry Chagin { 5937144d36fSDmitry Chagin struct proc_info *pi; 5947144d36fSDmitry Chagin const char *abi; 5957144d36fSDmitry Chagin const char *arch; 5967144d36fSDmitry Chagin u_int flags = 0; 5977144d36fSDmitry Chagin 5987144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 5997144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 6007144d36fSDmitry Chagin flags = pi->sv_flags; 6017144d36fSDmitry Chagin break; 6027144d36fSDmitry Chagin } 6037144d36fSDmitry Chagin } 6047144d36fSDmitry Chagin 6057144d36fSDmitry Chagin if (abiflag == 0) 6067144d36fSDmitry Chagin return (flags); 6077144d36fSDmitry Chagin 6087144d36fSDmitry Chagin switch (flags & SV_ABI_MASK) { 6097144d36fSDmitry Chagin case SV_ABI_LINUX: 6107144d36fSDmitry Chagin abi = "L"; 6117144d36fSDmitry Chagin break; 6127144d36fSDmitry Chagin case SV_ABI_FREEBSD: 6137144d36fSDmitry Chagin abi = "F"; 6147144d36fSDmitry Chagin break; 6156fb8946bSJohn Baldwin case SV_ABI_CLOUDABI: 6166fb8946bSJohn Baldwin abi = "C"; 6176fb8946bSJohn Baldwin break; 6187144d36fSDmitry Chagin default: 6197144d36fSDmitry Chagin abi = "U"; 6207144d36fSDmitry Chagin break; 6217144d36fSDmitry Chagin } 6227144d36fSDmitry Chagin 6237144d36fSDmitry Chagin if (flags & SV_LP64) 6247144d36fSDmitry Chagin arch = "64"; 6256fc8053fSJohn Baldwin else if (flags & SV_ILP32) 6267144d36fSDmitry Chagin arch = "32"; 6276fc8053fSJohn Baldwin else 6287144d36fSDmitry Chagin arch = "00"; 6297144d36fSDmitry Chagin 6307144d36fSDmitry Chagin printf("%s%s ", abi, arch); 6317144d36fSDmitry Chagin 6327144d36fSDmitry Chagin return (flags); 6337144d36fSDmitry Chagin } 6347144d36fSDmitry Chagin 63591fbb9c1SDavid Malone void 63691fbb9c1SDavid Malone dumpheader(struct ktr_header *kth) 6379b50d902SRodney W. Grimes { 6389b50d902SRodney W. Grimes static char unknown[64]; 639dda41f20SJohn Baldwin static struct timeval prevtime, prevtime_e; 640dda41f20SJohn Baldwin struct timeval temp; 64191fbb9c1SDavid Malone const char *type; 642da551bb2SMaxim Sobolev const char *sign; 6439b50d902SRodney W. Grimes 6449b50d902SRodney W. Grimes switch (kth->ktr_type) { 6459b50d902SRodney W. Grimes case KTR_SYSCALL: 6469b50d902SRodney W. Grimes type = "CALL"; 6479b50d902SRodney W. Grimes break; 6489b50d902SRodney W. Grimes case KTR_SYSRET: 6499b50d902SRodney W. Grimes type = "RET "; 6509b50d902SRodney W. Grimes break; 6519b50d902SRodney W. Grimes case KTR_NAMEI: 6529b50d902SRodney W. Grimes type = "NAMI"; 6539b50d902SRodney W. Grimes break; 6549b50d902SRodney W. Grimes case KTR_GENIO: 6559b50d902SRodney W. Grimes type = "GIO "; 6569b50d902SRodney W. Grimes break; 6579b50d902SRodney W. Grimes case KTR_PSIG: 6589b50d902SRodney W. Grimes type = "PSIG"; 6599b50d902SRodney W. Grimes break; 6609b50d902SRodney W. Grimes case KTR_CSW: 6619b50d902SRodney W. Grimes type = "CSW "; 6629b50d902SRodney W. Grimes break; 66382e2dd32SPoul-Henning Kamp case KTR_USER: 66482e2dd32SPoul-Henning Kamp type = "USER"; 66582e2dd32SPoul-Henning Kamp break; 66660e15db9SDag-Erling Smørgrav case KTR_STRUCT: 667ffb66079SJohn Baldwin case KTR_STRUCT_ARRAY: 66860e15db9SDag-Erling Smørgrav type = "STRU"; 66960e15db9SDag-Erling Smørgrav break; 670a56be37eSJohn Baldwin case KTR_SYSCTL: 671a56be37eSJohn Baldwin type = "SCTL"; 672a56be37eSJohn Baldwin break; 6737144d36fSDmitry Chagin case KTR_PROCCTOR: 6747144d36fSDmitry Chagin /* FALLTHROUGH */ 6757144d36fSDmitry Chagin case KTR_PROCDTOR: 6767144d36fSDmitry Chagin return; 677c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 678c601ad8eSDag-Erling Smørgrav type = "CAP "; 679c601ad8eSDag-Erling Smørgrav break; 68035818d2eSJohn Baldwin case KTR_FAULT: 68135818d2eSJohn Baldwin type = "PFLT"; 68235818d2eSJohn Baldwin break; 68335818d2eSJohn Baldwin case KTR_FAULTEND: 68435818d2eSJohn Baldwin type = "PRET"; 68535818d2eSJohn Baldwin break; 6869b50d902SRodney W. Grimes default: 68709307b25SDag-Erling Smørgrav sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 6889b50d902SRodney W. Grimes type = unknown; 6899b50d902SRodney W. Grimes } 6909b50d902SRodney W. Grimes 691a9ac598bSRobert Watson /* 692a9ac598bSRobert Watson * The ktr_tid field was previously the ktr_buffer field, which held 693a9ac598bSRobert Watson * the kernel pointer value for the buffer associated with data 694a9ac598bSRobert Watson * following the record header. It now holds a threadid, but only 695a9ac598bSRobert Watson * for trace files after the change. Older trace files still contain 696a9ac598bSRobert Watson * kernel pointers. Detect this and suppress the results by printing 697a9ac598bSRobert Watson * negative tid's as 0. 698a9ac598bSRobert Watson */ 699a9ac598bSRobert Watson if (threads) 70009307b25SDag-Erling Smørgrav printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid, 701c065c0b8SJaakko Heinonen kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0, 702c065c0b8SJaakko Heinonen MAXCOMLEN, kth->ktr_comm); 703a9ac598bSRobert Watson else 70409307b25SDag-Erling Smørgrav printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN, 705a9ac598bSRobert Watson kth->ktr_comm); 7069b50d902SRodney W. Grimes if (timestamp) { 707c1269d20SMaxim Sobolev if (timestamp & TIMESTAMP_ABSOLUTE) { 708c1269d20SMaxim Sobolev printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec, 709c1269d20SMaxim Sobolev kth->ktr_time.tv_usec); 710ec131914SPeter Wemm } 711c1269d20SMaxim Sobolev if (timestamp & TIMESTAMP_ELAPSED) { 712c1269d20SMaxim Sobolev if (prevtime_e.tv_sec == 0) 713c1269d20SMaxim Sobolev prevtime_e = kth->ktr_time; 71454b10c9eSJohn Baldwin timersub(&kth->ktr_time, &prevtime_e, &temp); 71554b10c9eSJohn Baldwin printf("%jd.%06ld ", (intmax_t)temp.tv_sec, 71654b10c9eSJohn Baldwin temp.tv_usec); 717c1269d20SMaxim Sobolev } 718c1269d20SMaxim Sobolev if (timestamp & TIMESTAMP_RELATIVE) { 719da551bb2SMaxim Sobolev if (prevtime.tv_sec == 0) 720da551bb2SMaxim Sobolev prevtime = kth->ktr_time; 72154b10c9eSJohn Baldwin if (timercmp(&kth->ktr_time, &prevtime, <)) { 72254b10c9eSJohn Baldwin timersub(&prevtime, &kth->ktr_time, &temp); 723da551bb2SMaxim Sobolev sign = "-"; 724da551bb2SMaxim Sobolev } else { 72554b10c9eSJohn Baldwin timersub(&kth->ktr_time, &prevtime, &temp); 726da551bb2SMaxim Sobolev sign = ""; 727da551bb2SMaxim Sobolev } 72854b10c9eSJohn Baldwin prevtime = kth->ktr_time; 72954b10c9eSJohn Baldwin printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec, 73054b10c9eSJohn Baldwin temp.tv_usec); 7319b50d902SRodney W. Grimes } 732c1269d20SMaxim Sobolev } 73309307b25SDag-Erling Smørgrav printf("%s ", type); 7349b50d902SRodney W. Grimes } 7359b50d902SRodney W. Grimes 7369b50d902SRodney W. Grimes #include <sys/syscall.h> 7379b50d902SRodney W. Grimes 738265e5898SJohn Baldwin static void 739265e5898SJohn Baldwin ioctlname(unsigned long val) 740265e5898SJohn Baldwin { 741265e5898SJohn Baldwin const char *str; 742265e5898SJohn Baldwin 743265e5898SJohn Baldwin str = sysdecode_ioctlname(val); 744265e5898SJohn Baldwin if (str != NULL) 745265e5898SJohn Baldwin printf("%s", str); 746265e5898SJohn Baldwin else if (decimal) 747265e5898SJohn Baldwin printf("%lu", val); 748265e5898SJohn Baldwin else 749265e5898SJohn Baldwin printf("%#lx", val); 750265e5898SJohn Baldwin } 751265e5898SJohn Baldwin 752a5f14abfSJohn Baldwin static enum sysdecode_abi 753a5f14abfSJohn Baldwin syscallabi(u_int sv_flags) 754a5f14abfSJohn Baldwin { 755a5f14abfSJohn Baldwin 756a5f14abfSJohn Baldwin if (sv_flags == 0) 7575842bd68SJohn Baldwin return (SYSDECODE_ABI_FREEBSD); 758a5f14abfSJohn Baldwin switch (sv_flags & SV_ABI_MASK) { 759a5f14abfSJohn Baldwin case SV_ABI_FREEBSD: 7605842bd68SJohn Baldwin return (SYSDECODE_ABI_FREEBSD); 761a5f14abfSJohn Baldwin case SV_ABI_LINUX: 762fc7d33b4SEd Maste #ifdef __LP64__ 763a5f14abfSJohn Baldwin if (sv_flags & SV_ILP32) 7645842bd68SJohn Baldwin return (SYSDECODE_ABI_LINUX32); 765a5f14abfSJohn Baldwin #endif 7665842bd68SJohn Baldwin return (SYSDECODE_ABI_LINUX); 7676fb8946bSJohn Baldwin case SV_ABI_CLOUDABI: 7686fb8946bSJohn Baldwin return (SYSDECODE_ABI_CLOUDABI64); 769a5f14abfSJohn Baldwin default: 7705842bd68SJohn Baldwin return (SYSDECODE_ABI_UNKNOWN); 771a5f14abfSJohn Baldwin } 772a5f14abfSJohn Baldwin } 773a5f14abfSJohn Baldwin 774a5f14abfSJohn Baldwin static void 775a5f14abfSJohn Baldwin syscallname(u_int code, u_int sv_flags) 776a5f14abfSJohn Baldwin { 777a5f14abfSJohn Baldwin const char *name; 778a5f14abfSJohn Baldwin 779a5f14abfSJohn Baldwin name = sysdecode_syscallname(syscallabi(sv_flags), code); 780a5f14abfSJohn Baldwin if (name == NULL) 781a5f14abfSJohn Baldwin printf("[%d]", code); 782a5f14abfSJohn Baldwin else { 783a5f14abfSJohn Baldwin printf("%s", name); 784a5f14abfSJohn Baldwin if (syscallno) 785a5f14abfSJohn Baldwin printf("[%d]", code); 786a5f14abfSJohn Baldwin } 787a5f14abfSJohn Baldwin } 788a5f14abfSJohn Baldwin 7899289f547SJohn Baldwin static void 7909289f547SJohn Baldwin print_signal(int signo) 7919289f547SJohn Baldwin { 7929289f547SJohn Baldwin const char *signame; 7939289f547SJohn Baldwin 7949289f547SJohn Baldwin signame = sysdecode_signal(signo); 7959289f547SJohn Baldwin if (signame != NULL) 7969289f547SJohn Baldwin printf("%s", signame); 7979289f547SJohn Baldwin else 7989289f547SJohn Baldwin printf("SIG %d", signo); 7999289f547SJohn Baldwin } 8009289f547SJohn Baldwin 80191fbb9c1SDavid Malone void 802a5f14abfSJohn Baldwin ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags) 8039b50d902SRodney W. Grimes { 80491fbb9c1SDavid Malone int narg = ktr->ktr_narg; 80571ed318eSJohn Baldwin register_t *ip, *first; 806c601ad8eSDag-Erling Smørgrav intmax_t arg; 80771ed318eSJohn Baldwin int quad_align, quad_slots; 8089b50d902SRodney W. Grimes 809a5f14abfSJohn Baldwin syscallname(ktr->ktr_code, sv_flags); 81071ed318eSJohn Baldwin ip = first = &ktr->ktr_args[0]; 8119b50d902SRodney W. Grimes if (narg) { 8129b50d902SRodney W. Grimes char c = '('; 8137144d36fSDmitry Chagin if (fancy && 814a5f14abfSJohn Baldwin (sv_flags == 0 || 815a5f14abfSJohn Baldwin (sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) { 81671ed318eSJohn Baldwin quad_align = 0; 81771ed318eSJohn Baldwin if (sv_flags & SV_ILP32) { 81871ed318eSJohn Baldwin #ifdef __powerpc__ 81971ed318eSJohn Baldwin quad_align = 1; 82071ed318eSJohn Baldwin #endif 82171ed318eSJohn Baldwin quad_slots = 2; 82271ed318eSJohn Baldwin } else 82371ed318eSJohn Baldwin quad_slots = 1; 82473430055SDag-Erling Smørgrav switch (ktr->ktr_code) { 8251ca6c7fcSJilles Tjoelker case SYS_bindat: 826c4561fabSJohn Baldwin case SYS_chflagsat: 8271ca6c7fcSJilles Tjoelker case SYS_connectat: 8288447b7cdSJilles Tjoelker case SYS_faccessat: 8298447b7cdSJilles Tjoelker case SYS_fchmodat: 8308447b7cdSJilles Tjoelker case SYS_fchownat: 8318447b7cdSJilles Tjoelker case SYS_fstatat: 8328447b7cdSJilles Tjoelker case SYS_futimesat: 8338447b7cdSJilles Tjoelker case SYS_linkat: 8348447b7cdSJilles Tjoelker case SYS_mkdirat: 8358447b7cdSJilles Tjoelker case SYS_mkfifoat: 8368447b7cdSJilles Tjoelker case SYS_mknodat: 8378447b7cdSJilles Tjoelker case SYS_openat: 8388447b7cdSJilles Tjoelker case SYS_readlinkat: 8398447b7cdSJilles Tjoelker case SYS_renameat: 8408447b7cdSJilles Tjoelker case SYS_unlinkat: 8412205e0d1SJilles Tjoelker case SYS_utimensat: 8428447b7cdSJilles Tjoelker putchar('('); 8439289f547SJohn Baldwin print_integer_arg_valid(sysdecode_atfd, *ip); 8448447b7cdSJilles Tjoelker c = ','; 8458447b7cdSJilles Tjoelker ip++; 8468447b7cdSJilles Tjoelker narg--; 8478447b7cdSJilles Tjoelker break; 8488447b7cdSJilles Tjoelker } 8498447b7cdSJilles Tjoelker switch (ktr->ktr_code) { 85073430055SDag-Erling Smørgrav case SYS_ioctl: { 85198a68a58SAlexander Leidinger print_number(ip, narg, c); 852d09e66beSDag-Erling Smørgrav putchar(c); 853265e5898SJohn Baldwin ioctlname(*ip); 8549b50d902SRodney W. Grimes c = ','; 8559b50d902SRodney W. Grimes ip++; 8569b50d902SRodney W. Grimes narg--; 85773430055SDag-Erling Smørgrav break; 85873430055SDag-Erling Smørgrav } 85973430055SDag-Erling Smørgrav case SYS_ptrace: 86009307b25SDag-Erling Smørgrav putchar('('); 8619289f547SJohn Baldwin print_integer_arg(sysdecode_ptrace_request, *ip); 8629b50d902SRodney W. Grimes c = ','; 8639b50d902SRodney W. Grimes ip++; 8649b50d902SRodney W. Grimes narg--; 86573430055SDag-Erling Smørgrav break; 86673430055SDag-Erling Smørgrav case SYS_access: 86773430055SDag-Erling Smørgrav case SYS_eaccess: 8688447b7cdSJilles Tjoelker case SYS_faccessat: 86998a68a58SAlexander Leidinger print_number(ip, narg, c); 87009307b25SDag-Erling Smørgrav putchar(','); 8719289f547SJohn Baldwin print_mask_arg(sysdecode_access_mode, *ip); 87298a68a58SAlexander Leidinger ip++; 87398a68a58SAlexander Leidinger narg--; 87473430055SDag-Erling Smørgrav break; 87573430055SDag-Erling Smørgrav case SYS_open: 8768447b7cdSJilles Tjoelker case SYS_openat: 87798a68a58SAlexander Leidinger print_number(ip, narg, c); 87809307b25SDag-Erling Smørgrav putchar(','); 8799289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, ip[0]); 8809289f547SJohn Baldwin if ((ip[0] & O_CREAT) == O_CREAT) { 8819289f547SJohn Baldwin putchar(','); 8829289f547SJohn Baldwin decode_filemode(ip[1]); 8839289f547SJohn Baldwin } 88473430055SDag-Erling Smørgrav ip += 2; 88598a68a58SAlexander Leidinger narg -= 2; 88673430055SDag-Erling Smørgrav break; 88773430055SDag-Erling Smørgrav case SYS_wait4: 88898a68a58SAlexander Leidinger print_number(ip, narg, c); 88998a68a58SAlexander Leidinger print_number(ip, narg, c); 89009307b25SDag-Erling Smørgrav putchar(','); 8919289f547SJohn Baldwin print_mask_arg0(sysdecode_wait4_options, *ip); 89234763d1cSJohn Baldwin ip++; 89334763d1cSJohn Baldwin narg--; 89434763d1cSJohn Baldwin break; 89534763d1cSJohn Baldwin case SYS_wait6: 89634763d1cSJohn Baldwin putchar('('); 8979289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, *ip); 89834763d1cSJohn Baldwin c = ','; 89934763d1cSJohn Baldwin ip++; 90034763d1cSJohn Baldwin narg--; 90171ed318eSJohn Baldwin print_number64(first, ip, narg, c); 90234763d1cSJohn Baldwin print_number(ip, narg, c); 90334763d1cSJohn Baldwin putchar(','); 9049289f547SJohn Baldwin print_mask_arg(sysdecode_wait6_options, *ip); 90598a68a58SAlexander Leidinger ip++; 90698a68a58SAlexander Leidinger narg--; 90773430055SDag-Erling Smørgrav break; 90873430055SDag-Erling Smørgrav case SYS_chmod: 90973430055SDag-Erling Smørgrav case SYS_fchmod: 91073430055SDag-Erling Smørgrav case SYS_lchmod: 911eebea334SBaptiste Daroussin case SYS_fchmodat: 91298a68a58SAlexander Leidinger print_number(ip, narg, c); 91309307b25SDag-Erling Smørgrav putchar(','); 9149289f547SJohn Baldwin decode_filemode(*ip); 91598a68a58SAlexander Leidinger ip++; 91698a68a58SAlexander Leidinger narg--; 91773430055SDag-Erling Smørgrav break; 9188447b7cdSJilles Tjoelker case SYS_mknodat: 91998a68a58SAlexander Leidinger print_number(ip, narg, c); 92009307b25SDag-Erling Smørgrav putchar(','); 9219289f547SJohn Baldwin decode_filemode(*ip); 92298a68a58SAlexander Leidinger ip++; 92398a68a58SAlexander Leidinger narg--; 92473430055SDag-Erling Smørgrav break; 92573430055SDag-Erling Smørgrav case SYS_getfsstat: 92698a68a58SAlexander Leidinger print_number(ip, narg, c); 92798a68a58SAlexander Leidinger print_number(ip, narg, c); 92809307b25SDag-Erling Smørgrav putchar(','); 92948f79574SJohn Baldwin print_integer_arg(sysdecode_getfsstat_mode, *ip); 93098a68a58SAlexander Leidinger ip++; 93198a68a58SAlexander Leidinger narg--; 93273430055SDag-Erling Smørgrav break; 93373430055SDag-Erling Smørgrav case SYS_mount: 93498a68a58SAlexander Leidinger print_number(ip, narg, c); 93598a68a58SAlexander Leidinger print_number(ip, narg, c); 93609307b25SDag-Erling Smørgrav putchar(','); 9379289f547SJohn Baldwin print_mask_arg(sysdecode_mount_flags, *ip); 93898a68a58SAlexander Leidinger ip++; 93998a68a58SAlexander Leidinger narg--; 94073430055SDag-Erling Smørgrav break; 94173430055SDag-Erling Smørgrav case SYS_unmount: 94298a68a58SAlexander Leidinger print_number(ip, narg, c); 94309307b25SDag-Erling Smørgrav putchar(','); 9449289f547SJohn Baldwin print_mask_arg(sysdecode_mount_flags, *ip); 94598a68a58SAlexander Leidinger ip++; 94698a68a58SAlexander Leidinger narg--; 94773430055SDag-Erling Smørgrav break; 94873430055SDag-Erling Smørgrav case SYS_recvmsg: 94973430055SDag-Erling Smørgrav case SYS_sendmsg: 95098a68a58SAlexander Leidinger print_number(ip, narg, c); 95198a68a58SAlexander Leidinger print_number(ip, narg, c); 95209307b25SDag-Erling Smørgrav putchar(','); 9539289f547SJohn Baldwin print_mask_arg0(sysdecode_msg_flags, *ip); 95498a68a58SAlexander Leidinger ip++; 95598a68a58SAlexander Leidinger narg--; 95673430055SDag-Erling Smørgrav break; 95773430055SDag-Erling Smørgrav case SYS_recvfrom: 95873430055SDag-Erling Smørgrav case SYS_sendto: 95998a68a58SAlexander Leidinger print_number(ip, narg, c); 96098a68a58SAlexander Leidinger print_number(ip, narg, c); 96198a68a58SAlexander Leidinger print_number(ip, narg, c); 96209307b25SDag-Erling Smørgrav putchar(','); 9639289f547SJohn Baldwin print_mask_arg0(sysdecode_msg_flags, *ip); 96498a68a58SAlexander Leidinger ip++; 96598a68a58SAlexander Leidinger narg--; 96673430055SDag-Erling Smørgrav break; 96773430055SDag-Erling Smørgrav case SYS_chflags: 968c4561fabSJohn Baldwin case SYS_chflagsat: 96973430055SDag-Erling Smørgrav case SYS_fchflags: 97073430055SDag-Erling Smørgrav case SYS_lchflags: 97198a68a58SAlexander Leidinger print_number(ip, narg, c); 97209307b25SDag-Erling Smørgrav putchar(','); 9739289f547SJohn Baldwin decode_fileflags(*ip); 97498a68a58SAlexander Leidinger ip++; 97598a68a58SAlexander Leidinger narg--; 97673430055SDag-Erling Smørgrav break; 97773430055SDag-Erling Smørgrav case SYS_kill: 97898a68a58SAlexander Leidinger print_number(ip, narg, c); 97909307b25SDag-Erling Smørgrav putchar(','); 9809289f547SJohn Baldwin print_signal(*ip); 98198a68a58SAlexander Leidinger ip++; 98298a68a58SAlexander Leidinger narg--; 98373430055SDag-Erling Smørgrav break; 98473430055SDag-Erling Smørgrav case SYS_reboot: 98509307b25SDag-Erling Smørgrav putchar('('); 9869289f547SJohn Baldwin print_mask_arg(sysdecode_reboot_howto, *ip); 98798a68a58SAlexander Leidinger ip++; 98898a68a58SAlexander Leidinger narg--; 98973430055SDag-Erling Smørgrav break; 99073430055SDag-Erling Smørgrav case SYS_umask: 99109307b25SDag-Erling Smørgrav putchar('('); 9929289f547SJohn Baldwin decode_filemode(*ip); 99398a68a58SAlexander Leidinger ip++; 99498a68a58SAlexander Leidinger narg--; 99573430055SDag-Erling Smørgrav break; 99673430055SDag-Erling Smørgrav case SYS_msync: 99798a68a58SAlexander Leidinger print_number(ip, narg, c); 99898a68a58SAlexander Leidinger print_number(ip, narg, c); 99909307b25SDag-Erling Smørgrav putchar(','); 10009289f547SJohn Baldwin print_mask_arg(sysdecode_msync_flags, *ip); 100198a68a58SAlexander Leidinger ip++; 100298a68a58SAlexander Leidinger narg--; 100373430055SDag-Erling Smørgrav break; 1004cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap 100573430055SDag-Erling Smørgrav case SYS_freebsd6_mmap: 1006cae1120aSPeter Wemm print_number(ip, narg, c); 1007cae1120aSPeter Wemm print_number(ip, narg, c); 100809307b25SDag-Erling Smørgrav putchar(','); 10099289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip); 101009307b25SDag-Erling Smørgrav putchar(','); 1011cae1120aSPeter Wemm ip++; 1012cae1120aSPeter Wemm narg--; 10139289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, *ip); 1014cae1120aSPeter Wemm ip++; 1015cae1120aSPeter Wemm narg--; 101673430055SDag-Erling Smørgrav break; 1017cae1120aSPeter Wemm #endif 101873430055SDag-Erling Smørgrav case SYS_mmap: 101998a68a58SAlexander Leidinger print_number(ip, narg, c); 102098a68a58SAlexander Leidinger print_number(ip, narg, c); 102109307b25SDag-Erling Smørgrav putchar(','); 10229289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip); 102309307b25SDag-Erling Smørgrav putchar(','); 102498a68a58SAlexander Leidinger ip++; 102598a68a58SAlexander Leidinger narg--; 10269289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, *ip); 102798a68a58SAlexander Leidinger ip++; 102898a68a58SAlexander Leidinger narg--; 102973430055SDag-Erling Smørgrav break; 103073430055SDag-Erling Smørgrav case SYS_mprotect: 103198a68a58SAlexander Leidinger print_number(ip, narg, c); 103298a68a58SAlexander Leidinger print_number(ip, narg, c); 103309307b25SDag-Erling Smørgrav putchar(','); 10349289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip); 103598a68a58SAlexander Leidinger ip++; 103698a68a58SAlexander Leidinger narg--; 103773430055SDag-Erling Smørgrav break; 103873430055SDag-Erling Smørgrav case SYS_madvise: 103998a68a58SAlexander Leidinger print_number(ip, narg, c); 104098a68a58SAlexander Leidinger print_number(ip, narg, c); 104109307b25SDag-Erling Smørgrav putchar(','); 10429289f547SJohn Baldwin print_integer_arg(sysdecode_madvice, *ip); 104398a68a58SAlexander Leidinger ip++; 104498a68a58SAlexander Leidinger narg--; 104573430055SDag-Erling Smørgrav break; 104639a3a438SJohn Baldwin case SYS_pathconf: 104739a3a438SJohn Baldwin case SYS_lpathconf: 104839a3a438SJohn Baldwin case SYS_fpathconf: 104939a3a438SJohn Baldwin print_number(ip, narg, c); 105039a3a438SJohn Baldwin putchar(','); 105139a3a438SJohn Baldwin print_integer_arg(sysdecode_pathconf_name, *ip); 105239a3a438SJohn Baldwin ip++; 105339a3a438SJohn Baldwin narg--; 105439a3a438SJohn Baldwin break; 10559483ab16SJohn Baldwin case SYS_getpriority: 105673430055SDag-Erling Smørgrav case SYS_setpriority: 10579483ab16SJohn Baldwin putchar('('); 10589289f547SJohn Baldwin print_integer_arg(sysdecode_prio_which, *ip); 10599483ab16SJohn Baldwin c = ','; 106098a68a58SAlexander Leidinger ip++; 106198a68a58SAlexander Leidinger narg--; 106273430055SDag-Erling Smørgrav break; 106373430055SDag-Erling Smørgrav case SYS_fcntl: 106498a68a58SAlexander Leidinger print_number(ip, narg, c); 106509307b25SDag-Erling Smørgrav putchar(','); 10669289f547SJohn Baldwin print_integer_arg(sysdecode_fcntl_cmd, ip[0]); 10679289f547SJohn Baldwin if (sysdecode_fcntl_arg_p(ip[0])) { 10689289f547SJohn Baldwin putchar(','); 10699289f547SJohn Baldwin if (ip[0] == F_SETFL) 10709289f547SJohn Baldwin print_mask_arg( 10719289f547SJohn Baldwin sysdecode_fcntl_fileflags, 10729289f547SJohn Baldwin ip[1]); 10739289f547SJohn Baldwin else 10749289f547SJohn Baldwin sysdecode_fcntl_arg(stdout, 10759289f547SJohn Baldwin ip[0], ip[1], 10769289f547SJohn Baldwin decimal ? 10 : 16); 10779289f547SJohn Baldwin } 107873430055SDag-Erling Smørgrav ip += 2; 107998a68a58SAlexander Leidinger narg -= 2; 108073430055SDag-Erling Smørgrav break; 108173430055SDag-Erling Smørgrav case SYS_socket: { 10828bc31d83SCraig Rodrigues int sockdomain; 108309307b25SDag-Erling Smørgrav putchar('('); 108495bb676aSDag-Erling Smørgrav sockdomain = *ip; 10859289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain, 10869289f547SJohn Baldwin sockdomain); 108798a68a58SAlexander Leidinger ip++; 108898a68a58SAlexander Leidinger narg--; 108909307b25SDag-Erling Smørgrav putchar(','); 10909289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, *ip); 109198a68a58SAlexander Leidinger ip++; 109298a68a58SAlexander Leidinger narg--; 10938bc31d83SCraig Rodrigues if (sockdomain == PF_INET || 10948bc31d83SCraig Rodrigues sockdomain == PF_INET6) { 109509307b25SDag-Erling Smørgrav putchar(','); 10969289f547SJohn Baldwin print_integer_arg(sysdecode_ipproto, 10979289f547SJohn Baldwin *ip); 10988bc31d83SCraig Rodrigues ip++; 10998bc31d83SCraig Rodrigues narg--; 11008bc31d83SCraig Rodrigues } 110198a68a58SAlexander Leidinger c = ','; 110273430055SDag-Erling Smørgrav break; 110373430055SDag-Erling Smørgrav } 110473430055SDag-Erling Smørgrav case SYS_setsockopt: 11059289f547SJohn Baldwin case SYS_getsockopt: { 11069289f547SJohn Baldwin const char *str; 11079289f547SJohn Baldwin 110898a68a58SAlexander Leidinger print_number(ip, narg, c); 110909307b25SDag-Erling Smørgrav putchar(','); 11109289f547SJohn Baldwin print_integer_arg_valid(sysdecode_sockopt_level, 11119289f547SJohn Baldwin *ip); 11129289f547SJohn Baldwin str = sysdecode_sockopt_name(ip[0], ip[1]); 11139289f547SJohn Baldwin if (str != NULL) { 11149289f547SJohn Baldwin printf(",%s", str); 111598a68a58SAlexander Leidinger ip++; 111698a68a58SAlexander Leidinger narg--; 11170460d351SJohn Baldwin } 111898a68a58SAlexander Leidinger ip++; 111998a68a58SAlexander Leidinger narg--; 112073430055SDag-Erling Smørgrav break; 11219289f547SJohn Baldwin } 1122cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek 112373430055SDag-Erling Smørgrav case SYS_freebsd6_lseek: 112498a68a58SAlexander Leidinger print_number(ip, narg, c); 112598a68a58SAlexander Leidinger /* Hidden 'pad' argument, not in lseek(2) */ 112698a68a58SAlexander Leidinger print_number(ip, narg, c); 112771ed318eSJohn Baldwin print_number64(first, ip, narg, c); 112809307b25SDag-Erling Smørgrav putchar(','); 11299289f547SJohn Baldwin print_integer_arg(sysdecode_whence, *ip); 113098a68a58SAlexander Leidinger ip++; 113198a68a58SAlexander Leidinger narg--; 113273430055SDag-Erling Smørgrav break; 1133cae1120aSPeter Wemm #endif 113473430055SDag-Erling Smørgrav case SYS_lseek: 1135cae1120aSPeter Wemm print_number(ip, narg, c); 113671ed318eSJohn Baldwin print_number64(first, ip, narg, c); 113709307b25SDag-Erling Smørgrav putchar(','); 11389289f547SJohn Baldwin print_integer_arg(sysdecode_whence, *ip); 1139cae1120aSPeter Wemm ip++; 1140cae1120aSPeter Wemm narg--; 114173430055SDag-Erling Smørgrav break; 114273430055SDag-Erling Smørgrav case SYS_flock: 114398a68a58SAlexander Leidinger print_number(ip, narg, c); 114409307b25SDag-Erling Smørgrav putchar(','); 11459289f547SJohn Baldwin print_mask_arg(sysdecode_flock_operation, *ip); 114698a68a58SAlexander Leidinger ip++; 114798a68a58SAlexander Leidinger narg--; 114873430055SDag-Erling Smørgrav break; 114973430055SDag-Erling Smørgrav case SYS_mkfifo: 11508447b7cdSJilles Tjoelker case SYS_mkfifoat: 115173430055SDag-Erling Smørgrav case SYS_mkdir: 11528447b7cdSJilles Tjoelker case SYS_mkdirat: 115398a68a58SAlexander Leidinger print_number(ip, narg, c); 115409307b25SDag-Erling Smørgrav putchar(','); 11559289f547SJohn Baldwin decode_filemode(*ip); 115698a68a58SAlexander Leidinger ip++; 115798a68a58SAlexander Leidinger narg--; 115873430055SDag-Erling Smørgrav break; 115973430055SDag-Erling Smørgrav case SYS_shutdown: 116098a68a58SAlexander Leidinger print_number(ip, narg, c); 116109307b25SDag-Erling Smørgrav putchar(','); 11629289f547SJohn Baldwin print_integer_arg(sysdecode_shutdown_how, *ip); 116398a68a58SAlexander Leidinger ip++; 116498a68a58SAlexander Leidinger narg--; 116573430055SDag-Erling Smørgrav break; 116673430055SDag-Erling Smørgrav case SYS_socketpair: 116709307b25SDag-Erling Smørgrav putchar('('); 11689289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain, *ip); 116998a68a58SAlexander Leidinger ip++; 117098a68a58SAlexander Leidinger narg--; 117109307b25SDag-Erling Smørgrav putchar(','); 11729289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, *ip); 117398a68a58SAlexander Leidinger ip++; 117498a68a58SAlexander Leidinger narg--; 117598a68a58SAlexander Leidinger c = ','; 117673430055SDag-Erling Smørgrav break; 117773430055SDag-Erling Smørgrav case SYS_getrlimit: 117873430055SDag-Erling Smørgrav case SYS_setrlimit: 117909307b25SDag-Erling Smørgrav putchar('('); 11809289f547SJohn Baldwin print_integer_arg(sysdecode_rlimit, *ip); 118198a68a58SAlexander Leidinger ip++; 118298a68a58SAlexander Leidinger narg--; 118398a68a58SAlexander Leidinger c = ','; 118473430055SDag-Erling Smørgrav break; 1185ee8aa41dSJohn Baldwin case SYS_getrusage: 1186ee8aa41dSJohn Baldwin putchar('('); 1187ee8aa41dSJohn Baldwin print_integer_arg(sysdecode_getrusage_who, *ip); 1188ee8aa41dSJohn Baldwin ip++; 1189ee8aa41dSJohn Baldwin narg--; 1190ee8aa41dSJohn Baldwin c = ','; 1191ee8aa41dSJohn Baldwin break; 119273430055SDag-Erling Smørgrav case SYS_quotactl: 119398a68a58SAlexander Leidinger print_number(ip, narg, c); 119409307b25SDag-Erling Smørgrav putchar(','); 11959289f547SJohn Baldwin if (!sysdecode_quotactl_cmd(stdout, *ip)) { 11969289f547SJohn Baldwin if (decimal) 11979289f547SJohn Baldwin printf("<invalid=%d>", (int)*ip); 11989289f547SJohn Baldwin else 11999289f547SJohn Baldwin printf("<invalid=%#x>", 12009289f547SJohn Baldwin (int)*ip); 12019289f547SJohn Baldwin } 120298a68a58SAlexander Leidinger ip++; 120398a68a58SAlexander Leidinger narg--; 120498a68a58SAlexander Leidinger c = ','; 120573430055SDag-Erling Smørgrav break; 120673430055SDag-Erling Smørgrav case SYS_nfssvc: 120709307b25SDag-Erling Smørgrav putchar('('); 12089289f547SJohn Baldwin print_integer_arg(sysdecode_nfssvc_flags, *ip); 120998a68a58SAlexander Leidinger ip++; 121098a68a58SAlexander Leidinger narg--; 121198a68a58SAlexander Leidinger c = ','; 121273430055SDag-Erling Smørgrav break; 121373430055SDag-Erling Smørgrav case SYS_rtprio: 121466ba8943SJohn Baldwin case SYS_rtprio_thread: 121509307b25SDag-Erling Smørgrav putchar('('); 12169289f547SJohn Baldwin print_integer_arg(sysdecode_rtprio_function, 12179289f547SJohn Baldwin *ip); 121898a68a58SAlexander Leidinger ip++; 121998a68a58SAlexander Leidinger narg--; 122098a68a58SAlexander Leidinger c = ','; 122173430055SDag-Erling Smørgrav break; 122273430055SDag-Erling Smørgrav case SYS___semctl: 122398a68a58SAlexander Leidinger print_number(ip, narg, c); 122498a68a58SAlexander Leidinger print_number(ip, narg, c); 122509307b25SDag-Erling Smørgrav putchar(','); 12269289f547SJohn Baldwin print_integer_arg(sysdecode_semctl_cmd, *ip); 122798a68a58SAlexander Leidinger ip++; 122898a68a58SAlexander Leidinger narg--; 122973430055SDag-Erling Smørgrav break; 123073430055SDag-Erling Smørgrav case SYS_semget: 123198a68a58SAlexander Leidinger print_number(ip, narg, c); 123298a68a58SAlexander Leidinger print_number(ip, narg, c); 123309307b25SDag-Erling Smørgrav putchar(','); 12349289f547SJohn Baldwin print_mask_arg(sysdecode_semget_flags, *ip); 123598a68a58SAlexander Leidinger ip++; 123698a68a58SAlexander Leidinger narg--; 123773430055SDag-Erling Smørgrav break; 123873430055SDag-Erling Smørgrav case SYS_msgctl: 123998a68a58SAlexander Leidinger print_number(ip, narg, c); 124009307b25SDag-Erling Smørgrav putchar(','); 12419289f547SJohn Baldwin print_integer_arg(sysdecode_msgctl_cmd, *ip); 124298a68a58SAlexander Leidinger ip++; 124398a68a58SAlexander Leidinger narg--; 124473430055SDag-Erling Smørgrav break; 124573430055SDag-Erling Smørgrav case SYS_shmat: 124698a68a58SAlexander Leidinger print_number(ip, narg, c); 124798a68a58SAlexander Leidinger print_number(ip, narg, c); 124809307b25SDag-Erling Smørgrav putchar(','); 12499289f547SJohn Baldwin print_mask_arg(sysdecode_shmat_flags, *ip); 125098a68a58SAlexander Leidinger ip++; 125198a68a58SAlexander Leidinger narg--; 125273430055SDag-Erling Smørgrav break; 125373430055SDag-Erling Smørgrav case SYS_shmctl: 125498a68a58SAlexander Leidinger print_number(ip, narg, c); 125509307b25SDag-Erling Smørgrav putchar(','); 12569289f547SJohn Baldwin print_integer_arg(sysdecode_shmctl_cmd, *ip); 125798a68a58SAlexander Leidinger ip++; 125898a68a58SAlexander Leidinger narg--; 125973430055SDag-Erling Smørgrav break; 1260777d35f4SRui Paulo case SYS_shm_open: 1261777d35f4SRui Paulo print_number(ip, narg, c); 1262777d35f4SRui Paulo putchar(','); 12639289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, ip[0]); 12649289f547SJohn Baldwin putchar(','); 12659289f547SJohn Baldwin decode_filemode(ip[1]); 12669289f547SJohn Baldwin ip += 2; 12679289f547SJohn Baldwin narg -= 2; 1268777d35f4SRui Paulo break; 126973430055SDag-Erling Smørgrav case SYS_minherit: 127098a68a58SAlexander Leidinger print_number(ip, narg, c); 127198a68a58SAlexander Leidinger print_number(ip, narg, c); 127209307b25SDag-Erling Smørgrav putchar(','); 12739289f547SJohn Baldwin print_integer_arg(sysdecode_minherit_inherit, 12749289f547SJohn Baldwin *ip); 127598a68a58SAlexander Leidinger ip++; 127698a68a58SAlexander Leidinger narg--; 127773430055SDag-Erling Smørgrav break; 127873430055SDag-Erling Smørgrav case SYS_rfork: 127909307b25SDag-Erling Smørgrav putchar('('); 12809289f547SJohn Baldwin print_mask_arg(sysdecode_rfork_flags, *ip); 128198a68a58SAlexander Leidinger ip++; 128298a68a58SAlexander Leidinger narg--; 128398a68a58SAlexander Leidinger c = ','; 128473430055SDag-Erling Smørgrav break; 128573430055SDag-Erling Smørgrav case SYS_lio_listio: 128609307b25SDag-Erling Smørgrav putchar('('); 12879289f547SJohn Baldwin print_integer_arg(sysdecode_lio_listio_mode, 12889289f547SJohn Baldwin *ip); 128998a68a58SAlexander Leidinger ip++; 129098a68a58SAlexander Leidinger narg--; 129198a68a58SAlexander Leidinger c = ','; 129273430055SDag-Erling Smørgrav break; 129373430055SDag-Erling Smørgrav case SYS_mlockall: 129409307b25SDag-Erling Smørgrav putchar('('); 12959289f547SJohn Baldwin print_mask_arg(sysdecode_mlockall_flags, *ip); 129698a68a58SAlexander Leidinger ip++; 129798a68a58SAlexander Leidinger narg--; 129873430055SDag-Erling Smørgrav break; 129973430055SDag-Erling Smørgrav case SYS_sched_setscheduler: 130098a68a58SAlexander Leidinger print_number(ip, narg, c); 130109307b25SDag-Erling Smørgrav putchar(','); 13029289f547SJohn Baldwin print_integer_arg(sysdecode_scheduler_policy, 13039289f547SJohn Baldwin *ip); 130498a68a58SAlexander Leidinger ip++; 130598a68a58SAlexander Leidinger narg--; 130673430055SDag-Erling Smørgrav break; 130773430055SDag-Erling Smørgrav case SYS_sched_get_priority_max: 130873430055SDag-Erling Smørgrav case SYS_sched_get_priority_min: 130909307b25SDag-Erling Smørgrav putchar('('); 13109289f547SJohn Baldwin print_integer_arg(sysdecode_scheduler_policy, 13119289f547SJohn Baldwin *ip); 131298a68a58SAlexander Leidinger ip++; 131398a68a58SAlexander Leidinger narg--; 131473430055SDag-Erling Smørgrav break; 131573430055SDag-Erling Smørgrav case SYS_sendfile: 131698a68a58SAlexander Leidinger print_number(ip, narg, c); 131798a68a58SAlexander Leidinger print_number(ip, narg, c); 131898a68a58SAlexander Leidinger print_number(ip, narg, c); 131998a68a58SAlexander Leidinger print_number(ip, narg, c); 132098a68a58SAlexander Leidinger print_number(ip, narg, c); 132198a68a58SAlexander Leidinger print_number(ip, narg, c); 132209307b25SDag-Erling Smørgrav putchar(','); 13239289f547SJohn Baldwin print_mask_arg(sysdecode_sendfile_flags, *ip); 132498a68a58SAlexander Leidinger ip++; 132598a68a58SAlexander Leidinger narg--; 132673430055SDag-Erling Smørgrav break; 132773430055SDag-Erling Smørgrav case SYS_kldsym: 132898a68a58SAlexander Leidinger print_number(ip, narg, c); 132909307b25SDag-Erling Smørgrav putchar(','); 13309289f547SJohn Baldwin print_integer_arg(sysdecode_kldsym_cmd, *ip); 133198a68a58SAlexander Leidinger ip++; 133298a68a58SAlexander Leidinger narg--; 133373430055SDag-Erling Smørgrav break; 133473430055SDag-Erling Smørgrav case SYS_sigprocmask: 133509307b25SDag-Erling Smørgrav putchar('('); 13369289f547SJohn Baldwin print_integer_arg(sysdecode_sigprocmask_how, 13379289f547SJohn Baldwin *ip); 133898a68a58SAlexander Leidinger ip++; 133998a68a58SAlexander Leidinger narg--; 134098a68a58SAlexander Leidinger c = ','; 134173430055SDag-Erling Smørgrav break; 134273430055SDag-Erling Smørgrav case SYS___acl_get_file: 134373430055SDag-Erling Smørgrav case SYS___acl_set_file: 134473430055SDag-Erling Smørgrav case SYS___acl_get_fd: 134573430055SDag-Erling Smørgrav case SYS___acl_set_fd: 134673430055SDag-Erling Smørgrav case SYS___acl_delete_file: 134773430055SDag-Erling Smørgrav case SYS___acl_delete_fd: 134873430055SDag-Erling Smørgrav case SYS___acl_aclcheck_file: 134973430055SDag-Erling Smørgrav case SYS___acl_aclcheck_fd: 135073430055SDag-Erling Smørgrav case SYS___acl_get_link: 135173430055SDag-Erling Smørgrav case SYS___acl_set_link: 135273430055SDag-Erling Smørgrav case SYS___acl_delete_link: 135373430055SDag-Erling Smørgrav case SYS___acl_aclcheck_link: 135498a68a58SAlexander Leidinger print_number(ip, narg, c); 135509307b25SDag-Erling Smørgrav putchar(','); 13569289f547SJohn Baldwin print_integer_arg(sysdecode_acltype, *ip); 135798a68a58SAlexander Leidinger ip++; 135898a68a58SAlexander Leidinger narg--; 135973430055SDag-Erling Smørgrav break; 136073430055SDag-Erling Smørgrav case SYS_sigaction: 136109307b25SDag-Erling Smørgrav putchar('('); 13629289f547SJohn Baldwin print_signal(*ip); 136398a68a58SAlexander Leidinger ip++; 136498a68a58SAlexander Leidinger narg--; 136598a68a58SAlexander Leidinger c = ','; 136673430055SDag-Erling Smørgrav break; 136773430055SDag-Erling Smørgrav case SYS_extattrctl: 136898a68a58SAlexander Leidinger print_number(ip, narg, c); 136909307b25SDag-Erling Smørgrav putchar(','); 13709289f547SJohn Baldwin print_integer_arg(sysdecode_extattrnamespace, 13719289f547SJohn Baldwin *ip); 137298a68a58SAlexander Leidinger ip++; 137398a68a58SAlexander Leidinger narg--; 137473430055SDag-Erling Smørgrav break; 137573430055SDag-Erling Smørgrav case SYS_nmount: 137698a68a58SAlexander Leidinger print_number(ip, narg, c); 137798a68a58SAlexander Leidinger print_number(ip, narg, c); 137809307b25SDag-Erling Smørgrav putchar(','); 13799289f547SJohn Baldwin print_mask_arg(sysdecode_mount_flags, *ip); 138098a68a58SAlexander Leidinger ip++; 138198a68a58SAlexander Leidinger narg--; 138273430055SDag-Erling Smørgrav break; 138373430055SDag-Erling Smørgrav case SYS_thr_create: 138498a68a58SAlexander Leidinger print_number(ip, narg, c); 138598a68a58SAlexander Leidinger print_number(ip, narg, c); 138609307b25SDag-Erling Smørgrav putchar(','); 13879289f547SJohn Baldwin print_mask_arg(sysdecode_thr_create_flags, *ip); 138898a68a58SAlexander Leidinger ip++; 138998a68a58SAlexander Leidinger narg--; 139073430055SDag-Erling Smørgrav break; 139173430055SDag-Erling Smørgrav case SYS_thr_kill: 139298a68a58SAlexander Leidinger print_number(ip, narg, c); 139309307b25SDag-Erling Smørgrav putchar(','); 13949289f547SJohn Baldwin print_signal(*ip); 139598a68a58SAlexander Leidinger ip++; 139698a68a58SAlexander Leidinger narg--; 139773430055SDag-Erling Smørgrav break; 139873430055SDag-Erling Smørgrav case SYS_kldunloadf: 139998a68a58SAlexander Leidinger print_number(ip, narg, c); 140009307b25SDag-Erling Smørgrav putchar(','); 14019289f547SJohn Baldwin print_integer_arg(sysdecode_kldunload_flags, 14029289f547SJohn Baldwin *ip); 140398a68a58SAlexander Leidinger ip++; 140498a68a58SAlexander Leidinger narg--; 140573430055SDag-Erling Smørgrav break; 14068447b7cdSJilles Tjoelker case SYS_linkat: 14078447b7cdSJilles Tjoelker case SYS_renameat: 14088447b7cdSJilles Tjoelker case SYS_symlinkat: 14098447b7cdSJilles Tjoelker print_number(ip, narg, c); 14108447b7cdSJilles Tjoelker putchar(','); 14119289f547SJohn Baldwin print_integer_arg_valid(sysdecode_atfd, *ip); 14128447b7cdSJilles Tjoelker ip++; 14138447b7cdSJilles Tjoelker narg--; 141439a3a438SJohn Baldwin print_number(ip, narg, c); 14158447b7cdSJilles Tjoelker break; 14162609222aSPawel Jakub Dawidek case SYS_cap_fcntls_limit: 14172609222aSPawel Jakub Dawidek print_number(ip, narg, c); 14182609222aSPawel Jakub Dawidek putchar(','); 14192609222aSPawel Jakub Dawidek arg = *ip; 14202609222aSPawel Jakub Dawidek ip++; 14212609222aSPawel Jakub Dawidek narg--; 14229289f547SJohn Baldwin print_mask_arg32(sysdecode_cap_fcntlrights, arg); 14232609222aSPawel Jakub Dawidek break; 1424145e6aa9SJohn Baldwin case SYS_posix_fadvise: 1425145e6aa9SJohn Baldwin print_number(ip, narg, c); 1426145e6aa9SJohn Baldwin print_number(ip, narg, c); 1427145e6aa9SJohn Baldwin print_number(ip, narg, c); 1428145e6aa9SJohn Baldwin (void)putchar(','); 14299289f547SJohn Baldwin print_integer_arg(sysdecode_fadvice, *ip); 1430145e6aa9SJohn Baldwin ip++; 1431145e6aa9SJohn Baldwin narg--; 1432145e6aa9SJohn Baldwin break; 143355648840SJohn Baldwin case SYS_procctl: 143455648840SJohn Baldwin putchar('('); 14359289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, *ip); 143655648840SJohn Baldwin c = ','; 143755648840SJohn Baldwin ip++; 143855648840SJohn Baldwin narg--; 143971ed318eSJohn Baldwin print_number64(first, ip, narg, c); 144055648840SJohn Baldwin putchar(','); 14419289f547SJohn Baldwin print_integer_arg(sysdecode_procctl_cmd, *ip); 144255648840SJohn Baldwin ip++; 144355648840SJohn Baldwin narg--; 144455648840SJohn Baldwin break; 1445fdb5bf37SJohn Baldwin case SYS__umtx_op: 1446fdb5bf37SJohn Baldwin print_number(ip, narg, c); 1447fdb5bf37SJohn Baldwin putchar(','); 14489289f547SJohn Baldwin print_integer_arg(sysdecode_umtx_op, *ip); 1449fdb5bf37SJohn Baldwin switch (*ip) { 1450fdb5bf37SJohn Baldwin case UMTX_OP_CV_WAIT: 1451fdb5bf37SJohn Baldwin ip++; 1452fdb5bf37SJohn Baldwin narg--; 1453fdb5bf37SJohn Baldwin putchar(','); 14549289f547SJohn Baldwin print_mask_argul( 14559289f547SJohn Baldwin sysdecode_umtx_cvwait_flags, *ip); 1456fdb5bf37SJohn Baldwin break; 1457fdb5bf37SJohn Baldwin case UMTX_OP_RW_RDLOCK: 1458fdb5bf37SJohn Baldwin ip++; 1459fdb5bf37SJohn Baldwin narg--; 1460fdb5bf37SJohn Baldwin putchar(','); 14619289f547SJohn Baldwin print_mask_argul( 14629289f547SJohn Baldwin sysdecode_umtx_rwlock_flags, *ip); 1463fdb5bf37SJohn Baldwin break; 1464fdb5bf37SJohn Baldwin } 1465fdb5bf37SJohn Baldwin ip++; 1466fdb5bf37SJohn Baldwin narg--; 14678dec6942SJohn Baldwin break; 14688dec6942SJohn Baldwin case SYS_ftruncate: 14698dec6942SJohn Baldwin case SYS_truncate: 14708dec6942SJohn Baldwin print_number(ip, narg, c); 14718dec6942SJohn Baldwin print_number64(first, ip, narg, c); 14728dec6942SJohn Baldwin break; 147339a3a438SJohn Baldwin case SYS_fchownat: 147439a3a438SJohn Baldwin print_number(ip, narg, c); 147539a3a438SJohn Baldwin print_number(ip, narg, c); 147639a3a438SJohn Baldwin print_number(ip, narg, c); 147739a3a438SJohn Baldwin break; 147839a3a438SJohn Baldwin case SYS_fstatat: 147939a3a438SJohn Baldwin case SYS_utimensat: 148039a3a438SJohn Baldwin print_number(ip, narg, c); 148139a3a438SJohn Baldwin print_number(ip, narg, c); 148239a3a438SJohn Baldwin break; 148339a3a438SJohn Baldwin case SYS_unlinkat: 148439a3a438SJohn Baldwin print_number(ip, narg, c); 148539a3a438SJohn Baldwin break; 148639a3a438SJohn Baldwin case SYS_sysarch: 148739a3a438SJohn Baldwin putchar('('); 148839a3a438SJohn Baldwin print_integer_arg(sysdecode_sysarch_number, *ip); 148939a3a438SJohn Baldwin ip++; 149039a3a438SJohn Baldwin narg--; 149139a3a438SJohn Baldwin c = ','; 149239a3a438SJohn Baldwin break; 149339a3a438SJohn Baldwin } 149439a3a438SJohn Baldwin switch (ktr->ktr_code) { 149539a3a438SJohn Baldwin case SYS_chflagsat: 149639a3a438SJohn Baldwin case SYS_fchownat: 149739a3a438SJohn Baldwin case SYS_faccessat: 149839a3a438SJohn Baldwin case SYS_fchmodat: 149939a3a438SJohn Baldwin case SYS_fstatat: 150039a3a438SJohn Baldwin case SYS_linkat: 150139a3a438SJohn Baldwin case SYS_unlinkat: 150239a3a438SJohn Baldwin case SYS_utimensat: 150339a3a438SJohn Baldwin putchar(','); 150439a3a438SJohn Baldwin print_mask_arg0(sysdecode_atflags, *ip); 150539a3a438SJohn Baldwin ip++; 150639a3a438SJohn Baldwin narg--; 150739a3a438SJohn Baldwin break; 15089b50d902SRodney W. Grimes } 15099b50d902SRodney W. Grimes } 151048f6dd8aSAttilio Rao while (narg > 0) { 151198a68a58SAlexander Leidinger print_number(ip, narg, c); 15129b50d902SRodney W. Grimes } 151309307b25SDag-Erling Smørgrav putchar(')'); 15149b50d902SRodney W. Grimes } 151509307b25SDag-Erling Smørgrav putchar('\n'); 15169b50d902SRodney W. Grimes } 15179b50d902SRodney W. Grimes 151891fbb9c1SDavid Malone void 1519a5f14abfSJohn Baldwin ktrsysret(struct ktr_sysret *ktr, u_int sv_flags) 15209b50d902SRodney W. Grimes { 152191fbb9c1SDavid Malone register_t ret = ktr->ktr_retval; 152291fbb9c1SDavid Malone int error = ktr->ktr_error; 15239b50d902SRodney W. Grimes 1524a5f14abfSJohn Baldwin syscallname(ktr->ktr_code, sv_flags); 1525b9034ce2SBryan Drewery printf(" "); 15269b50d902SRodney W. Grimes 15279b50d902SRodney W. Grimes if (error == 0) { 15289b50d902SRodney W. Grimes if (fancy) { 152909307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 15309b50d902SRodney W. Grimes if (ret < 0 || ret > 9) 153109307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 15329b50d902SRodney W. Grimes } else { 15339b50d902SRodney W. Grimes if (decimal) 153409307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 15359b50d902SRodney W. Grimes else 153609307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 15379b50d902SRodney W. Grimes } 15389b50d902SRodney W. Grimes } else if (error == ERESTART) 153909307b25SDag-Erling Smørgrav printf("RESTART"); 15409b50d902SRodney W. Grimes else if (error == EJUSTRETURN) 154109307b25SDag-Erling Smørgrav printf("JUSTRETURN"); 15429b50d902SRodney W. Grimes else { 1543287b96ddSJohn Baldwin printf("-1 errno %d", sysdecode_freebsd_to_abi_errno( 1544287b96ddSJohn Baldwin syscallabi(sv_flags), error)); 15459b50d902SRodney W. Grimes if (fancy) 154609307b25SDag-Erling Smørgrav printf(" %s", strerror(ktr->ktr_error)); 15479b50d902SRodney W. Grimes } 154809307b25SDag-Erling Smørgrav putchar('\n'); 15499b50d902SRodney W. Grimes } 15509b50d902SRodney W. Grimes 155191fbb9c1SDavid Malone void 155291fbb9c1SDavid Malone ktrnamei(char *cp, int len) 15539b50d902SRodney W. Grimes { 155409307b25SDag-Erling Smørgrav printf("\"%.*s\"\n", len, cp); 15559b50d902SRodney W. Grimes } 15569b50d902SRodney W. Grimes 155791fbb9c1SDavid Malone void 1558ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth) 15599b50d902SRodney W. Grimes { 1560ec4beb5dSPeter Wemm int n, i; 1561ec4beb5dSPeter Wemm int width; 1562ec4beb5dSPeter Wemm 1563ec4beb5dSPeter Wemm width = 0; 1564ec4beb5dSPeter Wemm do { 1565ec4beb5dSPeter Wemm width += 2; 1566ec4beb5dSPeter Wemm i = 13; /* base offset */ 1567ec4beb5dSPeter Wemm i += (width / 2) + 1; /* spaces every second byte */ 1568ec4beb5dSPeter Wemm i += (width * 2); /* width of bytes */ 1569ec4beb5dSPeter Wemm i += 3; /* " |" */ 1570ec4beb5dSPeter Wemm i += width; /* each byte */ 1571ec4beb5dSPeter Wemm i += 1; /* "|" */ 1572ec4beb5dSPeter Wemm } while (i < screenwidth); 1573ec4beb5dSPeter Wemm width -= 2; 1574ec4beb5dSPeter Wemm 1575ec4beb5dSPeter Wemm for (n = 0; n < len; n += width) { 1576ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1577ec4beb5dSPeter Wemm if ((i % width) == 0) { /* beginning of line */ 1578ec4beb5dSPeter Wemm printf(" 0x%04x", i); 1579ec4beb5dSPeter Wemm } 1580ec4beb5dSPeter Wemm if ((i % 2) == 0) { 1581ec4beb5dSPeter Wemm printf(" "); 1582ec4beb5dSPeter Wemm } 1583ec4beb5dSPeter Wemm if (i < len) 1584ec4beb5dSPeter Wemm printf("%02x", p[i] & 0xff); 1585ec4beb5dSPeter Wemm else 1586ec4beb5dSPeter Wemm printf(" "); 1587ec4beb5dSPeter Wemm } 1588ec4beb5dSPeter Wemm printf(" |"); 1589ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1590ec4beb5dSPeter Wemm if (i >= len) 1591ec4beb5dSPeter Wemm break; 1592ec4beb5dSPeter Wemm if (p[i] >= ' ' && p[i] <= '~') 1593ec4beb5dSPeter Wemm printf("%c", p[i]); 1594ec4beb5dSPeter Wemm else 1595ec4beb5dSPeter Wemm printf("."); 1596ec4beb5dSPeter Wemm } 1597ec4beb5dSPeter Wemm printf("|\n"); 1598ec4beb5dSPeter Wemm } 1599ec4beb5dSPeter Wemm if ((i % width) != 0) 1600ec4beb5dSPeter Wemm printf("\n"); 1601ec4beb5dSPeter Wemm } 1602ec4beb5dSPeter Wemm 1603ec4beb5dSPeter Wemm void 1604ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth) 1605ec4beb5dSPeter Wemm { 160691fbb9c1SDavid Malone int col = 0; 1607ec4beb5dSPeter Wemm char *cp; 160891fbb9c1SDavid Malone int width; 16099b50d902SRodney W. Grimes char visbuf[5]; 16109b50d902SRodney W. Grimes 161109307b25SDag-Erling Smørgrav printf(" \""); 16129b50d902SRodney W. Grimes col = 8; 16139b50d902SRodney W. Grimes for (;datalen > 0; datalen--, dp++) { 161409307b25SDag-Erling Smørgrav vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 16159b50d902SRodney W. Grimes cp = visbuf; 16169b50d902SRodney W. Grimes /* 16179b50d902SRodney W. Grimes * Keep track of printables and 16189b50d902SRodney W. Grimes * space chars (like fold(1)). 16199b50d902SRodney W. Grimes */ 16209b50d902SRodney W. Grimes if (col == 0) { 162109307b25SDag-Erling Smørgrav putchar('\t'); 16229b50d902SRodney W. Grimes col = 8; 16239b50d902SRodney W. Grimes } 16249b50d902SRodney W. Grimes switch(*cp) { 16259b50d902SRodney W. Grimes case '\n': 16269b50d902SRodney W. Grimes col = 0; 162709307b25SDag-Erling Smørgrav putchar('\n'); 16289b50d902SRodney W. Grimes continue; 16299b50d902SRodney W. Grimes case '\t': 16309b50d902SRodney W. Grimes width = 8 - (col&07); 16319b50d902SRodney W. Grimes break; 16329b50d902SRodney W. Grimes default: 16339b50d902SRodney W. Grimes width = strlen(cp); 16349b50d902SRodney W. Grimes } 16359b50d902SRodney W. Grimes if (col + width > (screenwidth-2)) { 163609307b25SDag-Erling Smørgrav printf("\\\n\t"); 16379b50d902SRodney W. Grimes col = 8; 16389b50d902SRodney W. Grimes } 16399b50d902SRodney W. Grimes col += width; 16409b50d902SRodney W. Grimes do { 164109307b25SDag-Erling Smørgrav putchar(*cp++); 16429b50d902SRodney W. Grimes } while (*cp); 16439b50d902SRodney W. Grimes } 16449b50d902SRodney W. Grimes if (col == 0) 164509307b25SDag-Erling Smørgrav printf(" "); 164609307b25SDag-Erling Smørgrav printf("\"\n"); 16479b50d902SRodney W. Grimes } 16489b50d902SRodney W. Grimes 1649ec4beb5dSPeter Wemm void 1650ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len) 1651ec4beb5dSPeter Wemm { 1652ec4beb5dSPeter Wemm int datalen = len - sizeof (struct ktr_genio); 1653ec4beb5dSPeter Wemm char *dp = (char *)ktr + sizeof (struct ktr_genio); 1654ec4beb5dSPeter Wemm static int screenwidth = 0; 1655ec4beb5dSPeter Wemm int i, binary; 1656ec4beb5dSPeter Wemm 16574b0ae512SPawel Jakub Dawidek printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 16584b0ae512SPawel Jakub Dawidek ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 16594b0ae512SPawel Jakub Dawidek datalen == 1 ? "" : "s"); 16604b0ae512SPawel Jakub Dawidek if (suppressdata) 16614b0ae512SPawel Jakub Dawidek return; 1662ec4beb5dSPeter Wemm if (screenwidth == 0) { 1663ec4beb5dSPeter Wemm struct winsize ws; 1664ec4beb5dSPeter Wemm 1665ec4beb5dSPeter Wemm if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 1666ec4beb5dSPeter Wemm ws.ws_col > 8) 1667ec4beb5dSPeter Wemm screenwidth = ws.ws_col; 1668ec4beb5dSPeter Wemm else 1669ec4beb5dSPeter Wemm screenwidth = 80; 1670ec4beb5dSPeter Wemm } 1671ec4beb5dSPeter Wemm if (maxdata && datalen > maxdata) 1672ec4beb5dSPeter Wemm datalen = maxdata; 1673ec4beb5dSPeter Wemm 1674ec4beb5dSPeter Wemm for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 1675ec4beb5dSPeter Wemm if (dp[i] >= 32 && dp[i] < 127) 1676ec4beb5dSPeter Wemm continue; 1677ec4beb5dSPeter Wemm if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 1678ec4beb5dSPeter Wemm continue; 1679ec4beb5dSPeter Wemm binary = 1; 1680ec4beb5dSPeter Wemm } 1681ec4beb5dSPeter Wemm if (binary) 1682ec4beb5dSPeter Wemm hexdump(dp, datalen, screenwidth); 1683ec4beb5dSPeter Wemm else 1684ec4beb5dSPeter Wemm visdump(dp, datalen, screenwidth); 1685ec4beb5dSPeter Wemm } 1686ec4beb5dSPeter Wemm 168791fbb9c1SDavid Malone void 1688dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig) 16899b50d902SRodney W. Grimes { 16909289f547SJohn Baldwin const char *str; 16919289f547SJohn Baldwin 16929289f547SJohn Baldwin print_signal(psig->signo); 16935677eef9SJilles Tjoelker if (psig->action == SIG_DFL) { 16949289f547SJohn Baldwin printf(" SIG_DFL"); 16955677eef9SJilles Tjoelker } else { 16969289f547SJohn Baldwin printf(" caught handler=0x%lx mask=0x%x", 16975677eef9SJilles Tjoelker (u_long)psig->action, psig->mask.__bits[0]); 169891fbb9c1SDavid Malone } 16999289f547SJohn Baldwin printf(" code="); 17009289f547SJohn Baldwin str = sysdecode_sigcode(psig->signo, psig->code); 17019289f547SJohn Baldwin if (str != NULL) 17029289f547SJohn Baldwin printf("%s", str); 17039289f547SJohn Baldwin else 17049289f547SJohn Baldwin printf("<invalid=%#x>", psig->code); 17059289f547SJohn Baldwin putchar('\n'); 17069b50d902SRodney W. Grimes } 17079b50d902SRodney W. Grimes 170891fbb9c1SDavid Malone void 170988bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs) 17109b50d902SRodney W. Grimes { 171109307b25SDag-Erling Smørgrav printf("%s %s\n", cs->out ? "stop" : "resume", 17129b50d902SRodney W. Grimes cs->user ? "user" : "kernel"); 17139b50d902SRodney W. Grimes } 17149b50d902SRodney W. Grimes 171588bf5036SJohn Baldwin void 171688bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs) 171788bf5036SJohn Baldwin { 171888bf5036SJohn Baldwin printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume", 171988bf5036SJohn Baldwin cs->user ? "user" : "kernel", cs->wmesg); 172088bf5036SJohn Baldwin } 172188bf5036SJohn Baldwin 172291fbb9c1SDavid Malone void 1723bb1a2d4aSJohn Baldwin ktruser(int len, void *p) 172482e2dd32SPoul-Henning Kamp { 1725bb1a2d4aSJohn Baldwin unsigned char *cp; 1726670b9e9fSJohn Baldwin 1727d6fb4894SJohn Baldwin if (sysdecode_utrace(stdout, p, len)) { 1728195aef99SBryan Drewery printf("\n"); 1729670b9e9fSJohn Baldwin return; 1730670b9e9fSJohn Baldwin } 1731670b9e9fSJohn Baldwin 173209307b25SDag-Erling Smørgrav printf("%d ", len); 1733bb1a2d4aSJohn Baldwin cp = p; 17343f8ba9aeSPoul-Henning Kamp while (len--) 1735743f9174SPoul-Henning Kamp if (decimal) 1736bb1a2d4aSJohn Baldwin printf(" %d", *cp++); 1737743f9174SPoul-Henning Kamp else 1738bb1a2d4aSJohn Baldwin printf(" %02x", *cp++); 173909307b25SDag-Erling Smørgrav printf("\n"); 174082e2dd32SPoul-Henning Kamp } 174182e2dd32SPoul-Henning Kamp 174291fbb9c1SDavid Malone void 17437008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp) 17447008be5bSPawel Jakub Dawidek { 17457008be5bSPawel Jakub Dawidek 17467008be5bSPawel Jakub Dawidek printf("cap_rights_t "); 17479289f547SJohn Baldwin sysdecode_cap_rights(stdout, rightsp); 17487008be5bSPawel Jakub Dawidek printf("\n"); 17497008be5bSPawel Jakub Dawidek } 17507008be5bSPawel Jakub Dawidek 1751de56aee0SKonstantin Belousov static void 1752de56aee0SKonstantin Belousov ktrtimeval(struct timeval *tv) 1753de56aee0SKonstantin Belousov { 1754de56aee0SKonstantin Belousov 1755de56aee0SKonstantin Belousov printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec); 1756de56aee0SKonstantin Belousov } 1757de56aee0SKonstantin Belousov 1758de56aee0SKonstantin Belousov void 1759de56aee0SKonstantin Belousov ktritimerval(struct itimerval *it) 1760de56aee0SKonstantin Belousov { 1761de56aee0SKonstantin Belousov 1762de56aee0SKonstantin Belousov printf("itimerval { .interval = "); 1763de56aee0SKonstantin Belousov ktrtimeval(&it->it_interval); 1764de56aee0SKonstantin Belousov printf(", .value = "); 1765de56aee0SKonstantin Belousov ktrtimeval(&it->it_value); 1766de56aee0SKonstantin Belousov printf(" }\n"); 1767de56aee0SKonstantin Belousov } 1768de56aee0SKonstantin Belousov 17697008be5bSPawel Jakub Dawidek void 177060e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa) 177160e15db9SDag-Erling Smørgrav { 177260e15db9SDag-Erling Smørgrav /* 177360e15db9SDag-Erling Smørgrav TODO: Support additional address families 1774237abf0cSDavide Italiano #include <netsmb/netbios.h> 1775237abf0cSDavide Italiano struct sockaddr_nb *nb; 177660e15db9SDag-Erling Smørgrav */ 17779289f547SJohn Baldwin const char *str; 177860e15db9SDag-Erling Smørgrav char addr[64]; 177960e15db9SDag-Erling Smørgrav 178060e15db9SDag-Erling Smørgrav /* 178160e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that sa points to a 178260e15db9SDag-Erling Smørgrav * buffer at least sizeof(struct sockaddr) bytes long and exactly 178360e15db9SDag-Erling Smørgrav * sa->sa_len bytes long. 178460e15db9SDag-Erling Smørgrav */ 178560e15db9SDag-Erling Smørgrav printf("struct sockaddr { "); 17869289f547SJohn Baldwin str = sysdecode_sockaddr_family(sa->sa_family); 17879289f547SJohn Baldwin if (str != NULL) 17889289f547SJohn Baldwin printf("%s", str); 17899289f547SJohn Baldwin else 17909289f547SJohn Baldwin printf("<invalid=%d>", sa->sa_family); 179160e15db9SDag-Erling Smørgrav printf(", "); 179260e15db9SDag-Erling Smørgrav 179360e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n) \ 179481a31394SDag-Erling Smørgrav if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) { \ 179560e15db9SDag-Erling Smørgrav printf("invalid"); \ 179660e15db9SDag-Erling Smørgrav break; \ 179760e15db9SDag-Erling Smørgrav } 179860e15db9SDag-Erling Smørgrav 179960e15db9SDag-Erling Smørgrav switch(sa->sa_family) { 180060e15db9SDag-Erling Smørgrav case AF_INET: { 180181a31394SDag-Erling Smørgrav struct sockaddr_in sa_in; 180260e15db9SDag-Erling Smørgrav 180381a31394SDag-Erling Smørgrav memset(&sa_in, 0, sizeof(sa_in)); 1804449df4ecSAndrey Zonov memcpy(&sa_in, sa, sa->sa_len); 180560e15db9SDag-Erling Smørgrav check_sockaddr_len(in); 180681a31394SDag-Erling Smørgrav inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr); 180781a31394SDag-Erling Smørgrav printf("%s:%u", addr, ntohs(sa_in.sin_port)); 180860e15db9SDag-Erling Smørgrav break; 180960e15db9SDag-Erling Smørgrav } 181060e15db9SDag-Erling Smørgrav case AF_INET6: { 181181a31394SDag-Erling Smørgrav struct sockaddr_in6 sa_in6; 181260e15db9SDag-Erling Smørgrav 181381a31394SDag-Erling Smørgrav memset(&sa_in6, 0, sizeof(sa_in6)); 1814449df4ecSAndrey Zonov memcpy(&sa_in6, sa, sa->sa_len); 181560e15db9SDag-Erling Smørgrav check_sockaddr_len(in6); 1816b9ef8051SAndrey V. Elsukov getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6), 1817b9ef8051SAndrey V. Elsukov addr, sizeof(addr), NULL, 0, NI_NUMERICHOST); 181881a31394SDag-Erling Smørgrav printf("[%s]:%u", addr, htons(sa_in6.sin6_port)); 181960e15db9SDag-Erling Smørgrav break; 182060e15db9SDag-Erling Smørgrav } 182160e15db9SDag-Erling Smørgrav case AF_UNIX: { 182281a31394SDag-Erling Smørgrav struct sockaddr_un sa_un; 182360e15db9SDag-Erling Smørgrav 182481a31394SDag-Erling Smørgrav memset(&sa_un, 0, sizeof(sa_un)); 1825449df4ecSAndrey Zonov memcpy(&sa_un, sa, sa->sa_len); 182681a31394SDag-Erling Smørgrav printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path); 182760e15db9SDag-Erling Smørgrav break; 182860e15db9SDag-Erling Smørgrav } 182960e15db9SDag-Erling Smørgrav default: 183060e15db9SDag-Erling Smørgrav printf("unknown address family"); 183160e15db9SDag-Erling Smørgrav } 183260e15db9SDag-Erling Smørgrav printf(" }\n"); 183360e15db9SDag-Erling Smørgrav } 183460e15db9SDag-Erling Smørgrav 183560e15db9SDag-Erling Smørgrav void 183660e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp) 183760e15db9SDag-Erling Smørgrav { 183860e15db9SDag-Erling Smørgrav char mode[12], timestr[PATH_MAX + 4]; 183960e15db9SDag-Erling Smørgrav struct passwd *pwd; 184060e15db9SDag-Erling Smørgrav struct group *grp; 184160e15db9SDag-Erling Smørgrav struct tm *tm; 184260e15db9SDag-Erling Smørgrav 184360e15db9SDag-Erling Smørgrav /* 184460e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that statp points to a 184560e15db9SDag-Erling Smørgrav * buffer exactly sizeof(struct stat) bytes long. 184660e15db9SDag-Erling Smørgrav */ 184760e15db9SDag-Erling Smørgrav printf("struct stat {"); 184856f0ad0dSDag-Erling Smørgrav printf("dev=%ju, ino=%ju, ", 184956f0ad0dSDag-Erling Smørgrav (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino); 185056f0ad0dSDag-Erling Smørgrav if (resolv == 0) 185156f0ad0dSDag-Erling Smørgrav printf("mode=0%jo, ", (uintmax_t)statp->st_mode); 185256f0ad0dSDag-Erling Smørgrav else { 185360e15db9SDag-Erling Smørgrav strmode(statp->st_mode, mode); 185456f0ad0dSDag-Erling Smørgrav printf("mode=%s, ", mode); 185556f0ad0dSDag-Erling Smørgrav } 185656f0ad0dSDag-Erling Smørgrav printf("nlink=%ju, ", (uintmax_t)statp->st_nlink); 18574622f0e1SPawel Jakub Dawidek if (resolv == 0) { 18584622f0e1SPawel Jakub Dawidek pwd = NULL; 18594622f0e1SPawel Jakub Dawidek } else { 18602560d181SMariusz Zaborski #ifdef WITH_CASPER 18614622f0e1SPawel Jakub Dawidek if (cappwd != NULL) 18624622f0e1SPawel Jakub Dawidek pwd = cap_getpwuid(cappwd, statp->st_uid); 18634622f0e1SPawel Jakub Dawidek else 18644622f0e1SPawel Jakub Dawidek #endif 18654622f0e1SPawel Jakub Dawidek pwd = getpwuid(statp->st_uid); 18664622f0e1SPawel Jakub Dawidek } 18674622f0e1SPawel Jakub Dawidek if (pwd == NULL) 186860e15db9SDag-Erling Smørgrav printf("uid=%ju, ", (uintmax_t)statp->st_uid); 186960e15db9SDag-Erling Smørgrav else 187060e15db9SDag-Erling Smørgrav printf("uid=\"%s\", ", pwd->pw_name); 18714622f0e1SPawel Jakub Dawidek if (resolv == 0) { 18724622f0e1SPawel Jakub Dawidek grp = NULL; 18734622f0e1SPawel Jakub Dawidek } else { 18742560d181SMariusz Zaborski #ifdef WITH_CASPER 18754622f0e1SPawel Jakub Dawidek if (capgrp != NULL) 18764622f0e1SPawel Jakub Dawidek grp = cap_getgrgid(capgrp, statp->st_gid); 18774622f0e1SPawel Jakub Dawidek else 18784622f0e1SPawel Jakub Dawidek #endif 18794622f0e1SPawel Jakub Dawidek grp = getgrgid(statp->st_gid); 18804622f0e1SPawel Jakub Dawidek } 18814622f0e1SPawel Jakub Dawidek if (grp == NULL) 188260e15db9SDag-Erling Smørgrav printf("gid=%ju, ", (uintmax_t)statp->st_gid); 188360e15db9SDag-Erling Smørgrav else 188460e15db9SDag-Erling Smørgrav printf("gid=\"%s\", ", grp->gr_name); 188560e15db9SDag-Erling Smørgrav printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); 188660e15db9SDag-Erling Smørgrav printf("atime="); 188760e15db9SDag-Erling Smørgrav if (resolv == 0) 188899742a23SEd Schouten printf("%jd", (intmax_t)statp->st_atim.tv_sec); 188960e15db9SDag-Erling Smørgrav else { 189099742a23SEd Schouten tm = localtime(&statp->st_atim.tv_sec); 189109307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 189260e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 189360e15db9SDag-Erling Smørgrav } 189499742a23SEd Schouten if (statp->st_atim.tv_nsec != 0) 189599742a23SEd Schouten printf(".%09ld, ", statp->st_atim.tv_nsec); 189660e15db9SDag-Erling Smørgrav else 189760e15db9SDag-Erling Smørgrav printf(", "); 18980e80f258SEnji Cooper printf("mtime="); 189960e15db9SDag-Erling Smørgrav if (resolv == 0) 190099742a23SEd Schouten printf("%jd", (intmax_t)statp->st_mtim.tv_sec); 190160e15db9SDag-Erling Smørgrav else { 190299742a23SEd Schouten tm = localtime(&statp->st_mtim.tv_sec); 190309307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 190460e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 190560e15db9SDag-Erling Smørgrav } 190699742a23SEd Schouten if (statp->st_mtim.tv_nsec != 0) 190799742a23SEd Schouten printf(".%09ld, ", statp->st_mtim.tv_nsec); 190860e15db9SDag-Erling Smørgrav else 190960e15db9SDag-Erling Smørgrav printf(", "); 191060e15db9SDag-Erling Smørgrav printf("ctime="); 191160e15db9SDag-Erling Smørgrav if (resolv == 0) 191299742a23SEd Schouten printf("%jd", (intmax_t)statp->st_ctim.tv_sec); 191360e15db9SDag-Erling Smørgrav else { 191499742a23SEd Schouten tm = localtime(&statp->st_ctim.tv_sec); 191509307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 191660e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 191760e15db9SDag-Erling Smørgrav } 191899742a23SEd Schouten if (statp->st_ctim.tv_nsec != 0) 191999742a23SEd Schouten printf(".%09ld, ", statp->st_ctim.tv_nsec); 192060e15db9SDag-Erling Smørgrav else 192160e15db9SDag-Erling Smørgrav printf(", "); 192260e15db9SDag-Erling Smørgrav printf("birthtime="); 192360e15db9SDag-Erling Smørgrav if (resolv == 0) 192499742a23SEd Schouten printf("%jd", (intmax_t)statp->st_birthtim.tv_sec); 192560e15db9SDag-Erling Smørgrav else { 192699742a23SEd Schouten tm = localtime(&statp->st_birthtim.tv_sec); 192709307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 192860e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 192960e15db9SDag-Erling Smørgrav } 193099742a23SEd Schouten if (statp->st_birthtim.tv_nsec != 0) 193199742a23SEd Schouten printf(".%09ld, ", statp->st_birthtim.tv_nsec); 193260e15db9SDag-Erling Smørgrav else 193360e15db9SDag-Erling Smørgrav printf(", "); 193460e15db9SDag-Erling Smørgrav printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x", 193560e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize, 193660e15db9SDag-Erling Smørgrav (intmax_t)statp->st_blocks, statp->st_flags); 193760e15db9SDag-Erling Smørgrav printf(" }\n"); 193860e15db9SDag-Erling Smørgrav } 193960e15db9SDag-Erling Smørgrav 194060e15db9SDag-Erling Smørgrav void 194160e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen) 194260e15db9SDag-Erling Smørgrav { 194360e15db9SDag-Erling Smørgrav char *name, *data; 194460e15db9SDag-Erling Smørgrav size_t namelen, datalen; 194560e15db9SDag-Erling Smørgrav int i; 19467008be5bSPawel Jakub Dawidek cap_rights_t rights; 1947de56aee0SKonstantin Belousov struct itimerval it; 194830c1278fSWarner Losh struct stat sb; 194930c1278fSWarner Losh struct sockaddr_storage ss; 195060e15db9SDag-Erling Smørgrav 195160e15db9SDag-Erling Smørgrav for (name = buf, namelen = 0; 195260e15db9SDag-Erling Smørgrav namelen < buflen && name[namelen] != '\0'; 195360e15db9SDag-Erling Smørgrav ++namelen) 195460e15db9SDag-Erling Smørgrav /* nothing */; 195560e15db9SDag-Erling Smørgrav if (namelen == buflen) 195660e15db9SDag-Erling Smørgrav goto invalid; 195760e15db9SDag-Erling Smørgrav if (name[namelen] != '\0') 195860e15db9SDag-Erling Smørgrav goto invalid; 195960e15db9SDag-Erling Smørgrav data = buf + namelen + 1; 196060e15db9SDag-Erling Smørgrav datalen = buflen - namelen - 1; 196160e15db9SDag-Erling Smørgrav if (datalen == 0) 196260e15db9SDag-Erling Smørgrav goto invalid; 196360e15db9SDag-Erling Smørgrav /* sanity check */ 196481a31394SDag-Erling Smørgrav for (i = 0; i < (int)namelen; ++i) 196581a31394SDag-Erling Smørgrav if (!isalpha(name[i])) 196660e15db9SDag-Erling Smørgrav goto invalid; 19677008be5bSPawel Jakub Dawidek if (strcmp(name, "caprights") == 0) { 19687008be5bSPawel Jakub Dawidek if (datalen != sizeof(cap_rights_t)) 19697008be5bSPawel Jakub Dawidek goto invalid; 19707008be5bSPawel Jakub Dawidek memcpy(&rights, data, datalen); 19717008be5bSPawel Jakub Dawidek ktrcaprights(&rights); 1972de56aee0SKonstantin Belousov } else if (strcmp(name, "itimerval") == 0) { 1973de56aee0SKonstantin Belousov if (datalen != sizeof(struct itimerval)) 1974de56aee0SKonstantin Belousov goto invalid; 1975de56aee0SKonstantin Belousov memcpy(&it, data, datalen); 1976de56aee0SKonstantin Belousov ktritimerval(&it); 19777008be5bSPawel Jakub Dawidek } else if (strcmp(name, "stat") == 0) { 197860e15db9SDag-Erling Smørgrav if (datalen != sizeof(struct stat)) 197960e15db9SDag-Erling Smørgrav goto invalid; 198030c1278fSWarner Losh memcpy(&sb, data, datalen); 198130c1278fSWarner Losh ktrstat(&sb); 198260e15db9SDag-Erling Smørgrav } else if (strcmp(name, "sockaddr") == 0) { 198330c1278fSWarner Losh if (datalen > sizeof(ss)) 198460e15db9SDag-Erling Smørgrav goto invalid; 198530c1278fSWarner Losh memcpy(&ss, data, datalen); 19864b03484fSAndrey Zonov if (datalen != ss.ss_len) 198730c1278fSWarner Losh goto invalid; 198830c1278fSWarner Losh ktrsockaddr((struct sockaddr *)&ss); 198960e15db9SDag-Erling Smørgrav } else { 199060e15db9SDag-Erling Smørgrav printf("unknown structure\n"); 199160e15db9SDag-Erling Smørgrav } 199260e15db9SDag-Erling Smørgrav return; 199360e15db9SDag-Erling Smørgrav invalid: 199460e15db9SDag-Erling Smørgrav printf("invalid record\n"); 199560e15db9SDag-Erling Smørgrav } 199660e15db9SDag-Erling Smørgrav 1997c601ad8eSDag-Erling Smørgrav void 1998c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr) 1999c601ad8eSDag-Erling Smørgrav { 2000e141be6fSDag-Erling Smørgrav switch (ktr->cap_type) { 2001e141be6fSDag-Erling Smørgrav case CAPFAIL_NOTCAPABLE: 2002e141be6fSDag-Erling Smørgrav /* operation on fd with insufficient capabilities */ 2003e141be6fSDag-Erling Smørgrav printf("operation requires "); 20049289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_needed); 20052c93e2a3SPawel Jakub Dawidek printf(", descriptor holds "); 20069289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_held); 2007e141be6fSDag-Erling Smørgrav break; 2008e141be6fSDag-Erling Smørgrav case CAPFAIL_INCREASE: 2009e141be6fSDag-Erling Smørgrav /* requested more capabilities than fd already has */ 2010e141be6fSDag-Erling Smørgrav printf("attempt to increase capabilities from "); 20119289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_held); 201260e45df8SDag-Erling Smørgrav printf(" to "); 20139289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_needed); 2014e141be6fSDag-Erling Smørgrav break; 2015e141be6fSDag-Erling Smørgrav case CAPFAIL_SYSCALL: 2016e141be6fSDag-Erling Smørgrav /* called restricted syscall */ 2017e141be6fSDag-Erling Smørgrav printf("disallowed system call"); 2018e141be6fSDag-Erling Smørgrav break; 2019e141be6fSDag-Erling Smørgrav case CAPFAIL_LOOKUP: 2020e141be6fSDag-Erling Smørgrav /* used ".." in strict-relative mode */ 2021e141be6fSDag-Erling Smørgrav printf("restricted VFS lookup"); 2022e141be6fSDag-Erling Smørgrav break; 2023e141be6fSDag-Erling Smørgrav default: 2024e141be6fSDag-Erling Smørgrav printf("unknown capability failure: "); 20259289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_needed); 2026e141be6fSDag-Erling Smørgrav printf(" "); 20279289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_held); 2028e141be6fSDag-Erling Smørgrav break; 2029e141be6fSDag-Erling Smørgrav } 203035818d2eSJohn Baldwin printf("\n"); 203135818d2eSJohn Baldwin } 203235818d2eSJohn Baldwin 203335818d2eSJohn Baldwin void 203435818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr) 203535818d2eSJohn Baldwin { 203635818d2eSJohn Baldwin 203778ec874dSDmitry Chagin printf("0x%jx ", (uintmax_t)ktr->vaddr); 20389289f547SJohn Baldwin print_mask_arg(sysdecode_vmprot, ktr->type); 203935818d2eSJohn Baldwin printf("\n"); 204035818d2eSJohn Baldwin } 204135818d2eSJohn Baldwin 204235818d2eSJohn Baldwin void 204335818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr) 204435818d2eSJohn Baldwin { 20459289f547SJohn Baldwin const char *str; 204635818d2eSJohn Baldwin 20479289f547SJohn Baldwin str = sysdecode_vmresult(ktr->result); 20489289f547SJohn Baldwin if (str != NULL) 20499289f547SJohn Baldwin printf("%s", str); 20509289f547SJohn Baldwin else 20519289f547SJohn Baldwin printf("<invalid=%d>", ktr->result); 205235818d2eSJohn Baldwin printf("\n"); 2053c601ad8eSDag-Erling Smørgrav } 2054c601ad8eSDag-Erling Smørgrav 205560e15db9SDag-Erling Smørgrav void 2056ffb66079SJohn Baldwin ktrkevent(struct kevent *kev) 2057ffb66079SJohn Baldwin { 2058ffb66079SJohn Baldwin 2059ffb66079SJohn Baldwin printf("{ ident="); 2060ffb66079SJohn Baldwin switch (kev->filter) { 2061ffb66079SJohn Baldwin case EVFILT_READ: 2062ffb66079SJohn Baldwin case EVFILT_WRITE: 2063ffb66079SJohn Baldwin case EVFILT_VNODE: 2064ffb66079SJohn Baldwin case EVFILT_PROC: 2065ffb66079SJohn Baldwin case EVFILT_TIMER: 2066ffb66079SJohn Baldwin case EVFILT_PROCDESC: 2067ffb66079SJohn Baldwin case EVFILT_EMPTY: 2068ffb66079SJohn Baldwin printf("%ju", (uintmax_t)kev->ident); 2069ffb66079SJohn Baldwin break; 2070ffb66079SJohn Baldwin case EVFILT_SIGNAL: 2071ffb66079SJohn Baldwin print_signal(kev->ident); 2072ffb66079SJohn Baldwin break; 2073ffb66079SJohn Baldwin default: 2074ffb66079SJohn Baldwin printf("%p", (void *)kev->ident); 2075ffb66079SJohn Baldwin } 2076ffb66079SJohn Baldwin printf(", filter="); 2077ffb66079SJohn Baldwin print_integer_arg(sysdecode_kevent_filter, kev->filter); 2078ffb66079SJohn Baldwin printf(", flags="); 2079ffb66079SJohn Baldwin print_mask_arg0(sysdecode_kevent_flags, kev->flags); 2080ffb66079SJohn Baldwin printf(", fflags="); 2081ffb66079SJohn Baldwin sysdecode_kevent_fflags(stdout, kev->filter, kev->fflags, 2082ffb66079SJohn Baldwin decimal ? 10 : 16); 2083ffb66079SJohn Baldwin printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata); 2084ffb66079SJohn Baldwin } 2085ffb66079SJohn Baldwin 2086ffb66079SJohn Baldwin void 2087ffb66079SJohn Baldwin ktrstructarray(struct ktr_struct_array *ksa, size_t buflen) 2088ffb66079SJohn Baldwin { 2089ffb66079SJohn Baldwin struct kevent kev; 2090ffb66079SJohn Baldwin char *name, *data; 2091ffb66079SJohn Baldwin size_t namelen, datalen; 2092ffb66079SJohn Baldwin int i; 2093ffb66079SJohn Baldwin bool first; 2094ffb66079SJohn Baldwin 2095ffb66079SJohn Baldwin buflen -= sizeof(*ksa); 2096ffb66079SJohn Baldwin for (name = (char *)(ksa + 1), namelen = 0; 2097ffb66079SJohn Baldwin namelen < buflen && name[namelen] != '\0'; 2098ffb66079SJohn Baldwin ++namelen) 2099ffb66079SJohn Baldwin /* nothing */; 2100ffb66079SJohn Baldwin if (namelen == buflen) 2101ffb66079SJohn Baldwin goto invalid; 2102ffb66079SJohn Baldwin if (name[namelen] != '\0') 2103ffb66079SJohn Baldwin goto invalid; 2104ffb66079SJohn Baldwin /* sanity check */ 2105ffb66079SJohn Baldwin for (i = 0; i < (int)namelen; ++i) 2106ffb66079SJohn Baldwin if (!isalnum(name[i]) && name[i] != '_') 2107ffb66079SJohn Baldwin goto invalid; 2108ffb66079SJohn Baldwin data = name + namelen + 1; 2109ffb66079SJohn Baldwin datalen = buflen - namelen - 1; 2110ffb66079SJohn Baldwin printf("struct %s[] = { ", name); 2111ffb66079SJohn Baldwin first = true; 2112ffb66079SJohn Baldwin for (; datalen >= ksa->struct_size; 2113ffb66079SJohn Baldwin data += ksa->struct_size, datalen -= ksa->struct_size) { 2114ffb66079SJohn Baldwin if (!first) 2115ffb66079SJohn Baldwin printf("\n "); 2116ffb66079SJohn Baldwin else 2117ffb66079SJohn Baldwin first = false; 2118ffb66079SJohn Baldwin if (strcmp(name, "kevent") == 0) { 2119ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev)) 2120ffb66079SJohn Baldwin goto bad_size; 2121ffb66079SJohn Baldwin memcpy(&kev, data, sizeof(kev)); 2122ffb66079SJohn Baldwin ktrkevent(&kev); 2123ffb66079SJohn Baldwin } else if (strcmp(name, "kevent_freebsd11") == 0) { 2124ffb66079SJohn Baldwin struct kevent_freebsd11 kev11; 2125ffb66079SJohn Baldwin 2126ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev11)) 2127ffb66079SJohn Baldwin goto bad_size; 2128ffb66079SJohn Baldwin memcpy(&kev11, data, sizeof(kev11)); 2129ffb66079SJohn Baldwin memset(&kev, 0, sizeof(kev)); 2130ffb66079SJohn Baldwin kev.ident = kev11.ident; 2131ffb66079SJohn Baldwin kev.filter = kev11.filter; 2132ffb66079SJohn Baldwin kev.flags = kev11.flags; 2133ffb66079SJohn Baldwin kev.fflags = kev11.fflags; 2134ffb66079SJohn Baldwin kev.data = kev11.data; 2135ffb66079SJohn Baldwin kev.udata = kev11.udata; 2136ffb66079SJohn Baldwin ktrkevent(&kev); 2137ffb66079SJohn Baldwin #ifdef _WANT_KEVENT32 2138ffb66079SJohn Baldwin } else if (strcmp(name, "kevent32") == 0) { 2139ffb66079SJohn Baldwin struct kevent32 kev32; 2140ffb66079SJohn Baldwin 2141ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev32)) 2142ffb66079SJohn Baldwin goto bad_size; 2143ffb66079SJohn Baldwin memcpy(&kev32, data, sizeof(kev32)); 2144ffb66079SJohn Baldwin memset(&kev, 0, sizeof(kev)); 2145ffb66079SJohn Baldwin kev.ident = kev32.ident; 2146ffb66079SJohn Baldwin kev.filter = kev32.filter; 2147ffb66079SJohn Baldwin kev.flags = kev32.flags; 2148ffb66079SJohn Baldwin kev.fflags = kev32.fflags; 2149ffb66079SJohn Baldwin #if BYTE_ORDER == BIG_ENDIAN 2150ffb66079SJohn Baldwin kev.data = kev32.data2 | ((int64_t)kev32.data1 << 32); 2151ffb66079SJohn Baldwin #else 2152ffb66079SJohn Baldwin kev.data = kev32.data1 | ((int64_t)kev32.data2 << 32); 2153ffb66079SJohn Baldwin #endif 2154ffb66079SJohn Baldwin kev.udata = (void *)(uintptr_t)kev32.udata; 2155ffb66079SJohn Baldwin ktrkevent(&kev); 2156ffb66079SJohn Baldwin } else if (strcmp(name, "kevent32_freebsd11") == 0) { 2157ffb66079SJohn Baldwin struct kevent32_freebsd11 kev32; 2158ffb66079SJohn Baldwin 2159ffb66079SJohn Baldwin if (ksa->struct_size != sizeof(kev32)) 2160ffb66079SJohn Baldwin goto bad_size; 2161ffb66079SJohn Baldwin memcpy(&kev32, data, sizeof(kev32)); 2162ffb66079SJohn Baldwin memset(&kev, 0, sizeof(kev)); 2163ffb66079SJohn Baldwin kev.ident = kev32.ident; 2164ffb66079SJohn Baldwin kev.filter = kev32.filter; 2165ffb66079SJohn Baldwin kev.flags = kev32.flags; 2166ffb66079SJohn Baldwin kev.fflags = kev32.fflags; 2167ffb66079SJohn Baldwin kev.data = kev32.data; 2168ffb66079SJohn Baldwin kev.udata = (void *)(uintptr_t)kev32.udata; 2169ffb66079SJohn Baldwin ktrkevent(&kev); 2170ffb66079SJohn Baldwin #endif 2171ffb66079SJohn Baldwin } else { 2172ffb66079SJohn Baldwin printf("<unknown structure> }\n"); 2173ffb66079SJohn Baldwin return; 2174ffb66079SJohn Baldwin } 2175ffb66079SJohn Baldwin } 2176ffb66079SJohn Baldwin printf(" }\n"); 2177ffb66079SJohn Baldwin return; 2178ffb66079SJohn Baldwin invalid: 2179ffb66079SJohn Baldwin printf("invalid record\n"); 2180ffb66079SJohn Baldwin return; 2181ffb66079SJohn Baldwin bad_size: 2182ffb66079SJohn Baldwin printf("<bad size> }\n"); 2183ffb66079SJohn Baldwin return; 2184ffb66079SJohn Baldwin } 2185ffb66079SJohn Baldwin 2186ffb66079SJohn Baldwin void 218791fbb9c1SDavid Malone usage(void) 21889b50d902SRodney W. Grimes { 2189b9034ce2SBryan Drewery fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] " 2190da647ae9SRuslan Ermilov "[-m maxdata] [-p pid] [-t trstr]\n"); 21919b50d902SRodney W. Grimes exit(1); 21929b50d902SRodney W. Grimes } 2193