Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/kdump/kdump.c
Show First 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | |||||
#ifdef WITH_CASPER | #ifdef WITH_CASPER | ||||
#include <libcasper.h> | #include <libcasper.h> | ||||
#include <casper/cap_grp.h> | #include <casper/cap_grp.h> | ||||
#include <casper/cap_pwd.h> | #include <casper/cap_pwd.h> | ||||
#endif | #endif | ||||
#if defined(__amd64__) | |||||
#include <amd64/linux/linux_syscall.h> | |||||
#include <amd64/linux32/linux32_syscall.h> | |||||
#endif | |||||
#if defined(__aarch64__) | |||||
emaste: minor point, these could be `#elif` | |||||
#include <arm64/linux/linux_syscall.h> | |||||
#endif | |||||
#if defined(__i386__) | |||||
#include <i386/linux/linux_syscall.h> | |||||
#endif | |||||
int fetchprocinfo(struct ktr_header *, u_int *); | int fetchprocinfo(struct ktr_header *, u_int *); | ||||
u_int findabi(struct ktr_header *); | u_int findabi(struct ktr_header *); | ||||
int fread_tail(void *, int, int); | int fread_tail(void *, int, int); | ||||
void dumpheader(struct ktr_header *, u_int); | void dumpheader(struct ktr_header *, u_int); | ||||
void ktrsyscall(struct ktr_syscall *, u_int); | void ktrsyscall(struct ktr_syscall *, u_int); | ||||
void ktrsysret(struct ktr_sysret *, u_int); | void ktrsysret(struct ktr_sysret *, u_int); | ||||
void ktrnamei(char *, int); | void ktrnamei(char *, int); | ||||
void hexdump(char *, int, int); | void hexdump(char *, int, int); | ||||
Show All 10 Lines | |||||
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 ktrkevent(struct kevent *); | ||||
void ktrstructarray(struct ktr_struct_array *, size_t); | void ktrstructarray(struct ktr_struct_array *, size_t); | ||||
void ktrbitset(char *, struct bitset *, size_t); | void ktrbitset(char *, struct bitset *, size_t); | ||||
void ktrsigset(char *, sigset_t *, size_t); | void ktrsigset(char *, sigset_t *, size_t); | ||||
void ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip, | |||||
int *resnarg, char *resc, u_int sv_flags); | |||||
void ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip, | |||||
int *resnarg, char *resc); | |||||
#if defined(__amd64__) | |||||
void ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip, | |||||
int *resnarg, char *resc); | |||||
#endif | |||||
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 bool abiflag, decimal, fancy = true, resolv, suppressdata, syscallno, | static bool abiflag, decimal, fancy = true, resolv, suppressdata, syscallno, | ||||
▲ Show 20 Lines • Show All 655 Lines • ▼ Show 20 Lines | print_signal(int signo) | ||||
signame = sysdecode_signal(signo); | signame = sysdecode_signal(signo); | ||||
if (signame != NULL) | if (signame != NULL) | ||||
printf("%s", signame); | printf("%s", signame); | ||||
else | else | ||||
printf("SIG %d", signo); | printf("SIG %d", signo); | ||||
} | } | ||||
static void | |||||
print_linux_signal(int signo) | |||||
{ | |||||
const char *signame; | |||||
signame = sysdecode_linux_signal(signo); | |||||
if (signame != NULL) | |||||
printf("%s", signame); | |||||
else | |||||
printf("SIG %d", signo); | |||||
} | |||||
void | void | ||||
ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags) | ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags) | ||||
{ | { | ||||
int narg = ktr->ktr_narg; | int narg = ktr->ktr_narg; | ||||
register_t *ip; | |||||
syscallname(ktr->ktr_code, sv_flags); | |||||
ip = &ktr->ktr_args[0]; | |||||
if (narg) { | |||||
char c = '('; | |||||
if (fancy) { | |||||
switch (sv_flags & SV_ABI_MASK) { | |||||
case SV_ABI_FREEBSD: | |||||
ktrsyscall_freebsd(ktr, &ip, &narg, &c, | |||||
sv_flags); | |||||
break; | |||||
case SV_ABI_LINUX: | |||||
#ifdef __amd64__ | |||||
if (sv_flags & SV_ILP32) | |||||
ktrsyscall_linux32(ktr, &ip, | |||||
&narg, &c); | |||||
else | |||||
#endif | |||||
ktrsyscall_linux(ktr, &ip, &narg, &c); | |||||
break; | |||||
} | |||||
} | |||||
while (narg > 0) | |||||
print_number(ip, narg, c); | |||||
putchar(')'); | |||||
} | |||||
putchar('\n'); | |||||
} | |||||
void | |||||
ktrsyscall_freebsd(struct ktr_syscall *ktr, register_t **resip, | |||||
int *resnarg, char *resc, u_int sv_flags) | |||||
{ | |||||
int narg = ktr->ktr_narg; | |||||
register_t *ip, *first; | register_t *ip, *first; | ||||
intmax_t arg; | intmax_t arg; | ||||
int quad_align, quad_slots; | int quad_align, quad_slots; | ||||
syscallname(ktr->ktr_code, sv_flags); | |||||
ip = first = &ktr->ktr_args[0]; | ip = first = &ktr->ktr_args[0]; | ||||
if (narg) { | char c = *resc; | ||||
char c = '('; | |||||
if (fancy && | |||||
(sv_flags == 0 || | |||||
(sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) { | |||||
quad_align = 0; | quad_align = 0; | ||||
if (sv_flags & SV_ILP32) { | if (sv_flags & SV_ILP32) { | ||||
#ifdef __powerpc__ | #ifdef __powerpc__ | ||||
quad_align = 1; | quad_align = 1; | ||||
#endif | #endif | ||||
quad_slots = 2; | quad_slots = 2; | ||||
} else | } else | ||||
quad_slots = 1; | quad_slots = 1; | ||||
▲ Show 20 Lines • Show All 715 Lines • ▼ Show 20 Lines | #endif | ||||
case SYS_unlinkat: | case SYS_unlinkat: | ||||
case SYS_utimensat: | case SYS_utimensat: | ||||
putchar(','); | putchar(','); | ||||
print_mask_arg0(sysdecode_atflags, *ip); | print_mask_arg0(sysdecode_atflags, *ip); | ||||
ip++; | ip++; | ||||
narg--; | narg--; | ||||
break; | break; | ||||
} | } | ||||
*resc = c; | |||||
*resip = ip; | |||||
*resnarg = narg; | |||||
} | } | ||||
while (narg > 0) { | |||||
print_number(ip, narg, c); | |||||
} | |||||
putchar(')'); | |||||
} | |||||
putchar('\n'); | |||||
} | |||||
void | void | ||||
ktrsysret(struct ktr_sysret *ktr, u_int sv_flags) | ktrsysret(struct ktr_sysret *ktr, u_int sv_flags) | ||||
{ | { | ||||
register_t ret = ktr->ktr_retval; | register_t ret = ktr->ktr_retval; | ||||
int error = ktr->ktr_error; | int error = ktr->ktr_error; | ||||
syscallname(ktr->ktr_code, sv_flags); | syscallname(ktr->ktr_code, sv_flags); | ||||
▲ Show 20 Lines • Show All 719 Lines • ▼ Show 20 Lines | #endif | ||||
return; | return; | ||||
invalid: | invalid: | ||||
printf("invalid record\n"); | printf("invalid record\n"); | ||||
return; | return; | ||||
bad_size: | bad_size: | ||||
printf("<bad size> }\n"); | printf("<bad size> }\n"); | ||||
return; | return; | ||||
} | } | ||||
void | |||||
ktrsyscall_linux(struct ktr_syscall *ktr, register_t **resip, | |||||
int *resnarg, char *resc) | |||||
{ | |||||
int narg = ktr->ktr_narg; | |||||
register_t *ip, *first; | |||||
int quad_align, quad_slots; | |||||
char c; | |||||
ip = first = &ktr->ktr_args[0]; | |||||
c = *resc; | |||||
quad_align = 0; | |||||
quad_slots = 1; | |||||
switch (ktr->ktr_code) { | |||||
case LINUX_SYS_linux_kill: | |||||
case LINUX_SYS_linux_tkill: | |||||
case LINUX_SYS_linux_rt_sigqueueinfo: | |||||
print_number(ip, narg, c); | |||||
putchar(','); | |||||
print_linux_signal(*ip); | |||||
ip++; | |||||
narg--; | |||||
break; | |||||
case LINUX_SYS_linux_tgkill: | |||||
case LINUX_SYS_linux_rt_tgsigqueueinfo: | |||||
print_number(ip, narg, c); | |||||
putchar(','); | |||||
print_number(ip, narg, c); | |||||
putchar(','); | |||||
print_linux_signal(*ip); | |||||
ip++; | |||||
narg--; | |||||
break; | |||||
case LINUX_SYS_linux_rt_sigaction: | |||||
putchar('('); | |||||
print_linux_signal(*ip); | |||||
ip++; | |||||
narg--; | |||||
c = ','; | |||||
break; | |||||
case LINUX_SYS_linux_ftruncate: | |||||
case LINUX_SYS_linux_truncate: | |||||
print_number(ip, narg, c); | |||||
print_number64(first, ip, narg, c); | |||||
break; | |||||
} | |||||
*resc = c; | |||||
*resip = ip; | |||||
*resnarg = narg; | |||||
} | |||||
#if defined(__amd64__) | |||||
void | |||||
ktrsyscall_linux32(struct ktr_syscall *ktr, register_t **resip, | |||||
int *resnarg, char *resc) | |||||
{ | |||||
int narg = ktr->ktr_narg; | |||||
register_t *ip, *first; | |||||
int quad_align, quad_slots; | |||||
char c; | |||||
ip = first = &ktr->ktr_args[0]; | |||||
c = *resc; | |||||
quad_align = 0; | |||||
quad_slots = 2; | |||||
switch (ktr->ktr_code) { | |||||
case LINUX32_SYS_linux_kill: | |||||
case LINUX32_SYS_linux_tkill: | |||||
case LINUX32_SYS_linux_rt_sigqueueinfo: | |||||
print_number(ip, narg, c); | |||||
putchar(','); | |||||
print_linux_signal(*ip); | |||||
ip++; | |||||
narg--; | |||||
break; | |||||
case LINUX32_SYS_linux_tgkill: | |||||
case LINUX32_SYS_linux_rt_tgsigqueueinfo: | |||||
print_number(ip, narg, c); | |||||
putchar(','); | |||||
print_number(ip, narg, c); | |||||
putchar(','); | |||||
print_linux_signal(*ip); | |||||
ip++; | |||||
narg--; | |||||
break; | |||||
case LINUX32_SYS_linux_signal: | |||||
case LINUX32_SYS_linux_sigaction: | |||||
case LINUX32_SYS_linux_rt_sigaction: | |||||
putchar('('); | |||||
print_linux_signal(*ip); | |||||
ip++; | |||||
narg--; | |||||
c = ','; | |||||
break; | |||||
case LINUX32_SYS_linux_ftruncate: | |||||
case LINUX32_SYS_linux_truncate: | |||||
print_number(ip, narg, c); | |||||
print_number64(first, ip, narg, c); | |||||
break; | |||||
} | |||||
*resc = c; | |||||
*resip = ip; | |||||
*resnarg = narg; | |||||
} | |||||
#endif /* __amd64__ */ | |||||
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); | ||||
} | } |
minor point, these could be #elif