Date: Fri, 10 May 2013 11:17:59 +0000 (UTC) From: Dmitry Chagin <dchagin@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r250450 - user/dchagin/lemul/usr.bin/kdump Message-ID: <201305101117.r4ABHxGF040343@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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"
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201305101117.r4ABHxGF040343>