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.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} +ABIS+= freebsd32 +.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-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 Index: usr.bin/truss/aarch64-fbsd.c =================================================================== --- usr.bin/truss/aarch64-fbsd.c +++ usr.bin/truss/aarch64-fbsd.c @@ -1,110 +0,0 @@ -/* - * Copyright (c) 2015 The FreeBSD Foundation - * - * Portions of this software were developed by Konstantin Belousov - * under sponsorship from the FreeBSD Foundation. - * - * 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/arm64-specific system call handling. */ - -#include -#include - -#include -#include -#include - -#include - -#include "truss.h" - -extern const char *syscallnames[]; /* silence compiler */ -#include "syscalls.h" - -static int -aarch64_fetch_args(struct trussinfo *trussinfo, u_int narg) -{ - struct reg regs; - struct current_syscall *cs; - lwpid_t tid; - u_int i, reg, syscall_num; - - 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. - */ - syscall_num = regs.x[8]; - if (syscall_num == SYS_syscall || syscall_num == SYS___syscall) { - reg = 1; - syscall_num = regs.x[0]; - } else { - reg = 0; - } - - for (i = 0; i < narg && reg < 8; i++, reg++) - cs->args[i] = regs.x[reg]; - return (0); -} - -static int -aarch64_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); - } - - retval[0] = regs.x[0]; - retval[1] = regs.x[1]; - *errorp = !!(regs.spsr & PSR_C); - return (0); -} - -static struct procabi aarch64_fbsd = { - "FreeBSD ELF64", - syscallnames, - nitems(syscallnames), - aarch64_fetch_args, - aarch64_fetch_retval -}; - -PROCABI(aarch64_fbsd); Index: usr.bin/truss/aarch64-freebsd.c =================================================================== --- usr.bin/truss/aarch64-freebsd.c +++ usr.bin/truss/aarch64-freebsd.c @@ -42,8 +42,7 @@ #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 @@ return (0); } -static struct procabi aarch64_fbsd = { +static struct procabi aarch64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -107,4 +106,4 @@ aarch64_fetch_retval }; -PROCABI(aarch64_fbsd); +PROCABI(aarch64_freebsd); Index: usr.bin/truss/amd64-cloudabi64.c =================================================================== --- usr.bin/truss/amd64-cloudabi64.c +++ usr.bin/truss/amd64-cloudabi64.c @@ -171,8 +171,8 @@ static struct procabi amd64_cloudabi64 = { "CloudABI ELF64", - cloudabi64_syscallnames, - nitems(cloudabi64_syscallnames), + syscallnames, + nitems(syscallnames), amd64_cloudabi64_fetch_args, amd64_cloudabi64_fetch_retval }; Index: usr.bin/truss/amd64-fbsd.c =================================================================== --- usr.bin/truss/amd64-fbsd.c +++ usr.bin/truss/amd64-fbsd.c @@ -1,131 +0,0 @@ -/* - * Copyright 1997 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Sean Eric Fagan - * 4. Neither the name of the author may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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/amd64-specific system call handling. */ - -#include -#include - -#include -#include - -#include - -#include "truss.h" - -#include "syscalls.h" - -static int -amd64_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 %rax if it contains - * either of these values. - */ - reg = 0; - switch (regs.r_rax) { - case SYS_syscall: - case SYS___syscall: - reg++; - break; - } - - for (i = 0; i < narg && reg < 6; i++, reg++) { - switch (reg) { - case 0: cs->args[i] = regs.r_rdi; break; - case 1: cs->args[i] = regs.r_rsi; break; - case 2: cs->args[i] = regs.r_rdx; break; - case 3: cs->args[i] = regs.r_rcx; break; - case 4: cs->args[i] = regs.r_r8; break; - case 5: cs->args[i] = regs.r_r9; break; - } - } - if (narg > i) { - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)(regs.r_rsp + sizeof(register_t)); - iorequest.piod_addr = &cs->args[i]; - iorequest.piod_len = (narg - i) * sizeof(register_t); - ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); - if (iorequest.piod_len == 0) - return (-1); - } - - return (0); -} - -static int -amd64_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); - } - - retval[0] = regs.r_rax; - retval[1] = regs.r_rdx; - *errorp = !!(regs.r_rflags & PSL_C); - return (0); -} - -static struct procabi amd64_fbsd = { - "FreeBSD ELF64", - syscallnames, - nitems(syscallnames), - amd64_fetch_args, - amd64_fetch_retval -}; - -PROCABI(amd64_fbsd); Index: usr.bin/truss/amd64-fbsd32.c =================================================================== --- usr.bin/truss/amd64-fbsd32.c +++ usr.bin/truss/amd64-fbsd32.c @@ -1,137 +0,0 @@ -/* - * Copyright 1997 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Sean Eric Fagan - * 4. Neither the name of the author may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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/i386-specific system call handling. */ - -#include -#include - -#include -#include - -#include -#include - -#include "truss.h" - -#include "freebsd32_syscalls.h" - -static int -amd64_fbsd32_fetch_args(struct trussinfo *trussinfo, u_int narg) -{ - struct ptrace_io_desc iorequest; - struct reg regs; - struct current_syscall *cs; - unsigned int args32[narg]; - unsigned long parm_offset; - lwpid_t tid; - u_int i; - - 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); - } - parm_offset = regs.r_rsp + sizeof(int); - - /* - * 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. - */ - switch (regs.r_rax) { - case SYS_syscall: - parm_offset += sizeof(int); - break; - case SYS___syscall: - parm_offset += sizeof(quad_t); - break; - } - - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)parm_offset; - 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 (i = 0; i < narg; i++) - cs->args[i] = args32[i]; - return (0); -} - -static int -amd64_fbsd32_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); - } - - retval[0] = regs.r_rax & 0xffffffff; - retval[1] = regs.r_rdx & 0xffffffff; - *errorp = !!(regs.r_rflags & PSL_C); - return (0); -} - -static struct procabi amd64_fbsd32 = { - "FreeBSD ELF32", - freebsd32_syscallnames, - nitems(freebsd32_syscallnames), - amd64_fbsd32_fetch_args, - amd64_fbsd32_fetch_retval -}; - -PROCABI(amd64_fbsd32); - -static struct procabi amd64_fbsd32_aout = { - "FreeBSD a.out", - freebsd32_syscallnames, - nitems(freebsd32_syscallnames), - amd64_fbsd32_fetch_args, - amd64_fbsd32_fetch_retval -}; - -PROCABI(amd64_fbsd32_aout); Index: usr.bin/truss/amd64-freebsd.c =================================================================== --- usr.bin/truss/amd64-freebsd.c +++ usr.bin/truss/amd64-freebsd.c @@ -44,7 +44,7 @@ #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 @@ return (0); } -static struct procabi amd64_fbsd = { +static struct procabi amd64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -128,4 +128,4 @@ amd64_fetch_retval }; -PROCABI(amd64_fbsd); +PROCABI(amd64_freebsd); Index: usr.bin/truss/amd64-freebsd32.c =================================================================== --- usr.bin/truss/amd64-freebsd32.c +++ usr.bin/truss/amd64-freebsd32.c @@ -32,7 +32,7 @@ #include __FBSDID("$FreeBSD: head/usr.bin/truss/amd64-fbsd32.c 288424 2015-09-30 19:13:32Z jhb $"); -/* FreeBSD/i386-specific system call handling. */ +/* FreeBSD/amd64-freebsd32-specific system call handling. */ #include #include @@ -48,7 +48,7 @@ #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 @@ } 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 @@ 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); 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 @@ -1,138 +0,0 @@ -/* - * Copyright 1997 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Sean Eric Fagan - * 4. Neither the name of the author may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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/arm-specific system call handling. */ - -#include -#include - -#include -#include -#include - -#include - -#include "truss.h" - -#include "syscalls.h" - -static int -arm_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, syscall_num; - - 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. - */ -#ifdef __ARM_EABI__ - syscall_num = regs.r[7]; -#else - if ((syscall_num = ptrace(PT_READ_I, tid, - (caddr_t)(regs.r[_REG_PC] - INSN_SIZE), 0)) == -1) { - fprintf(trussinfo->outfile, "-- CANNOT READ PC --\n"); - return (-1); - } - syscall_num = syscall_num & 0x000fffff; -#endif - - reg = 0; - switch (syscall_num) { - case SYS_syscall: - reg = 1; - break; - case SYS___syscall: - reg = 2; - break; - } - - for (i = 0; i < narg && reg < 4; i++, reg++) - cs->args[i] = regs.r[reg]; - if (narg > i) { - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)(regs.r_sp + - 4 * sizeof(uint32_t)); - iorequest.piod_addr = &cs->args[i]; - iorequest.piod_len = (narg - i) * sizeof(cs->args[0]); - ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); - if (iorequest.piod_len == 0) - return (-1); - } - - return (0); -} - -static int -arm_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 the __ARMEB__ handling for __syscall(). */ - retval[0] = regs.r[0]; - retval[1] = regs.r[1]; - *errorp = !!(regs.r_cpsr & PSR_C); - return (0); -} - -static struct procabi arm_fbsd = { - "FreeBSD ELF32", - syscallnames, - nitems(syscallnames), - arm_fetch_args, - arm_fetch_retval -}; - -PROCABI(arm_fbsd); Index: usr.bin/truss/arm-freebsd.c =================================================================== --- usr.bin/truss/arm-freebsd.c +++ usr.bin/truss/arm-freebsd.c @@ -45,7 +45,7 @@ #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 @@ return (0); } -static struct procabi arm_fbsd = { +static struct procabi arm_freebsd = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), @@ -135,4 +135,4 @@ arm_fetch_retval }; -PROCABI(arm_fbsd); +PROCABI(arm_freebsd); 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 @@ -1,131 +0,0 @@ -/* - * Copyright 1997 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Sean Eric Fagan - * 4. Neither the name of the author may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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/i386-specific system call handling. */ - -#include -#include - -#include -#include - -#include - -#include "truss.h" - -#include "syscalls.h" - -static int -i386_fetch_args(struct trussinfo *trussinfo, u_int narg) -{ - struct ptrace_io_desc iorequest; - struct reg regs; - struct current_syscall *cs; - lwpid_t tid; - unsigned int parm_offset; - - 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); - } - parm_offset = regs.r_esp + sizeof(int); - - /* - * 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. - */ - switch (regs.r_eax) { - case SYS_syscall: - parm_offset += sizeof(int); - break; - case SYS___syscall: - parm_offset += sizeof(quad_t); - break; - } - - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)parm_offset; - iorequest.piod_addr = cs->args; - iorequest.piod_len = narg * sizeof(unsigned long); - ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); - if (iorequest.piod_len == 0) - return (-1); - - return (0); -} - -static int -i386_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); - } - - retval[0] = regs.r_eax; - retval[1] = regs.r_edx; - *errorp = !!(regs.r_eflags & PSL_C); - return (0); -} - -static struct procabi i386_fbsd = { - "FreeBSD ELF32", - syscallnames, - nitems(syscallnames), - i386_fetch_args, - i386_fetch_retval -}; - -PROCABI(i386_fbsd); - -static struct procabi i386_fbsd_aout = { - "FreeBSD a.out", - syscallnames, - nitems(syscallnames), - i386_fetch_args, - i386_fetch_retval -}; - -PROCABI(i386_fbsd_aout); - Index: usr.bin/truss/i386-freebsd.c =================================================================== --- usr.bin/truss/i386-freebsd.c +++ usr.bin/truss/i386-freebsd.c @@ -44,7 +44,7 @@ #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 @@ return (0); } -static struct procabi i386_fbsd = { +static struct procabi i386_freebsd = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), @@ -117,9 +117,9 @@ 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 @@ i386_fetch_retval }; -PROCABI(i386_fbsd_aout); +PROCABI(i386_freebsd_aout); 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 @@ -1,141 +0,0 @@ -/* - * 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Sean Eric Fagan - * 4. Neither the name of the author may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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/mips-specific system call handling. */ - -#include -#include - -#include -#include - -#include - -#include "truss.h" - -#include "syscalls.h" - -static int -mips_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 = A0; - switch (regs.r_regs[V0]) { - case SYS_syscall: - reg = A1; - break; - case SYS___syscall: -#if defined(__mips_n32) || defined(__mips_n64) - reg = A1; -#else - reg = A2; -#endif - break; - } - -#if defined(__mips_n32) || defined(__mips_n64) -#define MAXREG A7 -#else -#define MAXREG A3 -#endif - - for (i = 0; i < narg && reg <= MAXREG; i++, reg++) - cs->args[i] = regs.r_regs[reg]; - if (narg > i) { - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)((uintptr_t)regs.r_regs[SP] + - 4 * sizeof(cs->args[0])); - iorequest.piod_addr = &cs->args[i]; - iorequest.piod_len = (narg - i) * sizeof(cs->args[0]); - ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); - if (iorequest.piod_len == 0) - return (-1); - } - - return (0); -} - -static int -mips_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 special handling for __syscall(). */ - retval[0] = regs.r_regs[V0]; - retval[1] = regs.r_regs[V1]; - *errorp = !!regs.r_regs[A3]; - return (0); -} - - -static struct procabi mips_fbsd = { -#ifdef __mips_n64 - "FreeBSD ELF64", -#else - "FreeBSD ELF32", -#endif - syscallnames, - nitems(syscallnames), - mips_fetch_args, - mips_fetch_retval -}; - -PROCABI(mips_fbsd); Index: usr.bin/truss/mips-freebsd.c =================================================================== --- usr.bin/truss/mips-freebsd.c +++ usr.bin/truss/mips-freebsd.c @@ -44,7 +44,7 @@ #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 @@ } -static struct procabi mips_fbsd = { +static struct procabi mips_freebsd = { #ifdef __mips_n64 "FreeBSD ELF64", #else @@ -138,4 +138,4 @@ mips_fetch_retval }; -PROCABI(mips_fbsd); +PROCABI(mips_freebsd); Index: usr.bin/truss/powerpc-fbsd.c =================================================================== --- usr.bin/truss/powerpc-fbsd.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * 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/powerpc-specific system call handling. */ - -#include -#include - -#include -#include - -#include - -#include "truss.h" - -#ifdef __powerpc64__ /* 32-bit compatibility */ -#include "freebsd32_syscalls.h" -#define syscallnames freebsd32_syscallnames -#else /* native 32-bit */ -#include "syscalls.h" -#endif - -static int -powerpc_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++) { -#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) -{ - 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(). */ -#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 = { - "FreeBSD ELF32", - syscallnames, - nitems(syscallnames), - powerpc_fetch_args, - powerpc_fetch_retval -}; - -PROCABI(powerpc_fbsd); Index: usr.bin/truss/powerpc-freebsd.c =================================================================== --- usr.bin/truss/powerpc-freebsd.c +++ usr.bin/truss/powerpc-freebsd.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 "freebsd_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,18 +105,13 @@ } /* 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 @@ powerpc_fetch_retval }; -PROCABI(powerpc_fbsd); +PROCABI(powerpc_freebsd); Index: usr.bin/truss/powerpc64-fbsd.c =================================================================== --- usr.bin/truss/powerpc64-fbsd.c +++ usr.bin/truss/powerpc64-fbsd.c @@ -1,118 +0,0 @@ -/* - * 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-specific system call handling. */ - -#include -#include - -#include -#include - -#include - -#include "truss.h" - -#include "syscalls.h" - -static int -powerpc64_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: - case SYS___syscall: - reg += 1; - break; - } - - for (i = 0; i < narg && reg < NARGREG; i++, reg++) - cs->args[i] = regs.fixreg[FIRSTARG + reg]; - if (narg > i) { - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)(regs.fixreg[1] + 48); - iorequest.piod_addr = &cs->args[i]; - iorequest.piod_len = (narg - i) * sizeof(cs->args[0]); - ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); - if (iorequest.piod_len == 0) - return (-1); - } - - return (0); -} - -static int -powerpc64_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); - } - - retval[0] = regs.fixreg[3]; - retval[1] = regs.fixreg[4]; - *errorp = !!(regs.cr & 0x10000000); - return (0); -} - -static struct procabi powerpc64_fbsd = { - "FreeBSD ELF64", - syscallnames, - nitems(syscallnames), - powerpc64_fetch_args, - powerpc64_fetch_retval -}; - -PROCABI(powerpc64_fbsd); Index: usr.bin/truss/powerpc64-freebsd.c =================================================================== --- usr.bin/truss/powerpc64-freebsd.c +++ usr.bin/truss/powerpc64-freebsd.c @@ -40,7 +40,7 @@ #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 @@ return (0); } -static struct procabi powerpc64_fbsd = { +static struct procabi powerpc64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -115,4 +115,4 @@ powerpc64_fetch_retval }; -PROCABI(powerpc64_fbsd); +PROCABI(powerpc64_freebsd); Index: usr.bin/truss/powerpc64-freebsd32.c =================================================================== --- usr.bin/truss/powerpc64-freebsd32.c +++ usr.bin/truss/powerpc64-freebsd32.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-freebsd32-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 static int -powerpc_fetch_args(struct trussinfo *trussinfo, u_int narg) +powerpc64_freebsd32_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_freebsd32_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_freebsd32 = { "FreeBSD ELF32", syscallnames, nitems(syscallnames), - powerpc_fetch_args, - powerpc_fetch_retval + powerpc64_freebsd32_fetch_args, + powerpc64_freebsd32_fetch_retval }; -PROCABI(powerpc_fbsd); +PROCABI(powerpc64_freebsd32); Index: usr.bin/truss/sparc64-fbsd.c =================================================================== --- usr.bin/truss/sparc64-fbsd.c +++ usr.bin/truss/sparc64-fbsd.c @@ -1,125 +0,0 @@ -/* - * 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Sean Eric Fagan - * 4. Neither the name of the author may be used to endorse or promote - * products derived from this software without specific prior written - * permission. - * - * 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/sparc64-specific system call handling. */ - -#include -#include - -#include -#include -#include - -#include -#include - -#include "truss.h" - -#include "syscalls.h" - -static int -sparc64_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.r_global[1]) { - case SYS_syscall: - case SYS___syscall: - reg = 1; - break; - } - - for (i = 0; i < narg && reg < 6; i++, reg++) - cs->args[i] = regs.r_out[reg]; - if (narg > i) { - iorequest.piod_op = PIOD_READ_D; - iorequest.piod_offs = (void *)(regs.r_out[6] + SPOFF + - offsetof(struct frame, fr_pad[6])); - iorequest.piod_addr = &cs->args[i]; - iorequest.piod_len = (narg - i) * sizeof(cs->args[0]); - ptrace(PT_IO, tid, (caddr_t)&iorequest, 0); - if (iorequest.piod_len == 0) - return (-1); - } - - return (0); -} - -static int -sparc64_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); - } - - retval[0] = regs.r_out[0]; - retval[1] = regs.r_out[1]; - *errorp = !!(regs.r_tstate & TSTATE_XCC_C); - return (0); -} - -static struct procabi sparc64_fbsd = { - "FreeBSD ELF64", - syscallnames, - nitems(syscallnames), - sparc64_fetch_args, - sparc64_fetch_retval -}; - -PROCABI(sparc64_fbsd); Index: usr.bin/truss/sparc64-freebsd.c =================================================================== --- usr.bin/truss/sparc64-freebsd.c +++ usr.bin/truss/sparc64-freebsd.c @@ -46,7 +46,7 @@ #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 @@ return (0); } -static struct procabi sparc64_fbsd = { +static struct procabi sparc64_freebsd = { "FreeBSD ELF64", syscallnames, nitems(syscallnames), @@ -122,4 +122,4 @@ sparc64_fetch_retval }; -PROCABI(sparc64_fbsd); +PROCABI(sparc64_freebsd);