Teach kdump to understand both linux emulation.
Differential Revision: https://reviews.freebsd.org/D1079 Reviewed by: emaste
This commit is contained in:
parent
0a1884d768
commit
c64979dc7e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=283430
@ -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>
|
||||
|
@ -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(" ");
|
||||
|
11
usr.bin/kdump/linux32_syscalls.conf
Normal file
11
usr.bin/kdump/linux32_syscalls.conf
Normal 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"
|
Loading…
Reference in New Issue
Block a user