svn commit: r252858 - in stable/9/sys/cddl/dev: dtrace/amd64 sdt

Mark Johnston markj at FreeBSD.org
Sat Jul 6 02:49:57 UTC 2013


Author: markj
Date: Sat Jul  6 02:49:56 2013
New Revision: 252858
URL: http://svnweb.freebsd.org/changeset/base/252858

Log:
  MFC r251238:
  SDT probes can directly pass up to five arguments as arguments to
  dtrace_probe(). Arguments beyond these five must be obtained in an
  architecture-specific way; this can be done through the getargval provider
  method, and through dtrace_getarg() if getargval isn't overridden.
  
  This change fixes two off-by-one bugs in the way these arguments are fetched
  in FreeBSD's DTrace implementation. First, the SDT provider must set the
  aframes parameter to 1 when creating a probe. The aframes parameter controls
  the number of frames that dtrace_getarg() will step over in order to find
  the frame containing the extra arguments. On FreeBSD, dtrace_getarg() is
  called in SDT probe context via
  
  dtrace_probe()->dtrace_dif_emulate()->dtrace_dif_variable->dtrace_getarg()
  
  so aframes must be 3 since the arguments are in dtrace_probe()'s frame; it
  was previously being called with a value of 2 instead. illumos uses a
  different aframes value for SDT probes, but this is because illumos SDT
  probes fire by triggering the #UD fault handler rather than calling
  dtrace_probe() directly.
  
  The second bug has to do with the way arguments are grabbed out
  dtrace_probe()'s frame on amd64. The code currently jumps over the first
  stack argument and retrieves the rest of them using a pointer into the
  stack. This works on i386 because all of dtrace_probe()'s arguments will be
  on the stack and the first argument is the probe ID, which should be
  ignored. However, it is incorrect to ignore the first stack argument on
  amd64, so we correct the pointer used to access the arguments.

Modified:
  stable/9/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
  stable/9/sys/cddl/dev/sdt/sdt.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/cddl/dev/dtrace/amd64/dtrace_isa.c
==============================================================================
--- stable/9/sys/cddl/dev/dtrace/amd64/dtrace_isa.c	Sat Jul  6 01:46:58 2013	(r252857)
+++ stable/9/sys/cddl/dev/dtrace/amd64/dtrace_isa.c	Sat Jul  6 02:49:56 2013	(r252858)
@@ -398,7 +398,7 @@ dtrace_getarg(int arg, int aframes)
 	}
 
 	arg -= (inreg + 1);
-	stack = (uintptr_t *)&fp[1];
+	stack = (uintptr_t *)fp + 2;
 
 load:
 	DTRACE_CPUFLAG_SET(CPU_DTRACE_NOFAULT);

Modified: stable/9/sys/cddl/dev/sdt/sdt.c
==============================================================================
--- stable/9/sys/cddl/dev/sdt/sdt.c	Sat Jul  6 01:46:58 2013	(r252857)
+++ stable/9/sys/cddl/dev/sdt/sdt.c	Sat Jul  6 02:49:56 2013	(r252858)
@@ -134,7 +134,7 @@ sdt_probe_callback(struct sdt_probe *pro
 		return (0);
 
 	(void) dtrace_probe_create(prov->id, probe->mod, probe->func,
-	    probe->name, 0, probe);
+	    probe->name, 1, probe);
 
 	return (0);
 }


More information about the svn-src-all mailing list