xref: /OK3568_Linux_fs/external/xserver/doc/dtrace/Xserver-DTrace.xml (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun<?xml version="1.0" encoding="ISO-8859-1"?>
2*4882a593Smuzhiyun<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
3*4882a593Smuzhiyun "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
4*4882a593Smuzhiyun <!ENTITY % defs SYSTEM "/xserver/doc/xml/xserver.ent"> %defs;
5*4882a593Smuzhiyun]>
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun<article id="Xserver-DTrace">
8*4882a593Smuzhiyun  <articleinfo>
9*4882a593Smuzhiyun    <title>Xserver Provider for DTrace</title>
10*4882a593Smuzhiyun    <author>
11*4882a593Smuzhiyun      <firstname>Alan</firstname><surname>Coopersmith</surname>
12*4882a593Smuzhiyun      <affiliation>
13*4882a593Smuzhiyun	<orgname>Oracle Corporation</orgname>
14*4882a593Smuzhiyun	<orgdiv>Solaris Engineering</orgdiv>
15*4882a593Smuzhiyun      </affiliation>
16*4882a593Smuzhiyun    </author>
17*4882a593Smuzhiyun    <releaseinfo>X Server Version &xserver.version;</releaseinfo>
18*4882a593Smuzhiyun    <copyright><year>2005</year><year>2006</year><year>2007</year><year>2010</year><year>2020</year>
19*4882a593Smuzhiyun      <holder>Oracle and/or its affiliates.</holder>
20*4882a593Smuzhiyun    </copyright>
21*4882a593Smuzhiyun    <legalnotice id="copyright">
22*4882a593Smuzhiyun      <para>
23*4882a593SmuzhiyunPermission is hereby granted, free of charge, to any person obtaining a
24*4882a593Smuzhiyuncopy of this software and associated documentation files (the "Software"),
25*4882a593Smuzhiyunto deal in the Software without restriction, including without limitation
26*4882a593Smuzhiyunthe rights to use, copy, modify, merge, publish, distribute, sublicense,
27*4882a593Smuzhiyunand/or sell copies of the Software, and to permit persons to whom the
28*4882a593SmuzhiyunSoftware is furnished to do so, subject to the following conditions:
29*4882a593Smuzhiyun      </para><para>
30*4882a593SmuzhiyunThe above copyright notice and this permission notice (including the next
31*4882a593Smuzhiyunparagraph) shall be included in all copies or substantial portions of the
32*4882a593SmuzhiyunSoftware.
33*4882a593Smuzhiyun      </para><para>
34*4882a593SmuzhiyunTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
35*4882a593SmuzhiyunIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
36*4882a593SmuzhiyunFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
37*4882a593SmuzhiyunTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
38*4882a593SmuzhiyunLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
39*4882a593SmuzhiyunFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
40*4882a593SmuzhiyunDEALINGS IN THE SOFTWARE.
41*4882a593Smuzhiyun      </para>
42*4882a593Smuzhiyun    </legalnotice>
43*4882a593Smuzhiyun  </articleinfo>
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun  <sect1 id="introduction">
46*4882a593Smuzhiyun    <title>Introduction</title>
47*4882a593Smuzhiyun    <para>
48*4882a593Smuzhiyun      This page provides details on a
49*4882a593Smuzhiyun      <ulink url="http://dtrace.org/guide/chp-usdt.html">statically defined user application tracing provider</ulink>
50*4882a593Smuzhiyun      for the
51*4882a593Smuzhiyun      <ulink url="http://dtrace.org/blogs/about/">DTrace</ulink>
52*4882a593Smuzhiyun      facility in <productname>Solaris</productname> 10,
53*4882a593Smuzhiyun      <productname>MacOS X</productname> 10.5, and later releases.  This
54*4882a593Smuzhiyun      provider instruments various points in the X server, to allow
55*4882a593Smuzhiyun      tracing what client applications are up to. DTrace probes may be used
56*4882a593Smuzhiyun      with <ulink url="http://sourceware.org/systemtap/">SystemTap</ulink>
57*4882a593Smuzhiyun      on GNU/Linux systems.
58*4882a593Smuzhiyun    </para>
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun    <para>
61*4882a593Smuzhiyun      The provider was integrated into the X.Org git master repository
62*4882a593Smuzhiyun      with Solaris 10 &amp; OpenSolaris support for the Xserver 1.4 release,
63*4882a593Smuzhiyun      released in 2007 with X11R7.3.   Support for DTrace on MacOS X
64*4882a593Smuzhiyun      was added in Xserver 1.7.
65*4882a593Smuzhiyun    </para>
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun    <para>
68*4882a593Smuzhiyun      These probes expose the request and reply structure of the X protocol
69*4882a593Smuzhiyun      between clients and the X server, so an understanding of that basic
70*4882a593Smuzhiyun      nature will aid in learning how to use these probes.
71*4882a593Smuzhiyun    </para>
72*4882a593Smuzhiyun  </sect1>
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun  <sect1 id="probes">
75*4882a593Smuzhiyun    <title>Available probes</title>
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun    <para>
78*4882a593Smuzhiyun      Due to the way User-Defined DTrace probes work, arguments to
79*4882a593Smuzhiyun      these probes all bear undistinguished names of
80*4882a593Smuzhiyun      <parameter>arg0</parameter>, <parameter>arg1</parameter>,
81*4882a593Smuzhiyun      <parameter>arg2</parameter>, etc.  These tables should help you
82*4882a593Smuzhiyun      determine what the real data is for each of the probe arguments.
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun    <table id="Probes_and_their_arguments">
85*4882a593Smuzhiyun      <title>Probes and their arguments</title>
86*4882a593Smuzhiyun      <tgroup cols='9'>
87*4882a593Smuzhiyun	<colspec colname="probe" colwidth="2*"/>
88*4882a593Smuzhiyun	<colspec colname="desc" colwidth="3*"/>
89*4882a593Smuzhiyun	<colspec colname="arg0" colwidth="1*"/>
90*4882a593Smuzhiyun	<colspec colname="arg1" colwidth="1*"/>
91*4882a593Smuzhiyun	<colspec colname="arg2" colwidth="1*"/>
92*4882a593Smuzhiyun	<colspec colname="arg3" colwidth="1*"/>
93*4882a593Smuzhiyun	<colspec colname="arg4" colwidth="1*"/>
94*4882a593Smuzhiyun	<colspec colname="arg5" colwidth="1*"/>
95*4882a593Smuzhiyun	<colspec colname="arg6" colwidth="1*"/>
96*4882a593Smuzhiyun	<spanspec spanname="all" namest="probe" nameend="arg4"/>
97*4882a593Smuzhiyun	<thead>
98*4882a593Smuzhiyun	  <row>
99*4882a593Smuzhiyun	    <entry>Probe name</entry>
100*4882a593Smuzhiyun	    <entry>Description</entry>
101*4882a593Smuzhiyun	    <entry>arg0</entry>
102*4882a593Smuzhiyun	    <entry>arg1</entry>
103*4882a593Smuzhiyun	    <entry>arg2</entry>
104*4882a593Smuzhiyun	    <entry>arg3</entry>
105*4882a593Smuzhiyun	    <entry>arg4</entry>
106*4882a593Smuzhiyun	    <entry>arg5</entry>
107*4882a593Smuzhiyun	    <entry>arg6</entry>
108*4882a593Smuzhiyun	  </row>
109*4882a593Smuzhiyun	</thead>
110*4882a593Smuzhiyun	<tbody>
111*4882a593Smuzhiyun	  <row>
112*4882a593Smuzhiyun	    <entry spanname="all" class="grouphead">Request Probes</entry>
113*4882a593Smuzhiyun	  </row>
114*4882a593Smuzhiyun	  <row>
115*4882a593Smuzhiyun	    <entry>request-start</entry>
116*4882a593Smuzhiyun	    <entry>Called just before processing each client request.</entry>
117*4882a593Smuzhiyun	    <entry><parameter>requestName</parameter></entry>
118*4882a593Smuzhiyun	    <entry><parameter>requestCode</parameter></entry>
119*4882a593Smuzhiyun	    <entry><parameter>requestLength</parameter></entry>
120*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
121*4882a593Smuzhiyun	    <entry><parameter>requestBuffer</parameter></entry>
122*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
123*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
124*4882a593Smuzhiyun	  </row>
125*4882a593Smuzhiyun	  <row>
126*4882a593Smuzhiyun	    <entry>request-done</entry>
127*4882a593Smuzhiyun	    <entry>Called just after processing each client request.</entry>
128*4882a593Smuzhiyun	    <entry><parameter>requestName</parameter></entry>
129*4882a593Smuzhiyun	    <entry><parameter>requestCode</parameter></entry>
130*4882a593Smuzhiyun	    <entry><parameter>sequenceNumber</parameter></entry>
131*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
132*4882a593Smuzhiyun	    <entry><parameter>resultCode</parameter></entry>
133*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
134*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
135*4882a593Smuzhiyun	  </row>
136*4882a593Smuzhiyun	  <row>
137*4882a593Smuzhiyun	    <entry spanname="all" class="grouphead">Event Probes</entry>
138*4882a593Smuzhiyun	  </row>
139*4882a593Smuzhiyun	  <row>
140*4882a593Smuzhiyun	    <entry>send-event</entry>
141*4882a593Smuzhiyun	    <entry>Called just before send each event to a client.</entry>
142*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
143*4882a593Smuzhiyun	    <entry><parameter>eventCode</parameter></entry>
144*4882a593Smuzhiyun	    <entry><parameter>eventBuffer</parameter></entry>
145*4882a593Smuzhiyun	    <entry nameend="arg3" class="unused"/>
146*4882a593Smuzhiyun	    <entry nameend="arg4" class="unused"/>
147*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
148*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
149*4882a593Smuzhiyun	  </row>
150*4882a593Smuzhiyun	  <row>
151*4882a593Smuzhiyun	    <entry spanname="all" class="grouphead">Client Connection Probes</entry>
152*4882a593Smuzhiyun	  </row>
153*4882a593Smuzhiyun	  <row>
154*4882a593Smuzhiyun	    <entry>client-connect</entry>
155*4882a593Smuzhiyun	    <entry>Called when a new connection is opened from a client</entry>
156*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
157*4882a593Smuzhiyun	    <entry><parameter>clientFD</parameter></entry>
158*4882a593Smuzhiyun	    <entry nameend="arg2" class="unused"/>
159*4882a593Smuzhiyun	    <entry nameend="arg3" class="unused"/>
160*4882a593Smuzhiyun	    <entry nameend="arg4" class="unused"/>
161*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
162*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
163*4882a593Smuzhiyun	  </row>
164*4882a593Smuzhiyun	  <row>
165*4882a593Smuzhiyun	    <entry>client-auth</entry>
166*4882a593Smuzhiyun	    <entry>Called when client authenticates (normally just after connection opened)</entry>
167*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
168*4882a593Smuzhiyun	    <entry><parameter>clientAddr</parameter></entry>
169*4882a593Smuzhiyun	    <entry><parameter>clientPid</parameter></entry>
170*4882a593Smuzhiyun	    <entry><parameter>clientZoneId</parameter></entry>
171*4882a593Smuzhiyun	    <entry nameend="arg4" class="unused"/>
172*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
173*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
174*4882a593Smuzhiyun	  </row>
175*4882a593Smuzhiyun	  <row>
176*4882a593Smuzhiyun	    <entry>client-disconnect</entry>
177*4882a593Smuzhiyun	    <entry>Called when a client connection is closed</entry>
178*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
179*4882a593Smuzhiyun	    <entry nameend="arg1" class="unused"/>
180*4882a593Smuzhiyun	    <entry nameend="arg2" class="unused"/>
181*4882a593Smuzhiyun	    <entry nameend="arg3" class="unused"/>
182*4882a593Smuzhiyun	    <entry nameend="arg4" class="unused"/>
183*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
184*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
185*4882a593Smuzhiyun	  </row>
186*4882a593Smuzhiyun	  <row>
187*4882a593Smuzhiyun	    <entry spanname="all" class="grouphead">Resource Allocation Probes</entry>
188*4882a593Smuzhiyun	  </row>
189*4882a593Smuzhiyun	  <row>
190*4882a593Smuzhiyun	    <entry>resource-alloc</entry>
191*4882a593Smuzhiyun	    <entry>Called when a new resource (pixmap, gc, colormap, etc.) is allocated</entry>
192*4882a593Smuzhiyun	    <entry><parameter>resourceId</parameter></entry>
193*4882a593Smuzhiyun	    <entry><parameter>resourceTypeId</parameter></entry>
194*4882a593Smuzhiyun	    <entry><parameter>resourceValue</parameter></entry>
195*4882a593Smuzhiyun	    <entry><parameter>resourceTypeName</parameter></entry>
196*4882a593Smuzhiyun	    <entry nameend="arg4" class="unused"/>
197*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
198*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
199*4882a593Smuzhiyun	  </row>
200*4882a593Smuzhiyun	  <row>
201*4882a593Smuzhiyun	    <entry>resource-free</entry>
202*4882a593Smuzhiyun	    <entry>Called when a resource is freed</entry>
203*4882a593Smuzhiyun	    <entry><parameter>resourceId</parameter></entry>
204*4882a593Smuzhiyun	    <entry><parameter>resourceTypeId</parameter></entry>
205*4882a593Smuzhiyun	    <entry><parameter>resourceValue</parameter></entry>
206*4882a593Smuzhiyun	    <entry><parameter>resourceTypeName</parameter></entry>
207*4882a593Smuzhiyun	    <entry nameend="arg4" class="unused"/>
208*4882a593Smuzhiyun	    <entry nameend="arg5" class="unused"/>
209*4882a593Smuzhiyun	    <entry nameend="arg6" class="unused"/>
210*4882a593Smuzhiyun	  </row>
211*4882a593Smuzhiyun	  <row>
212*4882a593Smuzhiyun	    <entry spanname="all" class="grouphead">Input API probes</entry>
213*4882a593Smuzhiyun	  </row>
214*4882a593Smuzhiyun	  <row>
215*4882a593Smuzhiyun	    <entry>input-event</entry>
216*4882a593Smuzhiyun	    <entry>Called when an input event was submitted for processing</entry>
217*4882a593Smuzhiyun	    <entry><parameter>deviceid</parameter></entry>
218*4882a593Smuzhiyun	    <entry><parameter>eventtype</parameter></entry>
219*4882a593Smuzhiyun	    <entry><parameter>button</parameter> or
220*4882a593Smuzhiyun		   <parameter>keycode</parameter> or
221*4882a593Smuzhiyun		   <parameter>touchid</parameter></entry>
222*4882a593Smuzhiyun	    <entry><parameter>flags</parameter></entry>
223*4882a593Smuzhiyun	    <entry><parameter>nvalues</parameter></entry>
224*4882a593Smuzhiyun	    <entry><parameter>mask</parameter></entry>
225*4882a593Smuzhiyun	    <entry><parameter>values</parameter></entry>
226*4882a593Smuzhiyun	  </row>
227*4882a593Smuzhiyun	</tbody>
228*4882a593Smuzhiyun      </tgroup>
229*4882a593Smuzhiyun    </table>
230*4882a593Smuzhiyun    </para>
231*4882a593Smuzhiyun  </sect1>
232*4882a593Smuzhiyun
233*4882a593Smuzhiyun  <sect1 id="arguments">
234*4882a593Smuzhiyun    <title>Data Available in Probe Arguments</title>
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun    <para>
237*4882a593Smuzhiyun      To access data in arguments of type <type>string</type>, you will need
238*4882a593Smuzhiyun      to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyinstr"><function>copyinstr()</function></ulink>.
239*4882a593Smuzhiyun      To access data buffers referenced via <type>uintptr_t</type>'s, you will
240*4882a593Smuzhiyun      need to use <ulink url="http://dtrace.org/guide/chp-actsub.html#chp-actsub-copyin"><function>copyin()</function></ulink>.
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun    <table id="Probe_Arguments">
243*4882a593Smuzhiyun      <title>Probe Arguments</title>
244*4882a593Smuzhiyun      <tgroup cols='3'>
245*4882a593Smuzhiyun	<colspec colname="arg" colwidth="2*"/>
246*4882a593Smuzhiyun	<colspec colname="type" colwidth="1*"/>
247*4882a593Smuzhiyun	<colspec colname="desc" colwidth="7*"/>
248*4882a593Smuzhiyun	<thead>
249*4882a593Smuzhiyun	  <row>
250*4882a593Smuzhiyun	    <entry>Argument name</entry>
251*4882a593Smuzhiyun	    <entry>Type</entry>
252*4882a593Smuzhiyun	    <entry>Description</entry>
253*4882a593Smuzhiyun	  </row>
254*4882a593Smuzhiyun	</thead>
255*4882a593Smuzhiyun	<tbody>
256*4882a593Smuzhiyun	  <row>
257*4882a593Smuzhiyun	    <entry><parameter>clientAddr</parameter></entry>
258*4882a593Smuzhiyun	    <entry><type>string</type></entry>
259*4882a593Smuzhiyun	    <entry>String representing address client connected from</entry>
260*4882a593Smuzhiyun	  </row>
261*4882a593Smuzhiyun	  <row>
262*4882a593Smuzhiyun	    <entry><parameter>clientFD</parameter></entry>
263*4882a593Smuzhiyun	    <entry><type>int</type></entry>
264*4882a593Smuzhiyun	    <entry>X server's file descriptor for server side of each connection</entry>
265*4882a593Smuzhiyun	  </row>
266*4882a593Smuzhiyun	  <row>
267*4882a593Smuzhiyun	    <entry><parameter>clientId</parameter></entry>
268*4882a593Smuzhiyun	    <entry><type>int</type></entry>
269*4882a593Smuzhiyun	    <entry>Unique integer identifier for each connection to the
270*4882a593Smuzhiyun	      X server</entry>
271*4882a593Smuzhiyun	  </row>
272*4882a593Smuzhiyun	  <row>
273*4882a593Smuzhiyun	    <entry><parameter>clientPid</parameter></entry>
274*4882a593Smuzhiyun	    <entry><type>pid_t</type></entry>
275*4882a593Smuzhiyun	    <entry>Process id of client, if connection is local
276*4882a593Smuzhiyun	      (from <function>getpeerucred()</function>)</entry>
277*4882a593Smuzhiyun	  </row>
278*4882a593Smuzhiyun	  <row>
279*4882a593Smuzhiyun	    <entry><parameter>clientZoneId</parameter></entry>
280*4882a593Smuzhiyun	    <entry><type>zoneid_t</type></entry>
281*4882a593Smuzhiyun	    <entry>Solaris: Zone id of client, if connection is local
282*4882a593Smuzhiyun	      (from <function>getpeerucred()</function>)</entry>
283*4882a593Smuzhiyun	  </row>
284*4882a593Smuzhiyun	  <row>
285*4882a593Smuzhiyun	    <entry><parameter>eventBuffer</parameter></entry>
286*4882a593Smuzhiyun	    <entry><type>uintptr_t</type></entry>
287*4882a593Smuzhiyun	    <entry>Pointer to buffer containing X event - decode using
288*4882a593Smuzhiyun	      structures in
289*4882a593Smuzhiyun	      &lt;<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>&gt;
290*4882a593Smuzhiyun	      and similar headers for each extension</entry>
291*4882a593Smuzhiyun	  </row>
292*4882a593Smuzhiyun	  <row>
293*4882a593Smuzhiyun	    <entry><parameter>eventCode</parameter></entry>
294*4882a593Smuzhiyun	    <entry><type>uint8_t</type></entry>
295*4882a593Smuzhiyun	    <entry>Event number of X event</entry>
296*4882a593Smuzhiyun	  </row>
297*4882a593Smuzhiyun	  <row>
298*4882a593Smuzhiyun	    <entry><parameter>resourceId</parameter></entry>
299*4882a593Smuzhiyun	    <entry><type>uint32_t</type></entry>
300*4882a593Smuzhiyun	    <entry>X resource id (XID)</entry>
301*4882a593Smuzhiyun	  </row>
302*4882a593Smuzhiyun	  <row>
303*4882a593Smuzhiyun	    <entry><parameter>resourceTypeId</parameter></entry>
304*4882a593Smuzhiyun	    <entry><type>uint32_t</type></entry>
305*4882a593Smuzhiyun	    <entry>Resource type id</entry>
306*4882a593Smuzhiyun	  </row>
307*4882a593Smuzhiyun	  <row>
308*4882a593Smuzhiyun	    <entry><parameter>resourceTypeName</parameter></entry>
309*4882a593Smuzhiyun	    <entry><type>string</type></entry>
310*4882a593Smuzhiyun	    <entry>String representing X resource type
311*4882a593Smuzhiyun		(<literal>"PIXMAP"</literal>, etc.)</entry>
312*4882a593Smuzhiyun	  </row>
313*4882a593Smuzhiyun	  <row>
314*4882a593Smuzhiyun	    <entry><parameter>resourceValue</parameter></entry>
315*4882a593Smuzhiyun	    <entry><type>uintptr_t</type></entry>
316*4882a593Smuzhiyun	    <entry>Pointer to data for X resource</entry>
317*4882a593Smuzhiyun	  </row>
318*4882a593Smuzhiyun	  <row>
319*4882a593Smuzhiyun	    <entry><parameter>resultCode</parameter></entry>
320*4882a593Smuzhiyun	    <entry><type>int</type></entry>
321*4882a593Smuzhiyun	    <entry>Integer code representing result status of request</entry>
322*4882a593Smuzhiyun	  </row>
323*4882a593Smuzhiyun	  <row>
324*4882a593Smuzhiyun	    <entry><parameter>requestBuffer</parameter></entry>
325*4882a593Smuzhiyun	    <entry><type>uintptr_t</type></entry>
326*4882a593Smuzhiyun	    <entry>Pointer to buffer containing X request - decode using
327*4882a593Smuzhiyun	      structures in
328*4882a593Smuzhiyun	      &lt;<ulink url="https://gitlab.freedesktop.org/xorg/proto/xorgproto/-/blob/master/include/X11/Xproto.h"><filename class="headerfile">X11/Xproto.h</filename></ulink>&gt;
329*4882a593Smuzhiyun	      and similar headers for each extension</entry>
330*4882a593Smuzhiyun	  </row>
331*4882a593Smuzhiyun	  <row>
332*4882a593Smuzhiyun	    <entry><parameter>requestCode</parameter></entry>
333*4882a593Smuzhiyun	    <entry><type>uint8_t</type></entry>
334*4882a593Smuzhiyun	    <entry>Request number of X request or Extension</entry>
335*4882a593Smuzhiyun	  </row>
336*4882a593Smuzhiyun	  <row>
337*4882a593Smuzhiyun	    <entry><parameter>requestName</parameter></entry>
338*4882a593Smuzhiyun	    <entry><type>string</type></entry>
339*4882a593Smuzhiyun	    <entry>Name of X request or Extension</entry>
340*4882a593Smuzhiyun	  </row>
341*4882a593Smuzhiyun	  <row>
342*4882a593Smuzhiyun	    <entry><parameter>requestLength</parameter></entry>
343*4882a593Smuzhiyun	    <entry><type>uint16_t</type></entry>
344*4882a593Smuzhiyun	    <entry>Length of X request</entry>
345*4882a593Smuzhiyun	  </row>
346*4882a593Smuzhiyun	  <row>
347*4882a593Smuzhiyun	    <entry><parameter>sequenceNumber</parameter></entry>
348*4882a593Smuzhiyun	    <entry><type>uint32_t</type></entry>
349*4882a593Smuzhiyun	    <entry>Number of X request in in this connection</entry>
350*4882a593Smuzhiyun	  </row>
351*4882a593Smuzhiyun	  <row>
352*4882a593Smuzhiyun	    <entry><parameter>deviceid</parameter></entry>
353*4882a593Smuzhiyun	    <entry><type>int</type></entry>
354*4882a593Smuzhiyun	    <entry>The device's numerical ID</entry>
355*4882a593Smuzhiyun	  </row>
356*4882a593Smuzhiyun	  <row>
357*4882a593Smuzhiyun	    <entry><parameter>eventtype</parameter></entry>
358*4882a593Smuzhiyun	    <entry><type>int</type></entry>
359*4882a593Smuzhiyun	    <entry>Protocol event type</entry>
360*4882a593Smuzhiyun	  </row>
361*4882a593Smuzhiyun	  <row>
362*4882a593Smuzhiyun	    <entry><parameter>button, keycode, touchid</parameter></entry>
363*4882a593Smuzhiyun	    <entry><type>uint32_t</type></entry>
364*4882a593Smuzhiyun	    <entry>The button number, keycode or touch ID</entry>
365*4882a593Smuzhiyun	  </row>
366*4882a593Smuzhiyun	  <row>
367*4882a593Smuzhiyun	    <entry><parameter>flags</parameter></entry>
368*4882a593Smuzhiyun	    <entry><type>uint32_t</type></entry>
369*4882a593Smuzhiyun	    <entry>Miscellaneous event-specific server flags</entry>
370*4882a593Smuzhiyun	  </row>
371*4882a593Smuzhiyun	  <row>
372*4882a593Smuzhiyun	    <entry><parameter>nvalues</parameter></entry>
373*4882a593Smuzhiyun	    <entry><type>int8_t</type></entry>
374*4882a593Smuzhiyun	    <entry>Number of bits in <parameter>mask</parameter> and number of elements
375*4882a593Smuzhiyun		    in <parameter>values</parameter></entry>
376*4882a593Smuzhiyun	  </row>
377*4882a593Smuzhiyun	  <row>
378*4882a593Smuzhiyun	    <entry><parameter>mask</parameter></entry>
379*4882a593Smuzhiyun	    <entry><type>uint8_t*</type></entry>
380*4882a593Smuzhiyun	    <entry>Binary mask indicating which indices in <parameter>values</parameter> contain
381*4882a593Smuzhiyun		  valid data</entry>
382*4882a593Smuzhiyun	  </row>
383*4882a593Smuzhiyun	  <row>
384*4882a593Smuzhiyun	    <entry><parameter>values</parameter></entry>
385*4882a593Smuzhiyun	    <entry><type>double*</type></entry>
386*4882a593Smuzhiyun	    <entry>Valuator values. Values for indices for which the
387*4882a593Smuzhiyun		  <parameter>mask</parameter> is not set are undefined</entry>
388*4882a593Smuzhiyun	  </row>
389*4882a593Smuzhiyun	</tbody>
390*4882a593Smuzhiyun      </tgroup>
391*4882a593Smuzhiyun    </table>
392*4882a593Smuzhiyun    </para>
393*4882a593Smuzhiyun  </sect1>
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun  <sect1 id="examples">
396*4882a593Smuzhiyun    <title>Examples</title>
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun    <example id="Counting_requests_by_request_name">
399*4882a593Smuzhiyun      <title>Counting requests by request name</title>
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun      <para>
402*4882a593Smuzhiyun	This script simply increments a counter for each different request
403*4882a593Smuzhiyun	made, and when you exit the script (such as by hitting
404*4882a593Smuzhiyun	<keycombo action='simul'><keycap>Control</keycap><keycap>C</keycap>
405*4882a593Smuzhiyun	</keycombo>) prints the counts.
406*4882a593Smuzhiyun
407*4882a593Smuzhiyun	<programlisting>
408*4882a593Smuzhiyun#!/usr/sbin/dtrace -s
409*4882a593Smuzhiyun
410*4882a593SmuzhiyunXserver*:::request-start
411*4882a593Smuzhiyun{
412*4882a593Smuzhiyun    @counts[copyinstr(arg0)] = count();
413*4882a593Smuzhiyun}
414*4882a593Smuzhiyun	</programlisting>
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun	The output from a short run may appear as:
417*4882a593Smuzhiyun	<screen>
418*4882a593Smuzhiyun  QueryPointer                                                      1
419*4882a593Smuzhiyun  CreatePixmap                                                      2
420*4882a593Smuzhiyun  FreePixmap                                                        2
421*4882a593Smuzhiyun  PutImage                                                          2
422*4882a593Smuzhiyun  ChangeGC                                                         10
423*4882a593Smuzhiyun  CopyArea                                                         10
424*4882a593Smuzhiyun  CreateGC                                                         14
425*4882a593Smuzhiyun  FreeGC                                                           14
426*4882a593Smuzhiyun  RENDER                                                           28
427*4882a593Smuzhiyun  SetClipRectangles                                                40
428*4882a593Smuzhiyun	</screen>
429*4882a593Smuzhiyun      </para>
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun      <para>
432*4882a593Smuzhiyun	This can be rewritten slightly to cache the string containing the name
433*4882a593Smuzhiyun	of the request since it will be reused many times, instead of copying
434*4882a593Smuzhiyun	it over and over from the kernel:
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun	<programlisting>
437*4882a593Smuzhiyun#!/usr/sbin/dtrace -s
438*4882a593Smuzhiyun
439*4882a593Smuzhiyunstring Xrequest[uintptr_t];
440*4882a593Smuzhiyun
441*4882a593SmuzhiyunXserver*:::request-start
442*4882a593Smuzhiyun/Xrequest[arg0] == ""/
443*4882a593Smuzhiyun{
444*4882a593Smuzhiyun    Xrequest[arg0] = copyinstr(arg0);
445*4882a593Smuzhiyun}
446*4882a593Smuzhiyun
447*4882a593SmuzhiyunXserver*:::request-start
448*4882a593Smuzhiyun{
449*4882a593Smuzhiyun    @counts[Xrequest[arg0]] = count();
450*4882a593Smuzhiyun}
451*4882a593Smuzhiyun	</programlisting>
452*4882a593Smuzhiyun      </para>
453*4882a593Smuzhiyun    </example>
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun    <example id="Get_average_CPU_time_per_request">
456*4882a593Smuzhiyun      <title>Get average CPU time per request</title>
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun      <para>This script records the CPU time used between the probes at
459*4882a593Smuzhiyun	the start and end of each request and aggregates it per request type.
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun	<programlisting>
462*4882a593Smuzhiyun#!/usr/sbin/dtrace -s
463*4882a593Smuzhiyun
464*4882a593SmuzhiyunXserver*:::request-start
465*4882a593Smuzhiyun{
466*4882a593Smuzhiyun    reqstart = vtimestamp;
467*4882a593Smuzhiyun}
468*4882a593Smuzhiyun
469*4882a593SmuzhiyunXserver*:::request-done
470*4882a593Smuzhiyun{
471*4882a593Smuzhiyun    @times[copyinstr(arg0)] = avg(vtimestamp - reqstart);
472*4882a593Smuzhiyun}
473*4882a593Smuzhiyun	</programlisting>
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun	The output from a sample run might look like:
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun	<screen>
478*4882a593Smuzhiyun  ChangeGC                                                        889
479*4882a593Smuzhiyun  MapWindow                                                       907
480*4882a593Smuzhiyun  SetClipRectangles                                              1319
481*4882a593Smuzhiyun  PolyPoint                                                      1413
482*4882a593Smuzhiyun  PolySegment                                                    1434
483*4882a593Smuzhiyun  PolyRectangle                                                  1828
484*4882a593Smuzhiyun  FreeCursor                                                     1895
485*4882a593Smuzhiyun  FreeGC                                                         1950
486*4882a593Smuzhiyun  CreateGC                                                       2244
487*4882a593Smuzhiyun  FreePixmap                                                     2246
488*4882a593Smuzhiyun  GetInputFocus                                                  2249
489*4882a593Smuzhiyun  TranslateCoords                                                8508
490*4882a593Smuzhiyun  QueryTree                                                      8846
491*4882a593Smuzhiyun  GetGeometry                                                    9948
492*4882a593Smuzhiyun  CreatePixmap                                                  12111
493*4882a593Smuzhiyun  AllowEvents                                                   14090
494*4882a593Smuzhiyun  GrabServer                                                    14791
495*4882a593Smuzhiyun  MIT-SCREEN-SAVER                                              16747
496*4882a593Smuzhiyun  ConfigureWindow                                               22917
497*4882a593Smuzhiyun  SetInputFocus                                                 28521
498*4882a593Smuzhiyun  PutImage                                                     240841
499*4882a593Smuzhiyun
500*4882a593Smuzhiyun	</screen>
501*4882a593Smuzhiyun      </para>
502*4882a593Smuzhiyun    </example>
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun    <example id="Monitoring_clients_that_connect_and_disconnect">
505*4882a593Smuzhiyun      <title>Monitoring clients that connect and disconnect</title>
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun      <para>
508*4882a593Smuzhiyun	This script simply prints information about each client that
509*4882a593Smuzhiyun	connects or disconnects from the server while it is running.
510*4882a593Smuzhiyun	Since the provider is specified as <code>Xserver$1</code> instead
511*4882a593Smuzhiyun	of <code>Xserver*</code> like previous examples, it won't monitor
512*4882a593Smuzhiyun	all Xserver processes running on the machine, but instead expects
513*4882a593Smuzhiyun	the process id of the X server to monitor to be specified as the
514*4882a593Smuzhiyun	argument to the script.
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun	<programlisting>
517*4882a593Smuzhiyun#!/usr/sbin/dtrace -s
518*4882a593Smuzhiyun
519*4882a593SmuzhiyunXserver$1:::client-connect
520*4882a593Smuzhiyun{
521*4882a593Smuzhiyun	printf("** Client Connect: id %d\n", arg0);
522*4882a593Smuzhiyun}
523*4882a593Smuzhiyun
524*4882a593SmuzhiyunXserver$1:::client-auth
525*4882a593Smuzhiyun{
526*4882a593Smuzhiyun	printf("** Client auth'ed: id %d =&gt; %s pid %d\n",
527*4882a593Smuzhiyun		arg0, copyinstr(arg1), arg2);
528*4882a593Smuzhiyun}
529*4882a593Smuzhiyun
530*4882a593SmuzhiyunXserver$1:::client-disconnect
531*4882a593Smuzhiyun{
532*4882a593Smuzhiyun	printf("** Client Disconnect: id %d\n", arg0);
533*4882a593Smuzhiyun}
534*4882a593Smuzhiyun	</programlisting>
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun	A sample run:
537*4882a593Smuzhiyun
538*4882a593Smuzhiyun	<screen>
539*4882a593Smuzhiyun<prompt>#</prompt> <userinput>./foo.d 5790</userinput>
540*4882a593Smuzhiyun<computeroutput>dtrace: script './foo.d' matched 4 probes
541*4882a593SmuzhiyunCPU     ID                    FUNCTION:NAME
542*4882a593Smuzhiyun  0  15774 CloseDownClient:client-disconnect ** Client Disconnect: id 65
543*4882a593Smuzhiyun
544*4882a593Smuzhiyun  2  15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun  0  15773 EstablishNewConnections:client-connect ** Client Connect: id 64
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun  0  15772            AuthAudit:client-auth ** Client auth'ed: id 64 =&gt; local host pid 2034
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun  0  15773 EstablishNewConnections:client-connect ** Client Connect: id 65
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun  0  15772            AuthAudit:client-auth ** Client auth'ed: id 65 =&gt; local host pid 2034
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun  0  15774 CloseDownClient:client-disconnect ** Client Disconnect: id 64
555*4882a593Smuzhiyun	  </computeroutput>
556*4882a593Smuzhiyun	</screen>
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun      </para>
559*4882a593Smuzhiyun    </example>
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun    <example id="Monitoring_clients_creating_Pixmaps">
562*4882a593Smuzhiyun      <title>Monitoring clients creating Pixmaps</title>
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun      <para>
565*4882a593Smuzhiyun	This script can be used to determine which clients are creating
566*4882a593Smuzhiyun	pixmaps in the X server, printing information about each client
567*4882a593Smuzhiyun	as it connects to help trace it back to the program on the other
568*4882a593Smuzhiyun	end of the X connection.
569*4882a593Smuzhiyun
570*4882a593Smuzhiyun	<programlisting>
571*4882a593Smuzhiyun#!/usr/sbin/dtrace -qs
572*4882a593Smuzhiyun
573*4882a593Smuzhiyunstring Xrequest[uintptr_t];
574*4882a593Smuzhiyunstring Xrestype[uintptr_t];
575*4882a593Smuzhiyun
576*4882a593SmuzhiyunXserver$1:::request-start
577*4882a593Smuzhiyun/Xrequest[arg0] == ""/
578*4882a593Smuzhiyun{
579*4882a593Smuzhiyun	Xrequest[arg0] = copyinstr(arg0);
580*4882a593Smuzhiyun}
581*4882a593Smuzhiyun
582*4882a593SmuzhiyunXserver$1:::resource-alloc
583*4882a593Smuzhiyun/arg3 != 0 &amp;&amp; Xrestype[arg3] == ""/
584*4882a593Smuzhiyun{
585*4882a593Smuzhiyun	Xrestype[arg3] = copyinstr(arg3);
586*4882a593Smuzhiyun}
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun
589*4882a593SmuzhiyunXserver$1:::request-start
590*4882a593Smuzhiyun/Xrequest[arg0] == "X_CreatePixmap"/
591*4882a593Smuzhiyun{
592*4882a593Smuzhiyun	printf("-&gt; %s: client %d\n", Xrequest[arg0], arg3);
593*4882a593Smuzhiyun}
594*4882a593Smuzhiyun
595*4882a593SmuzhiyunXserver$1:::request-done
596*4882a593Smuzhiyun/Xrequest[arg0] == "X_CreatePixmap"/
597*4882a593Smuzhiyun{
598*4882a593Smuzhiyun	printf("&lt;- %s: client %d\n", Xrequest[arg0], arg3);
599*4882a593Smuzhiyun}
600*4882a593Smuzhiyun
601*4882a593SmuzhiyunXserver$1:::resource-alloc
602*4882a593Smuzhiyun/Xrestype[arg3] == "PIXMAP"/
603*4882a593Smuzhiyun{
604*4882a593Smuzhiyun	printf("** Pixmap alloc: %08x\n", arg0);
605*4882a593Smuzhiyun}
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun
608*4882a593SmuzhiyunXserver$1:::resource-free
609*4882a593Smuzhiyun/Xrestype[arg3] == "PIXMAP"/
610*4882a593Smuzhiyun{
611*4882a593Smuzhiyun	printf("** Pixmap free:  %08x\n", arg0);
612*4882a593Smuzhiyun}
613*4882a593Smuzhiyun
614*4882a593SmuzhiyunXserver$1:::client-connect
615*4882a593Smuzhiyun{
616*4882a593Smuzhiyun	printf("** Client Connect: id %d\n", arg0);
617*4882a593Smuzhiyun}
618*4882a593Smuzhiyun
619*4882a593SmuzhiyunXserver$1:::client-auth
620*4882a593Smuzhiyun{
621*4882a593Smuzhiyun	printf("** Client auth'ed: id %d =&gt; %s pid %d\n",
622*4882a593Smuzhiyun		arg0, copyinstr(arg1), arg2);
623*4882a593Smuzhiyun}
624*4882a593Smuzhiyun
625*4882a593SmuzhiyunXserver$1:::client-disconnect
626*4882a593Smuzhiyun{
627*4882a593Smuzhiyun	printf("** Client Disconnect: id %d\n", arg0);
628*4882a593Smuzhiyun}
629*4882a593Smuzhiyun	</programlisting>
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun	Sample output from a run of this script:
632*4882a593Smuzhiyun	<screen><computeroutput>
633*4882a593Smuzhiyun** Client Connect: id 17
634*4882a593Smuzhiyun** Client auth'ed: id 17 =&gt; local host pid 20273
635*4882a593Smuzhiyun-&gt; X_CreatePixmap: client 17
636*4882a593Smuzhiyun** Pixmap alloc: 02200009
637*4882a593Smuzhiyun&lt;- X_CreatePixmap: client 17
638*4882a593Smuzhiyun-&gt; X_CreatePixmap: client 15
639*4882a593Smuzhiyun** Pixmap alloc: 01e00180
640*4882a593Smuzhiyun&lt;- X_CreatePixmap: client 15
641*4882a593Smuzhiyun-&gt; X_CreatePixmap: client 15
642*4882a593Smuzhiyun** Pixmap alloc: 01e00181
643*4882a593Smuzhiyun&lt;- X_CreatePixmap: client 15
644*4882a593Smuzhiyun-&gt; X_CreatePixmap: client 14
645*4882a593Smuzhiyun** Pixmap alloc: 01c004c8
646*4882a593Smuzhiyun&lt;- X_CreatePixmap: client 14
647*4882a593Smuzhiyun** Pixmap free:  02200009
648*4882a593Smuzhiyun** Client Disconnect: id 17
649*4882a593Smuzhiyun** Pixmap free:  01e00180
650*4882a593Smuzhiyun** Pixmap free:  01e00181
651*4882a593Smuzhiyun	  </computeroutput></screen>
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun      </para>
654*4882a593Smuzhiyun
655*4882a593Smuzhiyun    </example>
656*4882a593Smuzhiyun
657*4882a593Smuzhiyun    <example id="Input_API_monitoring_with_systemtap">
658*4882a593Smuzhiyun      <title>Input API monitoring with SystemTap</title>
659*4882a593Smuzhiyun
660*4882a593Smuzhiyun      <para>
661*4882a593Smuzhiyun	This script can be used to monitor events submitted by drivers to
662*4882a593Smuzhiyun	the server for enqueuing. Due to the integration of the input API
663*4882a593Smuzhiyun	probes, some server-enqueued events will show up too.
664*4882a593Smuzhiyun	<programlisting>
665*4882a593Smuzhiyun  # Compile+run with
666*4882a593Smuzhiyun  #       stap -g xorg.stp /usr/bin/Xorg
667*4882a593Smuzhiyun  #
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun  function print_valuators:string(nvaluators:long, mask_in:long, valuators_in:long) %{
671*4882a593Smuzhiyun	  int i;
672*4882a593Smuzhiyun	  unsigned char *mask = (unsigned char*)THIS->mask_in;
673*4882a593Smuzhiyun	  double *valuators = (double*)THIS->valuators_in;
674*4882a593Smuzhiyun	  char str[128] = {0};
675*4882a593Smuzhiyun	  char *s = str;
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun  #define BitIsSet(ptr, bit) (((unsigned char*)(ptr))[(bit)>>3] &amp; (1 &lt;&lt; ((bit) &amp; 7)))
678*4882a593Smuzhiyun
679*4882a593Smuzhiyun	  s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators);
680*4882a593Smuzhiyun	  for (i = 0; i &lt; THIS->nvaluators; i++)
681*4882a593Smuzhiyun	  {
682*4882a593Smuzhiyun		  s += sprintf(s, "	%d: ", i);
683*4882a593Smuzhiyun		  if (BitIsSet(mask, i))
684*4882a593Smuzhiyun		      s += sprintf(s, "%d", (int)valuators[i]);
685*4882a593Smuzhiyun	  }
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun	  sprintf(THIS->__retvalue, "%s", str);
688*4882a593Smuzhiyun  %}
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun  probe process(@1).mark("input__event")
691*4882a593Smuzhiyun  {
692*4882a593Smuzhiyun      deviceid = $arg1
693*4882a593Smuzhiyun      type = $arg2
694*4882a593Smuzhiyun      detail = $arg3
695*4882a593Smuzhiyun      flags = $arg4
696*4882a593Smuzhiyun      nvaluators = $arg5
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun      str = print_valuators(nvaluators, $arg6, $arg7)
699*4882a593Smuzhiyun      printf("Event: device %d type %d detail %d flags %#x %s\n",
700*4882a593Smuzhiyun	      deviceid, type, detail, flags, str);
701*4882a593Smuzhiyun  }
702*4882a593Smuzhiyun	</programlisting>
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun	Sample output from a run of this script:
705*4882a593Smuzhiyun	<screen><computeroutput>
706*4882a593SmuzhiyunEvent: device 13 type 4 detail 1 flags 0x0 nval: 0 ::
707*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 1 ::	0: 1
708*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -1
709*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -1
710*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 4	1: -3
711*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 3	1: -3
712*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 3	1: -2
713*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -2
714*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -2
715*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 2	1: -2
716*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 	1: -1
717*4882a593SmuzhiyunEvent: device 13 type 6 detail 0 flags 0xa nval: 2 ::	0: 	1: -1
718*4882a593SmuzhiyunEvent: device 13 type 5 detail 1 flags 0x0 nval: 0 ::
719*4882a593Smuzhiyun	</computeroutput></screen>
720*4882a593Smuzhiyun
721*4882a593Smuzhiyun      </para>
722*4882a593Smuzhiyun
723*4882a593Smuzhiyun    </example>
724*4882a593Smuzhiyun
725*4882a593Smuzhiyun  </sect1>
726*4882a593Smuzhiyun
727*4882a593Smuzhiyun</article>
728