]> xenbits.xensource.com Git - people/julieng/freebsd.git/commitdiff
Make truss work for CloudABI processes on aarch64.
authored <ed@FreeBSD.org>
Fri, 30 Oct 2015 08:11:37 +0000 (08:11 +0000)
committered <ed@FreeBSD.org>
Fri, 30 Oct 2015 08:11:37 +0000 (08:11 +0000)
This change copies over amd64-cloudabi64.c to aarch64-cloudabi.c and
adjusts it to fetch the proper registers on aarch64. To reduce the
amount of shared code, the errno conversion function is moved into a
separate source file.

Reviewed by: jhb, andrew
Differential Revision: https://reviews.freebsd.org/D4023

usr.bin/truss/Makefile
usr.bin/truss/aarch64-cloudabi64.c [new file with mode: 0644]
usr.bin/truss/amd64-cloudabi64.c
usr.bin/truss/cloudabi.c [new file with mode: 0644]
usr.bin/truss/cloudabi.h [new file with mode: 0644]

index c25f9285e0c872883cfdff687adb70429d44890c..e78436513c6cfb1b2f0ad268da33644b6d39f16a 100644 (file)
@@ -2,7 +2,7 @@
 
 NO_WERROR=
 PROG=  truss
-SRCS=  main.c setup.c syscalls.c ioctl.c
+SRCS=  cloudabi.c ioctl.c main.c setup.c syscalls.c
 
 .PATH: ${.CURDIR:H}/kdump
 SRCS+= utrace.c
@@ -24,6 +24,9 @@ ABI_SYSPATH.amd64-linux32=    sys/amd64/linux32
 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_ARCH} == "aarch64"
+ABIS+=         cloudabi64
+.endif
 .if ${MACHINE_CPUARCH} == "i386"
 ABIS+=         i386-linux
 .endif
diff --git a/usr.bin/truss/aarch64-cloudabi64.c b/usr.bin/truss/aarch64-cloudabi64.c
new file mode 100644 (file)
index 0000000..ad6afc2
--- /dev/null
@@ -0,0 +1,90 @@
+/*-
+ * 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/armreg.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+#include "cloudabi.h"
+#include "cloudabi64_syscalls.h"
+#include "truss.h"
+
+static int
+aarch64_cloudabi64_fetch_args(struct trussinfo *trussinfo, unsigned int narg)
+{
+       struct current_syscall *cs;
+       struct reg regs;
+       lwpid_t tid;
+       unsigned int i;
+
+       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;
+       for (i = 0; i < narg && i < 8; i++)
+               cs->args[i] = regs.x[i];
+       return (0);
+}
+
+static int
+aarch64_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.x[0];
+       retval[1] = regs.x[1];
+       *errorp = (regs.spsr & PSR_C) != 0;
+       if (*errorp)
+               retval[0] = cloudabi_convert_errno(retval[0]);
+       return (0);
+}
+
+static struct procabi aarch64_cloudabi64 = {
+       "CloudABI ELF64",
+       syscallnames,
+       nitems(syscallnames),
+       aarch64_cloudabi64_fetch_args,
+       aarch64_cloudabi64_fetch_retval
+};
+
+PROCABI(aarch64_cloudabi64);
index 2b93532659a5f2ee2e583747b04ba2a805b0ac9e..5982b66b4aebfbc1ca310ff59fdd51bc52b28b8e 100644 (file)
@@ -34,8 +34,7 @@ __FBSDID("$FreeBSD$");
 #include <errno.h>
 #include <stdio.h>
 
-#include <compat/cloudabi/cloudabi_syscalldefs.h>
-
+#include "cloudabi.h"
 #include "cloudabi64_syscalls.h"
 #include "truss.h"
 
@@ -68,85 +67,6 @@ amd64_cloudabi64_fetch_args(struct trussinfo *trussinfo, unsigned int narg)
        return (0);
 }
 
-static const int cloudabi_errno_table[] = {
-       [CLOUDABI_E2BIG]                = E2BIG,
-       [CLOUDABI_EACCES]               = EACCES,
-       [CLOUDABI_EADDRINUSE]           = EADDRINUSE,
-       [CLOUDABI_EADDRNOTAVAIL]        = EADDRNOTAVAIL,
-       [CLOUDABI_EAFNOSUPPORT]         = EAFNOSUPPORT,
-       [CLOUDABI_EAGAIN]               = EAGAIN,
-       [CLOUDABI_EALREADY]             = EALREADY,
-       [CLOUDABI_EBADF]                = EBADF,
-       [CLOUDABI_EBADMSG]              = EBADMSG,
-       [CLOUDABI_EBUSY]                = EBUSY,
-       [CLOUDABI_ECANCELED]            = ECANCELED,
-       [CLOUDABI_ECHILD]               = ECHILD,
-       [CLOUDABI_ECONNABORTED]         = ECONNABORTED,
-       [CLOUDABI_ECONNREFUSED]         = ECONNREFUSED,
-       [CLOUDABI_ECONNRESET]           = ECONNRESET,
-       [CLOUDABI_EDEADLK]              = EDEADLK,
-       [CLOUDABI_EDESTADDRREQ]         = EDESTADDRREQ,
-       [CLOUDABI_EDOM]                 = EDOM,
-       [CLOUDABI_EDQUOT]               = EDQUOT,
-       [CLOUDABI_EEXIST]               = EEXIST,
-       [CLOUDABI_EFAULT]               = EFAULT,
-       [CLOUDABI_EFBIG]                = EFBIG,
-       [CLOUDABI_EHOSTUNREACH]         = EHOSTUNREACH,
-       [CLOUDABI_EIDRM]                = EIDRM,
-       [CLOUDABI_EILSEQ]               = EILSEQ,
-       [CLOUDABI_EINPROGRESS]          = EINPROGRESS,
-       [CLOUDABI_EINTR]                = EINTR,
-       [CLOUDABI_EINVAL]               = EINVAL,
-       [CLOUDABI_EIO]                  = EIO,
-       [CLOUDABI_EISCONN]              = EISCONN,
-       [CLOUDABI_EISDIR]               = EISDIR,
-       [CLOUDABI_ELOOP]                = ELOOP,
-       [CLOUDABI_EMFILE]               = EMFILE,
-       [CLOUDABI_EMLINK]               = EMLINK,
-       [CLOUDABI_EMSGSIZE]             = EMSGSIZE,
-       [CLOUDABI_EMULTIHOP]            = EMULTIHOP,
-       [CLOUDABI_ENAMETOOLONG]         = ENAMETOOLONG,
-       [CLOUDABI_ENETDOWN]             = ENETDOWN,
-       [CLOUDABI_ENETRESET]            = ENETRESET,
-       [CLOUDABI_ENETUNREACH]          = ENETUNREACH,
-       [CLOUDABI_ENFILE]               = ENFILE,
-       [CLOUDABI_ENOBUFS]              = ENOBUFS,
-       [CLOUDABI_ENODEV]               = ENODEV,
-       [CLOUDABI_ENOENT]               = ENOENT,
-       [CLOUDABI_ENOEXEC]              = ENOEXEC,
-       [CLOUDABI_ENOLCK]               = ENOLCK,
-       [CLOUDABI_ENOLINK]              = ENOLINK,
-       [CLOUDABI_ENOMEM]               = ENOMEM,
-       [CLOUDABI_ENOMSG]               = ENOMSG,
-       [CLOUDABI_ENOPROTOOPT]          = ENOPROTOOPT,
-       [CLOUDABI_ENOSPC]               = ENOSPC,
-       [CLOUDABI_ENOSYS]               = ENOSYS,
-       [CLOUDABI_ENOTCONN]             = ENOTCONN,
-       [CLOUDABI_ENOTDIR]              = ENOTDIR,
-       [CLOUDABI_ENOTEMPTY]            = ENOTEMPTY,
-       [CLOUDABI_ENOTRECOVERABLE]      = ENOTRECOVERABLE,
-       [CLOUDABI_ENOTSOCK]             = ENOTSOCK,
-       [CLOUDABI_ENOTSUP]              = ENOTSUP,
-       [CLOUDABI_ENOTTY]               = ENOTTY,
-       [CLOUDABI_ENXIO]                = ENXIO,
-       [CLOUDABI_EOVERFLOW]            = EOVERFLOW,
-       [CLOUDABI_EOWNERDEAD]           = EOWNERDEAD,
-       [CLOUDABI_EPERM]                = EPERM,
-       [CLOUDABI_EPIPE]                = EPIPE,
-       [CLOUDABI_EPROTO]               = EPROTO,
-       [CLOUDABI_EPROTONOSUPPORT]      = EPROTONOSUPPORT,
-       [CLOUDABI_EPROTOTYPE]           = EPROTOTYPE,
-       [CLOUDABI_ERANGE]               = ERANGE,
-       [CLOUDABI_EROFS]                = EROFS,
-       [CLOUDABI_ESPIPE]               = ESPIPE,
-       [CLOUDABI_ESRCH]                = ESRCH,
-       [CLOUDABI_ESTALE]               = ESTALE,
-       [CLOUDABI_ETIMEDOUT]            = ETIMEDOUT,
-       [CLOUDABI_ETXTBSY]              = ETXTBSY,
-       [CLOUDABI_EXDEV]                = EXDEV,
-       [CLOUDABI_ENOTCAPABLE]          = ENOTCAPABLE,
-};
-
 static int
 amd64_cloudabi64_fetch_retval(struct trussinfo *trussinfo, long *retval,
     int *errorp)
@@ -163,9 +83,8 @@ amd64_cloudabi64_fetch_retval(struct trussinfo *trussinfo, long *retval,
        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) &&
-           cloudabi_errno_table[*retval] != 0)
-               *retval = cloudabi_errno_table[*retval];
+       if (*errorp)
+               retval[0] = cloudabi_convert_errno(retval[0]);
        return (0);
 }
 
diff --git a/usr.bin/truss/cloudabi.c b/usr.bin/truss/cloudabi.c
new file mode 100644 (file)
index 0000000..d426500
--- /dev/null
@@ -0,0 +1,122 @@
+/*-
+ * 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 <errno.h>
+
+#include <compat/cloudabi/cloudabi_syscalldefs.h>
+
+#include "cloudabi.h"
+
+long
+cloudabi_convert_errno(long error)
+{
+       static const int table[] = {
+               [CLOUDABI_E2BIG]                = E2BIG,
+               [CLOUDABI_EACCES]               = EACCES,
+               [CLOUDABI_EADDRINUSE]           = EADDRINUSE,
+               [CLOUDABI_EADDRNOTAVAIL]        = EADDRNOTAVAIL,
+               [CLOUDABI_EAFNOSUPPORT]         = EAFNOSUPPORT,
+               [CLOUDABI_EAGAIN]               = EAGAIN,
+               [CLOUDABI_EALREADY]             = EALREADY,
+               [CLOUDABI_EBADF]                = EBADF,
+               [CLOUDABI_EBADMSG]              = EBADMSG,
+               [CLOUDABI_EBUSY]                = EBUSY,
+               [CLOUDABI_ECANCELED]            = ECANCELED,
+               [CLOUDABI_ECHILD]               = ECHILD,
+               [CLOUDABI_ECONNABORTED]         = ECONNABORTED,
+               [CLOUDABI_ECONNREFUSED]         = ECONNREFUSED,
+               [CLOUDABI_ECONNRESET]           = ECONNRESET,
+               [CLOUDABI_EDEADLK]              = EDEADLK,
+               [CLOUDABI_EDESTADDRREQ]         = EDESTADDRREQ,
+               [CLOUDABI_EDOM]                 = EDOM,
+               [CLOUDABI_EDQUOT]               = EDQUOT,
+               [CLOUDABI_EEXIST]               = EEXIST,
+               [CLOUDABI_EFAULT]               = EFAULT,
+               [CLOUDABI_EFBIG]                = EFBIG,
+               [CLOUDABI_EHOSTUNREACH]         = EHOSTUNREACH,
+               [CLOUDABI_EIDRM]                = EIDRM,
+               [CLOUDABI_EILSEQ]               = EILSEQ,
+               [CLOUDABI_EINPROGRESS]          = EINPROGRESS,
+               [CLOUDABI_EINTR]                = EINTR,
+               [CLOUDABI_EINVAL]               = EINVAL,
+               [CLOUDABI_EIO]                  = EIO,
+               [CLOUDABI_EISCONN]              = EISCONN,
+               [CLOUDABI_EISDIR]               = EISDIR,
+               [CLOUDABI_ELOOP]                = ELOOP,
+               [CLOUDABI_EMFILE]               = EMFILE,
+               [CLOUDABI_EMLINK]               = EMLINK,
+               [CLOUDABI_EMSGSIZE]             = EMSGSIZE,
+               [CLOUDABI_EMULTIHOP]            = EMULTIHOP,
+               [CLOUDABI_ENAMETOOLONG]         = ENAMETOOLONG,
+               [CLOUDABI_ENETDOWN]             = ENETDOWN,
+               [CLOUDABI_ENETRESET]            = ENETRESET,
+               [CLOUDABI_ENETUNREACH]          = ENETUNREACH,
+               [CLOUDABI_ENFILE]               = ENFILE,
+               [CLOUDABI_ENOBUFS]              = ENOBUFS,
+               [CLOUDABI_ENODEV]               = ENODEV,
+               [CLOUDABI_ENOENT]               = ENOENT,
+               [CLOUDABI_ENOEXEC]              = ENOEXEC,
+               [CLOUDABI_ENOLCK]               = ENOLCK,
+               [CLOUDABI_ENOLINK]              = ENOLINK,
+               [CLOUDABI_ENOMEM]               = ENOMEM,
+               [CLOUDABI_ENOMSG]               = ENOMSG,
+               [CLOUDABI_ENOPROTOOPT]          = ENOPROTOOPT,
+               [CLOUDABI_ENOSPC]               = ENOSPC,
+               [CLOUDABI_ENOSYS]               = ENOSYS,
+               [CLOUDABI_ENOTCONN]             = ENOTCONN,
+               [CLOUDABI_ENOTDIR]              = ENOTDIR,
+               [CLOUDABI_ENOTEMPTY]            = ENOTEMPTY,
+               [CLOUDABI_ENOTRECOVERABLE]      = ENOTRECOVERABLE,
+               [CLOUDABI_ENOTSOCK]             = ENOTSOCK,
+               [CLOUDABI_ENOTSUP]              = ENOTSUP,
+               [CLOUDABI_ENOTTY]               = ENOTTY,
+               [CLOUDABI_ENXIO]                = ENXIO,
+               [CLOUDABI_EOVERFLOW]            = EOVERFLOW,
+               [CLOUDABI_EOWNERDEAD]           = EOWNERDEAD,
+               [CLOUDABI_EPERM]                = EPERM,
+               [CLOUDABI_EPIPE]                = EPIPE,
+               [CLOUDABI_EPROTO]               = EPROTO,
+               [CLOUDABI_EPROTONOSUPPORT]      = EPROTONOSUPPORT,
+               [CLOUDABI_EPROTOTYPE]           = EPROTOTYPE,
+               [CLOUDABI_ERANGE]               = ERANGE,
+               [CLOUDABI_EROFS]                = EROFS,
+               [CLOUDABI_ESPIPE]               = ESPIPE,
+               [CLOUDABI_ESRCH]                = ESRCH,
+               [CLOUDABI_ESTALE]               = ESTALE,
+               [CLOUDABI_ETIMEDOUT]            = ETIMEDOUT,
+               [CLOUDABI_ETXTBSY]              = ETXTBSY,
+               [CLOUDABI_EXDEV]                = EXDEV,
+               [CLOUDABI_ENOTCAPABLE]          = ENOTCAPABLE,
+       };
+
+       if (error < 0 || error >= nitems(table) || table[error] == 0)
+               return (error);
+       return (table[error]);
+}
diff --git a/usr.bin/truss/cloudabi.h b/usr.bin/truss/cloudabi.h
new file mode 100644 (file)
index 0000000..abc8c0c
--- /dev/null
@@ -0,0 +1,28 @@
+/*-
+ * 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.
+ *
+ * $FreeBSD$
+ */
+
+long   cloudabi_convert_errno(long);