Teach kdump to understand both linux emulation.

Differential Revision:	https://reviews.freebsd.org/D1079
Reviewed by:	emaste
This commit is contained in:
Dmitry Chagin 2015-05-24 16:22:03 +00:00
parent 0a1884d768
commit c64979dc7e
3 changed files with 51 additions and 19 deletions

View File

@ -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_subr.h
.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>

View File

@ -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(" ");

View File

@ -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"