Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Oct 2013 19:52:16 -0400
From:      Mark Johnston <markj@freebsd.org>
To:        Veniamin Gvozdikov <vg@freebsd.org>
Cc:        freebsd-dtrace@freebsd.org
Subject:   Re: Integration DTrace problems
Message-ID:  <20131020235216.GA13816@charmander>
In-Reply-To: <6A174747-D855-481D-A191-67A2805BC9AE@freebsd.org>
References:  <6A174747-D855-481D-A191-67A2805BC9AE@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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;



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