diff options
author | Ed Schouten <ed@FreeBSD.org> | 2015-10-30 08:11:37 +0000 |
---|---|---|
committer | Ed Schouten <ed@FreeBSD.org> | 2015-10-30 08:11:37 +0000 |
commit | b0e787276bd1972176b0a3a5df64508a55949651 (patch) | |
tree | 1e988c14fde8f61b75e36ca8b01a1022b41e8822 /usr.bin/truss/aarch64-cloudabi64.c | |
parent | ff44c5381db328cc05e983eb8f7d9d941b134b36 (diff) | |
download | src-b0e787276bd1972176b0a3a5df64508a55949651.tar.gz src-b0e787276bd1972176b0a3a5df64508a55949651.zip |
Make truss work for CloudABI processes on aarch64.
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
Notes
Notes:
svn path=/head/; revision=290186
Diffstat (limited to 'usr.bin/truss/aarch64-cloudabi64.c')
-rw-r--r-- | usr.bin/truss/aarch64-cloudabi64.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/usr.bin/truss/aarch64-cloudabi64.c b/usr.bin/truss/aarch64-cloudabi64.c new file mode 100644 index 000000000000..ad6afc260b5e --- /dev/null +++ b/usr.bin/truss/aarch64-cloudabi64.c @@ -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)®s, 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)®s, 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); |