From owner-freebsd-dtrace@FreeBSD.ORG Sun Oct 20 23:52:22 2013 Return-Path: Delivered-To: freebsd-dtrace@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id D55116CD; Sun, 20 Oct 2013 23:52:22 +0000 (UTC) (envelope-from markjdb@gmail.com) Received: from mail-qe0-x231.google.com (mail-qe0-x231.google.com [IPv6:2607:f8b0:400d:c02::231]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 8491A2A7E; Sun, 20 Oct 2013 23:52:22 +0000 (UTC) Received: by mail-qe0-f49.google.com with SMTP id a11so3353518qen.36 for ; Sun, 20 Oct 2013 16:52:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=aCL+35Gmqk7K9XNdpNirg8DsmUS9+hcWhLg2XaUDb2k=; b=p29TViDfoLiOM9pCbKCx6MEnC0RhoiY1EA+DdaffTYjXRTU/MKpMhJRMdeYcXqJvDB qEo5QKqHd2cmr5C1HkF4kHHjimhRPdOehKLTxSqQZyVinTFuw0cQba/ecNBxjFwDTU7K oaMqUrXfxoiFjg9j/nxTTuHwrKBOwoYNsh8pqszW6/N8xUkMLSZTykhvvDTieh0G1VhV MEEuEsQHU/lA9OyiC7R2/ir5CJKb0GAm+WbK9nkuhdJIOK2r73040++1TdZ8786y/ga2 MKWe+NTeH7xZAwNjrSkfbTQ+8tikRXuv86wuVoF3Ub6s7CWuWhcpyZPm/r+PYTKH6is5 +94A== X-Received: by 10.224.32.133 with SMTP id c5mr19937612qad.84.1382313141723; Sun, 20 Oct 2013 16:52:21 -0700 (PDT) Received: from charmander (24-212-218-13.cable.teksavvy.com. [24.212.218.13]) by mx.google.com with ESMTPSA id a5sm32154924qae.2.2013.10.20.16.52.20 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 20 Oct 2013 16:52:21 -0700 (PDT) Sender: Mark Johnston Date: Sun, 20 Oct 2013 19:52:16 -0400 From: Mark Johnston To: Veniamin Gvozdikov Subject: Re: Integration DTrace problems Message-ID: <20131020235216.GA13816@charmander> References: <6A174747-D855-481D-A191-67A2805BC9AE@freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <6A174747-D855-481D-A191-67A2805BC9AE@freebsd.org> User-Agent: Mutt/1.5.21 (2010-09-15) Cc: freebsd-dtrace@freebsd.org X-BeenThere: freebsd-dtrace@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "A discussion list for developers working on DTrace in FreeBSD." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 20 Oct 2013 23:52:23 -0000 On Wed, Oct 09, 2013 at 01:54:14AM +0400, Veniamin Gvozdikov wrote: > Hello, > > I have problems with integration DTrace: > > * Wildcard bug > * USDT at runtime works only with probes with arguments less than 5 The patch below should partly address this issue (which exists for the pid provider too). On amd64, the first six arguments are taken out of the trap frame with (roughly) the following line: val = regs->r_rdi[argno] where 0 <= argno <= 5 is the argument index. This works when the six argument registers correspond to consecutive of struct reg, which is not the case on FreeBSD. This bug only comes up when argno == 5 though, since the first _five_ arguments are passed directly to dtrace_probe() by the fasttrap trap handler. Arguments of index > 5 come from the stack and may still be incorrect with this patch. I'm not yet sure what the problem is - if the arguments are (4-byte) ints, some of the values are wrong, but when I change the types to long, the values are correct (up to arg9 at least). > * USDT depended by base src because need dtrace.h although It exists on OSX and Oracle Linux > * Bug with providers position in D file with multi link dtrace objects > * Bug with not used probes when all providers unavailable if doesn't use in code > * Inconvenient toolchains (need to see DTrace on OSX) > > For more details go to link http://zlonet.ru/page/dtrace-integration-features/ . > > > Any idea? diff --git a/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c b/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c index 65991af..8afc45a 100644 --- a/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c +++ b/sys/cddl/contrib/opensolaris/uts/intel/dtrace/fasttrap_isa.c @@ -271,8 +271,26 @@ fasttrap_anarg(struct reg *rp, int function_entry, int argno) * In 64-bit mode, the first six arguments are stored in * registers. */ - if (argno < 6) + if (argno < 6) { +#if !defined(sun) + switch (argno) { + case 0: + return (rp->r_rdi); + case 1: + return (rp->r_rsi); + case 2: + return (rp->r_rdx); + case 3: + return (rp->r_rcx); + case 4: + return (rp->r_r8); + case 5: + return (rp->r_r9); + } +#else return ((&rp->r_rdi)[argno]); +#endif + } stack = (uintptr_t *)rp->r_rsp; DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT); diff --git a/sys/cddl/dev/dtrace/amd64/dtrace_isa.c b/sys/cddl/dev/dtrace/amd64/dtrace_isa.c index 34d6f33..b82b77f 100644 --- a/sys/cddl/dev/dtrace/amd64/dtrace_isa.c +++ b/sys/cddl/dev/dtrace/amd64/dtrace_isa.c @@ -367,7 +367,31 @@ dtrace_getarg(int arg, int aframes) sizeof (uintptr_t)); if (arg <= inreg) { +#if !defined(sun) + switch (arg) { + case 0: + stack = (uintptr_t *)&rp->r_rdi; + break; + case 1: + stack = (uintptr_t *)&rp->r_rsi; + break; + case 2: + stack = (uintptr_t *)&rp->r_rdx; + break; + case 3: + stack = (uintptr_t *)&rp->r_rcx; + break; + case 4: + stack = (uintptr_t *)&rp->r_r8; + break; + case 5: + stack = (uintptr_t *)&rp->r_r9; + break; + } + arg = 0; +#else stack = (uintptr_t *)&rp->r_rdi; +#endif } else { stack = (uintptr_t *)(rp->r_rsp); arg -= inreg;