diff options
Diffstat (limited to 'tools/perf/scripts/python/Perf-Trace-Util')
5 files changed, 101 insertions, 7 deletions
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Context.c b/tools/perf/scripts/python/Perf-Trace-Util/Context.c index 957085dd5d8..fcd1dd66790 100644 --- a/tools/perf/scripts/python/Perf-Trace-Util/Context.c +++ b/tools/perf/scripts/python/Perf-Trace-Util/Context.c @@ -1,5 +1,5 @@  /* - * Context.c.  Python interfaces for perf trace. + * Context.c.  Python interfaces for perf script.   *   * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com>   * @@ -25,7 +25,7 @@  PyMODINIT_FUNC initperf_trace_context(void); -static PyObject *perf_trace_context_common_pc(PyObject *self, PyObject *args) +static PyObject *perf_trace_context_common_pc(PyObject *obj, PyObject *args)  {  	static struct scripting_context *scripting_context;  	PyObject *context; @@ -40,7 +40,7 @@ static PyObject *perf_trace_context_common_pc(PyObject *self, PyObject *args)  	return Py_BuildValue("i", retval);  } -static PyObject *perf_trace_context_common_flags(PyObject *self, +static PyObject *perf_trace_context_common_flags(PyObject *obj,  						 PyObject *args)  {  	static struct scripting_context *scripting_context; @@ -56,7 +56,7 @@ static PyObject *perf_trace_context_common_flags(PyObject *self,  	return Py_BuildValue("i", retval);  } -static PyObject *perf_trace_context_common_lock_depth(PyObject *self, +static PyObject *perf_trace_context_common_lock_depth(PyObject *obj,  						      PyObject *args)  {  	static struct scripting_context *scripting_context; diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py index aad7525bca1..de7211e4fa4 100644 --- a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py @@ -1,4 +1,4 @@ -# Core.py - Python extension for perf trace, core functions +# Core.py - Python extension for perf script, core functions  #  # Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com>  # diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py new file mode 100755 index 00000000000..9e0985794e2 --- /dev/null +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py @@ -0,0 +1,94 @@ +# EventClass.py +# +# This is a library defining some events types classes, which could +# be used by other scripts to analyzing the perf samples. +# +# Currently there are just a few classes defined for examples, +# PerfEvent is the base class for all perf event sample, PebsEvent +# is a HW base Intel x86 PEBS event, and user could add more SW/HW +# event classes based on requirements. + +import struct + +# Event types, user could add more here +EVTYPE_GENERIC  = 0 +EVTYPE_PEBS     = 1     # Basic PEBS event +EVTYPE_PEBS_LL  = 2     # PEBS event with load latency info +EVTYPE_IBS      = 3 + +# +# Currently we don't have good way to tell the event type, but by +# the size of raw buffer, raw PEBS event with load latency data's +# size is 176 bytes, while the pure PEBS event's size is 144 bytes. +# +def create_event(name, comm, dso, symbol, raw_buf): +        if (len(raw_buf) == 144): +                event = PebsEvent(name, comm, dso, symbol, raw_buf) +        elif (len(raw_buf) == 176): +                event = PebsNHM(name, comm, dso, symbol, raw_buf) +        else: +                event = PerfEvent(name, comm, dso, symbol, raw_buf) + +        return event + +class PerfEvent(object): +        event_num = 0 +        def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_GENERIC): +                self.name       = name +                self.comm       = comm +                self.dso        = dso +                self.symbol     = symbol +                self.raw_buf    = raw_buf +                self.ev_type    = ev_type +                PerfEvent.event_num += 1 + +        def show(self): +                print "PMU event: name=%12s, symbol=%24s, comm=%8s, dso=%12s" % (self.name, self.symbol, self.comm, self.dso) + +# +# Basic Intel PEBS (Precise Event-based Sampling) event, whose raw buffer +# contains the context info when that event happened: the EFLAGS and +# linear IP info, as well as all the registers. +# +class PebsEvent(PerfEvent): +        pebs_num = 0 +        def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_PEBS): +                tmp_buf=raw_buf[0:80] +                flags, ip, ax, bx, cx, dx, si, di, bp, sp = struct.unpack('QQQQQQQQQQ', tmp_buf) +                self.flags = flags +                self.ip    = ip +                self.ax    = ax +                self.bx    = bx +                self.cx    = cx +                self.dx    = dx +                self.si    = si +                self.di    = di +                self.bp    = bp +                self.sp    = sp + +                PerfEvent.__init__(self, name, comm, dso, symbol, raw_buf, ev_type) +                PebsEvent.pebs_num += 1 +                del tmp_buf + +# +# Intel Nehalem and Westmere support PEBS plus Load Latency info which lie +# in the four 64 bit words write after the PEBS data: +#       Status: records the IA32_PERF_GLOBAL_STATUS register value +#       DLA:    Data Linear Address (EIP) +#       DSE:    Data Source Encoding, where the latency happens, hit or miss +#               in L1/L2/L3 or IO operations +#       LAT:    the actual latency in cycles +# +class PebsNHM(PebsEvent): +        pebs_nhm_num = 0 +        def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_PEBS_LL): +                tmp_buf=raw_buf[144:176] +                status, dla, dse, lat = struct.unpack('QQQQ', tmp_buf) +                self.status = status +                self.dla = dla +                self.dse = dse +                self.lat = lat + +                PebsEvent.__init__(self, name, comm, dso, symbol, raw_buf, ev_type) +                PebsNHM.pebs_nhm_num += 1 +                del tmp_buf diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py index ae9a56e43e0..fdd92f69905 100644 --- a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/SchedGui.py @@ -1,4 +1,4 @@ -# SchedGui.py - Python extension for perf trace, basic GUI code for +# SchedGui.py - Python extension for perf script, basic GUI code for  #		traces drawing and overview.  #  # Copyright (C) 2010 by Frederic Weisbecker <fweisbec@gmail.com> diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py index 13cc02b5893..15c8400240f 100644 --- a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py @@ -1,4 +1,4 @@ -# Util.py - Python extension for perf trace, miscellaneous utility code +# Util.py - Python extension for perf script, miscellaneous utility code  #  # Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com>  #  | 
