diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile index 869d47989b9f..c25f9285e0c8 100644 --- a/usr.bin/truss/Makefile +++ b/usr.bin/truss/Makefile @@ -2,87 +2,64 @@ NO_WERROR= PROG= truss -SRCS= main.c setup.c syscalls.c syscalls.h ioctl.c - -.if exists(${.CURDIR}/${MACHINE_ARCH}-fbsd.c) -SRCS+= ${MACHINE_ARCH}-fbsd.c -.else -SRCS+= ${MACHINE_CPUARCH}-fbsd.c -.endif +SRCS= main.c setup.c syscalls.c ioctl.c .PATH: ${.CURDIR:H}/kdump SRCS+= utrace.c CFLAGS+= -I${.CURDIR} -I. -I${.CURDIR}/../../sys -CLEANFILES= syscalls.master syscalls.h ioctl.c - -.SUFFIXES: .master - -syscalls.master: ${.CURDIR}/../../sys/kern/syscalls.master - cat ${.ALLSRC} > syscalls.master - -syscalls.h: syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh syscalls.master \ - ${.CURDIR}/i386.conf +CLEANFILES= ioctl.c ioctl.c: ${.CURDIR}/../kdump/mkioctls env MACHINE=${MACHINE} CPP="${CPP}" \ /bin/sh ${.CURDIR}/../kdump/mkioctls return ${DESTDIR}${INCLUDEDIR} > ${.TARGET} +# Define where to generate syscalls for each ABI. +ABI_SYSPATH.freebsd= sys/kern +ABI_SYSPATH.freebsd32= sys/compat/freebsd32 +ABI_SYSPATH.cloudabi64= sys/compat/cloudabi64 +ABI_SYSPATH.i386-linux= sys/i386/linux +ABI_SYSPATH.amd64-linux32= sys/amd64/linux32 + +ABIS+= freebsd +# Each ABI is expected to have an ABI.c, MACHINE_ARCH-ABI.c or +# MACHINE_CPUARCH-ABI.c file that will be used to map the syscall arguments. .if ${MACHINE_CPUARCH} == "i386" -SRCS+= i386-linux.c linux_syscalls.h -CLEANFILES+=i386l-syscalls.master linux_syscalls.h - -i386l-syscalls.master: ${.CURDIR}/../../sys/i386/linux/syscalls.master - cat ${.ALLSRC} > ${.TARGET} - -linux_syscalls.h: i386l-syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \ - ${.CURDIR}/i386linux.conf +ABIS+= i386-linux .endif - .if ${MACHINE_CPUARCH} == "amd64" -SRCS+= amd64-linux32.c linux32_syscalls.h -CLEANFILES+=amd64l32-syscalls.master linux32_syscalls.h - -amd64l32-syscalls.master: ${.CURDIR}/../../sys/amd64/linux32/syscalls.master - cat ${.ALLSRC} > ${.TARGET} - -linux32_syscalls.h: amd64l32-syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \ - ${.CURDIR}/amd64linux32.conf - -SRCS+= amd64-fbsd32.c freebsd32_syscalls.h -CLEANFILES+=fbsd32-syscalls.master freebsd32_syscalls.h - -fbsd32-syscalls.master: ${.CURDIR}/../../sys/compat/freebsd32/syscalls.master - cat ${.ALLSRC} > ${.TARGET} - -freebsd32_syscalls.h: fbsd32-syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \ - ${.CURDIR}/fbsd32.conf - -SRCS+= amd64-cloudabi64.c cloudabi64_syscalls.h -CLEANFILES+=amd64cloudabi64-syscalls.master cloudabi64_syscalls.h - -amd64cloudabi64-syscalls.master: ${.CURDIR}/../../sys/compat/cloudabi64/syscalls.master - cat ${.ALLSRC} > ${.TARGET} - -cloudabi64_syscalls.h: amd64cloudabi64-syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \ - ${.CURDIR}/amd64cloudabi64.conf +ABIS+= amd64-linux32 +ABIS+= freebsd32 +ABIS+= cloudabi64 .endif - .if ${MACHINE_ARCH} == "powerpc64" -SRCS+= powerpc-fbsd.c freebsd32_syscalls.h -CLEANFILES+=fbsd32-syscalls.master freebsd32_syscalls.h - -fbsd32-syscalls.master: ${.CURDIR}/../../sys/compat/freebsd32/syscalls.master - cat ${.ALLSRC} > ${.TARGET} - -freebsd32_syscalls.h: fbsd32-syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \ - ${.CURDIR}/fbsd32.conf +ABIS+= freebsd32 .endif +.for abi in ${ABIS} +# Find the right file to handle this ABI. +abi_src= +ABI_SRCS= ${abi}.c ${MACHINE_ARCH}-${abi}.c ${MACHINE_CPUARCH}-${abi}.c +.for f in ${ABI_SRCS} +.if exists(${.CURDIR}/${f}) && empty(abi_src) +abi_src= ${f} +.endif +.endfor +SRCS:= ${SRCS} ${abi_src} ${abi}_syscalls.h +CLEANFILES+= ${abi}_syscalls.conf ${abi}_syscalls.master ${abi}_syscalls.h +${abi}_syscalls.conf: ${.CURDIR}/makesyscallsconf.sh + /bin/sh ${.CURDIR}/makesyscallsconf.sh ${abi} ${.TARGET} + +${abi}_syscalls.master: ${.CURDIR:H:H}/${ABI_SYSPATH.${abi}}/syscalls.master + cp -f ${.ALLSRC} ${.TARGET} + +${abi}_syscalls.h: ${abi}_syscalls.master ${abi}_syscalls.conf \ + ${.CURDIR:H:H}/sys/kern/makesyscalls.sh + /bin/sh ${.CURDIR:H:H}/sys/kern/makesyscalls.sh \ + ${abi}_syscalls.master ${abi}_syscalls.conf +# Eliminate compiler warning about non-static global. + sed -i '' '/^const char \*/s/^/static /' ${.TARGET}.tmp + mv ${.TARGET}.tmp ${.TARGET} +.endfor + .include diff --git a/usr.bin/truss/Makefile.depend.amd64 b/usr.bin/truss/Makefile.depend.amd64 index 210685b5df6d..bf32fa45b6f3 100644 --- a/usr.bin/truss/Makefile.depend.amd64 +++ b/usr.bin/truss/Makefile.depend.amd64 @@ -19,12 +19,12 @@ DIRDEPS = \ # local dependencies - needed for -jN in clean tree amd64-cloudabi64.o: cloudabi64_syscalls.h amd64-cloudabi64.po: cloudabi64_syscalls.h -amd64-fbsd.o: syscalls.h -amd64-fbsd.po: syscalls.h -amd64-fbsd32.o: freebsd32_syscalls.h -amd64-fbsd32.po: freebsd32_syscalls.h -amd64-linux32.o: linux32_syscalls.h -amd64-linux32.po: linux32_syscalls.h +amd64-freebsd.o: freebsd_syscalls.h +amd64-freebsd.po: freebsd_syscalls.h +amd64-freebsd32.o: freebsd32_syscalls.h +amd64-freebsd32.po: freebsd32_syscalls.h +amd64-linux32.o: amd64-linux32_syscalls.h +amd64-linux32.po: amd64-linux32_syscalls.h ioctl.o: ioctl.c ioctl.po: ioctl.c .endif diff --git a/usr.bin/truss/aarch64-fbsd.c b/usr.bin/truss/aarch64-freebsd.c similarity index 95% rename from usr.bin/truss/aarch64-fbsd.c rename to usr.bin/truss/aarch64-freebsd.c index 85819f672d76..1ec2b66c9f60 100644 --- a/usr.bin/truss/aarch64-fbsd.c +++ b/usr.bin/truss/aarch64-freebsd.c @@ -42,8 +42,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -extern const char *syscallnames[]; /* silence compiler */ -#include "syscalls.h" +#include "freebsd_syscalls.h" static int aarch64_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -99,7 +98,7 @@ aarch64_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) return (0); } -static struct procabi aarch64_fbsd = { +static struct procabi aarch64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -107,4 +106,4 @@ static struct procabi aarch64_fbsd = { aarch64_fetch_retval }; -PROCABI(aarch64_fbsd); +PROCABI(aarch64_freebsd); diff --git a/usr.bin/truss/amd64-cloudabi64.c b/usr.bin/truss/amd64-cloudabi64.c index e65d8cb87ee8..2b93532659a5 100644 --- a/usr.bin/truss/amd64-cloudabi64.c +++ b/usr.bin/truss/amd64-cloudabi64.c @@ -171,8 +171,8 @@ amd64_cloudabi64_fetch_retval(struct trussinfo *trussinfo, long *retval, static struct procabi amd64_cloudabi64 = { "CloudABI ELF64", - cloudabi64_syscallnames, - nitems(cloudabi64_syscallnames), + syscallnames, + nitems(syscallnames), amd64_cloudabi64_fetch_args, amd64_cloudabi64_fetch_retval }; diff --git a/usr.bin/truss/amd64-fbsd.c b/usr.bin/truss/amd64-freebsd.c similarity index 97% rename from usr.bin/truss/amd64-fbsd.c rename to usr.bin/truss/amd64-freebsd.c index ade9322c31e9..0461616100f4 100644 --- a/usr.bin/truss/amd64-fbsd.c +++ b/usr.bin/truss/amd64-freebsd.c @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "syscalls.h" +#include "freebsd_syscalls.h" static int amd64_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -120,7 +120,7 @@ amd64_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) return (0); } -static struct procabi amd64_fbsd = { +static struct procabi amd64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -128,4 +128,4 @@ static struct procabi amd64_fbsd = { amd64_fetch_retval }; -PROCABI(amd64_fbsd); +PROCABI(amd64_freebsd); diff --git a/usr.bin/truss/amd64-fbsd32.c b/usr.bin/truss/amd64-freebsd32.c similarity index 86% rename from usr.bin/truss/amd64-fbsd32.c rename to usr.bin/truss/amd64-freebsd32.c index 84a4b6ba8a7c..82eb6cd59c45 100644 --- a/usr.bin/truss/amd64-fbsd32.c +++ b/usr.bin/truss/amd64-freebsd32.c @@ -32,7 +32,7 @@ #include __FBSDID("$FreeBSD$"); -/* FreeBSD/i386-specific system call handling. */ +/* FreeBSD/amd64-freebsd32-specific system call handling. */ #include #include @@ -48,7 +48,7 @@ __FBSDID("$FreeBSD$"); #include "freebsd32_syscalls.h" static int -amd64_fbsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) +amd64_freebsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) { struct ptrace_io_desc iorequest; struct reg regs; @@ -98,7 +98,7 @@ amd64_fbsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) } static int -amd64_fbsd32_fetch_retval(struct trussinfo *trussinfo, long *retval, +amd64_freebsd32_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) { struct reg regs; @@ -116,22 +116,22 @@ amd64_fbsd32_fetch_retval(struct trussinfo *trussinfo, long *retval, return (0); } -static struct procabi amd64_fbsd32 = { +static struct procabi amd64_freebsd32 = { "FreeBSD ELF32", - freebsd32_syscallnames, - nitems(freebsd32_syscallnames), - amd64_fbsd32_fetch_args, - amd64_fbsd32_fetch_retval + syscallnames, + nitems(syscallnames), + amd64_freebsd32_fetch_args, + amd64_freebsd32_fetch_retval }; -PROCABI(amd64_fbsd32); +PROCABI(amd64_freebsd32); -static struct procabi amd64_fbsd32_aout = { +static struct procabi amd64_freebsd32_aout = { "FreeBSD a.out", - freebsd32_syscallnames, - nitems(freebsd32_syscallnames), - amd64_fbsd32_fetch_args, - amd64_fbsd32_fetch_retval + syscallnames, + nitems(syscallnames), + amd64_freebsd32_fetch_args, + amd64_freebsd32_fetch_retval }; -PROCABI(amd64_fbsd32_aout); +PROCABI(amd64_freebsd32_aout); diff --git a/usr.bin/truss/amd64-linux32.c b/usr.bin/truss/amd64-linux32.c index 4f64af343fbb..17e5fdc2b29a 100644 --- a/usr.bin/truss/amd64-linux32.c +++ b/usr.bin/truss/amd64-linux32.c @@ -43,7 +43,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "linux32_syscalls.h" +#include "amd64-linux32_syscalls.h" static int amd64_linux32_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -132,8 +132,8 @@ amd64_linux32_fetch_retval(struct trussinfo *trussinfo, long *retval, static struct procabi amd64_linux32 = { "Linux ELF32", - linux32_syscallnames, - nitems(linux32_syscallnames), + syscallnames, + nitems(syscallnames), amd64_linux32_fetch_args, amd64_linux32_fetch_retval }; diff --git a/usr.bin/truss/amd64cloudabi64.conf b/usr.bin/truss/amd64cloudabi64.conf deleted file mode 100644 index e68906ee99cb..000000000000 --- a/usr.bin/truss/amd64cloudabi64.conf +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -sysnames="cloudabi64_syscalls.h" -sysproto="/dev/null" -sysproto_h="/dev/null" -syshdr="/dev/null" -sysmk="/dev/null" -syssw="/dev/null" -syshide="/dev/null" -syscallprefix="SYS_" -switchname="sysent" -namesname="cloudabi64_syscallnames" -systrace="/dev/null" diff --git a/usr.bin/truss/amd64linux32.conf b/usr.bin/truss/amd64linux32.conf deleted file mode 100644 index 7f5e8bd268fe..000000000000 --- a/usr.bin/truss/amd64linux32.conf +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -sysnames="linux32_syscalls.h" -sysproto="/dev/null" -sysproto_h="/dev/null" -syshdr="/dev/null" -sysmk="/dev/null" -syssw="/dev/null" -syshide="/dev/null" -syscallprefix="SYS_" -switchname="sysent" -namesname="linux32_syscallnames" -systrace="/dev/null" diff --git a/usr.bin/truss/arm-fbsd.c b/usr.bin/truss/arm-freebsd.c similarity index 97% rename from usr.bin/truss/arm-fbsd.c rename to usr.bin/truss/arm-freebsd.c index 4b8222a53433..aa7bcccd5c3f 100644 --- a/usr.bin/truss/arm-fbsd.c +++ b/usr.bin/truss/arm-freebsd.c @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "syscalls.h" +#include "freebsd_syscalls.h" static int arm_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -127,7 +127,7 @@ arm_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) return (0); } -static struct procabi arm_fbsd = { +static struct procabi arm_freebsd = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), @@ -135,4 +135,4 @@ static struct procabi arm_fbsd = { arm_fetch_retval }; -PROCABI(arm_fbsd); +PROCABI(arm_freebsd); diff --git a/usr.bin/truss/fbsd32.conf b/usr.bin/truss/fbsd32.conf deleted file mode 100644 index 3323f115ee18..000000000000 --- a/usr.bin/truss/fbsd32.conf +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -sysnames="freebsd32_syscalls.h" -sysproto="/dev/null" -sysproto_h="/dev/null" -syshdr="/dev/null" -sysmk="/dev/null" -syssw="/dev/null" -syshide="/dev/null" -syscallprefix="SYS_" -switchname="sysent" -namesname="freebsd32_syscallnames" -systrace="/dev/null" diff --git a/usr.bin/truss/i386-fbsd.c b/usr.bin/truss/i386-freebsd.c similarity index 95% rename from usr.bin/truss/i386-fbsd.c rename to usr.bin/truss/i386-freebsd.c index 029815ec711d..d9d72aa28589 100644 --- a/usr.bin/truss/i386-fbsd.c +++ b/usr.bin/truss/i386-freebsd.c @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "syscalls.h" +#include "freebsd_syscalls.h" static int i386_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -109,7 +109,7 @@ i386_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) return (0); } -static struct procabi i386_fbsd = { +static struct procabi i386_freebsd = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), @@ -117,9 +117,9 @@ static struct procabi i386_fbsd = { i386_fetch_retval }; -PROCABI(i386_fbsd); +PROCABI(i386_freebsd); -static struct procabi i386_fbsd_aout = { +static struct procabi i386_freebsd_aout = { "FreeBSD a.out", syscallnames, nitems(syscallnames), @@ -127,5 +127,5 @@ static struct procabi i386_fbsd_aout = { i386_fetch_retval }; -PROCABI(i386_fbsd_aout); +PROCABI(i386_freebsd_aout); diff --git a/usr.bin/truss/i386-linux.c b/usr.bin/truss/i386-linux.c index fa57af2b3484..91662711676b 100644 --- a/usr.bin/truss/i386-linux.c +++ b/usr.bin/truss/i386-linux.c @@ -43,7 +43,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "linux_syscalls.h" +#include "i386-linux_syscalls.h" static int i386_linux_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -131,8 +131,8 @@ i386_linux_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) static struct procabi i386_linux = { "Linux ELF32", - linux_syscallnames, - nitems(linux_syscallnames), + syscallnames, + nitems(syscallnames), i386_linux_fetch_args, i386_linux_fetch_retval }; diff --git a/usr.bin/truss/i386linux.conf b/usr.bin/truss/i386linux.conf deleted file mode 100644 index 7669bceaf1a9..000000000000 --- a/usr.bin/truss/i386linux.conf +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -sysnames="linux_syscalls.h" -sysproto="/dev/null" -sysproto_h="/dev/null" -syshdr="/dev/null" -sysmk="/dev/null" -syssw="/dev/null" -syshide="/dev/null" -syscallprefix="SYS_" -switchname="sysent" -namesname="linux_syscallnames" -systrace="/dev/null" diff --git a/usr.bin/truss/i386.conf b/usr.bin/truss/makesyscallsconf.sh old mode 100644 new mode 100755 similarity index 66% rename from usr.bin/truss/i386.conf rename to usr.bin/truss/makesyscallsconf.sh index cfe2f46989be..81eb78ea9f09 --- a/usr.bin/truss/i386.conf +++ b/usr.bin/truss/makesyscallsconf.sh @@ -1,6 +1,13 @@ +#! /bin/sh # $FreeBSD$ -sysnames="syscalls.h" +ABI="$1" +CONF="$2" + +header="${ABI}_syscalls.h" + +cat > "${CONF}" << EOF +sysnames="${header}.tmp" sysproto="/dev/null" sysproto_h="/dev/null" syshdr="/dev/null" @@ -11,3 +18,4 @@ syscallprefix="SYS_" switchname="sysent" namesname="syscallnames" systrace="/dev/null" +EOF diff --git a/usr.bin/truss/mips-fbsd.c b/usr.bin/truss/mips-freebsd.c similarity index 97% rename from usr.bin/truss/mips-fbsd.c rename to usr.bin/truss/mips-freebsd.c index d488b7e7c030..0c504b88fd63 100644 --- a/usr.bin/truss/mips-fbsd.c +++ b/usr.bin/truss/mips-freebsd.c @@ -44,7 +44,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "syscalls.h" +#include "freebsd_syscalls.h" static int mips_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -126,7 +126,7 @@ mips_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) } -static struct procabi mips_fbsd = { +static struct procabi mips_freebsd = { #ifdef __mips_n64 "FreeBSD ELF64", #else @@ -138,4 +138,4 @@ static struct procabi mips_fbsd = { mips_fetch_retval }; -PROCABI(mips_fbsd); +PROCABI(mips_freebsd); diff --git a/usr.bin/truss/powerpc-fbsd.c b/usr.bin/truss/powerpc-freebsd.c similarity index 82% rename from usr.bin/truss/powerpc-fbsd.c rename to usr.bin/truss/powerpc-freebsd.c index 4a11459e7860..90c3663d3c9c 100644 --- a/usr.bin/truss/powerpc-fbsd.c +++ b/usr.bin/truss/powerpc-freebsd.c @@ -40,12 +40,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#ifdef __powerpc64__ /* 32-bit compatibility */ -#include "freebsd32_syscalls.h" -#define syscallnames freebsd32_syscallnames -#else /* native 32-bit */ -#include "syscalls.h" -#endif +#include "freebsd_syscalls.h" static int powerpc_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -82,34 +77,16 @@ powerpc_fetch_args(struct trussinfo *trussinfo, u_int narg) } for (i = 0; i < narg && reg < NARGREG; i++, reg++) { -#ifdef __powerpc64__ - cs->args[i] = regs.fixreg[FIRSTARG + reg] & 0xffffffff; -#else cs->args[i] = regs.fixreg[FIRSTARG + reg]; -#endif } if (narg > i) { -#ifdef __powerpc64__ - uint32_t args32[narg - i]; - u_int j; - -#endif iorequest.piod_op = PIOD_READ_D; iorequest.piod_offs = (void *)(regs.fixreg[1] + 8); -#ifdef __powerpc64__ - iorequest.piod_addr = args32; - iorequest.piod_len = sizeof(args32); -#else iorequest.piod_addr = &cs->args[i]; iorequest.piod_len = (narg - i) * sizeof(cs->args[0]); -#endif ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); if (iorequest.piod_len == 0) return (-1); -#ifdef __powerpc64__ - for (j = 0; j < narg - i; j++) - cs->args[i + j] = args32[j]; -#endif } return (0); @@ -128,18 +105,13 @@ powerpc_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) } /* XXX: Does not have fixup for __syscall(). */ -#ifdef __powerpc64__ - retval[0] = regs.fixreg[3] & 0xffffffff; - retval[1] = regs.fixreg[4] & 0xffffffff; -#else retval[0] = regs.fixreg[3]; retval[1] = regs.fixreg[4]; -#endif *errorp = !!(regs.cr & 0x10000000); return (0); } -static struct procabi powerpc_fbsd = { +static struct procabi powerpc_freebsd = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), @@ -147,4 +119,4 @@ static struct procabi powerpc_fbsd = { powerpc_fetch_retval }; -PROCABI(powerpc_fbsd); +PROCABI(powerpc_freebsd); diff --git a/usr.bin/truss/powerpc64-fbsd.c b/usr.bin/truss/powerpc64-freebsd.c similarity index 97% rename from usr.bin/truss/powerpc64-fbsd.c rename to usr.bin/truss/powerpc64-freebsd.c index 5ca5c22dc2cd..fafaa1bde5bf 100644 --- a/usr.bin/truss/powerpc64-fbsd.c +++ b/usr.bin/truss/powerpc64-freebsd.c @@ -40,7 +40,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "syscalls.h" +#include "freebsd_syscalls.h" static int powerpc64_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -107,7 +107,7 @@ powerpc64_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) return (0); } -static struct procabi powerpc64_fbsd = { +static struct procabi powerpc64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -115,4 +115,4 @@ static struct procabi powerpc64_fbsd = { powerpc64_fetch_retval }; -PROCABI(powerpc64_fbsd); +PROCABI(powerpc64_freebsd); diff --git a/usr.bin/truss/powerpc64-freebsd32.c b/usr.bin/truss/powerpc64-freebsd32.c new file mode 100644 index 000000000000..fc0ffb8dbddb --- /dev/null +++ b/usr.bin/truss/powerpc64-freebsd32.c @@ -0,0 +1,127 @@ +/* + * Copyright 2006 Peter Grehan + * Copyright 2005 Orlando Bassotto + * Copyright 1998 Sean Eric Fagan + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +/* FreeBSD/powerpc64-freebsd32-specific system call handling. */ + +#include +#include + +#include +#include + +#include + +#include "truss.h" + +#include "freebsd32_syscalls.h" + +static int +powerpc64_freebsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) +{ + struct ptrace_io_desc iorequest; + struct reg regs; + struct current_syscall *cs; + lwpid_t tid; + u_int i, reg; + + tid = trussinfo->curthread->tid; + cs = &trussinfo->curthread->cs; + if (ptrace(PT_GETREGS, tid, (caddr_t)®s, 0) < 0) { + fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n"); + return (-1); + } + + /* + * FreeBSD has two special kinds of system call redirections -- + * SYS_syscall, and SYS___syscall. The former is the old syscall() + * routine, basically; the latter is for quad-aligned arguments. + * + * The system call argument count and code from ptrace() already + * account for these, but we need to skip over the first argument. + */ + reg = 0; + switch (regs.fixreg[0]) { + case SYS_syscall: + reg += 1; + break; + case SYS___syscall: + reg += 2; + break; + } + + for (i = 0; i < narg && reg < NARGREG; i++, reg++) { + cs->args[i] = regs.fixreg[FIRSTARG + reg] & 0xffffffff; + } + if (narg > i) { + uint32_t args32[narg - i]; + u_int j; + + iorequest.piod_op = PIOD_READ_D; + iorequest.piod_offs = (void *)(regs.fixreg[1] + 8); + iorequest.piod_addr = args32; + iorequest.piod_len = sizeof(args32); + ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); + if (iorequest.piod_len == 0) + return (-1); + for (j = 0; j < narg - i; j++) + cs->args[i + j] = args32[j]; + } + + return (0); +} + +static int +powerpc64_freebsd32_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) +{ + struct reg regs; + lwpid_t tid; + + tid = trussinfo->curthread->tid; + if (ptrace(PT_GETREGS, tid, (caddr_t)®s, 0) < 0) { + fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n"); + return (-1); + } + + /* XXX: Does not have fixup for __syscall(). */ + retval[0] = regs.fixreg[3] & 0xffffffff; + retval[1] = regs.fixreg[4] & 0xffffffff; + *errorp = !!(regs.cr & 0x10000000); + return (0); +} + +static struct procabi powerpc64_freebsd32 = { + "FreeBSD ELF32", + syscallnames, + nitems(syscallnames), + powerpc64_freebsd32_fetch_args, + powerpc64_freebsd32_fetch_retval +}; + +PROCABI(powerpc64_freebsd32); diff --git a/usr.bin/truss/sparc64-fbsd.c b/usr.bin/truss/sparc64-freebsd.c similarity index 97% rename from usr.bin/truss/sparc64-fbsd.c rename to usr.bin/truss/sparc64-freebsd.c index c8c1e8c27c07..a4dba92e63e7 100644 --- a/usr.bin/truss/sparc64-fbsd.c +++ b/usr.bin/truss/sparc64-freebsd.c @@ -46,7 +46,7 @@ __FBSDID("$FreeBSD$"); #include "truss.h" -#include "syscalls.h" +#include "freebsd_syscalls.h" static int sparc64_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -114,7 +114,7 @@ sparc64_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) return (0); } -static struct procabi sparc64_fbsd = { +static struct procabi sparc64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -122,4 +122,4 @@ static struct procabi sparc64_fbsd = { sparc64_fetch_retval }; -PROCABI(sparc64_fbsd); +PROCABI(sparc64_freebsd);