diff options
-rw-r--r-- | dix/Xserver-dtrace.h.in | 7 | ||||
-rw-r--r-- | dix/Xserver.d | 2 | ||||
-rw-r--r-- | dix/getevents.c | 42 | ||||
-rw-r--r-- | doc/dtrace/Xserver-DTrace.xml | 153 |
4 files changed, 201 insertions, 3 deletions
diff --git a/dix/Xserver-dtrace.h.in b/dix/Xserver-dtrace.h.in index daf3faf1d..60ebbcdd9 100644 --- a/dix/Xserver-dtrace.h.in +++ b/dix/Xserver-dtrace.h.in @@ -54,7 +54,8 @@ extern "C" { __dtrace_Xserver___resource__free(arg0, arg1, arg2, arg3) #define XSERVER_SEND_EVENT(arg0, arg1, arg2) \ __dtrace_Xserver___send__event(arg0, arg1, arg2) - +#define XSERVER_INPUT_EVENT(arg0, arg1, arg2, arg3, arg4, arg5, arg6) \ + __dtrace_Xserver___input__event(arg0, arg1, arg2, arg3, arg4, arg5, arg6) extern void __dtrace_Xserver___client__auth(int, string, pid_t, zoneid_t); extern void __dtrace_Xserver___client__connect(int, int); @@ -64,6 +65,8 @@ extern void __dtrace_Xserver___request__start(string, uint8_t, uint16_t, int, vo extern void __dtrace_Xserver___resource__alloc(uint32_t, uint32_t, void *, string); extern void __dtrace_Xserver___resource__free(uint32_t, uint32_t, void *, string); extern void __dtrace_Xserver___send__event(int, uint8_t, void *); +extern void __dtrace_Xserver___input__event(int, uint16_t, uint32_t, uint32_t, int8_t, uint8_t *, double *); + #else @@ -75,6 +78,7 @@ extern void __dtrace_Xserver___send__event(int, uint8_t, void *); #define XSERVER_RESOURCE_ALLOC(arg0, arg1, arg2, arg3) #define XSERVER_RESOURCE_FREE(arg0, arg1, arg2, arg3) #define XSERVER_SEND_EVENT(arg0, arg1, arg2) +#define XSERVER_INPUT_EVENT(arg0, arg1, arg2, arg3, arg4, arg5, arg6) #endif @@ -86,6 +90,7 @@ extern void __dtrace_Xserver___send__event(int, uint8_t, void *); #define XSERVER_RESOURCE_ALLOC_ENABLED() (1) #define XSERVER_RESOURCE_FREE_ENABLED() (1) #define XSERVER_SEND_EVENT_ENABLED() (1) +#define XSERVER_INPUT_EVENT_ENABLED() (1) #ifdef __cplusplus } diff --git a/dix/Xserver.d b/dix/Xserver.d index 2ad337351..248d48e24 100644 --- a/dix/Xserver.d +++ b/dix/Xserver.d @@ -48,6 +48,8 @@ provider Xserver { probe resource__free(uint32_t, uint32_t, void *, string); /* client id, event type, event* */ probe send__event(int, uint8_t, void *); + /* deviceid, type, button/keycode/touchid, flags, nvalues, mask, values */ + probe input__event(int, int, uint32_t, uint32_t, int8_t, uint8_t*, double*); }; #pragma D attributes Unstable/Unstable/Common provider Xserver provider diff --git a/dix/getevents.c b/dix/getevents.c index fa85fe7cf..3093786c3 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -68,6 +68,12 @@ #include "extnsionst.h" #include "listdev.h" /* for sizing up DeviceClassesChangedEvent */ +#if XSERVER_DTRACE +#include <sys/types.h> +typedef const char *string; +#include <Xserver-dtrace.h> +#endif + /* Number of motion history events to store. */ #define MOTION_HISTORY_SIZE 256 @@ -1026,6 +1032,15 @@ GetKeyboardEvents(InternalEvent *events, DeviceIntPtr pDev, int type, RawDeviceEvent *raw; ValuatorMask mask; +#if XSERVER_DTRACE + if (XSERVER_INPUT_EVENT_ENABLED()) { + XSERVER_INPUT_EVENT(pDev->id, type, key_code, 0, + mask_in ? mask_in->last_bit + 1 : 0, + mask_in ? mask_in->mask : NULL, + mask_in ? mask_in->valuators : NULL); + } +#endif + /* refuse events from disabled devices */ if (!pDev->enabled) return 0; @@ -1503,6 +1518,15 @@ GetPointerEvents(InternalEvent *events, DeviceIntPtr pDev, int type, int i; int realtype = type; +#if XSERVER_DTRACE + if (XSERVER_INPUT_EVENT_ENABLED()) { + XSERVER_INPUT_EVENT(pDev->id, type, buttons, flags, + mask_in ? mask_in->last_bit + 1 : 0, + mask_in ? mask_in->mask : NULL, + mask_in ? mask_in->valuators : NULL); + } +#endif + /* refuse events from disabled devices */ if (!pDev->enabled) return 0; @@ -1628,6 +1652,15 @@ GetProximityEvents(InternalEvent *events, DeviceIntPtr pDev, int type, DeviceEvent *event; ValuatorMask mask; +#if XSERVER_DTRACE + if (XSERVER_INPUT_EVENT_ENABLED()) { + XSERVER_INPUT_EVENT(pDev->id, type, 0, 0, + mask_in ? mask_in->last_bit + 1 : 0, + mask_in ? mask_in->mask : NULL, + mask_in ? mask_in->valuators : NULL); + } +#endif + /* refuse events from disabled devices */ if (!pDev->enabled) return 0; @@ -1752,6 +1785,15 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid, Bool emulate_pointer = FALSE; int client_id = 0; +#if XSERVER_DTRACE + if (XSERVER_INPUT_EVENT_ENABLED()) { + XSERVER_INPUT_EVENT(dev->id, type, ddx_touchid, flags, + mask_in ? mask_in->last_bit + 1 : 0, + mask_in ? mask_in->mask : NULL, + mask_in ? mask_in->valuators : NULL); + } +#endif + if (!dev->enabled || !t || !v) return 0; diff --git a/doc/dtrace/Xserver-DTrace.xml b/doc/dtrace/Xserver-DTrace.xml index 5ef062980..91ca254d7 100644 --- a/doc/dtrace/Xserver-DTrace.xml +++ b/doc/dtrace/Xserver-DTrace.xml @@ -52,7 +52,9 @@ DEALINGS IN THE SOFTWARE. facility in <productname>Solaris</productname> 10, <productname>MacOS X</productname> 10.5, and later releases. This provider instruments various points in the X server, to allow - tracing what client applications are up to. + tracing what client applications are up to. DTrace probes may be used + with <ulink url="http://sourceware.org/systemtap/">SystemTap</ulink> + on GNU/Linux systems. </para> <para> @@ -81,7 +83,7 @@ DEALINGS IN THE SOFTWARE. <table id="Probes_and_their_arguments"> <title>Probes and their arguments</title> - <tgroup cols='7'> + <tgroup cols='9'> <colspec colname="probe" colwidth="2*"/> <colspec colname="desc" colwidth="3*"/> <colspec colname="arg0" colwidth="1*"/> @@ -89,6 +91,8 @@ DEALINGS IN THE SOFTWARE. <colspec colname="arg2" colwidth="1*"/> <colspec colname="arg3" colwidth="1*"/> <colspec colname="arg4" colwidth="1*"/> + <colspec colname="arg5" colwidth="1*"/> + <colspec colname="arg6" colwidth="1*"/> <spanspec spanname="all" namest="probe" nameend="arg4"/> <thead> <row> @@ -99,6 +103,8 @@ DEALINGS IN THE SOFTWARE. <entry>arg2</entry> <entry>arg3</entry> <entry>arg4</entry> + <entry>arg5</entry> + <entry>arg6</entry> </row> </thead> <tbody> @@ -113,6 +119,8 @@ DEALINGS IN THE SOFTWARE. <entry><parameter>requestLength</parameter></entry> <entry><parameter>clientId</parameter></entry> <entry><parameter>requestBuffer</parameter></entry> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry>request-done</entry> @@ -122,6 +130,8 @@ DEALINGS IN THE SOFTWARE. <entry><parameter>sequenceNumber</parameter></entry> <entry><parameter>clientId</parameter></entry> <entry><parameter>resultCode</parameter></entry> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry spanname="all" class="grouphead">Event Probes</entry> @@ -132,7 +142,10 @@ DEALINGS IN THE SOFTWARE. <entry><parameter>clientId</parameter></entry> <entry><parameter>eventCode</parameter></entry> <entry><parameter>eventBuffer</parameter></entry> + <entry nameend="arg3" class="unused"/> <entry nameend="arg4" class="unused"/> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry spanname="all" class="grouphead">Client Connection Probes</entry> @@ -142,7 +155,11 @@ DEALINGS IN THE SOFTWARE. <entry>Called when a new connection is opened from a client</entry> <entry><parameter>clientId</parameter></entry> <entry><parameter>clientFD</parameter></entry> + <entry nameend="arg2" class="unused"/> + <entry nameend="arg3" class="unused"/> <entry nameend="arg4" class="unused"/> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry>client-auth</entry> @@ -152,12 +169,19 @@ DEALINGS IN THE SOFTWARE. <entry><parameter>clientPid</parameter></entry> <entry><parameter>clientZoneId</parameter></entry> <entry nameend="arg4" class="unused"/> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry>client-disconnect</entry> <entry>Called when a client connection is closed</entry> <entry><parameter>clientId</parameter></entry> + <entry nameend="arg1" class="unused"/> + <entry nameend="arg2" class="unused"/> + <entry nameend="arg3" class="unused"/> <entry nameend="arg4" class="unused"/> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry spanname="all" class="grouphead">Resource Allocation Probes</entry> @@ -170,6 +194,8 @@ DEALINGS IN THE SOFTWARE. <entry><parameter>resourceValue</parameter></entry> <entry><parameter>resourceTypeName</parameter></entry> <entry nameend="arg4" class="unused"/> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> </row> <row> <entry>resource-free</entry> @@ -179,6 +205,24 @@ DEALINGS IN THE SOFTWARE. <entry><parameter>resourceValue</parameter></entry> <entry><parameter>resourceTypeName</parameter></entry> <entry nameend="arg4" class="unused"/> + <entry nameend="arg5" class="unused"/> + <entry nameend="arg6" class="unused"/> + </row> + <row> + <entry spanname="all" class="grouphead">Input API probes</entry> + </row> + <row> + <entry>input-event</entry> + <entry>Called when an input event was submitted for processing</entry> + <entry><parameter>deviceid</parameter></entry> + <entry><parameter>eventtype</parameter></entry> + <entry><parameter>button</parameter> or + <parameter>keycode</parameter> or + <parameter>touchid</parameter></entry> + <entry><parameter>flags</parameter></entry> + <entry><parameter>nvalues</parameter></entry> + <entry><parameter>mask</parameter></entry> + <entry><parameter>values</parameter></entry> </row> </tbody> </tgroup> @@ -304,6 +348,44 @@ DEALINGS IN THE SOFTWARE. <entry><type>uint32_t</type></entry> <entry>Number of X request in in this connection</entry> </row> + <row> + <entry><parameter>deviceid</parameter></entry> + <entry><type>int</type></entry> + <entry>The device's numerical ID</entry> + </row> + <row> + <entry><parameter>eventtype</parameter></entry> + <entry><type>int</type></entry> + <entry>Protocol event type</entry> + </row> + <row> + <entry><parameter>button, keycode, touchid</parameter></entry> + <entry><type>uint32_t</type></entry> + <entry>The button number, keycode or touch ID</entry> + </row> + <row> + <entry><parameter>flags</parameter></entry> + <entry><type>uint32_t</type></entry> + <entry>Miscellaneous event-specific server flags</entry> + </row> + <row> + <entry><parameter>nvalues</parameter></entry> + <entry><type>int8_t</type></entry> + <entry>Number of bits in <parameter>mask</parameter> and number of elements + in <parameter>values</parameter></entry> + </row> + <row> + <entry><parameter>mask</parameter></entry> + <entry><type>uint8_t*</type></entry> + <entry>Binary mask indicating which indices in <parameter>values</parameter> contain + valid data</entry> + </row> + <row> + <entry><parameter>values</parameter></entry> + <entry><type>double*</type></entry> + <entry>Valuator values. Values for indices for which the + <parameter>mask</parameter> is not set are undefined</entry> + </row> </tbody> </tgroup> </table> @@ -572,6 +654,73 @@ Xserver$1:::client-disconnect </example> + <example id="Input_API_monitoring_with_systemtap"> + <title>Input API monitoring with SystemTap</title> + + <para> + This script can be used to monitor events submitted by drivers to + the server for enqueuing. Due to the integration of the input API + probes, some server-enqueued events will show up too. + <programlisting> + # Compile+run with + # stap -g xorg.stp /usr/bin/Xorg + # + + + function print_valuators:string(nvaluators:long, mask_in:long, valuators_in:long) %{ + int i; + unsigned char *mask = (unsigned char*)THIS->mask_in; + double *valuators = (double*)THIS->valuators_in; + char str[128] = {0}; + char *s = str; + + #define BitIsSet(ptr, bit) (((unsigned char*)(ptr))[(bit)>>3] & (1 << ((bit) & 7))) + + s += sprintf(s, "nval: %d ::", (int)THIS->nvaluators); + for (i = 0; i < THIS->nvaluators; i++) + { + s += sprintf(s, " %d: ", i); + if (BitIsSet(mask, i)) + s += sprintf(s, "%d", (int)valuators[i]); + } + + sprintf(THIS->__retvalue, "%s", str); + %} + + probe process(@1).mark("input__event") + { + deviceid = $arg1 + type = $arg2 + detail = $arg3 + flags = $arg4 + nvaluators = $arg5 + + str = print_valuators(nvaluators, $arg6, $arg7) + printf("Event: device %d type %d detail %d flags %#x %s\n", + deviceid, type, detail, flags, str); + } + </programlisting> + + Sample output from a run of this script: + <screen><computeroutput> +Event: device 13 type 4 detail 1 flags 0x0 nval: 0 :: +Event: device 13 type 6 detail 0 flags 0xa nval: 1 :: 0: 1 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -1 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 4 1: -3 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -3 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 3 1: -2 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 2 1: -2 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1 +Event: device 13 type 6 detail 0 flags 0xa nval: 2 :: 0: 1: -1 +Event: device 13 type 5 detail 1 flags 0x0 nval: 0 :: + </computeroutput></screen> + + </para> + + </example> </sect1> |