summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.bin/truss/Makefile107
-rw-r--r--usr.bin/truss/Makefile.depend.amd6412
-rw-r--r--usr.bin/truss/aarch64-freebsd.c (renamed from usr.bin/truss/aarch64-fbsd.c)7
-rw-r--r--usr.bin/truss/amd64-cloudabi64.c4
-rw-r--r--usr.bin/truss/amd64-freebsd.c (renamed from usr.bin/truss/amd64-fbsd.c)6
-rw-r--r--usr.bin/truss/amd64-freebsd32.c (renamed from usr.bin/truss/amd64-fbsd32.c)30
-rw-r--r--usr.bin/truss/amd64-linux32.c6
-rw-r--r--usr.bin/truss/amd64cloudabi64.conf13
-rw-r--r--usr.bin/truss/amd64linux32.conf13
-rw-r--r--usr.bin/truss/arm-freebsd.c (renamed from usr.bin/truss/arm-fbsd.c)6
-rw-r--r--usr.bin/truss/fbsd32.conf13
-rw-r--r--usr.bin/truss/i386-freebsd.c (renamed from usr.bin/truss/i386-fbsd.c)10
-rw-r--r--usr.bin/truss/i386-linux.c6
-rw-r--r--usr.bin/truss/i386linux.conf13
-rwxr-xr-x[-rw-r--r--]usr.bin/truss/makesyscallsconf.sh (renamed from usr.bin/truss/i386.conf)10
-rw-r--r--usr.bin/truss/mips-freebsd.c (renamed from usr.bin/truss/mips-fbsd.c)6
-rw-r--r--usr.bin/truss/powerpc-freebsd.c (renamed from usr.bin/truss/powerpc-fbsd.c)34
-rw-r--r--usr.bin/truss/powerpc64-freebsd.c (renamed from usr.bin/truss/powerpc64-fbsd.c)6
-rw-r--r--usr.bin/truss/powerpc64-freebsd32.c127
-rw-r--r--usr.bin/truss/sparc64-freebsd.c (renamed from usr.bin/truss/sparc64-fbsd.c)6
20 files changed, 233 insertions, 202 deletions
diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile
index 869d479..c25f928 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}
-.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}
+# 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
-linux_syscalls.h: i386l-syscalls.master
- /bin/sh ${.CURDIR}/../../sys/kern/makesyscalls.sh ${.ALLSRC} \
- ${.CURDIR}/i386linux.conf
+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"
+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 <bsd.prog.mk>
diff --git a/usr.bin/truss/Makefile.depend.amd64 b/usr.bin/truss/Makefile.depend.amd64
index 210685b..bf32fa4 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
index 85819f6..1ec2b66 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 e65d8cb..2b93532 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
index ade9322..0461616 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
index 84a4b6b..82eb6cd 100644
--- a/usr.bin/truss/amd64-fbsd32.c
+++ b/usr.bin/truss/amd64-freebsd32.c
@@ -32,7 +32,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-/* FreeBSD/i386-specific system call handling. */
+/* FreeBSD/amd64-freebsd32-specific system call handling. */
#include <sys/ptrace.h>
#include <sys/syscall.h>
@@ -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 4f64af3..17e5fdc 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 e68906e..0000000
--- 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 7f5e8bd..0000000
--- 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
index 4b8222a..aa7bccc 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 3323f11..0000000
--- 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
index 029815e..d9d72aa 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 fa57af2..9166271 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 7669bce..0000000
--- 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
index cfe2f46..81eb78e 100644..100755
--- 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
index d488b7e..0c504b8 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
index 4a11459..90c3663 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
index 5ca5c22..fafaa1b 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 0000000..fc0ffb8
--- /dev/null
+++ b/usr.bin/truss/powerpc64-freebsd32.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2006 Peter Grehan <grehan@freebsd.org>
+ * Copyright 2005 Orlando Bassotto <orlando@break.net>
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* FreeBSD/powerpc64-freebsd32-specific system call handling. */
+
+#include <sys/ptrace.h>
+#include <sys/syscall.h>
+
+#include <machine/reg.h>
+#include <machine/frame.h>
+
+#include <stdio.h>
+
+#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)&regs, 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)&regs, 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
index c8c1e8c..a4dba92 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);
OpenPOWER on IntegriCloud