Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 16 Dec 2017 19:40:28 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r326911 - head/usr.bin/truss
Message-ID:  <201712161940.vBGJeSWm054090@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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)&regs, 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)&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;
+		/* 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)&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 (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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201712161940.vBGJeSWm054090>