| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
| 7 | |
| 8 | |
| 9 | |
| 10 |
|
| 11 | import struct
|
| 12 |
|
| 13 | |
| 14 | EVTYPE_GENERIC = 0
|
| 15 | EVTYPE_PEBS = 1 |
| 16 | EVTYPE_PEBS_LL = 2 |
| 17 | EVTYPE_IBS = 3
|
| 18 |
|
| 19 | |
| 20 | |
| 21 | |
| 22 | |
| 23 | |
| 24 | def create_event(name, comm, dso, symbol, raw_buf):
|
| 25 | if (len(raw_buf) == 144):
|
| 26 | event = PebsEvent(name, comm, dso, symbol, raw_buf)
|
| 27 | elif (len(raw_buf) == 176):
|
| 28 | event = PebsNHM(name, comm, dso, symbol, raw_buf)
|
| 29 | else:
|
| 30 | event = PerfEvent(name, comm, dso, symbol, raw_buf)
|
| 31 |
|
| 32 | return event
|
| 33 |
|
| 34 | class PerfEvent(object):
|
| 35 | event_num = 0
|
| 36 | def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_GENERIC):
|
| 37 | self.name = name
|
| 38 | self.comm = comm
|
| 39 | self.dso = dso
|
| 40 | self.symbol = symbol
|
| 41 | self.raw_buf = raw_buf
|
| 42 | self.ev_type = ev_type
|
| 43 | PerfEvent.event_num += 1
|
| 44 |
|
| 45 | def show(self):
|
| 46 | print "PMU event: name=%12s, symbol=%24s, comm=%8s, dso=%12s" % (self.name, self.symbol, self.comm, self.dso)
|
| 47 |
|
| 48 | |
| 49 | |
| 50 | |
| 51 | |
| 52 | |
| 53 | class PebsEvent(PerfEvent):
|
| 54 | pebs_num = 0
|
| 55 | def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_PEBS):
|
| 56 | tmp_buf=raw_buf[0:80]
|
| 57 | flags, ip, ax, bx, cx, dx, si, di, bp, sp = struct.unpack('QQQQQQQQQQ', tmp_buf)
|
| 58 | self.flags = flags
|
| 59 | self.ip = ip
|
| 60 | self.ax = ax
|
| 61 | self.bx = bx
|
| 62 | self.cx = cx
|
| 63 | self.dx = dx
|
| 64 | self.si = si
|
| 65 | self.di = di
|
| 66 | self.bp = bp
|
| 67 | self.sp = sp
|
| 68 |
|
| 69 | PerfEvent.__init__(self, name, comm, dso, symbol, raw_buf, ev_type)
|
| 70 | PebsEvent.pebs_num += 1
|
| 71 | del tmp_buf
|
| 72 |
|
| 73 | |
| 74 | |
| 75 | |
| 76 | |
| 77 | |
| 78 | |
| 79 | |
| 80 | |
| 81 | |
| 82 | class PebsNHM(PebsEvent):
|
| 83 | pebs_nhm_num = 0
|
| 84 | def __init__(self, name, comm, dso, symbol, raw_buf, ev_type=EVTYPE_PEBS_LL):
|
| 85 | tmp_buf=raw_buf[144:176]
|
| 86 | status, dla, dse, lat = struct.unpack('QQQQ', tmp_buf)
|
| 87 | self.status = status
|
| 88 | self.dla = dla
|
| 89 | self.dse = dse
|
| 90 | self.lat = lat
|
| 91 |
|
| 92 | PebsEvent.__init__(self, name, comm, dso, symbol, raw_buf, ev_type)
|
| 93 | PebsNHM.pebs_nhm_num += 1
|
| 94 | del tmp_buf
|