Index: usr.bin/truss/Makefile =================================================================== --- usr.bin/truss/Makefile +++ 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.fbsd= sys/kern +ABI_SYSPATH.fbsd32= sys/compat/freebsd32 +ABI_SYSPATH.cloudabi64= sys/compat/cloudabi64 +ABI_SYSPATH.i386-linux= sys/i386/linux +ABI_SYSPATH.amd64-linux32= sys/amd64/linux32 + +ABIS+= fbsd +# 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+= fbsd32 +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} +ABIS+= fbsd32 +.endif -freebsd32_syscalls.h: fbsd32-syscalls.master - /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \ - ${.CURDIR}/fbsd32.conf +.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 Index: usr.bin/truss/Makefile.depend.amd64 =================================================================== --- usr.bin/truss/Makefile.depend.amd64 +++ usr.bin/truss/Makefile.depend.amd64 @@ -19,12 +19,12 @@ # 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-fbsd.o: fbsd_syscalls.h +amd64-fbsd.po: fbsd_syscalls.h +amd64-fbsd32.o: fbsd32_syscalls.h +amd64-fbsd32.po: fbsd32_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 Index: usr.bin/truss/aarch64-fbsd.c =================================================================== --- usr.bin/truss/aarch64-fbsd.c +++ usr.bin/truss/aarch64-fbsd.c @@ -42,8 +42,7 @@ #include "truss.h" -extern const char *syscallnames[]; /* silence compiler */ -#include "syscalls.h" +#include "fbsd_syscalls.h" static int aarch64_fetch_args(struct trussinfo *trussinfo, u_int narg) Index: usr.bin/truss/amd64-fbsd.c =================================================================== --- usr.bin/truss/amd64-fbsd.c +++ usr.bin/truss/amd64-fbsd.c @@ -44,7 +44,7 @@ #include "truss.h" -#include "syscalls.h" +#include "fbsd_syscalls.h" static int amd64_fetch_args(struct trussinfo *trussinfo, u_int narg) Index: usr.bin/truss/amd64-fbsd32.c =================================================================== --- usr.bin/truss/amd64-fbsd32.c +++ usr.bin/truss/amd64-fbsd32.c @@ -32,7 +32,7 @@ #include __FBSDID("$FreeBSD$"); -/* FreeBSD/i386-specific system call handling. */ +/* FreeBSD/amd64-fbsd32-specific system call handling. */ #include #include @@ -45,7 +45,7 @@ #include "truss.h" -#include "freebsd32_syscalls.h" +#include "fbsd32_syscalls.h" static int amd64_fbsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -118,8 +118,8 @@ static struct procabi amd64_fbsd32 = { "FreeBSD ELF32", - freebsd32_syscallnames, - nitems(freebsd32_syscallnames), + syscallnames, + nitems(syscallnames), amd64_fbsd32_fetch_args, amd64_fbsd32_fetch_retval }; @@ -128,8 +128,8 @@ static struct procabi amd64_fbsd32_aout = { "FreeBSD a.out", - freebsd32_syscallnames, - nitems(freebsd32_syscallnames), + syscallnames, + nitems(syscallnames), amd64_fbsd32_fetch_args, amd64_fbsd32_fetch_retval }; Index: usr.bin/truss/amd64-linux32.c =================================================================== --- usr.bin/truss/amd64-linux32.c +++ usr.bin/truss/amd64-linux32.c @@ -43,7 +43,7 @@ #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 @@ static struct procabi amd64_linux32 = { "Linux ELF32", - linux32_syscallnames, - nitems(linux32_syscallnames), + syscallnames, + nitems(syscallnames), amd64_linux32_fetch_args, amd64_linux32_fetch_retval }; Index: usr.bin/truss/amd64cloudabi64.conf =================================================================== --- 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" Index: usr.bin/truss/amd64linux32.conf =================================================================== --- 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" Index: usr.bin/truss/arm-fbsd.c =================================================================== --- usr.bin/truss/arm-fbsd.c +++ usr.bin/truss/arm-fbsd.c @@ -45,7 +45,7 @@ #include "truss.h" -#include "syscalls.h" +#include "fbsd_syscalls.h" static int arm_fetch_args(struct trussinfo *trussinfo, u_int narg) Index: usr.bin/truss/fbsd32.conf =================================================================== --- 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" Index: usr.bin/truss/i386-fbsd.c =================================================================== --- usr.bin/truss/i386-fbsd.c +++ usr.bin/truss/i386-fbsd.c @@ -44,7 +44,7 @@ #include "truss.h" -#include "syscalls.h" +#include "fbsd_syscalls.h" static int i386_fetch_args(struct trussinfo *trussinfo, u_int narg) Index: usr.bin/truss/i386-linux.c =================================================================== --- usr.bin/truss/i386-linux.c +++ usr.bin/truss/i386-linux.c @@ -43,7 +43,7 @@ #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 @@ static struct procabi i386_linux = { "Linux ELF32", - linux_syscallnames, - nitems(linux_syscallnames), + syscallnames, + nitems(syscallnames), i386_linux_fetch_args, i386_linux_fetch_retval }; Index: usr.bin/truss/i386.conf =================================================================== --- usr.bin/truss/i386.conf +++ /dev/null @@ -1,13 +0,0 @@ -# $FreeBSD$ - -sysnames="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="syscallnames" -systrace="/dev/null" Index: usr.bin/truss/i386linux.conf =================================================================== --- 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" Index: usr.bin/truss/makesyscallsconf.sh =================================================================== --- /dev/null +++ usr.bin/truss/makesyscallsconf.sh @@ -0,0 +1,21 @@ +#! /bin/sh +# $FreeBSD$ + +ABI="$1" +CONF="$2" + +header="${ABI}_syscalls.h" + +cat > "${CONF}" << EOF +sysnames="${header}.tmp" +sysproto="/dev/null" +sysproto_h="/dev/null" +syshdr="/dev/null" +sysmk="/dev/null" +syssw="/dev/null" +syshide="/dev/null" +syscallprefix="SYS_" +switchname="sysent" +namesname="syscallnames" +systrace="/dev/null" +EOF Index: usr.bin/truss/mips-fbsd.c =================================================================== --- usr.bin/truss/mips-fbsd.c +++ usr.bin/truss/mips-fbsd.c @@ -44,7 +44,7 @@ #include "truss.h" -#include "syscalls.h" +#include "fbsd_syscalls.h" static int mips_fetch_args(struct trussinfo *trussinfo, u_int narg) Index: usr.bin/truss/powerpc-fbsd.c =================================================================== --- usr.bin/truss/powerpc-fbsd.c +++ usr.bin/truss/powerpc-fbsd.c @@ -40,12 +40,7 @@ #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 "fbsd_syscalls.h" static int powerpc_fetch_args(struct trussinfo *trussinfo, u_int narg) @@ -82,34 +77,16 @@ } 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,13 +105,8 @@ } /* 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); } Index: usr.bin/truss/powerpc64-fbsd.c =================================================================== --- usr.bin/truss/powerpc64-fbsd.c +++ usr.bin/truss/powerpc64-fbsd.c @@ -40,7 +40,7 @@ #include "truss.h" -#include "syscalls.h" +#include "fbsd_syscalls.h" static int powerpc64_fetch_args(struct trussinfo *trussinfo, u_int narg) Index: usr.bin/truss/powerpc64-fbsd32.c =================================================================== --- usr.bin/truss/powerpc64-fbsd32.c +++ usr.bin/truss/powerpc64-fbsd32.c @@ -28,7 +28,7 @@ #include __FBSDID("$FreeBSD: head/usr.bin/truss/powerpc-fbsd.c 288424 2015-09-30 19:13:32Z jhb $"); -/* FreeBSD/powerpc-specific system call handling. */ +/* FreeBSD/powerpc64-fbsd32-specific system call handling. */ #include #include @@ -40,15 +40,10 @@ #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 "fbsd32_syscalls.h" static int -powerpc_fetch_args(struct trussinfo *trussinfo, u_int narg) +powerpc64_fbsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) { struct ptrace_io_desc iorequest; struct reg regs; @@ -82,41 +77,28 @@ } 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); } static int -powerpc_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) +powerpc64_fbsd32_fetch_retval(struct trussinfo *trussinfo, long *retval, int *errorp) { struct reg regs; lwpid_t tid; @@ -128,23 +110,18 @@ } /* 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 powerpc64_fbsd32 = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), - powerpc_fetch_args, - powerpc_fetch_retval + powerpc64_fbsd32_fetch_args, + powerpc64_fbsd32_fetch_retval }; -PROCABI(powerpc_fbsd); +PROCABI(powerpc64_fbsd32); Index: usr.bin/truss/sparc64-fbsd.c =================================================================== --- usr.bin/truss/sparc64-fbsd.c +++ usr.bin/truss/sparc64-fbsd.c @@ -46,7 +46,7 @@ #include "truss.h" -#include "syscalls.h" +#include "fbsd_syscalls.h" static int sparc64_fetch_args(struct trussinfo *trussinfo, u_int narg)