Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F139435674
D35216.id106017.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D35216.id106017.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D35216: kdump: Decode small amount of Linux syscalls
Attached
Detach File
Event Timeline
Log In to Comment