Page MenuHomeFreeBSD

D35216.id106017.diff
No OneTemporary

D35216.id106017.diff

Index: usr.bin/kdump/Makefile
===================================================================
--- usr.bin/kdump/Makefile
+++ usr.bin/kdump/Makefile
@@ -8,6 +8,8 @@
PROG= kdump
SRCS= kdump.c subr.c
CFLAGS+= -I${SRCTOP}/usr.bin/ktrace
+CFLAGS+= -I${SRCTOP}/lib/libsysdecode
+CFLAGS+= -I${SRCTOP}/sys
LIBADD= sysdecode
.if ${MK_CASPER} != "no"
Index: usr.bin/kdump/kdump.c
===================================================================
--- usr.bin/kdump/kdump.c
+++ usr.bin/kdump/kdump.c
@@ -99,6 +99,17 @@
#include <casper/cap_pwd.h>
#endif
+#if defined(__amd64__)
+#include <amd64/linux/linux_syscall.h>
+#include <amd64/linux32/linux32_syscall.h>
+#endif
+#if defined(__aarch64__)
+#include <arm64/linux/linux_syscall.h>
+#endif
+#if defined(__i386__)
+#include <i386/linux/linux_syscall.h>
+#endif
+
int fetchprocinfo(struct ktr_header *, u_int *);
u_int findabi(struct ktr_header *);
int fread_tail(void *, int, int);
@@ -125,6 +136,14 @@
void ktrstructarray(struct ktr_struct_array *, size_t);
void ktrbitset(char *, struct bitset *, 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);
#define TIMESTAMP_NONE 0x0
@@ -796,21 +815,64 @@
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
ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
+{
+ 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;
intmax_t arg;
int quad_align, quad_slots;
- syscallname(ktr->ktr_code, sv_flags);
ip = first = &ktr->ktr_args[0];
- if (narg) {
- char c = '(';
- if (fancy &&
- (sv_flags == 0 ||
- (sv_flags & SV_ABI_MASK) == SV_ABI_FREEBSD)) {
+ char c = *resc;
+
quad_align = 0;
if (sv_flags & SV_ILP32) {
#ifdef __powerpc__
@@ -1542,13 +1604,9 @@
narg--;
break;
}
- }
- while (narg > 0) {
- print_number(ip, narg, c);
- }
- putchar(')');
- }
- putchar('\n');
+ *resc = c;
+ *resip = ip;
+ *resnarg = narg;
}
void
@@ -2286,6 +2344,112 @@
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
usage(void)
{

File Metadata

Mime Type
text/plain
Expires
Sat, Dec 13, 1:40 AM (19 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26917750
Default Alt Text
D35216.id106017.diff (5 KB)

Event Timeline