Date: Tue, 20 Dec 2016 03:02:24 +0900 (JST) From: Hiroki Sato <hrs@FreeBSD.org> To: markj@FreeBSD.org Cc: freebsd-dtrace@freebsd.org Subject: Re: clause-local variable with copyin() Message-ID: <20161220.030224.323335605995825210.hrs@allbsd.org> In-Reply-To: <20161219030125.GB57753@wkstn-mjohnston.west.isilon.com> References: <20161217.151014.1579687141761225852.hrs@allbsd.org> <20161219030125.GB57753@wkstn-mjohnston.west.isilon.com>
next in thread | previous in thread | raw e-mail | index | archive | help
----Security_Multipart(Tue_Dec_20_03_02_24_2016_631)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Mark Johnston <markj@FreeBSD.org> wrote
in <20161219030125.GB57753@wkstn-mjohnston.west.isilon.com>:
ma> On Sat, Dec 17, 2016 at 03:10:14PM +0900, Hiroki Sato wrote:
ma> > Do I misunderstand clause-local variable? I noticed this when I use
ma> > if-then clause which was recently implemented as a syntax sugar to
ma> > split a probe automatically. The following ended up with the same
ma> > result:
ma>
ma> I think this is more a quirk of copyin() than of clause-local variables.
ma> In particular:
ma> - your example works as expected if copyinstr() is used instead of
ma> copyin(), and
ma> - your example works if one assigns this->st = stringof(copyin(...)).
ma>
ma> copyin() and copyinstr() both copy data into a scratch buffer. However,
ma> copyinstr() returns a pass-by-reference string, while copyin() returns a
ma> pass-by-value pointer. The DIF instruction which saves to a clause-local
ma> variable, STLS, performs a deep copy of pass-by-reference variables to
ma> some dedicated storage. The scratch space containing the
ma> copyin()/copyinstr() is not preserved between enablings of the same
ma> probe, so the string copied during the first probe is not available in
ma> the second probe when copyin() is used.
The difference of the scratch space when using copyin() and
copyinstr() were the following ("-" is copyin() and "+" is
copyinstr()):
NAME ID KND SCP FLAG TYPE
arg0 106 scl glb r D type (integer) (size 8)
-st 500 scl loc w D type (pointer) (size 8)
+st 500 scl loc w string (unknown) by ref (size 256)
As you explained copyinstr() had DIF_TF_BYREF and DIF_OP_STLS
performed dtrace_vcopy(). However, I still do not understand the
difference of the behavior across the boundary of two clauses for a
single probe. Is it correct that the cause is that the contents of
the scratch space which came from copyin() or copyinstr() are not
preserved across multiple clauses of a single probe?
If it is true, I am still wondering why copyinstr() works. I think
DIF_OP_LDLS in the second probe to load this->st always fails if the
scratch space is not preserved regardless of whether the data type
involves dereference or not.
-- Hiroki
----Security_Multipart(Tue_Dec_20_03_02_24_2016_631)--
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iEYEABECAAYFAlhYILAACgkQTyzT2CeTzy0iMACgmAZW0gBSq1iuzq/GYqtwMGMG
qWEAoI/V4657LgnTc10a/bk1sF8jxF7C
=T9NS
-----END PGP SIGNATURE-----
----Security_Multipart(Tue_Dec_20_03_02_24_2016_631)----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20161220.030224.323335605995825210.hrs>
