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 2f6f06ced..6354e99ef 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 +typedef const char *string; +#include +#endif + /* Number of motion history events to store. */ #define MOTION_HISTORY_SIZE 256 @@ -1025,6 +1031,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; @@ -1501,6 +1516,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; @@ -1626,6 +1650,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; @@ -1750,6 +1783,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 Solaris 10, MacOS X 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 SystemTap + on GNU/Linux systems. @@ -81,7 +83,7 @@ DEALINGS IN THE SOFTWARE. Probes and their arguments - + @@ -89,6 +91,8 @@ DEALINGS IN THE SOFTWARE. + + @@ -99,6 +103,8 @@ DEALINGS IN THE SOFTWARE. arg2 arg3 arg4 + arg5 + arg6 @@ -113,6 +119,8 @@ DEALINGS IN THE SOFTWARE. requestLengthclientIdrequestBuffer + + request-done @@ -122,6 +130,8 @@ DEALINGS IN THE SOFTWARE. sequenceNumber clientId resultCode + + Event Probes @@ -132,7 +142,10 @@ DEALINGS IN THE SOFTWARE. clientId eventCode eventBuffer + + + Client Connection Probes @@ -142,7 +155,11 @@ DEALINGS IN THE SOFTWARE. Called when a new connection is opened from a client clientId clientFD + + + + client-auth @@ -152,12 +169,19 @@ DEALINGS IN THE SOFTWARE. clientPid clientZoneId + + client-disconnect Called when a client connection is closed clientId + + + + + Resource Allocation Probes @@ -170,6 +194,8 @@ DEALINGS IN THE SOFTWARE. resourceValue resourceTypeName + + resource-free @@ -179,6 +205,24 @@ DEALINGS IN THE SOFTWARE. resourceValue resourceTypeName + + + + + Input API probes + + + input-event + Called when an input event was submitted for processing + deviceid + eventtype + button or + keycode or + touchid + flags + nvalues + mask + values @@ -304,6 +348,44 @@ DEALINGS IN THE SOFTWARE. uint32_tNumber of X request in in this connection + + deviceid + int + The device's numerical ID + + + eventtype + int + Protocol event type + + + button, keycode, touchid + uint32_t + The button number, keycode or touch ID + + + flags + uint32_t + Miscellaneous event-specific server flags + + + nvalues + int8_t + Number of bits in mask and number of elements + in values + + + mask + uint8_t* + Binary mask indicating which indices in values contain + valid data + + + values + double* + Valuator values. Values for indices for which the + mask is not set are undefined +
@@ -572,6 +654,73 @@ Xserver$1:::client-disconnect + + Input API monitoring with SystemTap + + + 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. + + # 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); + } + + + Sample output from a run of this script: + +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 :: + + + + +