Author: dchagin
Date: Sun May 24 16:22:03 2015
New Revision: 283430
URL: https://svnweb.freebsd.org/changeset/base/283430

Log:
  Teach kdump to understand both linux emulation.
  
  Differential Revision:        https://reviews.freebsd.org/D1079
  Reviewed by:  emaste

Added:
  head/usr.bin/kdump/linux32_syscalls.conf   (contents, props changed)
Modified:
  head/usr.bin/kdump/Makefile
  head/usr.bin/kdump/kdump.c

Modified: head/usr.bin/kdump/Makefile
==============================================================================
--- head/usr.bin/kdump/Makefile Sun May 24 16:19:57 2015        (r283429)
+++ head/usr.bin/kdump/Makefile Sun May 24 16:22:03 2015        (r283430)
@@ -3,10 +3,6 @@
 
 .include <src.opts.mk>
 
-.if (${MACHINE_ARCH} == "amd64")
-SFX=           32
-.endif
-
 .PATH: ${.CURDIR}/../ktrace
 
 PROG=          kdump
@@ -30,6 +26,9 @@ CLEANFILES=   ioctl.c kdump_subr.c kdump_s
 .if (${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386")
 CLEANFILES+=   linux_syscalls.c
 .endif
+.if (${MACHINE_ARCH} == "amd64")
+CLEANFILES+=   linux32_syscalls.c
+.endif
 
 ioctl.c: mkioctls
        env MACHINE=${MACHINE} CPP="${CPP}" \
@@ -43,7 +42,11 @@ kdump_subr.c: mksubr kdump_subr.h
        sh ${.CURDIR}/mksubr ${DESTDIR}/usr/include >${.TARGET}
 .if (${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386")
        sh ${.CURDIR}/../../sys/kern/makesyscalls.sh \
-           ${.CURDIR}/../../sys/${MACHINE_ARCH}/linux${SFX}/syscalls.master 
${.CURDIR}/linux_syscalls.conf
+           ${.CURDIR}/../../sys/${MACHINE_ARCH}/linux/syscalls.master 
${.CURDIR}/linux_syscalls.conf
+.endif
+.if (${MACHINE_ARCH} == "amd64")
+       sh ${.CURDIR}/../../sys/kern/makesyscalls.sh \
+           ${.CURDIR}/../../sys/${MACHINE_ARCH}/linux32/syscalls.master 
${.CURDIR}/linux32_syscalls.conf
 .endif
 
 .include <bsd.prog.mk>

Modified: head/usr.bin/kdump/kdump.c
==============================================================================
--- head/usr.bin/kdump/kdump.c  Sun May 24 16:19:57 2015        (r283429)
+++ head/usr.bin/kdump/kdump.c  Sun May 24 16:22:03 2015        (r283430)
@@ -146,13 +146,11 @@ static struct ktr_header ktr_header;
 
 #if defined(__amd64__) || defined(__i386__)
 
-void linux_ktrsyscall(struct ktr_syscall *);
-void linux_ktrsysret(struct ktr_sysret *);
+void linux_ktrsyscall(struct ktr_syscall *, u_int);
+void linux_ktrsysret(struct ktr_sysret *, u_int);
 extern const char *linux_syscallnames[];
 
 #include <linux_syscalls.c>
-static int nlinux_syscalls = sizeof(linux_syscallnames) / \
-                               sizeof(linux_syscallnames[0]);
 
 /*
  * from linux.h
@@ -172,6 +170,12 @@ static int bsd_to_linux_errno[ELAST + 1]
 };
 #endif
 
+#if defined(__amd64__)
+extern const char *linux32_syscallnames[];
+
+#include <linux32_syscalls.c>
+#endif
+
 struct proc_info
 {
        TAILQ_ENTRY(proc_info)  info;
@@ -400,7 +404,8 @@ main(int argc, char *argv[])
                case KTR_SYSCALL:
 #if defined(__amd64__) || defined(__i386__)
                        if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
-                               linux_ktrsyscall((struct ktr_syscall *)m);
+                               linux_ktrsyscall((struct ktr_syscall *)m,
+                                   sv_flags);
                        else
 #endif
                                ktrsyscall((struct ktr_syscall *)m, sv_flags);
@@ -408,7 +413,8 @@ main(int argc, char *argv[])
                case KTR_SYSRET:
 #if defined(__amd64__) || defined(__i386__)
                        if ((sv_flags & SV_ABI_MASK) == SV_ABI_LINUX)
-                               linux_ktrsysret((struct ktr_sysret *)m);
+                               linux_ktrsysret((struct ktr_sysret *)m, 
+                                   sv_flags);
                        else
 #endif
                                ktrsysret((struct ktr_sysret *)m, sv_flags);
@@ -1970,16 +1976,28 @@ ktrfaultend(struct ktr_faultend *ktr)
 }
 
 #if defined(__amd64__) || defined(__i386__)
+
+#if defined(__amd64__)
+#define        NLINUX_SYSCALLS(v)              ((v) & SV_ILP32 ?               
\
+           nitems(linux32_syscallnames) : nitems(linux_syscallnames))
+#define        LINUX_SYSCALLNAMES(v, i)        ((v) & SV_ILP32 ?               
\
+           linux32_syscallnames[i] : linux_syscallnames[i])
+#else
+#define        NLINUX_SYSCALLS(v)              (nitems(linux_syscallnames))
+#define        LINUX_SYSCALLNAMES(v, i)        (linux_syscallnames[i])
+#endif
+
 void
-linux_ktrsyscall(struct ktr_syscall *ktr)
+linux_ktrsyscall(struct ktr_syscall *ktr, u_int sv_flags)
 {
        int narg = ktr->ktr_narg;
+       unsigned code = ktr->ktr_code;
        register_t *ip;
 
-       if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
+       if (ktr->ktr_code < 0 || code >= NLINUX_SYSCALLS(sv_flags))
                printf("[%d]", ktr->ktr_code);
        else {
-               printf("%s", linux_syscallnames[ktr->ktr_code]);
+               printf("%s", LINUX_SYSCALLNAMES(sv_flags, ktr->ktr_code));
                if (syscallno)
                        printf("[%d]", ktr->ktr_code);
        }
@@ -1994,16 +2012,16 @@ linux_ktrsyscall(struct ktr_syscall *ktr
 }
 
 void
-linux_ktrsysret(struct ktr_sysret *ktr)
+linux_ktrsysret(struct ktr_sysret *ktr, u_int sv_flags)
 {
        register_t ret = ktr->ktr_retval;
+       unsigned code = ktr->ktr_code;
        int error = ktr->ktr_error;
-       int code = ktr->ktr_code;
 
-       if (code >= nlinux_syscalls || code < 0)
-               printf("[%d] ", code);
+       if (ktr->ktr_code < 0 || code >= NLINUX_SYSCALLS(sv_flags))
+               printf("[%d] ", ktr->ktr_code);
        else {
-               printf("%s", linux_syscallnames[code]);
+               printf("%s ", LINUX_SYSCALLNAMES(sv_flags, code));
                if (syscallno)
                        printf("[%d]", code);
                printf(" ");

Added: head/usr.bin/kdump/linux32_syscalls.conf
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/usr.bin/kdump/linux32_syscalls.conf    Sun May 24 16:22:03 2015        
(r283430)
@@ -0,0 +1,11 @@
+# $FreeBSD$
+sysnames="linux32_syscalls.c"
+sysproto="/dev/null"
+sysproto_h=_LINUX32_SYSPROTO_H_
+syshdr="/dev/null"
+syssw="/dev/null"
+sysmk="/dev/null"
+syscallprefix="LINUX32_SYS_"
+switchname="/dev/null"
+namesname="linux32_syscallnames"
+systrace="/dev/null"
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to