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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to