Changeset View
Changeset View
Standalone View
Standalone View
head/usr.bin/kdump/kdump.c
Show All 38 Lines | |||||
#if 0 | #if 0 | ||||
static char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; | static char sccsid[] = "@(#)kdump.c 8.1 (Berkeley) 6/6/93"; | ||||
#endif | #endif | ||||
#endif /* not lint */ | #endif /* not lint */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#define _WANT_KERNEL_ERRNO | #define _WANT_KERNEL_ERRNO | ||||
#ifdef __LP64__ | |||||
#define _WANT_KEVENT32 | |||||
#endif | |||||
#define _WANT_FREEBSD11_KEVENT | |||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/capsicum.h> | #include <sys/capsicum.h> | ||||
#include <sys/errno.h> | #include <sys/errno.h> | ||||
#include <sys/time.h> | #include <sys/time.h> | ||||
#include <sys/uio.h> | #include <sys/uio.h> | ||||
#include <sys/event.h> | |||||
#include <sys/ktrace.h> | #include <sys/ktrace.h> | ||||
#include <sys/ioctl.h> | #include <sys/ioctl.h> | ||||
#include <sys/socket.h> | #include <sys/socket.h> | ||||
#include <sys/stat.h> | #include <sys/stat.h> | ||||
#include <sys/sysent.h> | #include <sys/sysent.h> | ||||
#include <sys/umtx.h> | #include <sys/umtx.h> | ||||
#include <sys/un.h> | #include <sys/un.h> | ||||
#include <sys/queue.h> | #include <sys/queue.h> | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | |||||
void ktrcaprights(cap_rights_t *); | void ktrcaprights(cap_rights_t *); | ||||
void ktritimerval(struct itimerval *it); | void ktritimerval(struct itimerval *it); | ||||
void ktrsockaddr(struct sockaddr *); | void ktrsockaddr(struct sockaddr *); | ||||
void ktrstat(struct stat *); | void ktrstat(struct stat *); | ||||
void ktrstruct(char *, size_t); | void ktrstruct(char *, size_t); | ||||
void ktrcapfail(struct ktr_cap_fail *); | void ktrcapfail(struct ktr_cap_fail *); | ||||
void ktrfault(struct ktr_fault *); | void ktrfault(struct ktr_fault *); | ||||
void ktrfaultend(struct ktr_faultend *); | void ktrfaultend(struct ktr_faultend *); | ||||
void ktrkevent(struct kevent *); | |||||
void ktrstructarray(struct ktr_struct_array *, size_t); | |||||
void usage(void); | void usage(void); | ||||
#define TIMESTAMP_NONE 0x0 | #define TIMESTAMP_NONE 0x0 | ||||
#define TIMESTAMP_ABSOLUTE 0x1 | #define TIMESTAMP_ABSOLUTE 0x1 | ||||
#define TIMESTAMP_ELAPSED 0x2 | #define TIMESTAMP_ELAPSED 0x2 | ||||
#define TIMESTAMP_RELATIVE 0x4 | #define TIMESTAMP_RELATIVE 0x4 | ||||
static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, | static int timestamp, decimal, fancy = 1, suppressdata, tail, threads, maxdata, | ||||
▲ Show 20 Lines • Show All 419 Lines • ▼ Show 20 Lines | case KTR_CAPFAIL: | ||||
ktrcapfail((struct ktr_cap_fail *)m); | ktrcapfail((struct ktr_cap_fail *)m); | ||||
break; | break; | ||||
case KTR_FAULT: | case KTR_FAULT: | ||||
ktrfault((struct ktr_fault *)m); | ktrfault((struct ktr_fault *)m); | ||||
break; | break; | ||||
case KTR_FAULTEND: | case KTR_FAULTEND: | ||||
ktrfaultend((struct ktr_faultend *)m); | ktrfaultend((struct ktr_faultend *)m); | ||||
break; | break; | ||||
case KTR_STRUCT_ARRAY: | |||||
ktrstructarray((struct ktr_struct_array *)m, ktrlen); | |||||
break; | |||||
default: | default: | ||||
printf("\n"); | printf("\n"); | ||||
break; | break; | ||||
} | } | ||||
if (tail) | if (tail) | ||||
fflush(stdout); | fflush(stdout); | ||||
} | } | ||||
return 0; | return 0; | ||||
▲ Show 20 Lines • Show All 118 Lines • ▼ Show 20 Lines | case KTR_PSIG: | ||||
break; | break; | ||||
case KTR_CSW: | case KTR_CSW: | ||||
type = "CSW "; | type = "CSW "; | ||||
break; | break; | ||||
case KTR_USER: | case KTR_USER: | ||||
type = "USER"; | type = "USER"; | ||||
break; | break; | ||||
case KTR_STRUCT: | case KTR_STRUCT: | ||||
case KTR_STRUCT_ARRAY: | |||||
type = "STRU"; | type = "STRU"; | ||||
break; | break; | ||||
case KTR_SYSCTL: | case KTR_SYSCTL: | ||||
type = "SCTL"; | type = "SCTL"; | ||||
break; | break; | ||||
case KTR_PROCCTOR: | case KTR_PROCCTOR: | ||||
/* FALLTHROUGH */ | /* FALLTHROUGH */ | ||||
case KTR_PROCDTOR: | case KTR_PROCDTOR: | ||||
▲ Show 20 Lines • Show All 1,373 Lines • ▼ Show 20 Lines | ktrfaultend(struct ktr_faultend *ktr) | ||||
const char *str; | const char *str; | ||||
str = sysdecode_vmresult(ktr->result); | str = sysdecode_vmresult(ktr->result); | ||||
if (str != NULL) | if (str != NULL) | ||||
printf("%s", str); | printf("%s", str); | ||||
else | else | ||||
printf("<invalid=%d>", ktr->result); | printf("<invalid=%d>", ktr->result); | ||||
printf("\n"); | printf("\n"); | ||||
} | |||||
void | |||||
ktrkevent(struct kevent *kev) | |||||
{ | |||||
printf("{ ident="); | |||||
switch (kev->filter) { | |||||
case EVFILT_READ: | |||||
case EVFILT_WRITE: | |||||
case EVFILT_VNODE: | |||||
case EVFILT_PROC: | |||||
case EVFILT_TIMER: | |||||
case EVFILT_PROCDESC: | |||||
case EVFILT_EMPTY: | |||||
printf("%ju", (uintmax_t)kev->ident); | |||||
break; | |||||
case EVFILT_SIGNAL: | |||||
print_signal(kev->ident); | |||||
break; | |||||
default: | |||||
printf("%p", (void *)kev->ident); | |||||
} | |||||
printf(", filter="); | |||||
print_integer_arg(sysdecode_kevent_filter, kev->filter); | |||||
printf(", flags="); | |||||
print_mask_arg0(sysdecode_kevent_flags, kev->flags); | |||||
printf(", fflags="); | |||||
sysdecode_kevent_fflags(stdout, kev->filter, kev->fflags, | |||||
decimal ? 10 : 16); | |||||
printf(", data=%#jx, udata=%p }", (uintmax_t)kev->data, kev->udata); | |||||
} | |||||
void | |||||
ktrstructarray(struct ktr_struct_array *ksa, size_t buflen) | |||||
{ | |||||
struct kevent kev; | |||||
char *name, *data; | |||||
size_t namelen, datalen; | |||||
int i; | |||||
bool first; | |||||
buflen -= sizeof(*ksa); | |||||
for (name = (char *)(ksa + 1), namelen = 0; | |||||
namelen < buflen && name[namelen] != '\0'; | |||||
++namelen) | |||||
/* nothing */; | |||||
if (namelen == buflen) | |||||
goto invalid; | |||||
if (name[namelen] != '\0') | |||||
goto invalid; | |||||
/* sanity check */ | |||||
for (i = 0; i < (int)namelen; ++i) | |||||
if (!isalnum(name[i]) && name[i] != '_') | |||||
goto invalid; | |||||
data = name + namelen + 1; | |||||
datalen = buflen - namelen - 1; | |||||
printf("struct %s[] = { ", name); | |||||
first = true; | |||||
for (; datalen >= ksa->struct_size; | |||||
data += ksa->struct_size, datalen -= ksa->struct_size) { | |||||
if (!first) | |||||
printf("\n "); | |||||
else | |||||
first = false; | |||||
if (strcmp(name, "kevent") == 0) { | |||||
if (ksa->struct_size != sizeof(kev)) | |||||
goto bad_size; | |||||
memcpy(&kev, data, sizeof(kev)); | |||||
ktrkevent(&kev); | |||||
} else if (strcmp(name, "kevent_freebsd11") == 0) { | |||||
struct kevent_freebsd11 kev11; | |||||
if (ksa->struct_size != sizeof(kev11)) | |||||
goto bad_size; | |||||
memcpy(&kev11, data, sizeof(kev11)); | |||||
memset(&kev, 0, sizeof(kev)); | |||||
kev.ident = kev11.ident; | |||||
kev.filter = kev11.filter; | |||||
kev.flags = kev11.flags; | |||||
kev.fflags = kev11.fflags; | |||||
kev.data = kev11.data; | |||||
kev.udata = kev11.udata; | |||||
ktrkevent(&kev); | |||||
#ifdef _WANT_KEVENT32 | |||||
} else if (strcmp(name, "kevent32") == 0) { | |||||
struct kevent32 kev32; | |||||
if (ksa->struct_size != sizeof(kev32)) | |||||
goto bad_size; | |||||
memcpy(&kev32, data, sizeof(kev32)); | |||||
memset(&kev, 0, sizeof(kev)); | |||||
kev.ident = kev32.ident; | |||||
kev.filter = kev32.filter; | |||||
kev.flags = kev32.flags; | |||||
kev.fflags = kev32.fflags; | |||||
#if BYTE_ORDER == BIG_ENDIAN | |||||
kev.data = kev32.data2 | ((int64_t)kev32.data1 << 32); | |||||
#else | |||||
kev.data = kev32.data1 | ((int64_t)kev32.data2 << 32); | |||||
#endif | |||||
kev.udata = (void *)(uintptr_t)kev32.udata; | |||||
ktrkevent(&kev); | |||||
} else if (strcmp(name, "kevent32_freebsd11") == 0) { | |||||
struct kevent32_freebsd11 kev32; | |||||
if (ksa->struct_size != sizeof(kev32)) | |||||
goto bad_size; | |||||
memcpy(&kev32, data, sizeof(kev32)); | |||||
memset(&kev, 0, sizeof(kev)); | |||||
kev.ident = kev32.ident; | |||||
kev.filter = kev32.filter; | |||||
kev.flags = kev32.flags; | |||||
kev.fflags = kev32.fflags; | |||||
kev.data = kev32.data; | |||||
kev.udata = (void *)(uintptr_t)kev32.udata; | |||||
ktrkevent(&kev); | |||||
#endif | |||||
} else { | |||||
printf("<unknown structure> }\n"); | |||||
return; | |||||
} | |||||
} | |||||
printf(" }\n"); | |||||
return; | |||||
invalid: | |||||
printf("invalid record\n"); | |||||
return; | |||||
bad_size: | |||||
printf("<bad size> }\n"); | |||||
return; | |||||
} | } | ||||
void | void | ||||
usage(void) | usage(void) | ||||
{ | { | ||||
fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] " | fprintf(stderr, "usage: kdump [-dEnlHRrSsTA] [-f trfile] " | ||||
"[-m maxdata] [-p pid] [-t trstr]\n"); | "[-m maxdata] [-p pid] [-t trstr]\n"); | ||||
exit(1); | exit(1); | ||||
} | } |