19b50d902SRodney W. Grimes /*- 29b50d902SRodney W. Grimes * Copyright (c) 1988, 1993 39b50d902SRodney W. Grimes * The Regents of the University of California. All rights reserved. 49b50d902SRodney W. Grimes * 59b50d902SRodney W. Grimes * Redistribution and use in source and binary forms, with or without 69b50d902SRodney W. Grimes * modification, are permitted provided that the following conditions 79b50d902SRodney W. Grimes * are met: 89b50d902SRodney W. Grimes * 1. Redistributions of source code must retain the above copyright 99b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer. 109b50d902SRodney W. Grimes * 2. Redistributions in binary form must reproduce the above copyright 119b50d902SRodney W. Grimes * notice, this list of conditions and the following disclaimer in the 129b50d902SRodney W. Grimes * documentation and/or other materials provided with the distribution. 13fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 149b50d902SRodney W. Grimes * may be used to endorse or promote products derived from this software 159b50d902SRodney W. Grimes * without specific prior written permission. 169b50d902SRodney W. Grimes * 179b50d902SRodney W. Grimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 189b50d902SRodney W. Grimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 199b50d902SRodney W. Grimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 209b50d902SRodney W. Grimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 219b50d902SRodney W. Grimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 229b50d902SRodney W. Grimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 239b50d902SRodney W. Grimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 249b50d902SRodney W. Grimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 259b50d902SRodney W. Grimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 269b50d902SRodney W. Grimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 279b50d902SRodney W. Grimes * SUCH DAMAGE. 289b50d902SRodney W. Grimes */ 299b50d902SRodney W. Grimes 309b50d902SRodney W. Grimes #ifndef lint 3115fc002bSPhilippe Charnier static const char copyright[] = 329b50d902SRodney W. Grimes "@(#) Copyright (c) 1988, 1993\n\ 339b50d902SRodney W. Grimes The Regents of the University of California. All rights reserved.\n"; 349b50d902SRodney W. Grimes #endif /* not lint */ 359b50d902SRodney W. Grimes 369b50d902SRodney W. Grimes #ifndef lint 3715fc002bSPhilippe Charnier #if 0 389b50d902SRodney W. Grimes static char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; 3915fc002bSPhilippe Charnier #endif 409b50d902SRodney W. Grimes #endif /* not lint */ 41e026a48cSDavid E. O'Brien #include <sys/cdefs.h> 42e026a48cSDavid E. O'Brien __FBSDID("$FreeBSD$"); 439b50d902SRodney W. Grimes 44406d2926SJohn Baldwin #define _WANT_KERNEL_ERRNO 459b50d902SRodney W. Grimes #include <sys/param.h> 46b881b8beSRobert Watson #include <sys/capsicum.h> 479b50d902SRodney W. Grimes #include <sys/errno.h> 489b50d902SRodney W. Grimes #include <sys/time.h> 499b50d902SRodney W. Grimes #include <sys/uio.h> 509b50d902SRodney W. Grimes #include <sys/ktrace.h> 519b50d902SRodney W. Grimes #include <sys/ioctl.h> 528bc31d83SCraig Rodrigues #include <sys/socket.h> 5360e15db9SDag-Erling Smørgrav #include <sys/stat.h> 547144d36fSDmitry Chagin #include <sys/sysent.h> 55fdb5bf37SJohn Baldwin #include <sys/umtx.h> 5660e15db9SDag-Erling Smørgrav #include <sys/un.h> 577144d36fSDmitry Chagin #include <sys/queue.h> 5834763d1cSJohn Baldwin #include <sys/wait.h> 59c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 60c36e54bbSMariusz Zaborski #include <sys/nv.h> 61c36e54bbSMariusz Zaborski #endif 621a604cfaSXin LI #include <arpa/inet.h> 6360e15db9SDag-Erling Smørgrav #include <netinet/in.h> 641a604cfaSXin LI #include <ctype.h> 65a4e3fc54SMariusz Zaborski #include <capsicum_helpers.h> 6615fc002bSPhilippe Charnier #include <err.h> 6760e15db9SDag-Erling Smørgrav #include <grp.h> 6860e15db9SDag-Erling Smørgrav #include <inttypes.h> 6915fc002bSPhilippe Charnier #include <locale.h> 70b9ef8051SAndrey V. Elsukov #include <netdb.h> 71f9b20fc8SPawel Jakub Dawidek #include <nl_types.h> 7260e15db9SDag-Erling Smørgrav #include <pwd.h> 7371ed318eSJohn Baldwin #include <stddef.h> 749b50d902SRodney W. Grimes #include <stdio.h> 759b50d902SRodney W. Grimes #include <stdlib.h> 769b50d902SRodney W. Grimes #include <string.h> 77d6fb4894SJohn Baldwin #include <sysdecode.h> 7860e15db9SDag-Erling Smørgrav #include <time.h> 7915fc002bSPhilippe Charnier #include <unistd.h> 8015fc002bSPhilippe Charnier #include <vis.h> 819b50d902SRodney W. Grimes #include "ktrace.h" 829b50d902SRodney W. Grimes 83c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 84c501d73cSMariusz Zaborski #include <libcasper.h> 85c501d73cSMariusz Zaborski 86c501d73cSMariusz Zaborski #include <casper/cap_grp.h> 87c501d73cSMariusz Zaborski #include <casper/cap_pwd.h> 88c501d73cSMariusz Zaborski #endif 89c501d73cSMariusz Zaborski 907144d36fSDmitry Chagin u_int abidump(struct ktr_header *); 917144d36fSDmitry Chagin int fetchprocinfo(struct ktr_header *, u_int *); 9291fbb9c1SDavid Malone int fread_tail(void *, int, int); 9391fbb9c1SDavid Malone void dumpheader(struct ktr_header *); 947144d36fSDmitry Chagin void ktrsyscall(struct ktr_syscall *, u_int); 957144d36fSDmitry Chagin void ktrsysret(struct ktr_sysret *, u_int); 9691fbb9c1SDavid Malone void ktrnamei(char *, int); 97ec4beb5dSPeter Wemm void hexdump(char *, int, int); 98ec4beb5dSPeter Wemm void visdump(char *, int, int); 9991fbb9c1SDavid Malone void ktrgenio(struct ktr_genio *, int); 100dde5f9b9SDmitry Chagin void ktrpsig(struct ktr_psig *); 10191fbb9c1SDavid Malone void ktrcsw(struct ktr_csw *); 10288bf5036SJohn Baldwin void ktrcsw_old(struct ktr_csw_old *); 103bb1a2d4aSJohn Baldwin void ktruser(int, void *); 1047008be5bSPawel Jakub Dawidek void ktrcaprights(cap_rights_t *); 105de56aee0SKonstantin Belousov void ktritimerval(struct itimerval *it); 10660e15db9SDag-Erling Smørgrav void ktrsockaddr(struct sockaddr *); 10760e15db9SDag-Erling Smørgrav void ktrstat(struct stat *); 10860e15db9SDag-Erling Smørgrav void ktrstruct(char *, size_t); 109c601ad8eSDag-Erling Smørgrav void ktrcapfail(struct ktr_cap_fail *); 11035818d2eSJohn Baldwin void ktrfault(struct ktr_fault *); 11135818d2eSJohn Baldwin void ktrfaultend(struct ktr_faultend *); 11291fbb9c1SDavid Malone void usage(void); 11391fbb9c1SDavid Malone 114c1269d20SMaxim Sobolev #define TIMESTAMP_NONE 0x0 115c1269d20SMaxim Sobolev #define TIMESTAMP_ABSOLUTE 0x1 116c1269d20SMaxim Sobolev #define TIMESTAMP_ELAPSED 0x2 117c1269d20SMaxim Sobolev #define TIMESTAMP_RELATIVE 0x4 118c1269d20SMaxim Sobolev 119bb1a2d4aSJohn Baldwin static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, 120b9034ce2SBryan Drewery resolv = 0, abiflag = 0, syscallno = 0; 121bb1a2d4aSJohn Baldwin static const char *tracefile = DEF_TRACEFILE; 122bb1a2d4aSJohn Baldwin static struct ktr_header ktr_header; 1239b50d902SRodney W. Grimes 12460e15db9SDag-Erling Smørgrav #define TIME_FORMAT "%b %e %T %Y" 1259b50d902SRodney W. Grimes #define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 1269b50d902SRodney W. Grimes 12771ed318eSJohn Baldwin #define print_number64(first,i,n,c) do { \ 12871ed318eSJohn Baldwin uint64_t __v; \ 12971ed318eSJohn Baldwin \ 13071ed318eSJohn Baldwin if (quad_align && (((ptrdiff_t)((i) - (first))) & 1) == 1) { \ 13171ed318eSJohn Baldwin (i)++; \ 13271ed318eSJohn Baldwin (n)--; \ 13371ed318eSJohn Baldwin } \ 13471ed318eSJohn Baldwin if (quad_slots == 2) \ 13571ed318eSJohn Baldwin __v = (uint64_t)(uint32_t)(i)[0] | \ 13671ed318eSJohn Baldwin ((uint64_t)(uint32_t)(i)[1]) << 32; \ 13771ed318eSJohn Baldwin else \ 13871ed318eSJohn Baldwin __v = (uint64_t)*(i); \ 13971ed318eSJohn Baldwin if (decimal) \ 14071ed318eSJohn Baldwin printf("%c%jd", (c), (intmax_t)__v); \ 14171ed318eSJohn Baldwin else \ 14271ed318eSJohn Baldwin printf("%c%#jx", (c), (uintmax_t)__v); \ 14371ed318eSJohn Baldwin (i) += quad_slots; \ 14471ed318eSJohn Baldwin (n) -= quad_slots; \ 14571ed318eSJohn Baldwin (c) = ','; \ 14671ed318eSJohn Baldwin } while (0) 14771ed318eSJohn Baldwin 14895bb676aSDag-Erling Smørgrav #define print_number(i,n,c) do { \ 149dde5f9b9SDmitry Chagin if (decimal) \ 150e4bb45b1SDag-Erling Smørgrav printf("%c%jd", c, (intmax_t)*i); \ 151dde5f9b9SDmitry Chagin else \ 152661522f5SDag-Erling Smørgrav printf("%c%#jx", c, (uintmax_t)(u_register_t)*i); \ 153dde5f9b9SDmitry Chagin i++; \ 154dde5f9b9SDmitry Chagin n--; \ 155dde5f9b9SDmitry Chagin c = ','; \ 156e4bb45b1SDag-Erling Smørgrav } while (0) 157dde5f9b9SDmitry Chagin 1587144d36fSDmitry Chagin struct proc_info 1597144d36fSDmitry Chagin { 1607144d36fSDmitry Chagin TAILQ_ENTRY(proc_info) info; 1617144d36fSDmitry Chagin u_int sv_flags; 1627144d36fSDmitry Chagin pid_t pid; 1637144d36fSDmitry Chagin }; 1647144d36fSDmitry Chagin 165bb1a2d4aSJohn Baldwin static TAILQ_HEAD(trace_procs, proc_info) trace_procs; 1667144d36fSDmitry Chagin 167c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 1684622f0e1SPawel Jakub Dawidek static cap_channel_t *cappwd, *capgrp; 1694622f0e1SPawel Jakub Dawidek #endif 1704622f0e1SPawel Jakub Dawidek 171e14da991SPawel Jakub Dawidek static void 172e14da991SPawel Jakub Dawidek strerror_init(void) 173e14da991SPawel Jakub Dawidek { 174e14da991SPawel Jakub Dawidek 175e14da991SPawel Jakub Dawidek /* 176e14da991SPawel Jakub Dawidek * Cache NLS data before entering capability mode. 177e14da991SPawel Jakub Dawidek * XXXPJD: There should be strerror_init() and strsignal_init() in libc. 178e14da991SPawel Jakub Dawidek */ 179e14da991SPawel Jakub Dawidek (void)catopen("libc", NL_CAT_LOCALE); 180e14da991SPawel Jakub Dawidek } 181e14da991SPawel Jakub Dawidek 182e14da991SPawel Jakub Dawidek static void 183e14da991SPawel Jakub Dawidek localtime_init(void) 184e14da991SPawel Jakub Dawidek { 185e14da991SPawel Jakub Dawidek time_t ltime; 186e14da991SPawel Jakub Dawidek 187e14da991SPawel Jakub Dawidek /* 188e14da991SPawel Jakub Dawidek * Allow localtime(3) to cache /etc/localtime content before entering 189e14da991SPawel Jakub Dawidek * capability mode. 190e14da991SPawel Jakub Dawidek * XXXPJD: There should be localtime_init() in libc. 191e14da991SPawel Jakub Dawidek */ 192e14da991SPawel Jakub Dawidek (void)time(<ime); 193e14da991SPawel Jakub Dawidek (void)localtime(<ime); 194e14da991SPawel Jakub Dawidek } 195e14da991SPawel Jakub Dawidek 196c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 1974622f0e1SPawel Jakub Dawidek static int 1984622f0e1SPawel Jakub Dawidek cappwdgrp_setup(cap_channel_t **cappwdp, cap_channel_t **capgrpp) 1994622f0e1SPawel Jakub Dawidek { 2004622f0e1SPawel Jakub Dawidek cap_channel_t *capcas, *cappwdloc, *capgrploc; 2014622f0e1SPawel Jakub Dawidek const char *cmds[1], *fields[1]; 2024622f0e1SPawel Jakub Dawidek 2034622f0e1SPawel Jakub Dawidek capcas = cap_init(); 2044622f0e1SPawel Jakub Dawidek if (capcas == NULL) { 205c501d73cSMariusz Zaborski err(1, "unable to create casper process"); 206c501d73cSMariusz Zaborski exit(1); 2074622f0e1SPawel Jakub Dawidek } 2084622f0e1SPawel Jakub Dawidek cappwdloc = cap_service_open(capcas, "system.pwd"); 2094622f0e1SPawel Jakub Dawidek capgrploc = cap_service_open(capcas, "system.grp"); 2104622f0e1SPawel Jakub Dawidek /* Casper capability no longer needed. */ 2114622f0e1SPawel Jakub Dawidek cap_close(capcas); 2124622f0e1SPawel Jakub Dawidek if (cappwdloc == NULL || capgrploc == NULL) { 2134622f0e1SPawel Jakub Dawidek if (cappwdloc == NULL) 2144622f0e1SPawel Jakub Dawidek warn("unable to open system.pwd service"); 2154622f0e1SPawel Jakub Dawidek if (capgrploc == NULL) 2164622f0e1SPawel Jakub Dawidek warn("unable to open system.grp service"); 2178ff3952bSPawel Jakub Dawidek exit(1); 2184622f0e1SPawel Jakub Dawidek } 2194622f0e1SPawel Jakub Dawidek /* Limit system.pwd to only getpwuid() function and pw_name field. */ 2204622f0e1SPawel Jakub Dawidek cmds[0] = "getpwuid"; 2218ff3952bSPawel Jakub Dawidek if (cap_pwd_limit_cmds(cappwdloc, cmds, 1) < 0) 2228ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.pwd service"); 2234622f0e1SPawel Jakub Dawidek fields[0] = "pw_name"; 2248ff3952bSPawel Jakub Dawidek if (cap_pwd_limit_fields(cappwdloc, fields, 1) < 0) 2258ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.pwd service"); 2264622f0e1SPawel Jakub Dawidek /* Limit system.grp to only getgrgid() function and gr_name field. */ 2274622f0e1SPawel Jakub Dawidek cmds[0] = "getgrgid"; 2288ff3952bSPawel Jakub Dawidek if (cap_grp_limit_cmds(capgrploc, cmds, 1) < 0) 2298ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.grp service"); 2304622f0e1SPawel Jakub Dawidek fields[0] = "gr_name"; 2318ff3952bSPawel Jakub Dawidek if (cap_grp_limit_fields(capgrploc, fields, 1) < 0) 2328ff3952bSPawel Jakub Dawidek err(1, "unable to limit system.grp service"); 2334622f0e1SPawel Jakub Dawidek 2344622f0e1SPawel Jakub Dawidek *cappwdp = cappwdloc; 2354622f0e1SPawel Jakub Dawidek *capgrpp = capgrploc; 2364622f0e1SPawel Jakub Dawidek return (0); 2374622f0e1SPawel Jakub Dawidek } 238c501d73cSMariusz Zaborski #endif /* HAVE_LIBCASPER */ 2394622f0e1SPawel Jakub Dawidek 2409289f547SJohn Baldwin static void 2419289f547SJohn Baldwin print_integer_arg(const char *(*decoder)(int), int value) 2429289f547SJohn Baldwin { 2439289f547SJohn Baldwin const char *str; 2449289f547SJohn Baldwin 2459289f547SJohn Baldwin str = decoder(value); 2469289f547SJohn Baldwin if (str != NULL) 2479289f547SJohn Baldwin printf("%s", str); 2489289f547SJohn Baldwin else { 2499289f547SJohn Baldwin if (decimal) 2509289f547SJohn Baldwin printf("<invalid=%d>", value); 2519289f547SJohn Baldwin else 2529289f547SJohn Baldwin printf("<invalid=%#x>", value); 2539289f547SJohn Baldwin } 2549289f547SJohn Baldwin } 2559289f547SJohn Baldwin 2569289f547SJohn Baldwin /* Like print_integer_arg but unknown values are treated as valid. */ 2579289f547SJohn Baldwin static void 2589289f547SJohn Baldwin print_integer_arg_valid(const char *(*decoder)(int), int value) 2599289f547SJohn Baldwin { 2609289f547SJohn Baldwin const char *str; 2619289f547SJohn Baldwin 2629289f547SJohn Baldwin str = decoder(value); 2639289f547SJohn Baldwin if (str != NULL) 2649289f547SJohn Baldwin printf("%s", str); 2659289f547SJohn Baldwin else { 2669289f547SJohn Baldwin if (decimal) 2679289f547SJohn Baldwin printf("%d", value); 2689289f547SJohn Baldwin else 2699289f547SJohn Baldwin printf("%#x", value); 2709289f547SJohn Baldwin } 2719289f547SJohn Baldwin } 2729289f547SJohn Baldwin 2739289f547SJohn Baldwin static void 2749289f547SJohn Baldwin print_mask_arg(bool (*decoder)(FILE *, int, int *), int value) 2759289f547SJohn Baldwin { 2769289f547SJohn Baldwin bool invalid; 2779289f547SJohn Baldwin int rem; 2789289f547SJohn Baldwin 2799289f547SJohn Baldwin printf("%#x<", value); 2809289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 2819289f547SJohn Baldwin printf(">"); 2829289f547SJohn Baldwin if (invalid) 2839289f547SJohn Baldwin printf("<invalid>%u", rem); 2849289f547SJohn Baldwin } 2859289f547SJohn Baldwin 2869289f547SJohn Baldwin static void 2879289f547SJohn Baldwin print_mask_arg0(bool (*decoder)(FILE *, int, int *), int value) 2889289f547SJohn Baldwin { 2899289f547SJohn Baldwin bool invalid; 2909289f547SJohn Baldwin int rem; 2919289f547SJohn Baldwin 2929289f547SJohn Baldwin if (value == 0) { 2939289f547SJohn Baldwin printf("0"); 2949289f547SJohn Baldwin return; 2959289f547SJohn Baldwin } 2969289f547SJohn Baldwin printf("%#x<", value); 2979289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 2989289f547SJohn Baldwin printf(">"); 2999289f547SJohn Baldwin if (invalid) 3009289f547SJohn Baldwin printf("<invalid>%u", rem); 3019289f547SJohn Baldwin } 3029289f547SJohn Baldwin 3039289f547SJohn Baldwin static void 3049289f547SJohn Baldwin decode_fileflags(fflags_t value) 3059289f547SJohn Baldwin { 3069289f547SJohn Baldwin bool invalid; 3079289f547SJohn Baldwin fflags_t rem; 3089289f547SJohn Baldwin 3099289f547SJohn Baldwin if (value == 0) { 3109289f547SJohn Baldwin printf("0"); 3119289f547SJohn Baldwin return; 3129289f547SJohn Baldwin } 3139289f547SJohn Baldwin printf("%#x<", value); 3149289f547SJohn Baldwin invalid = !sysdecode_fileflags(stdout, value, &rem); 3159289f547SJohn Baldwin printf(">"); 3169289f547SJohn Baldwin if (invalid) 3179289f547SJohn Baldwin printf("<invalid>%u", rem); 3189289f547SJohn Baldwin } 3199289f547SJohn Baldwin 3209289f547SJohn Baldwin static void 3219289f547SJohn Baldwin decode_filemode(int value) 3229289f547SJohn Baldwin { 3239289f547SJohn Baldwin bool invalid; 3249289f547SJohn Baldwin int rem; 3259289f547SJohn Baldwin 3269289f547SJohn Baldwin if (value == 0) { 3279289f547SJohn Baldwin printf("0"); 3289289f547SJohn Baldwin return; 3299289f547SJohn Baldwin } 3309289f547SJohn Baldwin printf("%#o<", value); 3319289f547SJohn Baldwin invalid = !sysdecode_filemode(stdout, value, &rem); 3329289f547SJohn Baldwin printf(">"); 3339289f547SJohn Baldwin if (invalid) 3349289f547SJohn Baldwin printf("<invalid>%u", rem); 3359289f547SJohn Baldwin } 3369289f547SJohn Baldwin 3379289f547SJohn Baldwin static void 3389289f547SJohn Baldwin print_mask_arg32(bool (*decoder)(FILE *, uint32_t, uint32_t *), uint32_t value) 3399289f547SJohn Baldwin { 3409289f547SJohn Baldwin bool invalid; 3419289f547SJohn Baldwin uint32_t rem; 3429289f547SJohn Baldwin 3439289f547SJohn Baldwin printf("%#x<", value); 3449289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 3459289f547SJohn Baldwin printf(">"); 3469289f547SJohn Baldwin if (invalid) 3479289f547SJohn Baldwin printf("<invalid>%u", rem); 3489289f547SJohn Baldwin } 3499289f547SJohn Baldwin 3509289f547SJohn Baldwin static void 3519289f547SJohn Baldwin print_mask_argul(bool (*decoder)(FILE *, u_long, u_long *), u_long value) 3529289f547SJohn Baldwin { 3539289f547SJohn Baldwin bool invalid; 3549289f547SJohn Baldwin u_long rem; 3559289f547SJohn Baldwin 3569289f547SJohn Baldwin if (value == 0) { 3579289f547SJohn Baldwin printf("0"); 3589289f547SJohn Baldwin return; 3599289f547SJohn Baldwin } 3609289f547SJohn Baldwin printf("%#lx<", value); 3619289f547SJohn Baldwin invalid = !decoder(stdout, value, &rem); 3629289f547SJohn Baldwin printf(">"); 3639289f547SJohn Baldwin if (invalid) 3649289f547SJohn Baldwin printf("<invalid>%lu", rem); 3659289f547SJohn Baldwin } 3669289f547SJohn Baldwin 36791fbb9c1SDavid Malone int 36891fbb9c1SDavid Malone main(int argc, char *argv[]) 3699b50d902SRodney W. Grimes { 3709b50d902SRodney W. Grimes int ch, ktrlen, size; 37191fbb9c1SDavid Malone void *m; 3729b50d902SRodney W. Grimes int trpoints = ALL_POINTS; 373db53f66bSJohn Baldwin int drop_logged; 374ec4beb5dSPeter Wemm pid_t pid = 0; 3757144d36fSDmitry Chagin u_int sv_flags; 3769b50d902SRodney W. Grimes 37709307b25SDag-Erling Smørgrav setlocale(LC_CTYPE, ""); 3785ccbfb26SAndrey A. Chernov 379c1269d20SMaxim Sobolev timestamp = TIMESTAMP_NONE; 380c1269d20SMaxim Sobolev 381b9034ce2SBryan Drewery while ((ch = getopt(argc,argv,"f:dElm:np:AHRrSsTt:")) != -1) 38209307b25SDag-Erling Smørgrav switch (ch) { 3837144d36fSDmitry Chagin case 'A': 3847144d36fSDmitry Chagin abiflag = 1; 3857144d36fSDmitry Chagin break; 3869b50d902SRodney W. Grimes case 'f': 3879b50d902SRodney W. Grimes tracefile = optarg; 3889b50d902SRodney W. Grimes break; 3899b50d902SRodney W. Grimes case 'd': 3909b50d902SRodney W. Grimes decimal = 1; 3919b50d902SRodney W. Grimes break; 3929b50d902SRodney W. Grimes case 'l': 3939b50d902SRodney W. Grimes tail = 1; 3949b50d902SRodney W. Grimes break; 3959b50d902SRodney W. Grimes case 'm': 3969b50d902SRodney W. Grimes maxdata = atoi(optarg); 3979b50d902SRodney W. Grimes break; 3989b50d902SRodney W. Grimes case 'n': 3999b50d902SRodney W. Grimes fancy = 0; 4009b50d902SRodney W. Grimes break; 401ec4beb5dSPeter Wemm case 'p': 402ec4beb5dSPeter Wemm pid = atoi(optarg); 403ec4beb5dSPeter Wemm break; 40460e15db9SDag-Erling Smørgrav case 'r': 40560e15db9SDag-Erling Smørgrav resolv = 1; 40660e15db9SDag-Erling Smørgrav break; 407b9034ce2SBryan Drewery case 'S': 408b9034ce2SBryan Drewery syscallno = 1; 409b9034ce2SBryan Drewery break; 410df0c8868SRobert Watson case 's': 411df0c8868SRobert Watson suppressdata = 1; 412df0c8868SRobert Watson break; 413ec131914SPeter Wemm case 'E': 414c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_ELAPSED; 415ec131914SPeter Wemm break; 416a9ac598bSRobert Watson case 'H': 417a9ac598bSRobert Watson threads = 1; 418a9ac598bSRobert Watson break; 4199b50d902SRodney W. Grimes case 'R': 420c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_RELATIVE; 4219b50d902SRodney W. Grimes break; 4229b50d902SRodney W. Grimes case 'T': 423c1269d20SMaxim Sobolev timestamp |= TIMESTAMP_ABSOLUTE; 4249b50d902SRodney W. Grimes break; 4259b50d902SRodney W. Grimes case 't': 4269b50d902SRodney W. Grimes trpoints = getpoints(optarg); 42715fc002bSPhilippe Charnier if (trpoints < 0) 42815fc002bSPhilippe Charnier errx(1, "unknown trace point in %s", optarg); 4299b50d902SRodney W. Grimes break; 4309b50d902SRodney W. Grimes default: 4319b50d902SRodney W. Grimes usage(); 4329b50d902SRodney W. Grimes } 4339b50d902SRodney W. Grimes 43480844fd1SBill Fenner if (argc > optind) 4359b50d902SRodney W. Grimes usage(); 4369b50d902SRodney W. Grimes 43709307b25SDag-Erling Smørgrav m = malloc(size = 1025); 43815fc002bSPhilippe Charnier if (m == NULL) 43915fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 4409d0fa50eSSimon J. Gerraty if (strcmp(tracefile, "-") != 0) 44115fc002bSPhilippe Charnier if (!freopen(tracefile, "r", stdin)) 44215fc002bSPhilippe Charnier err(1, "%s", tracefile); 443f9b20fc8SPawel Jakub Dawidek 444e14da991SPawel Jakub Dawidek strerror_init(); 445e14da991SPawel Jakub Dawidek localtime_init(); 446c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 4474622f0e1SPawel Jakub Dawidek if (resolv != 0) { 4484622f0e1SPawel Jakub Dawidek if (cappwdgrp_setup(&cappwd, &capgrp) < 0) { 4494622f0e1SPawel Jakub Dawidek cappwd = NULL; 4504622f0e1SPawel Jakub Dawidek capgrp = NULL; 4514622f0e1SPawel Jakub Dawidek } 4524622f0e1SPawel Jakub Dawidek } 4534622f0e1SPawel Jakub Dawidek if (resolv == 0 || (cappwd != NULL && capgrp != NULL)) { 4544622f0e1SPawel Jakub Dawidek if (cap_enter() < 0 && errno != ENOSYS) 4554622f0e1SPawel Jakub Dawidek err(1, "unable to enter capability mode"); 4564622f0e1SPawel Jakub Dawidek } 4574622f0e1SPawel Jakub Dawidek #else 458d2c9ca44SPawel Jakub Dawidek if (resolv == 0) { 459f9b20fc8SPawel Jakub Dawidek if (cap_enter() < 0 && errno != ENOSYS) 460f9b20fc8SPawel Jakub Dawidek err(1, "unable to enter capability mode"); 461d2c9ca44SPawel Jakub Dawidek } 4624622f0e1SPawel Jakub Dawidek #endif 463a4e3fc54SMariusz Zaborski if (caph_limit_stdio() == -1) 464a4e3fc54SMariusz Zaborski err(1, "unable to limit stdio"); 465f9b20fc8SPawel Jakub Dawidek 4667144d36fSDmitry Chagin TAILQ_INIT(&trace_procs); 467db53f66bSJohn Baldwin drop_logged = 0; 4689b50d902SRodney W. Grimes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 469db53f66bSJohn Baldwin if (ktr_header.ktr_type & KTR_DROP) { 470db53f66bSJohn Baldwin ktr_header.ktr_type &= ~KTR_DROP; 471a9ac598bSRobert Watson if (!drop_logged && threads) { 47209307b25SDag-Erling Smørgrav printf( 473c065c0b8SJaakko Heinonen "%6jd %6jd %-8.*s Events dropped.\n", 474c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, 475c065c0b8SJaakko Heinonen ktr_header.ktr_tid > 0 ? 476c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_tid : 0, 477c065c0b8SJaakko Heinonen MAXCOMLEN, ktr_header.ktr_comm); 478a9ac598bSRobert Watson drop_logged = 1; 479a9ac598bSRobert Watson } else if (!drop_logged) { 48009307b25SDag-Erling Smørgrav printf("%6jd %-8.*s Events dropped.\n", 481c065c0b8SJaakko Heinonen (intmax_t)ktr_header.ktr_pid, MAXCOMLEN, 482db53f66bSJohn Baldwin ktr_header.ktr_comm); 483db53f66bSJohn Baldwin drop_logged = 1; 484db53f66bSJohn Baldwin } 485db53f66bSJohn Baldwin } 4869b50d902SRodney W. Grimes if (trpoints & (1<<ktr_header.ktr_type)) 48701a36e29SJohn Baldwin if (pid == 0 || ktr_header.ktr_pid == pid || 48801a36e29SJohn Baldwin ktr_header.ktr_tid == pid) 4899b50d902SRodney W. Grimes dumpheader(&ktr_header); 49015fc002bSPhilippe Charnier if ((ktrlen = ktr_header.ktr_len) < 0) 49115fc002bSPhilippe Charnier errx(1, "bogus length 0x%x", ktrlen); 4929b50d902SRodney W. Grimes if (ktrlen > size) { 49309307b25SDag-Erling Smørgrav m = realloc(m, ktrlen+1); 49415fc002bSPhilippe Charnier if (m == NULL) 49515fc002bSPhilippe Charnier errx(1, "%s", strerror(ENOMEM)); 4969b50d902SRodney W. Grimes size = ktrlen; 4979b50d902SRodney W. Grimes } 49815fc002bSPhilippe Charnier if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 49915fc002bSPhilippe Charnier errx(1, "data too short"); 5007144d36fSDmitry Chagin if (fetchprocinfo(&ktr_header, (u_int *)m) != 0) 5017144d36fSDmitry Chagin continue; 5027144d36fSDmitry Chagin sv_flags = abidump(&ktr_header); 50301a36e29SJohn Baldwin if (pid && ktr_header.ktr_pid != pid && 50401a36e29SJohn Baldwin ktr_header.ktr_tid != pid) 505ec4beb5dSPeter Wemm continue; 5069b50d902SRodney W. Grimes if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 5079b50d902SRodney W. Grimes continue; 508db53f66bSJohn Baldwin drop_logged = 0; 5099b50d902SRodney W. Grimes switch (ktr_header.ktr_type) { 5109b50d902SRodney W. Grimes case KTR_SYSCALL: 5117144d36fSDmitry Chagin ktrsyscall((struct ktr_syscall *)m, sv_flags); 5129b50d902SRodney W. Grimes break; 5139b50d902SRodney W. Grimes case KTR_SYSRET: 5147144d36fSDmitry Chagin ktrsysret((struct ktr_sysret *)m, sv_flags); 5159b50d902SRodney W. Grimes break; 5169b50d902SRodney W. Grimes case KTR_NAMEI: 517a56be37eSJohn Baldwin case KTR_SYSCTL: 5189b50d902SRodney W. Grimes ktrnamei(m, ktrlen); 5199b50d902SRodney W. Grimes break; 5209b50d902SRodney W. Grimes case KTR_GENIO: 5219b50d902SRodney W. Grimes ktrgenio((struct ktr_genio *)m, ktrlen); 5229b50d902SRodney W. Grimes break; 5239b50d902SRodney W. Grimes case KTR_PSIG: 524dde5f9b9SDmitry Chagin ktrpsig((struct ktr_psig *)m); 5259b50d902SRodney W. Grimes break; 5269b50d902SRodney W. Grimes case KTR_CSW: 52788bf5036SJohn Baldwin if (ktrlen == sizeof(struct ktr_csw_old)) 52888bf5036SJohn Baldwin ktrcsw_old((struct ktr_csw_old *)m); 52988bf5036SJohn Baldwin else 5309b50d902SRodney W. Grimes ktrcsw((struct ktr_csw *)m); 5319b50d902SRodney W. Grimes break; 53282e2dd32SPoul-Henning Kamp case KTR_USER: 5333f8ba9aeSPoul-Henning Kamp ktruser(ktrlen, m); 53482e2dd32SPoul-Henning Kamp break; 53560e15db9SDag-Erling Smørgrav case KTR_STRUCT: 53660e15db9SDag-Erling Smørgrav ktrstruct(m, ktrlen); 53760e15db9SDag-Erling Smørgrav break; 538c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 539c601ad8eSDag-Erling Smørgrav ktrcapfail((struct ktr_cap_fail *)m); 54035818d2eSJohn Baldwin break; 54135818d2eSJohn Baldwin case KTR_FAULT: 54235818d2eSJohn Baldwin ktrfault((struct ktr_fault *)m); 54335818d2eSJohn Baldwin break; 54435818d2eSJohn Baldwin case KTR_FAULTEND: 54535818d2eSJohn Baldwin ktrfaultend((struct ktr_faultend *)m); 54635818d2eSJohn Baldwin break; 547b9609ab1SJohn Baldwin default: 548b9609ab1SJohn Baldwin printf("\n"); 549b9609ab1SJohn Baldwin break; 5509b50d902SRodney W. Grimes } 5519b50d902SRodney W. Grimes if (tail) 55209307b25SDag-Erling Smørgrav fflush(stdout); 5539b50d902SRodney W. Grimes } 55491fbb9c1SDavid Malone return 0; 5559b50d902SRodney W. Grimes } 5569b50d902SRodney W. Grimes 55791fbb9c1SDavid Malone int 55891fbb9c1SDavid Malone fread_tail(void *buf, int size, int num) 5599b50d902SRodney W. Grimes { 5609b50d902SRodney W. Grimes int i; 5619b50d902SRodney W. Grimes 5629b50d902SRodney W. Grimes while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 56309307b25SDag-Erling Smørgrav sleep(1); 5649b50d902SRodney W. Grimes clearerr(stdin); 5659b50d902SRodney W. Grimes } 5669b50d902SRodney W. Grimes return (i); 5679b50d902SRodney W. Grimes } 5689b50d902SRodney W. Grimes 5697144d36fSDmitry Chagin int 5707144d36fSDmitry Chagin fetchprocinfo(struct ktr_header *kth, u_int *flags) 5717144d36fSDmitry Chagin { 5727144d36fSDmitry Chagin struct proc_info *pi; 5737144d36fSDmitry Chagin 5747144d36fSDmitry Chagin switch (kth->ktr_type) { 5757144d36fSDmitry Chagin case KTR_PROCCTOR: 5767144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 5777144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 5787144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 5797144d36fSDmitry Chagin break; 5807144d36fSDmitry Chagin } 5817144d36fSDmitry Chagin } 5827144d36fSDmitry Chagin pi = malloc(sizeof(struct proc_info)); 5837144d36fSDmitry Chagin if (pi == NULL) 5847144d36fSDmitry Chagin errx(1, "%s", strerror(ENOMEM)); 5857144d36fSDmitry Chagin pi->sv_flags = *flags; 5867144d36fSDmitry Chagin pi->pid = kth->ktr_pid; 5877144d36fSDmitry Chagin TAILQ_INSERT_TAIL(&trace_procs, pi, info); 5887144d36fSDmitry Chagin return (1); 5897144d36fSDmitry Chagin 5907144d36fSDmitry Chagin case KTR_PROCDTOR: 5917144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 5927144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 5937144d36fSDmitry Chagin TAILQ_REMOVE(&trace_procs, pi, info); 5947144d36fSDmitry Chagin free(pi); 5957144d36fSDmitry Chagin break; 5967144d36fSDmitry Chagin } 5977144d36fSDmitry Chagin } 5987144d36fSDmitry Chagin return (1); 5997144d36fSDmitry Chagin } 6007144d36fSDmitry Chagin 6017144d36fSDmitry Chagin return (0); 6027144d36fSDmitry Chagin } 6037144d36fSDmitry Chagin 6047144d36fSDmitry Chagin u_int 6057144d36fSDmitry Chagin abidump(struct ktr_header *kth) 6067144d36fSDmitry Chagin { 6077144d36fSDmitry Chagin struct proc_info *pi; 6087144d36fSDmitry Chagin const char *abi; 6097144d36fSDmitry Chagin const char *arch; 6107144d36fSDmitry Chagin u_int flags = 0; 6117144d36fSDmitry Chagin 6127144d36fSDmitry Chagin TAILQ_FOREACH(pi, &trace_procs, info) { 6137144d36fSDmitry Chagin if (pi->pid == kth->ktr_pid) { 6147144d36fSDmitry Chagin flags = pi->sv_flags; 6157144d36fSDmitry Chagin break; 6167144d36fSDmitry Chagin } 6177144d36fSDmitry Chagin } 6187144d36fSDmitry Chagin 6197144d36fSDmitry Chagin if (abiflag == 0) 6207144d36fSDmitry Chagin return (flags); 6217144d36fSDmitry Chagin 6227144d36fSDmitry Chagin switch (flags & SV_ABI_MASK) { 6237144d36fSDmitry Chagin case SV_ABI_LINUX: 6247144d36fSDmitry Chagin abi = "L"; 6257144d36fSDmitry Chagin break; 6267144d36fSDmitry Chagin case SV_ABI_FREEBSD: 6277144d36fSDmitry Chagin abi = "F"; 6287144d36fSDmitry Chagin break; 6296fb8946bSJohn Baldwin case SV_ABI_CLOUDABI: 6306fb8946bSJohn Baldwin abi = "C"; 6316fb8946bSJohn Baldwin break; 6327144d36fSDmitry Chagin default: 6337144d36fSDmitry Chagin abi = "U"; 6347144d36fSDmitry Chagin break; 6357144d36fSDmitry Chagin } 6367144d36fSDmitry Chagin 6377144d36fSDmitry Chagin if (flags & SV_LP64) 6387144d36fSDmitry Chagin arch = "64"; 6396fc8053fSJohn Baldwin else if (flags & SV_ILP32) 6407144d36fSDmitry Chagin arch = "32"; 6416fc8053fSJohn Baldwin else 6427144d36fSDmitry Chagin arch = "00"; 6437144d36fSDmitry Chagin 6447144d36fSDmitry Chagin printf("%s%s ", abi, arch); 6457144d36fSDmitry Chagin 6467144d36fSDmitry Chagin return (flags); 6477144d36fSDmitry Chagin } 6487144d36fSDmitry Chagin 64991fbb9c1SDavid Malone void 65091fbb9c1SDavid Malone dumpheader(struct ktr_header *kth) 6519b50d902SRodney W. Grimes { 6529b50d902SRodney W. Grimes static char unknown[64]; 653dda41f20SJohn Baldwin static struct timeval prevtime, prevtime_e; 654dda41f20SJohn Baldwin struct timeval temp; 65591fbb9c1SDavid Malone const char *type; 656da551bb2SMaxim Sobolev const char *sign; 6579b50d902SRodney W. Grimes 6589b50d902SRodney W. Grimes switch (kth->ktr_type) { 6599b50d902SRodney W. Grimes case KTR_SYSCALL: 6609b50d902SRodney W. Grimes type = "CALL"; 6619b50d902SRodney W. Grimes break; 6629b50d902SRodney W. Grimes case KTR_SYSRET: 6639b50d902SRodney W. Grimes type = "RET "; 6649b50d902SRodney W. Grimes break; 6659b50d902SRodney W. Grimes case KTR_NAMEI: 6669b50d902SRodney W. Grimes type = "NAMI"; 6679b50d902SRodney W. Grimes break; 6689b50d902SRodney W. Grimes case KTR_GENIO: 6699b50d902SRodney W. Grimes type = "GIO "; 6709b50d902SRodney W. Grimes break; 6719b50d902SRodney W. Grimes case KTR_PSIG: 6729b50d902SRodney W. Grimes type = "PSIG"; 6739b50d902SRodney W. Grimes break; 6749b50d902SRodney W. Grimes case KTR_CSW: 6759b50d902SRodney W. Grimes type = "CSW "; 6769b50d902SRodney W. Grimes break; 67782e2dd32SPoul-Henning Kamp case KTR_USER: 67882e2dd32SPoul-Henning Kamp type = "USER"; 67982e2dd32SPoul-Henning Kamp break; 68060e15db9SDag-Erling Smørgrav case KTR_STRUCT: 68160e15db9SDag-Erling Smørgrav type = "STRU"; 68260e15db9SDag-Erling Smørgrav break; 683a56be37eSJohn Baldwin case KTR_SYSCTL: 684a56be37eSJohn Baldwin type = "SCTL"; 685a56be37eSJohn Baldwin break; 6867144d36fSDmitry Chagin case KTR_PROCCTOR: 6877144d36fSDmitry Chagin /* FALLTHROUGH */ 6887144d36fSDmitry Chagin case KTR_PROCDTOR: 6897144d36fSDmitry Chagin return; 690c601ad8eSDag-Erling Smørgrav case KTR_CAPFAIL: 691c601ad8eSDag-Erling Smørgrav type = "CAP "; 692c601ad8eSDag-Erling Smørgrav break; 69335818d2eSJohn Baldwin case KTR_FAULT: 69435818d2eSJohn Baldwin type = "PFLT"; 69535818d2eSJohn Baldwin break; 69635818d2eSJohn Baldwin case KTR_FAULTEND: 69735818d2eSJohn Baldwin type = "PRET"; 69835818d2eSJohn Baldwin break; 6999b50d902SRodney W. Grimes default: 70009307b25SDag-Erling Smørgrav sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 7019b50d902SRodney W. Grimes type = unknown; 7029b50d902SRodney W. Grimes } 7039b50d902SRodney W. Grimes 704a9ac598bSRobert Watson /* 705a9ac598bSRobert Watson * The ktr_tid field was previously the ktr_buffer field, which held 706a9ac598bSRobert Watson * the kernel pointer value for the buffer associated with data 707a9ac598bSRobert Watson * following the record header. It now holds a threadid, but only 708a9ac598bSRobert Watson * for trace files after the change. Older trace files still contain 709a9ac598bSRobert Watson * kernel pointers. Detect this and suppress the results by printing 710a9ac598bSRobert Watson * negative tid's as 0. 711a9ac598bSRobert Watson */ 712a9ac598bSRobert Watson if (threads) 71309307b25SDag-Erling Smørgrav printf("%6jd %6jd %-8.*s ", (intmax_t)kth->ktr_pid, 714c065c0b8SJaakko Heinonen kth->ktr_tid > 0 ? (intmax_t)kth->ktr_tid : 0, 715c065c0b8SJaakko Heinonen MAXCOMLEN, kth->ktr_comm); 716a9ac598bSRobert Watson else 71709307b25SDag-Erling Smørgrav printf("%6jd %-8.*s ", (intmax_t)kth->ktr_pid, MAXCOMLEN, 718a9ac598bSRobert Watson kth->ktr_comm); 7199b50d902SRodney W. Grimes if (timestamp) { 720c1269d20SMaxim Sobolev if (timestamp & TIMESTAMP_ABSOLUTE) { 721c1269d20SMaxim Sobolev printf("%jd.%06ld ", (intmax_t)kth->ktr_time.tv_sec, 722c1269d20SMaxim Sobolev kth->ktr_time.tv_usec); 723ec131914SPeter Wemm } 724c1269d20SMaxim Sobolev if (timestamp & TIMESTAMP_ELAPSED) { 725c1269d20SMaxim Sobolev if (prevtime_e.tv_sec == 0) 726c1269d20SMaxim Sobolev prevtime_e = kth->ktr_time; 72754b10c9eSJohn Baldwin timersub(&kth->ktr_time, &prevtime_e, &temp); 72854b10c9eSJohn Baldwin printf("%jd.%06ld ", (intmax_t)temp.tv_sec, 72954b10c9eSJohn Baldwin temp.tv_usec); 730c1269d20SMaxim Sobolev } 731c1269d20SMaxim Sobolev if (timestamp & TIMESTAMP_RELATIVE) { 732da551bb2SMaxim Sobolev if (prevtime.tv_sec == 0) 733da551bb2SMaxim Sobolev prevtime = kth->ktr_time; 73454b10c9eSJohn Baldwin if (timercmp(&kth->ktr_time, &prevtime, <)) { 73554b10c9eSJohn Baldwin timersub(&prevtime, &kth->ktr_time, &temp); 736da551bb2SMaxim Sobolev sign = "-"; 737da551bb2SMaxim Sobolev } else { 73854b10c9eSJohn Baldwin timersub(&kth->ktr_time, &prevtime, &temp); 739da551bb2SMaxim Sobolev sign = ""; 740da551bb2SMaxim Sobolev } 74154b10c9eSJohn Baldwin prevtime = kth->ktr_time; 74254b10c9eSJohn Baldwin printf("%s%jd.%06ld ", sign, (intmax_t)temp.tv_sec, 74354b10c9eSJohn Baldwin temp.tv_usec); 7449b50d902SRodney W. Grimes } 745c1269d20SMaxim Sobolev } 74609307b25SDag-Erling Smørgrav printf("%s ", type); 7479b50d902SRodney W. Grimes } 7489b50d902SRodney W. Grimes 7499b50d902SRodney W. Grimes #include <sys/syscall.h> 7509b50d902SRodney W. Grimes 751265e5898SJohn Baldwin static void 752265e5898SJohn Baldwin ioctlname(unsigned long val) 753265e5898SJohn Baldwin { 754265e5898SJohn Baldwin const char *str; 755265e5898SJohn Baldwin 756265e5898SJohn Baldwin str = sysdecode_ioctlname(val); 757265e5898SJohn Baldwin if (str != NULL) 758265e5898SJohn Baldwin printf("%s", str); 759265e5898SJohn Baldwin else if (decimal) 760265e5898SJohn Baldwin printf("%lu", val); 761265e5898SJohn Baldwin else 762265e5898SJohn Baldwin printf("%#lx", val); 763265e5898SJohn Baldwin } 764265e5898SJohn Baldwin 765a5f14abfSJohn Baldwin static enum sysdecode_abi 766a5f14abfSJohn Baldwin syscallabi(u_int sv_flags) 767a5f14abfSJohn Baldwin { 768a5f14abfSJohn Baldwin 769a5f14abfSJohn Baldwin if (sv_flags == 0) 7705842bd68SJohn Baldwin return (SYSDECODE_ABI_FREEBSD); 771a5f14abfSJohn Baldwin switch (sv_flags & SV_ABI_MASK) { 772a5f14abfSJohn Baldwin case SV_ABI_FREEBSD: 7735842bd68SJohn Baldwin return (SYSDECODE_ABI_FREEBSD); 774a5f14abfSJohn Baldwin #if defined(__amd64__) || defined(__i386__) 775a5f14abfSJohn Baldwin case SV_ABI_LINUX: 776a5f14abfSJohn Baldwin #ifdef __amd64__ 777a5f14abfSJohn Baldwin if (sv_flags & SV_ILP32) 7785842bd68SJohn Baldwin return (SYSDECODE_ABI_LINUX32); 779a5f14abfSJohn Baldwin #endif 7805842bd68SJohn Baldwin return (SYSDECODE_ABI_LINUX); 781a5f14abfSJohn Baldwin #endif 7826fb8946bSJohn Baldwin #if defined(__aarch64__) || defined(__amd64__) 7836fb8946bSJohn Baldwin case SV_ABI_CLOUDABI: 7846fb8946bSJohn Baldwin return (SYSDECODE_ABI_CLOUDABI64); 7856fb8946bSJohn Baldwin #endif 786a5f14abfSJohn Baldwin default: 7875842bd68SJohn Baldwin return (SYSDECODE_ABI_UNKNOWN); 788a5f14abfSJohn Baldwin } 789a5f14abfSJohn Baldwin } 790a5f14abfSJohn Baldwin 791a5f14abfSJohn Baldwin static void 792a5f14abfSJohn Baldwin syscallname(u_int code, u_int sv_flags) 793a5f14abfSJohn Baldwin { 794a5f14abfSJohn Baldwin const char *name; 795a5f14abfSJohn Baldwin 796a5f14abfSJohn Baldwin name = sysdecode_syscallname(syscallabi(sv_flags), code); 797a5f14abfSJohn Baldwin if (name == NULL) 798a5f14abfSJohn Baldwin printf("[%d]", code); 799a5f14abfSJohn Baldwin else { 800a5f14abfSJohn Baldwin printf("%s", name); 801a5f14abfSJohn Baldwin if (syscallno) 802a5f14abfSJohn Baldwin printf("[%d]", code); 803a5f14abfSJohn Baldwin } 804a5f14abfSJohn Baldwin } 805a5f14abfSJohn Baldwin 8069289f547SJohn Baldwin static void 8079289f547SJohn Baldwin print_signal(int signo) 8089289f547SJohn Baldwin { 8099289f547SJohn Baldwin const char *signame; 8109289f547SJohn Baldwin 8119289f547SJohn Baldwin signame = sysdecode_signal(signo); 8129289f547SJohn Baldwin if (signame != NULL) 8139289f547SJohn Baldwin printf("%s", signame); 8149289f547SJohn Baldwin else 8159289f547SJohn Baldwin printf("SIG %d", signo); 8169289f547SJohn Baldwin } 8179289f547SJohn Baldwin 81891fbb9c1SDavid Malone void 819a5f14abfSJohn Baldwin ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags) 8209b50d902SRodney W. Grimes { 82191fbb9c1SDavid Malone int narg = ktr->ktr_narg; 82271ed318eSJohn Baldwin register_t *ip, *first; 823c601ad8eSDag-Erling Smørgrav intmax_t arg; 82471ed318eSJohn Baldwin int quad_align, quad_slots; 8259b50d902SRodney W. Grimes 826a5f14abfSJohn Baldwin syscallname(ktr->ktr_code, sv_flags); 82771ed318eSJohn Baldwin ip = first = &ktr->ktr_args[0]; 8289b50d902SRodney W. Grimes if (narg) { 8299b50d902SRodney W. Grimes char c = '('; 8307144d36fSDmitry Chagin if (fancy && 831a5f14abfSJohn Baldwin (sv_flags == 0 || 832a5f14abfSJohn Baldwin (sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) { 83371ed318eSJohn Baldwin quad_align = 0; 83471ed318eSJohn Baldwin if (sv_flags & SV_ILP32) { 83571ed318eSJohn Baldwin #ifdef __powerpc__ 83671ed318eSJohn Baldwin quad_align = 1; 83771ed318eSJohn Baldwin #endif 83871ed318eSJohn Baldwin quad_slots = 2; 83971ed318eSJohn Baldwin } else 84071ed318eSJohn Baldwin quad_slots = 1; 84173430055SDag-Erling Smørgrav switch (ktr->ktr_code) { 8421ca6c7fcSJilles Tjoelker case SYS_bindat: 8431ca6c7fcSJilles Tjoelker case SYS_connectat: 8448447b7cdSJilles Tjoelker case SYS_faccessat: 8458447b7cdSJilles Tjoelker case SYS_fchmodat: 8468447b7cdSJilles Tjoelker case SYS_fchownat: 8478447b7cdSJilles Tjoelker case SYS_fstatat: 8488447b7cdSJilles Tjoelker case SYS_futimesat: 8498447b7cdSJilles Tjoelker case SYS_linkat: 8508447b7cdSJilles Tjoelker case SYS_mkdirat: 8518447b7cdSJilles Tjoelker case SYS_mkfifoat: 8528447b7cdSJilles Tjoelker case SYS_mknodat: 8538447b7cdSJilles Tjoelker case SYS_openat: 8548447b7cdSJilles Tjoelker case SYS_readlinkat: 8558447b7cdSJilles Tjoelker case SYS_renameat: 8568447b7cdSJilles Tjoelker case SYS_unlinkat: 8572205e0d1SJilles Tjoelker case SYS_utimensat: 8588447b7cdSJilles Tjoelker putchar('('); 8599289f547SJohn Baldwin print_integer_arg_valid(sysdecode_atfd, *ip); 8608447b7cdSJilles Tjoelker c = ','; 8618447b7cdSJilles Tjoelker ip++; 8628447b7cdSJilles Tjoelker narg--; 8638447b7cdSJilles Tjoelker break; 8648447b7cdSJilles Tjoelker } 8658447b7cdSJilles Tjoelker switch (ktr->ktr_code) { 86673430055SDag-Erling Smørgrav case SYS_ioctl: { 86798a68a58SAlexander Leidinger print_number(ip, narg, c); 868d09e66beSDag-Erling Smørgrav putchar(c); 869265e5898SJohn Baldwin ioctlname(*ip); 8709b50d902SRodney W. Grimes c = ','; 8719b50d902SRodney W. Grimes ip++; 8729b50d902SRodney W. Grimes narg--; 87373430055SDag-Erling Smørgrav break; 87473430055SDag-Erling Smørgrav } 87573430055SDag-Erling Smørgrav case SYS_ptrace: 87609307b25SDag-Erling Smørgrav putchar('('); 8779289f547SJohn Baldwin print_integer_arg(sysdecode_ptrace_request, *ip); 8789b50d902SRodney W. Grimes c = ','; 8799b50d902SRodney W. Grimes ip++; 8809b50d902SRodney W. Grimes narg--; 88173430055SDag-Erling Smørgrav break; 88273430055SDag-Erling Smørgrav case SYS_access: 88373430055SDag-Erling Smørgrav case SYS_eaccess: 8848447b7cdSJilles Tjoelker case SYS_faccessat: 88598a68a58SAlexander Leidinger print_number(ip, narg, c); 88609307b25SDag-Erling Smørgrav putchar(','); 8879289f547SJohn Baldwin print_mask_arg(sysdecode_access_mode, *ip); 88898a68a58SAlexander Leidinger ip++; 88998a68a58SAlexander Leidinger narg--; 89073430055SDag-Erling Smørgrav break; 89173430055SDag-Erling Smørgrav case SYS_open: 8928447b7cdSJilles Tjoelker case SYS_openat: 89398a68a58SAlexander Leidinger print_number(ip, narg, c); 89409307b25SDag-Erling Smørgrav putchar(','); 8959289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, ip[0]); 8969289f547SJohn Baldwin if ((ip[0] & O_CREAT) == O_CREAT) { 8979289f547SJohn Baldwin putchar(','); 8989289f547SJohn Baldwin decode_filemode(ip[1]); 8999289f547SJohn Baldwin } 90073430055SDag-Erling Smørgrav ip += 2; 90198a68a58SAlexander Leidinger narg -= 2; 90273430055SDag-Erling Smørgrav break; 90373430055SDag-Erling Smørgrav case SYS_wait4: 90498a68a58SAlexander Leidinger print_number(ip, narg, c); 90598a68a58SAlexander Leidinger print_number(ip, narg, c); 90609307b25SDag-Erling Smørgrav putchar(','); 9079289f547SJohn Baldwin print_mask_arg0(sysdecode_wait4_options, *ip); 90834763d1cSJohn Baldwin ip++; 90934763d1cSJohn Baldwin narg--; 91034763d1cSJohn Baldwin break; 91134763d1cSJohn Baldwin case SYS_wait6: 91234763d1cSJohn Baldwin putchar('('); 9139289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, *ip); 91434763d1cSJohn Baldwin c = ','; 91534763d1cSJohn Baldwin ip++; 91634763d1cSJohn Baldwin narg--; 91771ed318eSJohn Baldwin print_number64(first, ip, narg, c); 91834763d1cSJohn Baldwin print_number(ip, narg, c); 91934763d1cSJohn Baldwin putchar(','); 9209289f547SJohn Baldwin print_mask_arg(sysdecode_wait6_options, *ip); 92198a68a58SAlexander Leidinger ip++; 92298a68a58SAlexander Leidinger narg--; 92373430055SDag-Erling Smørgrav break; 92473430055SDag-Erling Smørgrav case SYS_chmod: 92573430055SDag-Erling Smørgrav case SYS_fchmod: 92673430055SDag-Erling Smørgrav case SYS_lchmod: 927eebea334SBaptiste Daroussin case SYS_fchmodat: 92898a68a58SAlexander Leidinger print_number(ip, narg, c); 92909307b25SDag-Erling Smørgrav putchar(','); 9309289f547SJohn Baldwin decode_filemode(*ip); 93198a68a58SAlexander Leidinger ip++; 93298a68a58SAlexander Leidinger narg--; 93373430055SDag-Erling Smørgrav break; 93473430055SDag-Erling Smørgrav case SYS_mknod: 9358447b7cdSJilles Tjoelker case SYS_mknodat: 93698a68a58SAlexander Leidinger print_number(ip, narg, c); 93709307b25SDag-Erling Smørgrav putchar(','); 9389289f547SJohn Baldwin decode_filemode(*ip); 93998a68a58SAlexander Leidinger ip++; 94098a68a58SAlexander Leidinger narg--; 94173430055SDag-Erling Smørgrav break; 94273430055SDag-Erling Smørgrav case SYS_getfsstat: 94398a68a58SAlexander Leidinger print_number(ip, narg, c); 94498a68a58SAlexander Leidinger print_number(ip, narg, c); 94509307b25SDag-Erling Smørgrav putchar(','); 94648f79574SJohn Baldwin print_integer_arg(sysdecode_getfsstat_mode, *ip); 94798a68a58SAlexander Leidinger ip++; 94898a68a58SAlexander Leidinger narg--; 94973430055SDag-Erling Smørgrav break; 95073430055SDag-Erling Smørgrav case SYS_mount: 95198a68a58SAlexander Leidinger print_number(ip, narg, c); 95298a68a58SAlexander Leidinger print_number(ip, narg, c); 95309307b25SDag-Erling Smørgrav putchar(','); 9549289f547SJohn Baldwin print_mask_arg(sysdecode_mount_flags, *ip); 95598a68a58SAlexander Leidinger ip++; 95698a68a58SAlexander Leidinger narg--; 95773430055SDag-Erling Smørgrav break; 95873430055SDag-Erling Smørgrav case SYS_unmount: 95998a68a58SAlexander Leidinger print_number(ip, narg, c); 96009307b25SDag-Erling Smørgrav putchar(','); 9619289f547SJohn Baldwin print_mask_arg(sysdecode_mount_flags, *ip); 96298a68a58SAlexander Leidinger ip++; 96398a68a58SAlexander Leidinger narg--; 96473430055SDag-Erling Smørgrav break; 96573430055SDag-Erling Smørgrav case SYS_recvmsg: 96673430055SDag-Erling Smørgrav case SYS_sendmsg: 96798a68a58SAlexander Leidinger print_number(ip, narg, c); 96898a68a58SAlexander Leidinger print_number(ip, narg, c); 96909307b25SDag-Erling Smørgrav putchar(','); 9709289f547SJohn Baldwin print_mask_arg0(sysdecode_msg_flags, *ip); 97198a68a58SAlexander Leidinger ip++; 97298a68a58SAlexander Leidinger narg--; 97373430055SDag-Erling Smørgrav break; 97473430055SDag-Erling Smørgrav case SYS_recvfrom: 97573430055SDag-Erling Smørgrav case SYS_sendto: 97698a68a58SAlexander Leidinger print_number(ip, narg, c); 97798a68a58SAlexander Leidinger print_number(ip, narg, c); 97898a68a58SAlexander Leidinger print_number(ip, narg, c); 97909307b25SDag-Erling Smørgrav putchar(','); 9809289f547SJohn Baldwin print_mask_arg0(sysdecode_msg_flags, *ip); 98198a68a58SAlexander Leidinger ip++; 98298a68a58SAlexander Leidinger narg--; 98373430055SDag-Erling Smørgrav break; 98473430055SDag-Erling Smørgrav case SYS_chflags: 98573430055SDag-Erling Smørgrav case SYS_fchflags: 98673430055SDag-Erling Smørgrav case SYS_lchflags: 98798a68a58SAlexander Leidinger print_number(ip, narg, c); 98809307b25SDag-Erling Smørgrav putchar(','); 9899289f547SJohn Baldwin decode_fileflags(*ip); 99098a68a58SAlexander Leidinger ip++; 99198a68a58SAlexander Leidinger narg--; 99273430055SDag-Erling Smørgrav break; 99373430055SDag-Erling Smørgrav case SYS_kill: 99498a68a58SAlexander Leidinger print_number(ip, narg, c); 99509307b25SDag-Erling Smørgrav putchar(','); 9969289f547SJohn Baldwin print_signal(*ip); 99798a68a58SAlexander Leidinger ip++; 99898a68a58SAlexander Leidinger narg--; 99973430055SDag-Erling Smørgrav break; 100073430055SDag-Erling Smørgrav case SYS_reboot: 100109307b25SDag-Erling Smørgrav putchar('('); 10029289f547SJohn Baldwin print_mask_arg(sysdecode_reboot_howto, *ip); 100398a68a58SAlexander Leidinger ip++; 100498a68a58SAlexander Leidinger narg--; 100573430055SDag-Erling Smørgrav break; 100673430055SDag-Erling Smørgrav case SYS_umask: 100709307b25SDag-Erling Smørgrav putchar('('); 10089289f547SJohn Baldwin decode_filemode(*ip); 100998a68a58SAlexander Leidinger ip++; 101098a68a58SAlexander Leidinger narg--; 101173430055SDag-Erling Smørgrav break; 101273430055SDag-Erling Smørgrav case SYS_msync: 101398a68a58SAlexander Leidinger print_number(ip, narg, c); 101498a68a58SAlexander Leidinger print_number(ip, narg, c); 101509307b25SDag-Erling Smørgrav putchar(','); 10169289f547SJohn Baldwin print_mask_arg(sysdecode_msync_flags, *ip); 101798a68a58SAlexander Leidinger ip++; 101898a68a58SAlexander Leidinger narg--; 101973430055SDag-Erling Smørgrav break; 1020cae1120aSPeter Wemm #ifdef SYS_freebsd6_mmap 102173430055SDag-Erling Smørgrav case SYS_freebsd6_mmap: 1022cae1120aSPeter Wemm print_number(ip, narg, c); 1023cae1120aSPeter Wemm print_number(ip, narg, c); 102409307b25SDag-Erling Smørgrav putchar(','); 10259289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip); 102609307b25SDag-Erling Smørgrav putchar(','); 1027cae1120aSPeter Wemm ip++; 1028cae1120aSPeter Wemm narg--; 10299289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, *ip); 1030cae1120aSPeter Wemm ip++; 1031cae1120aSPeter Wemm narg--; 103273430055SDag-Erling Smørgrav break; 1033cae1120aSPeter Wemm #endif 103473430055SDag-Erling Smørgrav case SYS_mmap: 103598a68a58SAlexander Leidinger print_number(ip, narg, c); 103698a68a58SAlexander Leidinger print_number(ip, narg, c); 103709307b25SDag-Erling Smørgrav putchar(','); 10389289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip); 103909307b25SDag-Erling Smørgrav putchar(','); 104098a68a58SAlexander Leidinger ip++; 104198a68a58SAlexander Leidinger narg--; 10429289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_flags, *ip); 104398a68a58SAlexander Leidinger ip++; 104498a68a58SAlexander Leidinger narg--; 104573430055SDag-Erling Smørgrav break; 104673430055SDag-Erling Smørgrav case SYS_mprotect: 104798a68a58SAlexander Leidinger print_number(ip, narg, c); 104898a68a58SAlexander Leidinger print_number(ip, narg, c); 104909307b25SDag-Erling Smørgrav putchar(','); 10509289f547SJohn Baldwin print_mask_arg(sysdecode_mmap_prot, *ip); 105198a68a58SAlexander Leidinger ip++; 105298a68a58SAlexander Leidinger narg--; 105373430055SDag-Erling Smørgrav break; 105473430055SDag-Erling Smørgrav case SYS_madvise: 105598a68a58SAlexander Leidinger print_number(ip, narg, c); 105698a68a58SAlexander Leidinger print_number(ip, narg, c); 105709307b25SDag-Erling Smørgrav putchar(','); 10589289f547SJohn Baldwin print_integer_arg(sysdecode_madvice, *ip); 105998a68a58SAlexander Leidinger ip++; 106098a68a58SAlexander Leidinger narg--; 106173430055SDag-Erling Smørgrav break; 106273430055SDag-Erling Smørgrav case SYS_setpriority: 106398a68a58SAlexander Leidinger print_number(ip, narg, c); 106498a68a58SAlexander Leidinger print_number(ip, narg, c); 106509307b25SDag-Erling Smørgrav putchar(','); 10669289f547SJohn Baldwin print_integer_arg(sysdecode_prio_which, *ip); 106798a68a58SAlexander Leidinger ip++; 106898a68a58SAlexander Leidinger narg--; 106973430055SDag-Erling Smørgrav break; 107073430055SDag-Erling Smørgrav case SYS_fcntl: 107198a68a58SAlexander Leidinger print_number(ip, narg, c); 107209307b25SDag-Erling Smørgrav putchar(','); 10739289f547SJohn Baldwin print_integer_arg(sysdecode_fcntl_cmd, ip[0]); 10749289f547SJohn Baldwin if (sysdecode_fcntl_arg_p(ip[0])) { 10759289f547SJohn Baldwin putchar(','); 10769289f547SJohn Baldwin if (ip[0] == F_SETFL) 10779289f547SJohn Baldwin print_mask_arg( 10789289f547SJohn Baldwin sysdecode_fcntl_fileflags, 10799289f547SJohn Baldwin ip[1]); 10809289f547SJohn Baldwin else 10819289f547SJohn Baldwin sysdecode_fcntl_arg(stdout, 10829289f547SJohn Baldwin ip[0], ip[1], 10839289f547SJohn Baldwin decimal ? 10 : 16); 10849289f547SJohn Baldwin } 108573430055SDag-Erling Smørgrav ip += 2; 108698a68a58SAlexander Leidinger narg -= 2; 108773430055SDag-Erling Smørgrav break; 108873430055SDag-Erling Smørgrav case SYS_socket: { 10898bc31d83SCraig Rodrigues int sockdomain; 109009307b25SDag-Erling Smørgrav putchar('('); 109195bb676aSDag-Erling Smørgrav sockdomain = *ip; 10929289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain, 10939289f547SJohn Baldwin sockdomain); 109498a68a58SAlexander Leidinger ip++; 109598a68a58SAlexander Leidinger narg--; 109609307b25SDag-Erling Smørgrav putchar(','); 10979289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, *ip); 109898a68a58SAlexander Leidinger ip++; 109998a68a58SAlexander Leidinger narg--; 11008bc31d83SCraig Rodrigues if (sockdomain == PF_INET || 11018bc31d83SCraig Rodrigues sockdomain == PF_INET6) { 110209307b25SDag-Erling Smørgrav putchar(','); 11039289f547SJohn Baldwin print_integer_arg(sysdecode_ipproto, 11049289f547SJohn Baldwin *ip); 11058bc31d83SCraig Rodrigues ip++; 11068bc31d83SCraig Rodrigues narg--; 11078bc31d83SCraig Rodrigues } 110898a68a58SAlexander Leidinger c = ','; 110973430055SDag-Erling Smørgrav break; 111073430055SDag-Erling Smørgrav } 111173430055SDag-Erling Smørgrav case SYS_setsockopt: 11129289f547SJohn Baldwin case SYS_getsockopt: { 11139289f547SJohn Baldwin const char *str; 11149289f547SJohn Baldwin 111598a68a58SAlexander Leidinger print_number(ip, narg, c); 111609307b25SDag-Erling Smørgrav putchar(','); 11179289f547SJohn Baldwin print_integer_arg_valid(sysdecode_sockopt_level, 11189289f547SJohn Baldwin *ip); 11199289f547SJohn Baldwin str = sysdecode_sockopt_name(ip[0], ip[1]); 11209289f547SJohn Baldwin if (str != NULL) { 11219289f547SJohn Baldwin printf(",%s", str); 112298a68a58SAlexander Leidinger ip++; 112398a68a58SAlexander Leidinger narg--; 11240460d351SJohn Baldwin } 112598a68a58SAlexander Leidinger ip++; 112698a68a58SAlexander Leidinger narg--; 112773430055SDag-Erling Smørgrav break; 11289289f547SJohn Baldwin } 1129cae1120aSPeter Wemm #ifdef SYS_freebsd6_lseek 113073430055SDag-Erling Smørgrav case SYS_freebsd6_lseek: 113198a68a58SAlexander Leidinger print_number(ip, narg, c); 113298a68a58SAlexander Leidinger /* Hidden 'pad' argument, not in lseek(2) */ 113398a68a58SAlexander Leidinger print_number(ip, narg, c); 113471ed318eSJohn Baldwin print_number64(first, ip, narg, c); 113509307b25SDag-Erling Smørgrav putchar(','); 11369289f547SJohn Baldwin print_integer_arg(sysdecode_whence, *ip); 113798a68a58SAlexander Leidinger ip++; 113898a68a58SAlexander Leidinger narg--; 113973430055SDag-Erling Smørgrav break; 1140cae1120aSPeter Wemm #endif 114173430055SDag-Erling Smørgrav case SYS_lseek: 1142cae1120aSPeter Wemm print_number(ip, narg, c); 114371ed318eSJohn Baldwin print_number64(first, ip, narg, c); 114409307b25SDag-Erling Smørgrav putchar(','); 11459289f547SJohn Baldwin print_integer_arg(sysdecode_whence, *ip); 1146cae1120aSPeter Wemm ip++; 1147cae1120aSPeter Wemm narg--; 114873430055SDag-Erling Smørgrav break; 114973430055SDag-Erling Smørgrav case SYS_flock: 115098a68a58SAlexander Leidinger print_number(ip, narg, c); 115109307b25SDag-Erling Smørgrav putchar(','); 11529289f547SJohn Baldwin print_mask_arg(sysdecode_flock_operation, *ip); 115398a68a58SAlexander Leidinger ip++; 115498a68a58SAlexander Leidinger narg--; 115573430055SDag-Erling Smørgrav break; 115673430055SDag-Erling Smørgrav case SYS_mkfifo: 11578447b7cdSJilles Tjoelker case SYS_mkfifoat: 115873430055SDag-Erling Smørgrav case SYS_mkdir: 11598447b7cdSJilles Tjoelker case SYS_mkdirat: 116098a68a58SAlexander Leidinger print_number(ip, narg, c); 116109307b25SDag-Erling Smørgrav putchar(','); 11629289f547SJohn Baldwin decode_filemode(*ip); 116398a68a58SAlexander Leidinger ip++; 116498a68a58SAlexander Leidinger narg--; 116573430055SDag-Erling Smørgrav break; 116673430055SDag-Erling Smørgrav case SYS_shutdown: 116798a68a58SAlexander Leidinger print_number(ip, narg, c); 116809307b25SDag-Erling Smørgrav putchar(','); 11699289f547SJohn Baldwin print_integer_arg(sysdecode_shutdown_how, *ip); 117098a68a58SAlexander Leidinger ip++; 117198a68a58SAlexander Leidinger narg--; 117273430055SDag-Erling Smørgrav break; 117373430055SDag-Erling Smørgrav case SYS_socketpair: 117409307b25SDag-Erling Smørgrav putchar('('); 11759289f547SJohn Baldwin print_integer_arg(sysdecode_socketdomain, *ip); 117698a68a58SAlexander Leidinger ip++; 117798a68a58SAlexander Leidinger narg--; 117809307b25SDag-Erling Smørgrav putchar(','); 11799289f547SJohn Baldwin print_mask_arg(sysdecode_socket_type, *ip); 118098a68a58SAlexander Leidinger ip++; 118198a68a58SAlexander Leidinger narg--; 118298a68a58SAlexander Leidinger c = ','; 118373430055SDag-Erling Smørgrav break; 118473430055SDag-Erling Smørgrav case SYS_getrlimit: 118573430055SDag-Erling Smørgrav case SYS_setrlimit: 118609307b25SDag-Erling Smørgrav putchar('('); 11879289f547SJohn Baldwin print_integer_arg(sysdecode_rlimit, *ip); 118898a68a58SAlexander Leidinger ip++; 118998a68a58SAlexander Leidinger narg--; 119098a68a58SAlexander Leidinger c = ','; 119173430055SDag-Erling Smørgrav 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: 121409307b25SDag-Erling Smørgrav putchar('('); 12159289f547SJohn Baldwin print_integer_arg(sysdecode_rtprio_function, 12169289f547SJohn Baldwin *ip); 121798a68a58SAlexander Leidinger ip++; 121898a68a58SAlexander Leidinger narg--; 121998a68a58SAlexander Leidinger c = ','; 122073430055SDag-Erling Smørgrav break; 122173430055SDag-Erling Smørgrav case SYS___semctl: 122298a68a58SAlexander Leidinger print_number(ip, narg, c); 122398a68a58SAlexander Leidinger print_number(ip, narg, c); 122409307b25SDag-Erling Smørgrav putchar(','); 12259289f547SJohn Baldwin print_integer_arg(sysdecode_semctl_cmd, *ip); 122698a68a58SAlexander Leidinger ip++; 122798a68a58SAlexander Leidinger narg--; 122873430055SDag-Erling Smørgrav break; 122973430055SDag-Erling Smørgrav case SYS_semget: 123098a68a58SAlexander Leidinger print_number(ip, narg, c); 123198a68a58SAlexander Leidinger print_number(ip, narg, c); 123209307b25SDag-Erling Smørgrav putchar(','); 12339289f547SJohn Baldwin print_mask_arg(sysdecode_semget_flags, *ip); 123498a68a58SAlexander Leidinger ip++; 123598a68a58SAlexander Leidinger narg--; 123673430055SDag-Erling Smørgrav break; 123773430055SDag-Erling Smørgrav case SYS_msgctl: 123898a68a58SAlexander Leidinger print_number(ip, narg, c); 123909307b25SDag-Erling Smørgrav putchar(','); 12409289f547SJohn Baldwin print_integer_arg(sysdecode_msgctl_cmd, *ip); 124198a68a58SAlexander Leidinger ip++; 124298a68a58SAlexander Leidinger narg--; 124373430055SDag-Erling Smørgrav break; 124473430055SDag-Erling Smørgrav case SYS_shmat: 124598a68a58SAlexander Leidinger print_number(ip, narg, c); 124698a68a58SAlexander Leidinger print_number(ip, narg, c); 124709307b25SDag-Erling Smørgrav putchar(','); 12489289f547SJohn Baldwin print_mask_arg(sysdecode_shmat_flags, *ip); 124998a68a58SAlexander Leidinger ip++; 125098a68a58SAlexander Leidinger narg--; 125173430055SDag-Erling Smørgrav break; 125273430055SDag-Erling Smørgrav case SYS_shmctl: 125398a68a58SAlexander Leidinger print_number(ip, narg, c); 125409307b25SDag-Erling Smørgrav putchar(','); 12559289f547SJohn Baldwin print_integer_arg(sysdecode_shmctl_cmd, *ip); 125698a68a58SAlexander Leidinger ip++; 125798a68a58SAlexander Leidinger narg--; 125873430055SDag-Erling Smørgrav break; 1259777d35f4SRui Paulo case SYS_shm_open: 1260777d35f4SRui Paulo print_number(ip, narg, c); 1261777d35f4SRui Paulo putchar(','); 12629289f547SJohn Baldwin print_mask_arg(sysdecode_open_flags, ip[0]); 12639289f547SJohn Baldwin putchar(','); 12649289f547SJohn Baldwin decode_filemode(ip[1]); 12659289f547SJohn Baldwin ip += 2; 12669289f547SJohn Baldwin narg -= 2; 1267777d35f4SRui Paulo break; 126873430055SDag-Erling Smørgrav case SYS_minherit: 126998a68a58SAlexander Leidinger print_number(ip, narg, c); 127098a68a58SAlexander Leidinger print_number(ip, narg, c); 127109307b25SDag-Erling Smørgrav putchar(','); 12729289f547SJohn Baldwin print_integer_arg(sysdecode_minherit_inherit, 12739289f547SJohn Baldwin *ip); 127498a68a58SAlexander Leidinger ip++; 127598a68a58SAlexander Leidinger narg--; 127673430055SDag-Erling Smørgrav break; 127773430055SDag-Erling Smørgrav case SYS_rfork: 127809307b25SDag-Erling Smørgrav putchar('('); 12799289f547SJohn Baldwin print_mask_arg(sysdecode_rfork_flags, *ip); 128098a68a58SAlexander Leidinger ip++; 128198a68a58SAlexander Leidinger narg--; 128298a68a58SAlexander Leidinger c = ','; 128373430055SDag-Erling Smørgrav break; 128473430055SDag-Erling Smørgrav case SYS_lio_listio: 128509307b25SDag-Erling Smørgrav putchar('('); 12869289f547SJohn Baldwin print_integer_arg(sysdecode_lio_listio_mode, 12879289f547SJohn Baldwin *ip); 128898a68a58SAlexander Leidinger ip++; 128998a68a58SAlexander Leidinger narg--; 129098a68a58SAlexander Leidinger c = ','; 129173430055SDag-Erling Smørgrav break; 129273430055SDag-Erling Smørgrav case SYS_mlockall: 129309307b25SDag-Erling Smørgrav putchar('('); 12949289f547SJohn Baldwin print_mask_arg(sysdecode_mlockall_flags, *ip); 129598a68a58SAlexander Leidinger ip++; 129698a68a58SAlexander Leidinger narg--; 129773430055SDag-Erling Smørgrav break; 129873430055SDag-Erling Smørgrav case SYS_sched_setscheduler: 129998a68a58SAlexander Leidinger print_number(ip, narg, c); 130009307b25SDag-Erling Smørgrav putchar(','); 13019289f547SJohn Baldwin print_integer_arg(sysdecode_scheduler_policy, 13029289f547SJohn Baldwin *ip); 130398a68a58SAlexander Leidinger ip++; 130498a68a58SAlexander Leidinger narg--; 130573430055SDag-Erling Smørgrav break; 130673430055SDag-Erling Smørgrav case SYS_sched_get_priority_max: 130773430055SDag-Erling Smørgrav case SYS_sched_get_priority_min: 130809307b25SDag-Erling Smørgrav putchar('('); 13099289f547SJohn Baldwin print_integer_arg(sysdecode_scheduler_policy, 13109289f547SJohn Baldwin *ip); 131198a68a58SAlexander Leidinger ip++; 131298a68a58SAlexander Leidinger narg--; 131373430055SDag-Erling Smørgrav break; 131473430055SDag-Erling Smørgrav case SYS_sendfile: 131598a68a58SAlexander Leidinger print_number(ip, narg, c); 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); 132109307b25SDag-Erling Smørgrav putchar(','); 13229289f547SJohn Baldwin print_mask_arg(sysdecode_sendfile_flags, *ip); 132398a68a58SAlexander Leidinger ip++; 132498a68a58SAlexander Leidinger narg--; 132573430055SDag-Erling Smørgrav break; 132673430055SDag-Erling Smørgrav case SYS_kldsym: 132798a68a58SAlexander Leidinger print_number(ip, narg, c); 132809307b25SDag-Erling Smørgrav putchar(','); 13299289f547SJohn Baldwin print_integer_arg(sysdecode_kldsym_cmd, *ip); 133098a68a58SAlexander Leidinger ip++; 133198a68a58SAlexander Leidinger narg--; 133273430055SDag-Erling Smørgrav break; 133373430055SDag-Erling Smørgrav case SYS_sigprocmask: 133409307b25SDag-Erling Smørgrav putchar('('); 13359289f547SJohn Baldwin print_integer_arg(sysdecode_sigprocmask_how, 13369289f547SJohn Baldwin *ip); 133798a68a58SAlexander Leidinger ip++; 133898a68a58SAlexander Leidinger narg--; 133998a68a58SAlexander Leidinger c = ','; 134073430055SDag-Erling Smørgrav break; 134173430055SDag-Erling Smørgrav case SYS___acl_get_file: 134273430055SDag-Erling Smørgrav case SYS___acl_set_file: 134373430055SDag-Erling Smørgrav case SYS___acl_get_fd: 134473430055SDag-Erling Smørgrav case SYS___acl_set_fd: 134573430055SDag-Erling Smørgrav case SYS___acl_delete_file: 134673430055SDag-Erling Smørgrav case SYS___acl_delete_fd: 134773430055SDag-Erling Smørgrav case SYS___acl_aclcheck_file: 134873430055SDag-Erling Smørgrav case SYS___acl_aclcheck_fd: 134973430055SDag-Erling Smørgrav case SYS___acl_get_link: 135073430055SDag-Erling Smørgrav case SYS___acl_set_link: 135173430055SDag-Erling Smørgrav case SYS___acl_delete_link: 135273430055SDag-Erling Smørgrav case SYS___acl_aclcheck_link: 135398a68a58SAlexander Leidinger print_number(ip, narg, c); 135409307b25SDag-Erling Smørgrav putchar(','); 13559289f547SJohn Baldwin print_integer_arg(sysdecode_acltype, *ip); 135698a68a58SAlexander Leidinger ip++; 135798a68a58SAlexander Leidinger narg--; 135873430055SDag-Erling Smørgrav break; 135973430055SDag-Erling Smørgrav case SYS_sigaction: 136009307b25SDag-Erling Smørgrav putchar('('); 13619289f547SJohn Baldwin print_signal(*ip); 136298a68a58SAlexander Leidinger ip++; 136398a68a58SAlexander Leidinger narg--; 136498a68a58SAlexander Leidinger c = ','; 136573430055SDag-Erling Smørgrav break; 136673430055SDag-Erling Smørgrav case SYS_extattrctl: 136798a68a58SAlexander Leidinger print_number(ip, narg, c); 136809307b25SDag-Erling Smørgrav putchar(','); 13699289f547SJohn Baldwin print_integer_arg(sysdecode_extattrnamespace, 13709289f547SJohn Baldwin *ip); 137198a68a58SAlexander Leidinger ip++; 137298a68a58SAlexander Leidinger narg--; 137373430055SDag-Erling Smørgrav break; 137473430055SDag-Erling Smørgrav case SYS_nmount: 137598a68a58SAlexander Leidinger print_number(ip, narg, c); 137698a68a58SAlexander Leidinger print_number(ip, narg, c); 137709307b25SDag-Erling Smørgrav putchar(','); 13789289f547SJohn Baldwin print_mask_arg(sysdecode_mount_flags, *ip); 137998a68a58SAlexander Leidinger ip++; 138098a68a58SAlexander Leidinger narg--; 138173430055SDag-Erling Smørgrav break; 138273430055SDag-Erling Smørgrav case SYS_thr_create: 138398a68a58SAlexander Leidinger print_number(ip, narg, c); 138498a68a58SAlexander Leidinger print_number(ip, narg, c); 138509307b25SDag-Erling Smørgrav putchar(','); 13869289f547SJohn Baldwin print_mask_arg(sysdecode_thr_create_flags, *ip); 138798a68a58SAlexander Leidinger ip++; 138898a68a58SAlexander Leidinger narg--; 138973430055SDag-Erling Smørgrav break; 139073430055SDag-Erling Smørgrav case SYS_thr_kill: 139198a68a58SAlexander Leidinger print_number(ip, narg, c); 139209307b25SDag-Erling Smørgrav putchar(','); 13939289f547SJohn Baldwin print_signal(*ip); 139498a68a58SAlexander Leidinger ip++; 139598a68a58SAlexander Leidinger narg--; 139673430055SDag-Erling Smørgrav break; 139773430055SDag-Erling Smørgrav case SYS_kldunloadf: 139898a68a58SAlexander Leidinger print_number(ip, narg, c); 139909307b25SDag-Erling Smørgrav putchar(','); 14009289f547SJohn Baldwin print_integer_arg(sysdecode_kldunload_flags, 14019289f547SJohn Baldwin *ip); 140298a68a58SAlexander Leidinger ip++; 140398a68a58SAlexander Leidinger narg--; 140473430055SDag-Erling Smørgrav break; 14058447b7cdSJilles Tjoelker case SYS_linkat: 14068447b7cdSJilles Tjoelker case SYS_renameat: 14078447b7cdSJilles Tjoelker case SYS_symlinkat: 14088447b7cdSJilles Tjoelker print_number(ip, narg, c); 14098447b7cdSJilles Tjoelker putchar(','); 14109289f547SJohn Baldwin print_integer_arg_valid(sysdecode_atfd, *ip); 14118447b7cdSJilles Tjoelker ip++; 14128447b7cdSJilles Tjoelker narg--; 14138447b7cdSJilles Tjoelker break; 14142609222aSPawel Jakub Dawidek case SYS_cap_fcntls_limit: 14152609222aSPawel Jakub Dawidek print_number(ip, narg, c); 14162609222aSPawel Jakub Dawidek putchar(','); 14172609222aSPawel Jakub Dawidek arg = *ip; 14182609222aSPawel Jakub Dawidek ip++; 14192609222aSPawel Jakub Dawidek narg--; 14209289f547SJohn Baldwin print_mask_arg32(sysdecode_cap_fcntlrights, arg); 14212609222aSPawel Jakub Dawidek break; 1422145e6aa9SJohn Baldwin case SYS_posix_fadvise: 1423145e6aa9SJohn Baldwin print_number(ip, narg, c); 1424145e6aa9SJohn Baldwin print_number(ip, narg, c); 1425145e6aa9SJohn Baldwin print_number(ip, narg, c); 1426145e6aa9SJohn Baldwin (void)putchar(','); 14279289f547SJohn Baldwin print_integer_arg(sysdecode_fadvice, *ip); 1428145e6aa9SJohn Baldwin ip++; 1429145e6aa9SJohn Baldwin narg--; 1430145e6aa9SJohn Baldwin break; 143155648840SJohn Baldwin case SYS_procctl: 143255648840SJohn Baldwin putchar('('); 14339289f547SJohn Baldwin print_integer_arg(sysdecode_idtype, *ip); 143455648840SJohn Baldwin c = ','; 143555648840SJohn Baldwin ip++; 143655648840SJohn Baldwin narg--; 143771ed318eSJohn Baldwin print_number64(first, ip, narg, c); 143855648840SJohn Baldwin putchar(','); 14399289f547SJohn Baldwin print_integer_arg(sysdecode_procctl_cmd, *ip); 144055648840SJohn Baldwin ip++; 144155648840SJohn Baldwin narg--; 144255648840SJohn Baldwin break; 1443fdb5bf37SJohn Baldwin case SYS__umtx_op: 1444fdb5bf37SJohn Baldwin print_number(ip, narg, c); 1445fdb5bf37SJohn Baldwin putchar(','); 14469289f547SJohn Baldwin print_integer_arg(sysdecode_umtx_op, *ip); 1447fdb5bf37SJohn Baldwin switch (*ip) { 1448fdb5bf37SJohn Baldwin case UMTX_OP_CV_WAIT: 1449fdb5bf37SJohn Baldwin ip++; 1450fdb5bf37SJohn Baldwin narg--; 1451fdb5bf37SJohn Baldwin putchar(','); 14529289f547SJohn Baldwin print_mask_argul( 14539289f547SJohn Baldwin sysdecode_umtx_cvwait_flags, *ip); 1454fdb5bf37SJohn Baldwin break; 1455fdb5bf37SJohn Baldwin case UMTX_OP_RW_RDLOCK: 1456fdb5bf37SJohn Baldwin ip++; 1457fdb5bf37SJohn Baldwin narg--; 1458fdb5bf37SJohn Baldwin putchar(','); 14599289f547SJohn Baldwin print_mask_argul( 14609289f547SJohn Baldwin sysdecode_umtx_rwlock_flags, *ip); 1461fdb5bf37SJohn Baldwin break; 1462fdb5bf37SJohn Baldwin } 1463fdb5bf37SJohn Baldwin ip++; 1464fdb5bf37SJohn Baldwin narg--; 14658dec6942SJohn Baldwin break; 14668dec6942SJohn Baldwin case SYS_ftruncate: 14678dec6942SJohn Baldwin case SYS_truncate: 14688dec6942SJohn Baldwin print_number(ip, narg, c); 14698dec6942SJohn Baldwin print_number64(first, ip, narg, c); 14708dec6942SJohn Baldwin break; 14719b50d902SRodney W. Grimes } 14729b50d902SRodney W. Grimes } 147348f6dd8aSAttilio Rao while (narg > 0) { 147498a68a58SAlexander Leidinger print_number(ip, narg, c); 14759b50d902SRodney W. Grimes } 147609307b25SDag-Erling Smørgrav putchar(')'); 14779b50d902SRodney W. Grimes } 147809307b25SDag-Erling Smørgrav putchar('\n'); 14799b50d902SRodney W. Grimes } 14809b50d902SRodney W. Grimes 148191fbb9c1SDavid Malone void 1482a5f14abfSJohn Baldwin ktrsysret(struct ktr_sysret *ktr, u_int sv_flags) 14839b50d902SRodney W. Grimes { 148491fbb9c1SDavid Malone register_t ret = ktr->ktr_retval; 148591fbb9c1SDavid Malone int error = ktr->ktr_error; 14869b50d902SRodney W. Grimes 1487a5f14abfSJohn Baldwin syscallname(ktr->ktr_code, sv_flags); 1488b9034ce2SBryan Drewery printf(" "); 14899b50d902SRodney W. Grimes 14909b50d902SRodney W. Grimes if (error == 0) { 14919b50d902SRodney W. Grimes if (fancy) { 149209307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 14939b50d902SRodney W. Grimes if (ret < 0 || ret > 9) 149409307b25SDag-Erling Smørgrav printf("/%#lx", (unsigned long)ret); 14959b50d902SRodney W. Grimes } else { 14969b50d902SRodney W. Grimes if (decimal) 149709307b25SDag-Erling Smørgrav printf("%ld", (long)ret); 14989b50d902SRodney W. Grimes else 149909307b25SDag-Erling Smørgrav printf("%#lx", (unsigned long)ret); 15009b50d902SRodney W. Grimes } 15019b50d902SRodney W. Grimes } else if (error == ERESTART) 150209307b25SDag-Erling Smørgrav printf("RESTART"); 15039b50d902SRodney W. Grimes else if (error == EJUSTRETURN) 150409307b25SDag-Erling Smørgrav printf("JUSTRETURN"); 15059b50d902SRodney W. Grimes else { 1506287b96ddSJohn Baldwin printf("-1 errno %d", sysdecode_freebsd_to_abi_errno( 1507287b96ddSJohn Baldwin syscallabi(sv_flags), error)); 15089b50d902SRodney W. Grimes if (fancy) 150909307b25SDag-Erling Smørgrav printf(" %s", strerror(ktr->ktr_error)); 15109b50d902SRodney W. Grimes } 151109307b25SDag-Erling Smørgrav putchar('\n'); 15129b50d902SRodney W. Grimes } 15139b50d902SRodney W. Grimes 151491fbb9c1SDavid Malone void 151591fbb9c1SDavid Malone ktrnamei(char *cp, int len) 15169b50d902SRodney W. Grimes { 151709307b25SDag-Erling Smørgrav printf("\"%.*s\"\n", len, cp); 15189b50d902SRodney W. Grimes } 15199b50d902SRodney W. Grimes 152091fbb9c1SDavid Malone void 1521ec4beb5dSPeter Wemm hexdump(char *p, int len, int screenwidth) 15229b50d902SRodney W. Grimes { 1523ec4beb5dSPeter Wemm int n, i; 1524ec4beb5dSPeter Wemm int width; 1525ec4beb5dSPeter Wemm 1526ec4beb5dSPeter Wemm width = 0; 1527ec4beb5dSPeter Wemm do { 1528ec4beb5dSPeter Wemm width += 2; 1529ec4beb5dSPeter Wemm i = 13; /* base offset */ 1530ec4beb5dSPeter Wemm i += (width / 2) + 1; /* spaces every second byte */ 1531ec4beb5dSPeter Wemm i += (width * 2); /* width of bytes */ 1532ec4beb5dSPeter Wemm i += 3; /* " |" */ 1533ec4beb5dSPeter Wemm i += width; /* each byte */ 1534ec4beb5dSPeter Wemm i += 1; /* "|" */ 1535ec4beb5dSPeter Wemm } while (i < screenwidth); 1536ec4beb5dSPeter Wemm width -= 2; 1537ec4beb5dSPeter Wemm 1538ec4beb5dSPeter Wemm for (n = 0; n < len; n += width) { 1539ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1540ec4beb5dSPeter Wemm if ((i % width) == 0) { /* beginning of line */ 1541ec4beb5dSPeter Wemm printf(" 0x%04x", i); 1542ec4beb5dSPeter Wemm } 1543ec4beb5dSPeter Wemm if ((i % 2) == 0) { 1544ec4beb5dSPeter Wemm printf(" "); 1545ec4beb5dSPeter Wemm } 1546ec4beb5dSPeter Wemm if (i < len) 1547ec4beb5dSPeter Wemm printf("%02x", p[i] & 0xff); 1548ec4beb5dSPeter Wemm else 1549ec4beb5dSPeter Wemm printf(" "); 1550ec4beb5dSPeter Wemm } 1551ec4beb5dSPeter Wemm printf(" |"); 1552ec4beb5dSPeter Wemm for (i = n; i < n + width; i++) { 1553ec4beb5dSPeter Wemm if (i >= len) 1554ec4beb5dSPeter Wemm break; 1555ec4beb5dSPeter Wemm if (p[i] >= ' ' && p[i] <= '~') 1556ec4beb5dSPeter Wemm printf("%c", p[i]); 1557ec4beb5dSPeter Wemm else 1558ec4beb5dSPeter Wemm printf("."); 1559ec4beb5dSPeter Wemm } 1560ec4beb5dSPeter Wemm printf("|\n"); 1561ec4beb5dSPeter Wemm } 1562ec4beb5dSPeter Wemm if ((i % width) != 0) 1563ec4beb5dSPeter Wemm printf("\n"); 1564ec4beb5dSPeter Wemm } 1565ec4beb5dSPeter Wemm 1566ec4beb5dSPeter Wemm void 1567ec4beb5dSPeter Wemm visdump(char *dp, int datalen, int screenwidth) 1568ec4beb5dSPeter Wemm { 156991fbb9c1SDavid Malone int col = 0; 1570ec4beb5dSPeter Wemm char *cp; 157191fbb9c1SDavid Malone int width; 15729b50d902SRodney W. Grimes char visbuf[5]; 15739b50d902SRodney W. Grimes 157409307b25SDag-Erling Smørgrav printf(" \""); 15759b50d902SRodney W. Grimes col = 8; 15769b50d902SRodney W. Grimes for (;datalen > 0; datalen--, dp++) { 157709307b25SDag-Erling Smørgrav vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 15789b50d902SRodney W. Grimes cp = visbuf; 15799b50d902SRodney W. Grimes /* 15809b50d902SRodney W. Grimes * Keep track of printables and 15819b50d902SRodney W. Grimes * space chars (like fold(1)). 15829b50d902SRodney W. Grimes */ 15839b50d902SRodney W. Grimes if (col == 0) { 158409307b25SDag-Erling Smørgrav putchar('\t'); 15859b50d902SRodney W. Grimes col = 8; 15869b50d902SRodney W. Grimes } 15879b50d902SRodney W. Grimes switch(*cp) { 15889b50d902SRodney W. Grimes case '\n': 15899b50d902SRodney W. Grimes col = 0; 159009307b25SDag-Erling Smørgrav putchar('\n'); 15919b50d902SRodney W. Grimes continue; 15929b50d902SRodney W. Grimes case '\t': 15939b50d902SRodney W. Grimes width = 8 - (col&07); 15949b50d902SRodney W. Grimes break; 15959b50d902SRodney W. Grimes default: 15969b50d902SRodney W. Grimes width = strlen(cp); 15979b50d902SRodney W. Grimes } 15989b50d902SRodney W. Grimes if (col + width > (screenwidth-2)) { 159909307b25SDag-Erling Smørgrav printf("\\\n\t"); 16009b50d902SRodney W. Grimes col = 8; 16019b50d902SRodney W. Grimes } 16029b50d902SRodney W. Grimes col += width; 16039b50d902SRodney W. Grimes do { 160409307b25SDag-Erling Smørgrav putchar(*cp++); 16059b50d902SRodney W. Grimes } while (*cp); 16069b50d902SRodney W. Grimes } 16079b50d902SRodney W. Grimes if (col == 0) 160809307b25SDag-Erling Smørgrav printf(" "); 160909307b25SDag-Erling Smørgrav printf("\"\n"); 16109b50d902SRodney W. Grimes } 16119b50d902SRodney W. Grimes 1612ec4beb5dSPeter Wemm void 1613ec4beb5dSPeter Wemm ktrgenio(struct ktr_genio *ktr, int len) 1614ec4beb5dSPeter Wemm { 1615ec4beb5dSPeter Wemm int datalen = len - sizeof (struct ktr_genio); 1616ec4beb5dSPeter Wemm char *dp = (char *)ktr + sizeof (struct ktr_genio); 1617ec4beb5dSPeter Wemm static int screenwidth = 0; 1618ec4beb5dSPeter Wemm int i, binary; 1619ec4beb5dSPeter Wemm 16204b0ae512SPawel Jakub Dawidek printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 16214b0ae512SPawel Jakub Dawidek ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 16224b0ae512SPawel Jakub Dawidek datalen == 1 ? "" : "s"); 16234b0ae512SPawel Jakub Dawidek if (suppressdata) 16244b0ae512SPawel Jakub Dawidek return; 1625ec4beb5dSPeter Wemm if (screenwidth == 0) { 1626ec4beb5dSPeter Wemm struct winsize ws; 1627ec4beb5dSPeter Wemm 1628ec4beb5dSPeter Wemm if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 1629ec4beb5dSPeter Wemm ws.ws_col > 8) 1630ec4beb5dSPeter Wemm screenwidth = ws.ws_col; 1631ec4beb5dSPeter Wemm else 1632ec4beb5dSPeter Wemm screenwidth = 80; 1633ec4beb5dSPeter Wemm } 1634ec4beb5dSPeter Wemm if (maxdata && datalen > maxdata) 1635ec4beb5dSPeter Wemm datalen = maxdata; 1636ec4beb5dSPeter Wemm 1637ec4beb5dSPeter Wemm for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 1638ec4beb5dSPeter Wemm if (dp[i] >= 32 && dp[i] < 127) 1639ec4beb5dSPeter Wemm continue; 1640ec4beb5dSPeter Wemm if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 1641ec4beb5dSPeter Wemm continue; 1642ec4beb5dSPeter Wemm binary = 1; 1643ec4beb5dSPeter Wemm } 1644ec4beb5dSPeter Wemm if (binary) 1645ec4beb5dSPeter Wemm hexdump(dp, datalen, screenwidth); 1646ec4beb5dSPeter Wemm else 1647ec4beb5dSPeter Wemm visdump(dp, datalen, screenwidth); 1648ec4beb5dSPeter Wemm } 1649ec4beb5dSPeter Wemm 165091fbb9c1SDavid Malone void 1651dde5f9b9SDmitry Chagin ktrpsig(struct ktr_psig *psig) 16529b50d902SRodney W. Grimes { 16539289f547SJohn Baldwin const char *str; 16549289f547SJohn Baldwin 16559289f547SJohn Baldwin print_signal(psig->signo); 16565677eef9SJilles Tjoelker if (psig->action == SIG_DFL) { 16579289f547SJohn Baldwin printf(" SIG_DFL"); 16585677eef9SJilles Tjoelker } else { 16599289f547SJohn Baldwin printf(" caught handler=0x%lx mask=0x%x", 16605677eef9SJilles Tjoelker (u_long)psig->action, psig->mask.__bits[0]); 166191fbb9c1SDavid Malone } 16629289f547SJohn Baldwin printf(" code="); 16639289f547SJohn Baldwin str = sysdecode_sigcode(psig->signo, psig->code); 16649289f547SJohn Baldwin if (str != NULL) 16659289f547SJohn Baldwin printf("%s", str); 16669289f547SJohn Baldwin else 16679289f547SJohn Baldwin printf("<invalid=%#x>", psig->code); 16689289f547SJohn Baldwin putchar('\n'); 16699b50d902SRodney W. Grimes } 16709b50d902SRodney W. Grimes 167191fbb9c1SDavid Malone void 167288bf5036SJohn Baldwin ktrcsw_old(struct ktr_csw_old *cs) 16739b50d902SRodney W. Grimes { 167409307b25SDag-Erling Smørgrav printf("%s %s\n", cs->out ? "stop" : "resume", 16759b50d902SRodney W. Grimes cs->user ? "user" : "kernel"); 16769b50d902SRodney W. Grimes } 16779b50d902SRodney W. Grimes 167888bf5036SJohn Baldwin void 167988bf5036SJohn Baldwin ktrcsw(struct ktr_csw *cs) 168088bf5036SJohn Baldwin { 168188bf5036SJohn Baldwin printf("%s %s \"%s\"\n", cs->out ? "stop" : "resume", 168288bf5036SJohn Baldwin cs->user ? "user" : "kernel", cs->wmesg); 168388bf5036SJohn Baldwin } 168488bf5036SJohn Baldwin 168591fbb9c1SDavid Malone void 1686bb1a2d4aSJohn Baldwin ktruser(int len, void *p) 168782e2dd32SPoul-Henning Kamp { 1688bb1a2d4aSJohn Baldwin unsigned char *cp; 1689670b9e9fSJohn Baldwin 1690d6fb4894SJohn Baldwin if (sysdecode_utrace(stdout, p, len)) { 1691195aef99SBryan Drewery printf("\n"); 1692670b9e9fSJohn Baldwin return; 1693670b9e9fSJohn Baldwin } 1694670b9e9fSJohn Baldwin 169509307b25SDag-Erling Smørgrav printf("%d ", len); 1696bb1a2d4aSJohn Baldwin cp = p; 16973f8ba9aeSPoul-Henning Kamp while (len--) 1698743f9174SPoul-Henning Kamp if (decimal) 1699bb1a2d4aSJohn Baldwin printf(" %d", *cp++); 1700743f9174SPoul-Henning Kamp else 1701bb1a2d4aSJohn Baldwin printf(" %02x", *cp++); 170209307b25SDag-Erling Smørgrav printf("\n"); 170382e2dd32SPoul-Henning Kamp } 170482e2dd32SPoul-Henning Kamp 170591fbb9c1SDavid Malone void 17067008be5bSPawel Jakub Dawidek ktrcaprights(cap_rights_t *rightsp) 17077008be5bSPawel Jakub Dawidek { 17087008be5bSPawel Jakub Dawidek 17097008be5bSPawel Jakub Dawidek printf("cap_rights_t "); 17109289f547SJohn Baldwin sysdecode_cap_rights(stdout, rightsp); 17117008be5bSPawel Jakub Dawidek printf("\n"); 17127008be5bSPawel Jakub Dawidek } 17137008be5bSPawel Jakub Dawidek 1714de56aee0SKonstantin Belousov static void 1715de56aee0SKonstantin Belousov ktrtimeval(struct timeval *tv) 1716de56aee0SKonstantin Belousov { 1717de56aee0SKonstantin Belousov 1718de56aee0SKonstantin Belousov printf("{%ld, %ld}", (long)tv->tv_sec, tv->tv_usec); 1719de56aee0SKonstantin Belousov } 1720de56aee0SKonstantin Belousov 1721de56aee0SKonstantin Belousov void 1722de56aee0SKonstantin Belousov ktritimerval(struct itimerval *it) 1723de56aee0SKonstantin Belousov { 1724de56aee0SKonstantin Belousov 1725de56aee0SKonstantin Belousov printf("itimerval { .interval = "); 1726de56aee0SKonstantin Belousov ktrtimeval(&it->it_interval); 1727de56aee0SKonstantin Belousov printf(", .value = "); 1728de56aee0SKonstantin Belousov ktrtimeval(&it->it_value); 1729de56aee0SKonstantin Belousov printf(" }\n"); 1730de56aee0SKonstantin Belousov } 1731de56aee0SKonstantin Belousov 17327008be5bSPawel Jakub Dawidek void 173360e15db9SDag-Erling Smørgrav ktrsockaddr(struct sockaddr *sa) 173460e15db9SDag-Erling Smørgrav { 173560e15db9SDag-Erling Smørgrav /* 173660e15db9SDag-Erling Smørgrav TODO: Support additional address families 173760e15db9SDag-Erling Smørgrav #include <netnatm/natm.h> 173860e15db9SDag-Erling Smørgrav struct sockaddr_natm *natm; 1739237abf0cSDavide Italiano #include <netsmb/netbios.h> 1740237abf0cSDavide Italiano struct sockaddr_nb *nb; 174160e15db9SDag-Erling Smørgrav */ 17429289f547SJohn Baldwin const char *str; 174360e15db9SDag-Erling Smørgrav char addr[64]; 174460e15db9SDag-Erling Smørgrav 174560e15db9SDag-Erling Smørgrav /* 174660e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that sa points to a 174760e15db9SDag-Erling Smørgrav * buffer at least sizeof(struct sockaddr) bytes long and exactly 174860e15db9SDag-Erling Smørgrav * sa->sa_len bytes long. 174960e15db9SDag-Erling Smørgrav */ 175060e15db9SDag-Erling Smørgrav printf("struct sockaddr { "); 17519289f547SJohn Baldwin str = sysdecode_sockaddr_family(sa->sa_family); 17529289f547SJohn Baldwin if (str != NULL) 17539289f547SJohn Baldwin printf("%s", str); 17549289f547SJohn Baldwin else 17559289f547SJohn Baldwin printf("<invalid=%d>", sa->sa_family); 175660e15db9SDag-Erling Smørgrav printf(", "); 175760e15db9SDag-Erling Smørgrav 175860e15db9SDag-Erling Smørgrav #define check_sockaddr_len(n) \ 175981a31394SDag-Erling Smørgrav if (sa_##n.s##n##_len < sizeof(struct sockaddr_##n)) { \ 176060e15db9SDag-Erling Smørgrav printf("invalid"); \ 176160e15db9SDag-Erling Smørgrav break; \ 176260e15db9SDag-Erling Smørgrav } 176360e15db9SDag-Erling Smørgrav 176460e15db9SDag-Erling Smørgrav switch(sa->sa_family) { 176560e15db9SDag-Erling Smørgrav case AF_INET: { 176681a31394SDag-Erling Smørgrav struct sockaddr_in sa_in; 176760e15db9SDag-Erling Smørgrav 176881a31394SDag-Erling Smørgrav memset(&sa_in, 0, sizeof(sa_in)); 1769449df4ecSAndrey Zonov memcpy(&sa_in, sa, sa->sa_len); 177060e15db9SDag-Erling Smørgrav check_sockaddr_len(in); 177181a31394SDag-Erling Smørgrav inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof addr); 177281a31394SDag-Erling Smørgrav printf("%s:%u", addr, ntohs(sa_in.sin_port)); 177360e15db9SDag-Erling Smørgrav break; 177460e15db9SDag-Erling Smørgrav } 177560e15db9SDag-Erling Smørgrav case AF_INET6: { 177681a31394SDag-Erling Smørgrav struct sockaddr_in6 sa_in6; 177760e15db9SDag-Erling Smørgrav 177881a31394SDag-Erling Smørgrav memset(&sa_in6, 0, sizeof(sa_in6)); 1779449df4ecSAndrey Zonov memcpy(&sa_in6, sa, sa->sa_len); 178060e15db9SDag-Erling Smørgrav check_sockaddr_len(in6); 1781b9ef8051SAndrey V. Elsukov getnameinfo((struct sockaddr *)&sa_in6, sizeof(sa_in6), 1782b9ef8051SAndrey V. Elsukov addr, sizeof(addr), NULL, 0, NI_NUMERICHOST); 178381a31394SDag-Erling Smørgrav printf("[%s]:%u", addr, htons(sa_in6.sin6_port)); 178460e15db9SDag-Erling Smørgrav break; 178560e15db9SDag-Erling Smørgrav } 178660e15db9SDag-Erling Smørgrav case AF_UNIX: { 178781a31394SDag-Erling Smørgrav struct sockaddr_un sa_un; 178860e15db9SDag-Erling Smørgrav 178981a31394SDag-Erling Smørgrav memset(&sa_un, 0, sizeof(sa_un)); 1790449df4ecSAndrey Zonov memcpy(&sa_un, sa, sa->sa_len); 179181a31394SDag-Erling Smørgrav printf("%.*s", (int)sizeof(sa_un.sun_path), sa_un.sun_path); 179260e15db9SDag-Erling Smørgrav break; 179360e15db9SDag-Erling Smørgrav } 179460e15db9SDag-Erling Smørgrav default: 179560e15db9SDag-Erling Smørgrav printf("unknown address family"); 179660e15db9SDag-Erling Smørgrav } 179760e15db9SDag-Erling Smørgrav printf(" }\n"); 179860e15db9SDag-Erling Smørgrav } 179960e15db9SDag-Erling Smørgrav 180060e15db9SDag-Erling Smørgrav void 180160e15db9SDag-Erling Smørgrav ktrstat(struct stat *statp) 180260e15db9SDag-Erling Smørgrav { 180360e15db9SDag-Erling Smørgrav char mode[12], timestr[PATH_MAX + 4]; 180460e15db9SDag-Erling Smørgrav struct passwd *pwd; 180560e15db9SDag-Erling Smørgrav struct group *grp; 180660e15db9SDag-Erling Smørgrav struct tm *tm; 180760e15db9SDag-Erling Smørgrav 180860e15db9SDag-Erling Smørgrav /* 180960e15db9SDag-Erling Smørgrav * note: ktrstruct() has already verified that statp points to a 181060e15db9SDag-Erling Smørgrav * buffer exactly sizeof(struct stat) bytes long. 181160e15db9SDag-Erling Smørgrav */ 181260e15db9SDag-Erling Smørgrav printf("struct stat {"); 181356f0ad0dSDag-Erling Smørgrav printf("dev=%ju, ino=%ju, ", 181456f0ad0dSDag-Erling Smørgrav (uintmax_t)statp->st_dev, (uintmax_t)statp->st_ino); 181556f0ad0dSDag-Erling Smørgrav if (resolv == 0) 181656f0ad0dSDag-Erling Smørgrav printf("mode=0%jo, ", (uintmax_t)statp->st_mode); 181756f0ad0dSDag-Erling Smørgrav else { 181860e15db9SDag-Erling Smørgrav strmode(statp->st_mode, mode); 181956f0ad0dSDag-Erling Smørgrav printf("mode=%s, ", mode); 182056f0ad0dSDag-Erling Smørgrav } 182156f0ad0dSDag-Erling Smørgrav printf("nlink=%ju, ", (uintmax_t)statp->st_nlink); 18224622f0e1SPawel Jakub Dawidek if (resolv == 0) { 18234622f0e1SPawel Jakub Dawidek pwd = NULL; 18244622f0e1SPawel Jakub Dawidek } else { 1825c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 18264622f0e1SPawel Jakub Dawidek if (cappwd != NULL) 18274622f0e1SPawel Jakub Dawidek pwd = cap_getpwuid(cappwd, statp->st_uid); 18284622f0e1SPawel Jakub Dawidek else 18294622f0e1SPawel Jakub Dawidek #endif 18304622f0e1SPawel Jakub Dawidek pwd = getpwuid(statp->st_uid); 18314622f0e1SPawel Jakub Dawidek } 18324622f0e1SPawel Jakub Dawidek if (pwd == NULL) 183360e15db9SDag-Erling Smørgrav printf("uid=%ju, ", (uintmax_t)statp->st_uid); 183460e15db9SDag-Erling Smørgrav else 183560e15db9SDag-Erling Smørgrav printf("uid=\"%s\", ", pwd->pw_name); 18364622f0e1SPawel Jakub Dawidek if (resolv == 0) { 18374622f0e1SPawel Jakub Dawidek grp = NULL; 18384622f0e1SPawel Jakub Dawidek } else { 1839c501d73cSMariusz Zaborski #ifdef HAVE_LIBCASPER 18404622f0e1SPawel Jakub Dawidek if (capgrp != NULL) 18414622f0e1SPawel Jakub Dawidek grp = cap_getgrgid(capgrp, statp->st_gid); 18424622f0e1SPawel Jakub Dawidek else 18434622f0e1SPawel Jakub Dawidek #endif 18444622f0e1SPawel Jakub Dawidek grp = getgrgid(statp->st_gid); 18454622f0e1SPawel Jakub Dawidek } 18464622f0e1SPawel Jakub Dawidek if (grp == NULL) 184760e15db9SDag-Erling Smørgrav printf("gid=%ju, ", (uintmax_t)statp->st_gid); 184860e15db9SDag-Erling Smørgrav else 184960e15db9SDag-Erling Smørgrav printf("gid=\"%s\", ", grp->gr_name); 185060e15db9SDag-Erling Smørgrav printf("rdev=%ju, ", (uintmax_t)statp->st_rdev); 185160e15db9SDag-Erling Smørgrav printf("atime="); 185260e15db9SDag-Erling Smørgrav if (resolv == 0) 185399742a23SEd Schouten printf("%jd", (intmax_t)statp->st_atim.tv_sec); 185460e15db9SDag-Erling Smørgrav else { 185599742a23SEd Schouten tm = localtime(&statp->st_atim.tv_sec); 185609307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 185760e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 185860e15db9SDag-Erling Smørgrav } 185999742a23SEd Schouten if (statp->st_atim.tv_nsec != 0) 186099742a23SEd Schouten printf(".%09ld, ", statp->st_atim.tv_nsec); 186160e15db9SDag-Erling Smørgrav else 186260e15db9SDag-Erling Smørgrav printf(", "); 18630e80f258SEnji Cooper printf("mtime="); 186460e15db9SDag-Erling Smørgrav if (resolv == 0) 186599742a23SEd Schouten printf("%jd", (intmax_t)statp->st_mtim.tv_sec); 186660e15db9SDag-Erling Smørgrav else { 186799742a23SEd Schouten tm = localtime(&statp->st_mtim.tv_sec); 186809307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 186960e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 187060e15db9SDag-Erling Smørgrav } 187199742a23SEd Schouten if (statp->st_mtim.tv_nsec != 0) 187299742a23SEd Schouten printf(".%09ld, ", statp->st_mtim.tv_nsec); 187360e15db9SDag-Erling Smørgrav else 187460e15db9SDag-Erling Smørgrav printf(", "); 187560e15db9SDag-Erling Smørgrav printf("ctime="); 187660e15db9SDag-Erling Smørgrav if (resolv == 0) 187799742a23SEd Schouten printf("%jd", (intmax_t)statp->st_ctim.tv_sec); 187860e15db9SDag-Erling Smørgrav else { 187999742a23SEd Schouten tm = localtime(&statp->st_ctim.tv_sec); 188009307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 188160e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 188260e15db9SDag-Erling Smørgrav } 188399742a23SEd Schouten if (statp->st_ctim.tv_nsec != 0) 188499742a23SEd Schouten printf(".%09ld, ", statp->st_ctim.tv_nsec); 188560e15db9SDag-Erling Smørgrav else 188660e15db9SDag-Erling Smørgrav printf(", "); 188760e15db9SDag-Erling Smørgrav printf("birthtime="); 188860e15db9SDag-Erling Smørgrav if (resolv == 0) 188999742a23SEd Schouten printf("%jd", (intmax_t)statp->st_birthtim.tv_sec); 189060e15db9SDag-Erling Smørgrav else { 189199742a23SEd Schouten tm = localtime(&statp->st_birthtim.tv_sec); 189209307b25SDag-Erling Smørgrav strftime(timestr, sizeof(timestr), TIME_FORMAT, tm); 189360e15db9SDag-Erling Smørgrav printf("\"%s\"", timestr); 189460e15db9SDag-Erling Smørgrav } 189599742a23SEd Schouten if (statp->st_birthtim.tv_nsec != 0) 189699742a23SEd Schouten printf(".%09ld, ", statp->st_birthtim.tv_nsec); 189760e15db9SDag-Erling Smørgrav else 189860e15db9SDag-Erling Smørgrav printf(", "); 189960e15db9SDag-Erling Smørgrav printf("size=%jd, blksize=%ju, blocks=%jd, flags=0x%x", 190060e15db9SDag-Erling Smørgrav (uintmax_t)statp->st_size, (uintmax_t)statp->st_blksize, 190160e15db9SDag-Erling Smørgrav (intmax_t)statp->st_blocks, statp->st_flags); 190260e15db9SDag-Erling Smørgrav printf(" }\n"); 190360e15db9SDag-Erling Smørgrav } 190460e15db9SDag-Erling Smørgrav 190560e15db9SDag-Erling Smørgrav void 190660e15db9SDag-Erling Smørgrav ktrstruct(char *buf, size_t buflen) 190760e15db9SDag-Erling Smørgrav { 190860e15db9SDag-Erling Smørgrav char *name, *data; 190960e15db9SDag-Erling Smørgrav size_t namelen, datalen; 191060e15db9SDag-Erling Smørgrav int i; 19117008be5bSPawel Jakub Dawidek cap_rights_t rights; 1912de56aee0SKonstantin Belousov struct itimerval it; 191330c1278fSWarner Losh struct stat sb; 191430c1278fSWarner Losh struct sockaddr_storage ss; 191560e15db9SDag-Erling Smørgrav 191660e15db9SDag-Erling Smørgrav for (name = buf, namelen = 0; 191760e15db9SDag-Erling Smørgrav namelen < buflen && name[namelen] != '\0'; 191860e15db9SDag-Erling Smørgrav ++namelen) 191960e15db9SDag-Erling Smørgrav /* nothing */; 192060e15db9SDag-Erling Smørgrav if (namelen == buflen) 192160e15db9SDag-Erling Smørgrav goto invalid; 192260e15db9SDag-Erling Smørgrav if (name[namelen] != '\0') 192360e15db9SDag-Erling Smørgrav goto invalid; 192460e15db9SDag-Erling Smørgrav data = buf + namelen + 1; 192560e15db9SDag-Erling Smørgrav datalen = buflen - namelen - 1; 192660e15db9SDag-Erling Smørgrav if (datalen == 0) 192760e15db9SDag-Erling Smørgrav goto invalid; 192860e15db9SDag-Erling Smørgrav /* sanity check */ 192981a31394SDag-Erling Smørgrav for (i = 0; i < (int)namelen; ++i) 193081a31394SDag-Erling Smørgrav if (!isalpha(name[i])) 193160e15db9SDag-Erling Smørgrav goto invalid; 19327008be5bSPawel Jakub Dawidek if (strcmp(name, "caprights") == 0) { 19337008be5bSPawel Jakub Dawidek if (datalen != sizeof(cap_rights_t)) 19347008be5bSPawel Jakub Dawidek goto invalid; 19357008be5bSPawel Jakub Dawidek memcpy(&rights, data, datalen); 19367008be5bSPawel Jakub Dawidek ktrcaprights(&rights); 1937de56aee0SKonstantin Belousov } else if (strcmp(name, "itimerval") == 0) { 1938de56aee0SKonstantin Belousov if (datalen != sizeof(struct itimerval)) 1939de56aee0SKonstantin Belousov goto invalid; 1940de56aee0SKonstantin Belousov memcpy(&it, data, datalen); 1941de56aee0SKonstantin Belousov ktritimerval(&it); 19427008be5bSPawel Jakub Dawidek } else if (strcmp(name, "stat") == 0) { 194360e15db9SDag-Erling Smørgrav if (datalen != sizeof(struct stat)) 194460e15db9SDag-Erling Smørgrav goto invalid; 194530c1278fSWarner Losh memcpy(&sb, data, datalen); 194630c1278fSWarner Losh ktrstat(&sb); 194760e15db9SDag-Erling Smørgrav } else if (strcmp(name, "sockaddr") == 0) { 194830c1278fSWarner Losh if (datalen > sizeof(ss)) 194960e15db9SDag-Erling Smørgrav goto invalid; 195030c1278fSWarner Losh memcpy(&ss, data, datalen); 19514b03484fSAndrey Zonov if (datalen != ss.ss_len) 195230c1278fSWarner Losh goto invalid; 195330c1278fSWarner Losh ktrsockaddr((struct sockaddr *)&ss); 195460e15db9SDag-Erling Smørgrav } else { 195560e15db9SDag-Erling Smørgrav printf("unknown structure\n"); 195660e15db9SDag-Erling Smørgrav } 195760e15db9SDag-Erling Smørgrav return; 195860e15db9SDag-Erling Smørgrav invalid: 195960e15db9SDag-Erling Smørgrav printf("invalid record\n"); 196060e15db9SDag-Erling Smørgrav } 196160e15db9SDag-Erling Smørgrav 1962c601ad8eSDag-Erling Smørgrav void 1963c601ad8eSDag-Erling Smørgrav ktrcapfail(struct ktr_cap_fail *ktr) 1964c601ad8eSDag-Erling Smørgrav { 1965e141be6fSDag-Erling Smørgrav switch (ktr->cap_type) { 1966e141be6fSDag-Erling Smørgrav case CAPFAIL_NOTCAPABLE: 1967e141be6fSDag-Erling Smørgrav /* operation on fd with insufficient capabilities */ 1968e141be6fSDag-Erling Smørgrav printf("operation requires "); 19699289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_needed); 19702c93e2a3SPawel Jakub Dawidek printf(", descriptor holds "); 19719289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_held); 1972e141be6fSDag-Erling Smørgrav break; 1973e141be6fSDag-Erling Smørgrav case CAPFAIL_INCREASE: 1974e141be6fSDag-Erling Smørgrav /* requested more capabilities than fd already has */ 1975e141be6fSDag-Erling Smørgrav printf("attempt to increase capabilities from "); 19769289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_held); 197760e45df8SDag-Erling Smørgrav printf(" to "); 19789289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_needed); 1979e141be6fSDag-Erling Smørgrav break; 1980e141be6fSDag-Erling Smørgrav case CAPFAIL_SYSCALL: 1981e141be6fSDag-Erling Smørgrav /* called restricted syscall */ 1982e141be6fSDag-Erling Smørgrav printf("disallowed system call"); 1983e141be6fSDag-Erling Smørgrav break; 1984e141be6fSDag-Erling Smørgrav case CAPFAIL_LOOKUP: 1985e141be6fSDag-Erling Smørgrav /* used ".." in strict-relative mode */ 1986e141be6fSDag-Erling Smørgrav printf("restricted VFS lookup"); 1987e141be6fSDag-Erling Smørgrav break; 1988e141be6fSDag-Erling Smørgrav default: 1989e141be6fSDag-Erling Smørgrav printf("unknown capability failure: "); 19909289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_needed); 1991e141be6fSDag-Erling Smørgrav printf(" "); 19929289f547SJohn Baldwin sysdecode_cap_rights(stdout, &ktr->cap_held); 1993e141be6fSDag-Erling Smørgrav break; 1994e141be6fSDag-Erling Smørgrav } 199535818d2eSJohn Baldwin printf("\n"); 199635818d2eSJohn Baldwin } 199735818d2eSJohn Baldwin 199835818d2eSJohn Baldwin void 199935818d2eSJohn Baldwin ktrfault(struct ktr_fault *ktr) 200035818d2eSJohn Baldwin { 200135818d2eSJohn Baldwin 200278ec874dSDmitry Chagin printf("0x%jx ", (uintmax_t)ktr->vaddr); 20039289f547SJohn Baldwin print_mask_arg(sysdecode_vmprot, ktr->type); 200435818d2eSJohn Baldwin printf("\n"); 200535818d2eSJohn Baldwin } 200635818d2eSJohn Baldwin 200735818d2eSJohn Baldwin void 200835818d2eSJohn Baldwin ktrfaultend(struct ktr_faultend *ktr) 200935818d2eSJohn Baldwin { 20109289f547SJohn Baldwin const char *str; 201135818d2eSJohn Baldwin 20129289f547SJohn Baldwin str = sysdecode_vmresult(ktr->result); 20139289f547SJohn Baldwin if (str != NULL) 20149289f547SJohn Baldwin printf("%s", str); 20159289f547SJohn Baldwin else 20169289f547SJohn Baldwin printf("<invalid=%d>", ktr->result); 201735818d2eSJohn Baldwin printf("\n"); 2018c601ad8eSDag-Erling Smørgrav } 2019c601ad8eSDag-Erling Smørgrav 202060e15db9SDag-Erling Smørgrav void 202191fbb9c1SDavid Malone usage(void) 20229b50d902SRodney W. Grimes { 2023b9034ce2SBryan Drewery fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] " 2024da647ae9SRuslan Ermilov "[-m maxdata] [-p pid] [-t trstr]\n"); 20259b50d902SRodney W. Grimes exit(1); 20269b50d902SRodney W. Grimes } 2027