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