Integration DTrace problems
Adam Leventhal
ahl at delphix.com
Mon Oct 21 02:29:07 UTC 2013
Hey Mark,
I'd go so far as to suggest you remove the #ifdef sun stuff and just
have your new logic replace what was there. As the original author of
that code (I think), it is more kludgy than clever in retrospect -- as
so many things are...
Thanks.
Adam
On Sun, Oct 20, 2013 at 6:52 PM, Mark Johnston <markj at freebsd.org> wrote:
> 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;
> _______________________________________________
> freebsd-dtrace at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-dtrace
> To unsubscribe, send any mail to "freebsd-dtrace-unsubscribe at freebsd.org"
--
Adam Leventhal
CTO, Delphix
http://blog.delphix.com/ahl
More information about the freebsd-dtrace
mailing list