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)®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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201712161940.vBGJeSWm054090>