svn commit: r283430 - head/usr.bin/kdump

Dmitry Chagin dchagin at FreeBSD.org
Sun May 24 16:22:05 UTC 2015


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"


More information about the svn-src-all mailing list