summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2016-06-09 02:21:07 +0000
committerjhb <jhb@FreeBSD.org>2016-06-09 02:21:07 +0000
commite65b37c80944222a70a895d3ceab4bcc01f40c08 (patch)
treefbb1bf4cea27c878ceec9885ab52d88b845d2cc5 /usr.bin
parent5a0157b1f9c04a1cdb9c4e1925332c177fc6ea02 (diff)
downloadFreeBSD-src-e65b37c80944222a70a895d3ceab4bcc01f40c08.zip
FreeBSD-src-e65b37c80944222a70a895d3ceab4bcc01f40c08.tar.gz
Add support for truss'ing Linux/x86_64 binaries under amd64.
Prodding by: xmj
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/truss/Makefile1
-rw-r--r--usr.bin/truss/amd64-linux.c104
2 files changed, 105 insertions, 0 deletions
diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile
index 7ba4392..480dab0 100644
--- a/usr.bin/truss/Makefile
+++ b/usr.bin/truss/Makefile
@@ -18,6 +18,7 @@ ABIS+= cloudabi64
ABIS+= i386-linux
.endif
.if ${MACHINE_CPUARCH} == "amd64"
+ABIS+= amd64-linux
ABIS+= amd64-linux32
ABIS+= freebsd32
ABIS+= cloudabi64
diff --git a/usr.bin/truss/amd64-linux.c b/usr.bin/truss/amd64-linux.c
new file mode 100644
index 0000000..4397804
--- /dev/null
+++ b/usr.bin/truss/amd64-linux.c
@@ -0,0 +1,104 @@
+/*
+ * 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 <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/* Linux/x86_64-specific system call handling. */
+
+#include <sys/ptrace.h>
+
+#include <machine/reg.h>
+#include <machine/psl.h>
+
+#include <stdio.h>
+#include <sysdecode.h>
+
+#include "truss.h"
+
+static int
+amd64_linux_fetch_args(struct trussinfo *trussinfo, u_int narg)
+{
+ struct reg regs;
+ struct current_syscall *cs;
+ lwpid_t tid;
+
+ 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);
+ }
+
+ switch (narg) {
+ default:
+ cs->args[5] = regs.r_r9;
+ case 5:
+ cs->args[4] = regs.r_r8;
+ case 4:
+ cs->args[3] = regs.r_rcx;
+ case 3:
+ cs->args[2] = regs.r_rdx;
+ case 2:
+ cs->args[1] = regs.r_rsi;
+ case 1:
+ cs->args[0] = regs.r_rdi;
+ }
+
+ return (0);
+}
+
+static int
+amd64_linux_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);
+ }
+
+ retval[0] = regs.r_rax;
+ retval[1] = regs.r_rdx;
+ *errorp = !!(regs.r_rflags & PSL_C);
+ return (0);
+}
+
+static struct procabi amd64_linux = {
+ "Linux ELF64",
+ SYSDECODE_ABI_LINUX,
+ amd64_linux_fetch_args,
+ amd64_linux_fetch_retval
+};
+
+PROCABI(amd64_linux);
OpenPOWER on IntegriCloud