aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/truss/Makefile10
-rw-r--r--usr.bin/truss/amd64-cloudabi64.c113
-rw-r--r--usr.bin/truss/amd64cloudabi64.conf13
3 files changed, 136 insertions, 0 deletions
diff --git a/usr.bin/truss/Makefile b/usr.bin/truss/Makefile
index 34a6ef449291..1cd0a9c3ad34 100644
--- a/usr.bin/truss/Makefile
+++ b/usr.bin/truss/Makefile
@@ -58,6 +58,16 @@ fbsd32-syscalls.master: ${.CURDIR}/../../sys/compat/freebsd32/syscalls.master
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
.endif
.if ${MACHINE_ARCH} == "powerpc64"
diff --git a/usr.bin/truss/amd64-cloudabi64.c b/usr.bin/truss/amd64-cloudabi64.c
new file mode 100644
index 000000000000..797c62ad7a46
--- /dev/null
+++ b/usr.bin/truss/amd64-cloudabi64.c
@@ -0,0 +1,113 @@
+/*-
+ * Copyright (c) 2015 Nuxi, https://nuxi.nl/
+ *
+ * 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$");
+
+#include <sys/param.h>
+#include <sys/ptrace.h>
+
+#include <machine/psl.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+#include "cloudabi64_syscalls.h"
+#include "truss.h"
+
+static int
+amd64_cloudabi64_fetch_args(struct trussinfo *trussinfo, unsigned int narg)
+{
+ struct current_syscall *cs;
+ struct reg regs;
+ lwpid_t tid;
+
+ tid = trussinfo->curthread->tid;
+ if (ptrace(PT_GETREGS, tid, (caddr_t)&regs, 0) == -1) {
+ fprintf(trussinfo->outfile, "-- CANNOT READ REGISTERS --\n");
+ return (-1);
+ }
+
+ cs = &trussinfo->curthread->cs;
+ if (narg >= 1)
+ cs->args[0] = regs.r_rdi;
+ if (narg >= 2)
+ cs->args[1] = regs.r_rsi;
+ if (narg >= 3)
+ cs->args[2] = regs.r_rdx;
+ if (narg >= 4)
+ cs->args[3] = regs.r_rcx;
+ if (narg >= 5)
+ cs->args[4] = regs.r_r8;
+ if (narg >= 6)
+ cs->args[5] = regs.r_r9;
+ return (0);
+}
+
+static const int cloudabi_errno_table[] = {
+ 0, E2BIG, EACCES, EADDRINUSE, EADDRNOTAVAIL, EAFNOSUPPORT,
+ EAGAIN, EALREADY, EBADF, EBADMSG, EBUSY, ECANCELED, ECHILD,
+ ECONNABORTED, ECONNREFUSED, ECONNRESET, EDEADLK, EDESTADDRREQ,
+ EDOM, EDQUOT, EEXIST, EFAULT, EFBIG, EHOSTUNREACH, EIDRM,
+ EILSEQ, EINPROGRESS, EINTR, EINVAL, EIO, EISCONN, EISDIR, ELOOP,
+ EMFILE, EMLINK, EMSGSIZE, EMULTIHOP, ENAMETOOLONG, ENETDOWN,
+ ENETRESET, ENETUNREACH, ENFILE, ENOBUFS, ENODEV, ENOENT,
+ ENOEXEC, ENOLCK, ENOLINK, ENOMEM, ENOMSG, ENOPROTOOPT, ENOSPC,
+ ENOSYS, ENOTCONN, ENOTDIR, ENOTEMPTY, ENOTRECOVERABLE, ENOTSOCK,
+ ENOTSUP, ENOTTY, ENXIO, EOVERFLOW, EOWNERDEAD, EPERM, EPIPE,
+ EPROTO, EPROTONOSUPPORT, EPROTOTYPE, ERANGE, EROFS, ESPIPE,
+ ESRCH, ESTALE, ETIMEDOUT, ETXTBSY, EXDEV, ENOTCAPABLE,
+};
+
+static int
+amd64_cloudabi64_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) == -1) {
+ 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) != 0;
+ if (*errorp && *retval >= 0 && *retval < nitems(cloudabi_errno_table))
+ *retval = cloudabi_errno_table[*retval];
+ return (0);
+}
+
+static struct procabi amd64_cloudabi64 = {
+ "CloudABI ELF64",
+ cloudabi64_syscallnames,
+ nitems(cloudabi64_syscallnames),
+ amd64_cloudabi64_fetch_args,
+ amd64_cloudabi64_fetch_retval
+};
+
+PROCABI(amd64_cloudabi64);
diff --git a/usr.bin/truss/amd64cloudabi64.conf b/usr.bin/truss/amd64cloudabi64.conf
new file mode 100644
index 000000000000..e68906ee99cb
--- /dev/null
+++ b/usr.bin/truss/amd64cloudabi64.conf
@@ -0,0 +1,13 @@
+# $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"