From owner-svn-src-head@freebsd.org Sat Dec 16 19:40:29 2017 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 61255E8C6E1; Sat, 16 Dec 2017 19:40:29 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 3AA246FC95; Sat, 16 Dec 2017 19:40:29 +0000 (UTC) (envelope-from ed@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id vBGJeSNj054092; Sat, 16 Dec 2017 19:40:28 GMT (envelope-from ed@FreeBSD.org) Received: (from ed@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id vBGJeSWm054090; Sat, 16 Dec 2017 19:40:28 GMT (envelope-from ed@FreeBSD.org) Message-Id: <201712161940.vBGJeSWm054090@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ed set sender to ed@FreeBSD.org using -f From: Ed Schouten Date: Sat, 16 Dec 2017 19:40:28 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r326911 - head/usr.bin/truss X-SVN-Group: head X-SVN-Commit-Author: ed X-SVN-Commit-Paths: head/usr.bin/truss X-SVN-Commit-Revision: 326911 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 16 Dec 2017 19:40:29 -0000 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);