2 # SPDX-License-Identifier: GPL-2.0
4 # This is a library defining some events types classes, which could
5 # be used by other scripts to analyzing the perf samples.
7 # Currently there are just a few classes defined for examples,
8 # PerfEvent is the base class for all perf event sample, PebsEvent
9 # is a HW base Intel x86 PEBS event, and user could add more SW/HW
10 # event classes based on requirements.
11 from __future__
import print_function
15 # Event types, user could add more here
17 EVTYPE_PEBS
= 1 # Basic PEBS event
18 EVTYPE_PEBS_LL
= 2 # PEBS event with load latency info
22 # Currently we don't have good way to tell the event type, but by
23 # the size of raw buffer, raw PEBS event with load latency data's
24 # size is 176 bytes, while the pure PEBS event's size is 144 bytes.
26 def create_event(name
, comm
, dso
, symbol
, raw_buf
):
27 if (len(raw_buf
) == 144):
28 event
= PebsEvent(name
, comm
, dso
, symbol
, raw_buf
)
29 elif (len(raw_buf
) == 176):
30 event
= PebsNHM(name
, comm
, dso
, symbol
, raw_buf
)
32 event
= PerfEvent(name
, comm
, dso
, symbol
, raw_buf
)
36 class PerfEvent(object):
38 def __init__(self
, name
, comm
, dso
, symbol
, raw_buf
, ev_type
=EVTYPE_GENERIC
):
43 self
.raw_buf
= raw_buf
44 self
.ev_type
= ev_type
45 PerfEvent
.event_num
+= 1
48 print("PMU event: name=%12s, symbol=%24s, comm=%8s, dso=%12s" %
49 (self
.name
, self
.symbol
, self
.comm
, self
.dso
))
52 # Basic Intel PEBS (Precise Event-based Sampling) event, whose raw buffer
53 # contains the context info when that event happened: the EFLAGS and
54 # linear IP info, as well as all the registers.
56 class PebsEvent(PerfEvent
):
58 def __init__(self
, name
, comm
, dso
, symbol
, raw_buf
, ev_type
=EVTYPE_PEBS
):
60 flags
, ip
, ax
, bx
, cx
, dx
, si
, di
, bp
, sp
= struct
.unpack('QQQQQQQQQQ', tmp_buf
)
72 PerfEvent
.__init
__(self
, name
, comm
, dso
, symbol
, raw_buf
, ev_type
)
73 PebsEvent
.pebs_num
+= 1
77 # Intel Nehalem and Westmere support PEBS plus Load Latency info which lie
78 # in the four 64 bit words write after the PEBS data:
79 # Status: records the IA32_PERF_GLOBAL_STATUS register value
80 # DLA: Data Linear Address (EIP)
81 # DSE: Data Source Encoding, where the latency happens, hit or miss
82 # in L1/L2/L3 or IO operations
83 # LAT: the actual latency in cycles
85 class PebsNHM(PebsEvent
):
87 def __init__(self
, name
, comm
, dso
, symbol
, raw_buf
, ev_type
=EVTYPE_PEBS_LL
):
88 tmp_buf
=raw_buf
[144:176]
89 status
, dla
, dse
, lat
= struct
.unpack('QQQQ', tmp_buf
)
95 PebsEvent
.__init
__(self
, name
, comm
, dso
, symbol
, raw_buf
, ev_type
)
96 PebsNHM
.pebs_nhm_num
+= 1