svn commit: r250450 - user/dchagin/lemul/usr.bin/kdump

Dmitry Chagin dchagin at FreeBSD.org
Fri May 10 11:18:00 UTC 2013


Author: dchagin
Date: Fri May 10 11:17:58 2013
New Revision: 250450
URL: http://svnweb.freebsd.org/changeset/base/250450

Log:
  Teach kdump to understand x86-64 linux emulation.

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

Modified: user/dchagin/lemul/usr.bin/kdump/Makefile
==============================================================================
--- user/dchagin/lemul/usr.bin/kdump/Makefile	Fri May 10 11:15:44 2013	(r250449)
+++ user/dchagin/lemul/usr.bin/kdump/Makefile	Fri May 10 11:17:58 2013	(r250450)
@@ -1,10 +1,6 @@
 #	@(#)Makefile	8.1 (Berkeley) 6/6/93
 # $FreeBSD$
 
-.if (${MACHINE_ARCH} == "amd64")
-SFX=		32
-.endif
-
 .PATH: ${.CURDIR}/../ktrace
 
 PROG=		kdump
@@ -15,10 +11,14 @@ CFLAGS+=	-I${.CURDIR}/../ktrace -I${.CUR
 .if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386"
 SRCS+=		linux_syscalls.c
 .endif
+.if ${MACHINE_ARCH} == "amd64"
+SRCS+=		linux32_syscalls.c
+.endif
 
 NO_WERROR?=	YES
 
-CLEANFILES=	ioctl.c kdump_subr.c kdump_subr.h linux_syscalls.c
+CLEANFILES=	ioctl.c kdump_subr.c kdump_subr.h linux_syscalls.c \
+		    linux32_syscalls.c
 
 ioctl.c: mkioctls
 	env MACHINE=${MACHINE} CPP="${CPP}" \
@@ -33,8 +33,16 @@ kdump_subr.c: mksubr kdump_subr.h
 
 linux_syscalls.c:
 	/bin/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
 	echo "int nlinux_syscalls = sizeof(linux_syscallnames) / sizeof(linux_syscallnames[0]);" \
 	    >> linux_syscalls.c
 
+.if ${MACHINE_ARCH} == "amd64"
+linux32_syscalls.c:
+	/bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh \
+	    ${.CURDIR}/../../sys/${MACHINE_ARCH}/linux32/syscalls.master ${.CURDIR}/linux32_syscalls.conf
+	echo "int nlinux32_syscalls = sizeof(linux32_syscallnames) / sizeof(linux32_syscallnames[0]);" \
+	    >> linux32_syscalls.c
+.endif
+
 .include <bsd.prog.mk>

Modified: user/dchagin/lemul/usr.bin/kdump/kdump.c
==============================================================================
--- user/dchagin/lemul/usr.bin/kdump/kdump.c	Fri May 10 11:15:44 2013	(r250449)
+++ user/dchagin/lemul/usr.bin/kdump/kdump.c	Fri May 10 11:17:58 2013	(r250450)
@@ -128,8 +128,8 @@ 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 char *linux_syscallnames[];
 extern int nlinux_syscalls;
 
@@ -151,6 +151,11 @@ static int bsd_to_linux_errno[ELAST + 1]
 };
 #endif
 
+#if defined(__amd64__)
+extern char *linux32_syscallnames[];
+extern int nlinux32_syscalls;
+#endif
+
 struct proc_info
 {
 	TAILQ_ENTRY(proc_info)	info;
@@ -277,7 +282,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);
@@ -285,7 +291,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);
@@ -1689,16 +1696,27 @@ ktrfaultend(struct ktr_faultend *ktr)
 }
 
 #if defined(__amd64__) || defined(__i386__)
+
+#if defined(__amd64__)
+#define	NLINUX_SYSCALLS(v)		((v) & SV_ILP32 ?		\
+	    nlinux32_syscalls : nlinux_syscalls)
+#define	LINUX_SYSCALLNAMES(v, i)	((v) & SV_ILP32 ?		\
+	    linux32_syscallnames[i] : linux_syscallnames[i])
+#else
+#define	NLINUX_SYSCALLS(v)		(nlinux_syscalls)
+#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;
 	register_t *ip;
 
-	if (ktr->ktr_code >= nlinux_syscalls || ktr->ktr_code < 0)
+	if (ktr->ktr_code >= NLINUX_SYSCALLS(sv_flags) || ktr->ktr_code < 0)
 		printf("[%d]", ktr->ktr_code);
 	else
-		printf("%s", linux_syscallnames[ktr->ktr_code]);
+		printf("%s", LINUX_SYSCALLNAMES(sv_flags, ktr->ktr_code));
 	ip = &ktr->ktr_args[0];
 	if (narg) {
 		char c = '(';
@@ -1710,16 +1728,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;
 	int error = ktr->ktr_error;
 	int code = ktr->ktr_code;
 
-	if (code >= nlinux_syscalls || code < 0)
+	if (code >= NLINUX_SYSCALLS(sv_flags) || code < 0)
 		printf("[%d] ", code);
 	else
-		printf("%s ", linux_syscallnames[code]);
+		printf("%s ", LINUX_SYSCALLNAMES(sv_flags, code));
 
 	if (error == 0) {
 		if (fancy) {

Added: user/dchagin/lemul/usr.bin/kdump/linux32_syscalls.conf
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/dchagin/lemul/usr.bin/kdump/linux32_syscalls.conf	Fri May 10 11:17:58 2013	(r250450)
@@ -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-user mailing list