1# -*- mode:python -*- 2# Copyright (c) 2009-2014, 2017 ARM Limited 3# All rights reserved. 4# 5# The license below extends only to copyright in the software and shall 6# not be construed as granting a license to any other intellectual 7# property including but not limited to intellectual property relating 8# to a hardware implementation of the functionality of the software --- 29 unchanged lines hidden (view full) --- 38# Andreas Sandberg 39 40from m5.defines import buildEnv 41from m5.SimObject import * 42from m5.params import * 43from m5.params import isNullPointer 44from m5.proxy import * 45 |
46class ProbeEvent(object): 47 def __init__(self, pmu, _eventId, obj, *listOfNames): 48 self.obj = obj 49 self.names = listOfNames 50 self.eventId = _eventId 51 self.pmu = pmu 52 53 def register(self): 54 if self.obj: 55 for name in self.names: 56 self.pmu.getCCObject().addEventProbe(self.eventId, 57 self.obj.getCCObject(), name) 58 59class SoftwareIncrement(object): 60 def __init__(self,pmu, _eventId): 61 self.eventId = _eventId 62 self.pmu = pmu 63 64 def register(self): 65 self.pmu.getCCObject().addSoftwareIncrementEvent(self.eventId) 66 67ARCH_EVENT_CORE_CYCLES = 0x11 68 |
69class ArmPMU(SimObject): |
70 |
71 type = 'ArmPMU' 72 cxx_class = 'ArmISA::PMU' 73 cxx_header = 'arch/arm/pmu.hh' 74 75 cxx_exports = [ 76 PyBindMethod("addEventProbe"), |
77 PyBindMethod("addSoftwareIncrementEvent"), |
78 ] 79 |
80 _events = None 81 82 def addEvent(self, newObject): 83 if not (isinstance(newObject, ProbeEvent) 84 or isinstance(newObject, SoftwareIncrement)): 85 raise TypeError("argument must be of ProbeEvent or " 86 "SoftwareIncrement type") 87 88 if not self._events: 89 self._events = [] 90 91 self._events.append(newObject) 92 |
93 # Override the normal SimObject::regProbeListeners method and 94 # register deferred event handlers. 95 def regProbeListeners(self): |
96 for event in self._events: 97 event.register() |
98 99 self.getCCObject().regProbeListeners() 100 |
101 def addArchEvents(self, 102 cpu=None, 103 itb=None, dtb=None, 104 icache=None, dcache=None, 105 l2cache=None): 106 """Add architected events to the PMU. 107 108 This method can be called multiple times with only a subset of --- 4 unchanged lines hidden (view full) --- 113 114 CPU events should also be registered once per CPU that is 115 sharing the PMU (e.g., when switching between CPU models). 116 """ 117 118 bpred = cpu.branchPred if cpu and not isNullPointer(cpu.branchPred) \ 119 else None 120 |
121 self.addEvent(SoftwareIncrement(self,0x00)) |
122 # 0x01: L1I_CACHE_REFILL |
123 self.addEvent(ProbeEvent(self,0x02, itb, "Refills")) |
124 # 0x03: L1D_CACHE_REFILL 125 # 0x04: L1D_CACHE |
126 self.addEvent(ProbeEvent(self,0x05, dtb, "Refills")) 127 self.addEvent(ProbeEvent(self,0x06, cpu, "RetiredLoads")) 128 self.addEvent(ProbeEvent(self,0x07, cpu, "RetiredStores")) 129 self.addEvent(ProbeEvent(self,0x08, cpu, "RetiredInsts")) |
130 # 0x09: EXC_TAKEN 131 # 0x0A: EXC_RETURN 132 # 0x0B: CID_WRITE_RETIRED |
133 self.addEvent(ProbeEvent(self,0x0C, cpu, "RetiredBranches")) |
134 # 0x0D: BR_IMMED_RETIRED 135 # 0x0E: BR_RETURN_RETIRED 136 # 0x0F: UNALIGEND_LDST_RETIRED |
137 self.addEvent(ProbeEvent(self,0x10, bpred, "Misses")) 138 self.addEvent(ProbeEvent(self, ARCH_EVENT_CORE_CYCLES, cpu, 139 "ActiveCycles")) 140 self.addEvent(ProbeEvent(self,0x12, bpred, "Branches")) 141 self.addEvent(ProbeEvent(self,0x13, cpu, "RetiredLoads", 142 "RetiredStores")) |
143 # 0x14: L1I_CACHE 144 # 0x15: L1D_CACHE_WB 145 # 0x16: L2D_CACHE 146 # 0x17: L2D_CACHE_REFILL 147 # 0x18: L2D_CACHE_WB 148 # 0x19: BUS_ACCESS 149 # 0x1A: MEMORY_ERROR 150 # 0x1B: INST_SPEC --- 14 unchanged lines hidden (view full) --- 165 # 0x2A: L3D_CACHE_REFILL 166 # 0x2B: L3D_CACHE 167 # 0x2C: L3D_CACHE_WB 168 # 0x2D: L2D_TLB_REFILL 169 # 0x2E: L2I_TLB_REFILL 170 # 0x2F: L2D_TLB 171 # 0x30: L2I_TLB 172 |
173 cycleEventId = Param.Int(ARCH_EVENT_CORE_CYCLES, "Cycle event id") |
174 platform = Param.Platform(Parent.any, "Platform this device is part of.") 175 eventCounters = Param.Int(31, "Number of supported PMU counters") 176 pmuInterrupt = Param.Int(68, "PMU GIC interrupt number") |