kdump.c revision 115759
1117610Sdes/*- 2117610Sdes * Copyright (c) 1988, 1993 3255376Sdes * The Regents of the University of California. All rights reserved. 4117610Sdes * 5255376Sdes * Redistribution and use in source and binary forms, with or without 6117610Sdes * modification, are permitted provided that the following conditions 7117610Sdes * are met: 8117610Sdes * 1. Redistributions of source code must retain the above copyright 9255376Sdes * notice, this list of conditions and the following disclaimer. 10117610Sdes * 2. Redistributions in binary form must reproduce the above copyright 11117610Sdes * notice, this list of conditions and the following disclaimer in the 12117610Sdes * documentation and/or other materials provided with the distribution. 13117610Sdes * 3. All advertising materials mentioning features or use of this software 14117610Sdes * must display the following acknowledgement: 15117610Sdes * This product includes software developed by the University of 16117610Sdes * California, Berkeley and its contributors. 17117610Sdes * 4. Neither the name of the University nor the names of its contributors 18255376Sdes * may be used to endorse or promote products derived from this software 19117610Sdes * without specific prior written permission. 20117610Sdes * 21117610Sdes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22117610Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23255376Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24255376Sdes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25255376Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26117610Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27255376Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28117610Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29255376Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30255376Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31255376Sdes * SUCH DAMAGE. 32255376Sdes */ 33117610Sdes 34255376Sdes#ifndef lint 35117610Sdesstatic const char copyright[] = 36117610Sdes"@(#) Copyright (c) 1988, 1993\n\ 37117610Sdes The Regents of the University of California. All rights reserved.\n"; 38117610Sdes#endif /* not lint */ 39117610Sdes 40117610Sdes#ifndef lint 41117610Sdes#if 0 42117610Sdesstatic char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; 43117610Sdes#endif 44117610Sdes#endif /* not lint */ 45117610Sdes#include <sys/cdefs.h> 46117610Sdes__FBSDID("$FreeBSD: head/usr.bin/kdump/kdump.c 115759 2003-06-03 01:44:43Z peter $"); 47117610Sdes 48117610Sdes#define _KERNEL 49117610Sdesextern int errno; 50117610Sdes#include <sys/errno.h> 51117610Sdes#undef _KERNEL 52117610Sdes#include <sys/param.h> 53255376Sdes#include <sys/errno.h> 54117610Sdes#define _KERNEL 55117610Sdes#include <sys/time.h> 56117610Sdes#undef _KERNEL 57117610Sdes#include <sys/uio.h> 58117610Sdes#include <sys/ktrace.h> 59117610Sdes#include <sys/ioctl.h> 60117610Sdes#include <sys/ptrace.h> 61117610Sdes#include <err.h> 62117610Sdes#include <locale.h> 63117610Sdes#include <stdio.h> 64117610Sdes#include <stdlib.h> 65255376Sdes#include <string.h> 66117610Sdes#include <unistd.h> 67255376Sdes#include <vis.h> 68117610Sdes#include "ktrace.h" 69255376Sdes 70117610Sdesint fread_tail(void *, int, int); 71117610Sdesvoid dumpheader(struct ktr_header *); 72117610Sdesvoid ktrsyscall(struct ktr_syscall *); 73117610Sdesvoid ktrsysret(struct ktr_sysret *); 74117610Sdesvoid ktrnamei(char *, int); 75117610Sdesvoid hexdump(char *, int, int); 76117610Sdesvoid visdump(char *, int, int); 77117610Sdesvoid ktrgenio(struct ktr_genio *, int); 78117610Sdesvoid ktrpsig(struct ktr_psig *); 79117610Sdesvoid ktrcsw(struct ktr_csw *); 80117610Sdesvoid ktruser(int, unsigned char *); 81117610Sdesvoid usage(void); 82117610Sdes 83117610Sdesint timestamp, decimal, fancy = 1, tail, maxdata; 84117610Sdesconst char *tracefile = DEF_TRACEFILE; 85117610Sdesstruct ktr_header ktr_header; 86117610Sdes 87117610Sdes#define eqs(s1, s2) (strcmp((s1), (s2)) == 0) 88117610Sdes 89117610Sdesint 90117610Sdesmain(int argc, char *argv[]) 91117610Sdes{ 92117610Sdes int ch, ktrlen, size; 93117610Sdes void *m; 94117610Sdes int trpoints = ALL_POINTS; 95117610Sdes int drop_logged; 96117610Sdes pid_t pid = 0; 97117610Sdes 98117610Sdes (void) setlocale(LC_CTYPE, ""); 99117610Sdes 100117610Sdes while ((ch = getopt(argc,argv,"f:dlm:np:RTt:")) != -1) 101117610Sdes switch((char)ch) { 102117610Sdes case 'f': 103255376Sdes tracefile = optarg; 104117610Sdes break; 105117610Sdes case 'd': 106117610Sdes decimal = 1; 107117610Sdes break; 108117610Sdes case 'l': 109117610Sdes tail = 1; 110117610Sdes break; 111117610Sdes case 'm': 112117610Sdes maxdata = atoi(optarg); 113117610Sdes break; 114117610Sdes case 'n': 115117610Sdes fancy = 0; 116117610Sdes break; 117117610Sdes case 'p': 118117610Sdes pid = atoi(optarg); 119117610Sdes break; 120117610Sdes case 'R': 121117610Sdes timestamp = 2; /* relative timestamp */ 122255376Sdes break; 123117610Sdes case 'T': 124117610Sdes timestamp = 1; 125117610Sdes break; 126117610Sdes case 't': 127117610Sdes trpoints = getpoints(optarg); 128117610Sdes if (trpoints < 0) 129117610Sdes errx(1, "unknown trace point in %s", optarg); 130117610Sdes break; 131117610Sdes default: 132117610Sdes usage(); 133117610Sdes } 134117610Sdes 135255376Sdes if (argc > optind) 136255376Sdes usage(); 137255376Sdes 138255376Sdes m = (void *)malloc(size = 1025); 139255376Sdes if (m == NULL) 140255376Sdes errx(1, "%s", strerror(ENOMEM)); 141255376Sdes if (!freopen(tracefile, "r", stdin)) 142255376Sdes err(1, "%s", tracefile); 143255376Sdes drop_logged = 0; 144255376Sdes while (fread_tail(&ktr_header, sizeof(struct ktr_header), 1)) { 145255376Sdes if (ktr_header.ktr_type & KTR_DROP) { 146255376Sdes ktr_header.ktr_type &= ~KTR_DROP; 147255376Sdes if (!drop_logged) { 148255376Sdes (void)printf("%6d %-8.*s Events dropped.\n", 149255376Sdes ktr_header.ktr_pid, MAXCOMLEN, 150255376Sdes ktr_header.ktr_comm); 151255376Sdes drop_logged = 1; 152255376Sdes } 153255376Sdes } 154255376Sdes if (trpoints & (1<<ktr_header.ktr_type)) 155255376Sdes if (pid == 0 || ktr_header.ktr_pid == pid) 156117610Sdes dumpheader(&ktr_header); 157117610Sdes if ((ktrlen = ktr_header.ktr_len) < 0) 158117610Sdes errx(1, "bogus length 0x%x", ktrlen); 159117610Sdes if (ktrlen > size) { 160117610Sdes m = (void *)realloc(m, ktrlen+1); 161255376Sdes if (m == NULL) 162117610Sdes errx(1, "%s", strerror(ENOMEM)); 163117610Sdes size = ktrlen; 164117610Sdes } 165117610Sdes if (ktrlen && fread_tail(m, ktrlen, 1) == 0) 166117610Sdes errx(1, "data too short"); 167117610Sdes if (pid && ktr_header.ktr_pid != pid) 168117610Sdes continue; 169117610Sdes if ((trpoints & (1<<ktr_header.ktr_type)) == 0) 170117610Sdes continue; 171117610Sdes drop_logged = 0; 172117610Sdes switch (ktr_header.ktr_type) { 173117610Sdes case KTR_SYSCALL: 174117610Sdes ktrsyscall((struct ktr_syscall *)m); 175117610Sdes break; 176117610Sdes case KTR_SYSRET: 177117610Sdes ktrsysret((struct ktr_sysret *)m); 178255376Sdes break; 179117610Sdes case KTR_NAMEI: 180117610Sdes ktrnamei(m, ktrlen); 181117610Sdes break; 182117610Sdes case KTR_GENIO: 183117610Sdes ktrgenio((struct ktr_genio *)m, ktrlen); 184117610Sdes break; 185117610Sdes case KTR_PSIG: 186117610Sdes ktrpsig((struct ktr_psig *)m); 187255376Sdes break; 188117610Sdes case KTR_CSW: 189117610Sdes ktrcsw((struct ktr_csw *)m); 190117610Sdes break; 191117610Sdes case KTR_USER: 192117610Sdes ktruser(ktrlen, m); 193117610Sdes break; 194117610Sdes default: 195117610Sdes printf("\n"); 196117610Sdes break; 197255376Sdes } 198117610Sdes if (tail) 199117610Sdes (void)fflush(stdout); 200117610Sdes } 201117610Sdes return 0; 202117610Sdes} 203117610Sdes 204117610Sdesint 205117610Sdesfread_tail(void *buf, int size, int num) 206117610Sdes{ 207117610Sdes int i; 208117610Sdes 209117610Sdes while ((i = fread(buf, size, num, stdin)) == 0 && tail) { 210117610Sdes (void)sleep(1); 211117610Sdes clearerr(stdin); 212117610Sdes } 213117610Sdes return (i); 214117610Sdes} 215117610Sdes 216117610Sdesvoid 217255376Sdesdumpheader(struct ktr_header *kth) 218255376Sdes{ 219255376Sdes static char unknown[64]; 220255376Sdes static struct timeval prevtime, temp; 221255376Sdes const char *type; 222117610Sdes 223255376Sdes switch (kth->ktr_type) { 224255376Sdes case KTR_SYSCALL: 225255376Sdes type = "CALL"; 226255376Sdes break; 227255376Sdes case KTR_SYSRET: 228255376Sdes type = "RET "; 229255376Sdes break; 230255376Sdes case KTR_NAMEI: 231255376Sdes type = "NAMI"; 232255376Sdes break; 233255376Sdes case KTR_GENIO: 234255376Sdes type = "GIO "; 235255376Sdes break; 236255376Sdes case KTR_PSIG: 237255376Sdes type = "PSIG"; 238117610Sdes break; 239255376Sdes case KTR_CSW: 240255376Sdes type = "CSW"; 241117610Sdes break; 242255376Sdes case KTR_USER: 243255376Sdes type = "USER"; 244255376Sdes break; 245255376Sdes default: 246255376Sdes (void)sprintf(unknown, "UNKNOWN(%d)", kth->ktr_type); 247117610Sdes type = unknown; 248117610Sdes } 249117610Sdes 250117610Sdes (void)printf("%6d %-8.*s ", kth->ktr_pid, MAXCOMLEN, kth->ktr_comm); 251117610Sdes if (timestamp) { 252117610Sdes if (timestamp == 2) { 253117610Sdes temp = kth->ktr_time; 254117610Sdes timevalsub(&kth->ktr_time, &prevtime); 255117610Sdes prevtime = temp; 256117610Sdes } 257117610Sdes (void)printf("%ld.%06ld ", 258117610Sdes kth->ktr_time.tv_sec, kth->ktr_time.tv_usec); 259117610Sdes } 260117610Sdes (void)printf("%s ", type); 261117610Sdes} 262117610Sdes 263117610Sdes#include <sys/syscall.h> 264117610Sdes#define KTRACE 265117610Sdes#include <sys/kern/syscalls.c> 266117610Sdes#undef KTRACE 267117610Sdesint nsyscalls = sizeof (syscallnames) / sizeof (syscallnames[0]); 268117610Sdes 269117610Sdesstatic const char *ptrace_ops[] = { 270117610Sdes "PT_TRACE_ME", "PT_READ_I", "PT_READ_D", "PT_READ_U", 271117610Sdes "PT_WRITE_I", "PT_WRITE_D", "PT_WRITE_U", "PT_CONTINUE", 272117610Sdes "PT_KILL", "PT_STEP", "PT_ATTACH", "PT_DETACH", 273117610Sdes}; 274117610Sdes 275117610Sdesvoid 276117610Sdesktrsyscall(struct ktr_syscall *ktr) 277117610Sdes{ 278117610Sdes int narg = ktr->ktr_narg; 279117610Sdes register_t *ip; 280117610Sdes const char *ioctlname(u_long); 281117610Sdes 282117610Sdes if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0) 283117610Sdes (void)printf("[%d]", ktr->ktr_code); 284255376Sdes else 285117610Sdes (void)printf("%s", syscallnames[ktr->ktr_code]); 286117610Sdes ip = &ktr->ktr_args[0]; 287117610Sdes if (narg) { 288117610Sdes char c = '('; 289255376Sdes if (fancy) { 290255376Sdes if (ktr->ktr_code == SYS_ioctl) { 291255376Sdes const char *cp; 292255376Sdes if (decimal) 293255376Sdes (void)printf("(%ld", (long)*ip); 294117610Sdes else 295117610Sdes (void)printf("(%#lx", (long)*ip); 296117610Sdes ip++; 297117610Sdes narg--; 298117610Sdes if ((cp = ioctlname(*ip)) != NULL) 299255376Sdes (void)printf(",%s", cp); 300117610Sdes else { 301117610Sdes if (decimal) 302255376Sdes (void)printf(",%ld", (long)*ip); 303117610Sdes else 304117610Sdes (void)printf(",%#lx ", (long)*ip); 305255376Sdes } 306117610Sdes c = ','; 307117610Sdes ip++; 308255376Sdes narg--; 309117610Sdes } else if (ktr->ktr_code == SYS_ptrace) { 310117610Sdes if ((size_t)*ip < sizeof(ptrace_ops) / 311255376Sdes sizeof(ptrace_ops[0]) && *ip >= 0) 312117610Sdes (void)printf("(%s", ptrace_ops[*ip]); 313117610Sdes#ifdef PT_GETREGS 314255376Sdes else if (*ip == PT_GETREGS) 315255376Sdes (void)printf("(%s", "PT_GETREGS"); 316255376Sdes#endif 317255376Sdes#ifdef PT_SETREGS 318255376Sdes else if (*ip == PT_SETREGS) 319255376Sdes (void)printf("(%s", "PT_SETREGS"); 320255376Sdes#endif 321117610Sdes#ifdef PT_GETFPREGS 322117610Sdes else if (*ip == PT_GETFPREGS) 323255376Sdes (void)printf("(%s", "PT_GETFPREGS"); 324255376Sdes#endif 325255376Sdes#ifdef PT_SETFPREGS 326255376Sdes else if (*ip == PT_SETFPREGS) 327117610Sdes (void)printf("(%s", "PT_SETFPREGS"); 328117610Sdes#endif 329255376Sdes#ifdef PT_GETDBREGS 330117610Sdes else if (*ip == PT_GETDBREGS) 331117610Sdes (void)printf("(%s", "PT_GETDBREGS"); 332117610Sdes#endif 333117610Sdes#ifdef PT_SETDBREGS 334117610Sdes else if (*ip == PT_SETDBREGS) 335117610Sdes (void)printf("(%s", "PT_SETDBREGS"); 336117610Sdes#endif 337255376Sdes else 338117610Sdes (void)printf("(%ld", (long)*ip); 339117610Sdes c = ','; 340255376Sdes ip++; 341117610Sdes narg--; 342117610Sdes } 343255376Sdes } 344255376Sdes while (narg) { 345117610Sdes if (decimal) 346255376Sdes (void)printf("%c%ld", c, (long)*ip); 347117610Sdes else 348255376Sdes (void)printf("%c%#lx", c, (long)*ip); 349255376Sdes c = ','; 350255376Sdes ip++; 351117610Sdes narg--; 352117610Sdes } 353255376Sdes (void)putchar(')'); 354117610Sdes } 355117610Sdes (void)putchar('\n'); 356255376Sdes} 357255376Sdes 358255376Sdesvoid 359255376Sdesktrsysret(struct ktr_sysret *ktr) 360255376Sdes{ 361255376Sdes register_t ret = ktr->ktr_retval; 362255376Sdes int error = ktr->ktr_error; 363255376Sdes int code = ktr->ktr_code; 364255376Sdes 365255376Sdes if (code >= nsyscalls || code < 0) 366255376Sdes (void)printf("[%d] ", code); 367255376Sdes else 368255376Sdes (void)printf("%s ", syscallnames[code]); 369255376Sdes 370255376Sdes if (error == 0) { 371255376Sdes if (fancy) { 372255376Sdes (void)printf("%d", ret); 373255376Sdes if (ret < 0 || ret > 9) 374255376Sdes (void)printf("/%#lx", (long)ret); 375255376Sdes } else { 376117610Sdes if (decimal) 377117610Sdes (void)printf("%ld", (long)ret); 378117610Sdes else 379117610Sdes (void)printf("%#lx", (long)ret); 380117610Sdes } 381255376Sdes } else if (error == ERESTART) 382117610Sdes (void)printf("RESTART"); 383117610Sdes else if (error == EJUSTRETURN) 384117610Sdes (void)printf("JUSTRETURN"); 385117610Sdes else { 386117610Sdes (void)printf("-1 errno %d", ktr->ktr_error); 387117610Sdes if (fancy) 388117610Sdes (void)printf(" %s", strerror(ktr->ktr_error)); 389117610Sdes } 390255376Sdes (void)putchar('\n'); 391117610Sdes} 392117610Sdes 393255376Sdesvoid 394117610Sdesktrnamei(char *cp, int len) 395117610Sdes{ 396117610Sdes (void)printf("\"%.*s\"\n", len, cp); 397117610Sdes} 398117610Sdes 399117610Sdesvoid 400117610Sdeshexdump(char *p, int len, int screenwidth) 401117610Sdes{ 402117610Sdes int n, i; 403117610Sdes int width; 404117610Sdes 405255376Sdes width = 0; 406117610Sdes do { 407117610Sdes width += 2; 408255376Sdes i = 13; /* base offset */ 409117610Sdes i += (width / 2) + 1; /* spaces every second byte */ 410117610Sdes i += (width * 2); /* width of bytes */ 411117610Sdes i += 3; /* " |" */ 412117610Sdes i += width; /* each byte */ 413117610Sdes i += 1; /* "|" */ 414117610Sdes } while (i < screenwidth); 415117610Sdes width -= 2; 416117610Sdes 417117610Sdes for (n = 0; n < len; n += width) { 418255376Sdes for (i = n; i < n + width; i++) { 419255376Sdes if ((i % width) == 0) { /* beginning of line */ 420117610Sdes printf(" 0x%04x", i); 421117610Sdes } 422255376Sdes if ((i % 2) == 0) { 423117610Sdes printf(" "); 424255376Sdes } 425255376Sdes if (i < len) 426117610Sdes printf("%02x", p[i] & 0xff); 427255376Sdes else 428255376Sdes printf(" "); 429117610Sdes } 430255376Sdes printf(" |"); 431255376Sdes for (i = n; i < n + width; i++) { 432117610Sdes if (i >= len) 433255376Sdes break; 434255376Sdes if (p[i] >= ' ' && p[i] <= '~') 435255376Sdes printf("%c", p[i]); 436255376Sdes else 437255376Sdes printf("."); 438117610Sdes } 439117610Sdes printf("|\n"); 440255376Sdes } 441117610Sdes if ((i % width) != 0) 442117610Sdes printf("\n"); 443255376Sdes} 444117610Sdes 445117610Sdesvoid 446255376Sdesvisdump(char *dp, int datalen, int screenwidth) 447117610Sdes{ 448117610Sdes int col = 0; 449255376Sdes char *cp; 450117610Sdes int width; 451117610Sdes char visbuf[5]; 452255376Sdes 453117610Sdes (void)printf(" \""); 454117610Sdes col = 8; 455117610Sdes for (;datalen > 0; datalen--, dp++) { 456117610Sdes (void) vis(visbuf, *dp, VIS_CSTYLE, *(dp+1)); 457117610Sdes cp = visbuf; 458117610Sdes /* 459117610Sdes * Keep track of printables and 460117610Sdes * space chars (like fold(1)). 461117610Sdes */ 462117610Sdes if (col == 0) { 463117610Sdes (void)putchar('\t'); 464117610Sdes col = 8; 465117610Sdes } 466117610Sdes switch(*cp) { 467117610Sdes case '\n': 468117610Sdes col = 0; 469117610Sdes (void)putchar('\n'); 470117610Sdes continue; 471117610Sdes case '\t': 472117610Sdes width = 8 - (col&07); 473117610Sdes break; 474117610Sdes default: 475117610Sdes width = strlen(cp); 476255376Sdes } 477255376Sdes if (col + width > (screenwidth-2)) { 478255376Sdes (void)printf("\\\n\t"); 479255376Sdes col = 8; 480117610Sdes } 481255376Sdes col += width; 482117610Sdes do { 483117610Sdes (void)putchar(*cp++); 484255376Sdes } while (*cp); 485117610Sdes } 486117610Sdes if (col == 0) 487255376Sdes (void)printf(" "); 488117610Sdes (void)printf("\"\n"); 489117610Sdes} 490255376Sdes 491117610Sdesvoid 492117610Sdesktrgenio(struct ktr_genio *ktr, int len) 493255376Sdes{ 494117610Sdes int datalen = len - sizeof (struct ktr_genio); 495117610Sdes char *dp = (char *)ktr + sizeof (struct ktr_genio); 496255376Sdes static int screenwidth = 0; 497117610Sdes int i, binary; 498117610Sdes 499255376Sdes if (screenwidth == 0) { 500117610Sdes struct winsize ws; 501117610Sdes 502255376Sdes if (fancy && ioctl(fileno(stderr), TIOCGWINSZ, &ws) != -1 && 503117610Sdes ws.ws_col > 8) 504255376Sdes screenwidth = ws.ws_col; 505255376Sdes else 506117610Sdes screenwidth = 80; 507117610Sdes } 508117610Sdes printf("fd %d %s %d byte%s\n", ktr->ktr_fd, 509117610Sdes ktr->ktr_rw == UIO_READ ? "read" : "wrote", datalen, 510117610Sdes datalen == 1 ? "" : "s"); 511117610Sdes if (maxdata && datalen > maxdata) 512117610Sdes datalen = maxdata; 513117610Sdes 514117610Sdes for (i = 0, binary = 0; i < datalen && binary == 0; i++) { 515117610Sdes if (dp[i] >= 32 && dp[i] < 127) 516117610Sdes continue; 517117610Sdes if (dp[i] == 10 || dp[i] == 13 || dp[i] == 0 || dp[i] == 9) 518255376Sdes continue; 519117610Sdes binary = 1; 520117610Sdes } 521255376Sdes if (binary) 522117610Sdes hexdump(dp, datalen, screenwidth); 523117610Sdes else 524117610Sdes visdump(dp, datalen, screenwidth); 525255376Sdes} 526117610Sdes 527117610Sdesconst char *signames[] = { 528255376Sdes "NULL", "HUP", "INT", "QUIT", "ILL", "TRAP", "IOT", /* 1 - 6 */ 529117610Sdes "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", /* 7 - 12 */ 530117610Sdes "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", /* 13 - 18 */ 531255376Sdes "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", /* 19 - 24 */ 532117610Sdes "XFSZ", "VTALRM", "PROF", "WINCH", "29", "USR1", /* 25 - 30 */ 533117610Sdes "USR2", NULL, /* 31 - 32 */ 534255376Sdes}; 535117610Sdes 536255376Sdesvoid 537255376Sdesktrpsig(struct ktr_psig *psig) 538117610Sdes{ 539117610Sdes (void)printf("SIG%s ", signames[psig->signo]); 540255376Sdes if (psig->action == SIG_DFL) 541117610Sdes (void)printf("SIG_DFL\n"); 542117610Sdes else { 543117610Sdes (void)printf("caught handler=0x%lx mask=0x%x code=0x%x\n", 544117610Sdes (u_long)psig->action, psig->mask.__bits[0], psig->code); 545117610Sdes } 546117610Sdes} 547117610Sdes 548255376Sdesvoid 549117610Sdesktrcsw(struct ktr_csw *cs) 550117610Sdes{ 551117610Sdes (void)printf("%s %s\n", cs->out ? "stop" : "resume", 552117610Sdes cs->user ? "user" : "kernel"); 553117610Sdes} 554117610Sdes 555117610Sdesvoid 556117610Sdesktruser(int len, unsigned char *p) 557117610Sdes{ 558117610Sdes (void)printf("%d ", len); 559117610Sdes while (len--) 560117610Sdes (void)printf(" %02x", *p++); 561117610Sdes (void)printf("\n"); 562117610Sdes 563255376Sdes} 564255376Sdes 565255376Sdesvoid 566255376Sdesusage(void) 567255376Sdes{ 568255376Sdes (void)fprintf(stderr, 569117610Sdes "usage: kdump [-dnlRT] [-f trfile] [-m maxdata] [-t [cnisuw]]\n"); 570117610Sdes exit(1); 571117610Sdes} 572117610Sdes