svn commit: r326911 - head/usr.bin/truss
Ed Schouten
ed at FreeBSD.org
Sat Dec 16 19:40:29 UTC 2017
Author: ed
Date: Sat Dec 16 19:40:28 2017
New Revision: 326911
URL: https://svnweb.freebsd.org/changeset/base/326911
Log:
Make truss(8) work for i686-unknown-cloudabi binaries on FreeBSD/amd64.
This change copies the existing amd64_cloudabi64.c to amd64_cloudabi32.c
and reimplements the functions for fetching system call arguments and
return values to use the same scheme as used by the vDSO that is used
when running cloudabi32 executables.
As arguments are automatically padded to 64-bit words by the vDSO in
userspace, we can copy the arguments directly into the array used by
truss(8) internally.
Reviewed by: jhb
Differential Revision: https://reviews.freebsd.org/D13516
Added:
head/usr.bin/truss/amd64-cloudabi32.c
- copied, changed from r326896, head/usr.bin/truss/amd64-cloudabi64.c
Modified:
head/usr.bin/truss/Makefile
Modified: head/usr.bin/truss/Makefile
==============================================================================
--- head/usr.bin/truss/Makefile Sat Dec 16 19:37:55 2017 (r326910)
+++ head/usr.bin/truss/Makefile Sat Dec 16 19:40:28 2017 (r326911)
@@ -22,6 +22,7 @@ ABIS+= i386-linux
ABIS+= amd64-linux
ABIS+= amd64-linux32
ABIS+= freebsd32
+ABIS+= cloudabi32
ABIS+= cloudabi64
.endif
.if ${MACHINE_ARCH} == "powerpc64"
Copied and modified: head/usr.bin/truss/amd64-cloudabi32.c (from r326896, head/usr.bin/truss/amd64-cloudabi64.c)
==============================================================================
--- head/usr.bin/truss/amd64-cloudabi64.c Sat Dec 16 12:23:59 2017 (r326896, copy source)
+++ head/usr.bin/truss/amd64-cloudabi32.c Sat Dec 16 19:40:28 2017 (r326911)
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2015 Nuxi, https://nuxi.nl/
+ * Copyright (c) 2015-2017 Nuxi, https://nuxi.nl/
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -38,60 +38,75 @@ __FBSDID("$FreeBSD$");
#include "truss.h"
static int
-amd64_cloudabi64_fetch_args(struct trussinfo *trussinfo, unsigned int narg)
+amd64_cloudabi32_fetch_args(struct trussinfo *trussinfo, unsigned int narg)
{
struct current_syscall *cs;
+ struct ptrace_io_desc iorequest;
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);
- }
+ if (narg > 0) {
+ /* Fetch registers, containing the address of the arguments. */
+ 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;
- 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;
+ /* Fetch arguments. They are already padded to 64 bits. */
+ cs = &trussinfo->curthread->cs;
+ iorequest.piod_op = PIOD_READ_D;
+ iorequest.piod_offs = (void *)regs.r_rcx;
+ iorequest.piod_addr = cs->args;
+ iorequest.piod_len = sizeof(cs->args[0]) * narg;
+ if (ptrace(PT_IO, tid, (caddr_t)&iorequest, 0) == -1 ||
+ iorequest.piod_len == 0)
+ return (-1);
+ }
return (0);
}
static int
-amd64_cloudabi64_fetch_retval(struct trussinfo *trussinfo, long *retval,
+amd64_cloudabi32_fetch_retval(struct trussinfo *trussinfo, long *retval,
int *errorp)
{
+ struct ptrace_io_desc iorequest;
struct reg regs;
lwpid_t tid;
+ /* Fetch registers, containing the address of the return values. */
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.r_rax;
- retval[1] = regs.r_rdx;
- *errorp = (regs.r_rflags & PSL_C) != 0;
+ if (regs.r_rax == 0) {
+ /* System call succeeded. Fetch return values. */
+ iorequest.piod_op = PIOD_READ_D;
+ iorequest.piod_offs = (void *)regs.r_rcx;
+ iorequest.piod_addr = retval;
+ iorequest.piod_len = sizeof(retval[0]) * 2;
+ if (ptrace(PT_IO, tid, (caddr_t)&iorequest, 0) == -1 ||
+ iorequest.piod_len == 0)
+ return (-1);
+ *errorp = 0;
+ } else {
+ /* System call failed. Set error. */
+ retval[0] = regs.r_rax;
+ *errorp = 1;
+ }
return (0);
}
-static struct procabi amd64_cloudabi64 = {
- "CloudABI ELF64",
- SYSDECODE_ABI_CLOUDABI64,
- amd64_cloudabi64_fetch_args,
- amd64_cloudabi64_fetch_retval,
- STAILQ_HEAD_INITIALIZER(amd64_cloudabi64.extra_syscalls),
+static struct procabi amd64_cloudabi32 = {
+ "CloudABI ELF32",
+ SYSDECODE_ABI_CLOUDABI32,
+ amd64_cloudabi32_fetch_args,
+ amd64_cloudabi32_fetch_retval,
+ STAILQ_HEAD_INITIALIZER(amd64_cloudabi32.extra_syscalls),
{ NULL }
};
-PROCABI(amd64_cloudabi64);
+PROCABI(amd64_cloudabi32);
More information about the svn-src-all
mailing list