svn commit: r301715 - head/usr.bin/truss

John Baldwin jhb at FreeBSD.org
Thu Jun 9 02:21:08 UTC 2016


Author: jhb
Date: Thu Jun  9 02:21:07 2016
New Revision: 301715
URL: https://svnweb.freebsd.org/changeset/base/301715

Log:
  Add support for truss'ing Linux/x86_64 binaries under amd64.
  
  Prodding by:	xmj

Added:
  head/usr.bin/truss/amd64-linux.c   (contents, props changed)
Modified:
  head/usr.bin/truss/Makefile

Modified: head/usr.bin/truss/Makefile
==============================================================================
--- head/usr.bin/truss/Makefile	Thu Jun  9 02:02:50 2016	(r301714)
+++ head/usr.bin/truss/Makefile	Thu Jun  9 02:21:07 2016	(r301715)
@@ -18,6 +18,7 @@ ABIS+=		cloudabi64
 ABIS+=		i386-linux
 .endif
 .if ${MACHINE_CPUARCH} == "amd64"
+ABIS+=		amd64-linux
 ABIS+=		amd64-linux32
 ABIS+=		freebsd32
 ABIS+=		cloudabi64

Added: head/usr.bin/truss/amd64-linux.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/usr.bin/truss/amd64-linux.c	Thu Jun  9 02:21:07 2016	(r301715)
@@ -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);


More information about the svn-src-head mailing list