gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
pmu.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2014 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
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Dam Sunwoo
38  * Matt Horsnell
39  * Andreas Sandberg
40  */
41 
42 #include "arch/arm/pmu.hh"
43 
44 #include "arch/arm/isa.hh"
45 #include "arch/arm/utility.hh"
46 #include "base/trace.hh"
47 #include "cpu/base.hh"
48 #include "debug/Checkpoint.hh"
49 #include "debug/PMUVerbose.hh"
50 #include "dev/arm/base_gic.hh"
51 #include "dev/arm/realview.hh"
52 #include "params/ArmPMU.hh"
53 
54 namespace ArmISA {
55 
56 const MiscReg PMU::reg_pmcr_wr_mask = 0x39;
57 
58 PMU::PMU(const ArmPMUParams *p)
59  : SimObject(p), BaseISADevice(),
60  reg_pmcnten(0), reg_pmcr(0),
61  reg_pmselr(0), reg_pminten(0), reg_pmovsr(0),
62  reg_pmceid(0),
63  clock_remainder(0),
64  counters(p->eventCounters),
65  reg_pmcr_conf(0),
66  pmuInterrupt(p->pmuInterrupt),
67  platform(p->platform)
68 {
69  DPRINTF(PMUVerbose, "Initializing the PMU.\n");
70 
71  if (p->eventCounters > 31) {
72  fatal("The PMU can only accept 31 counters, %d counters requested.\n",
73  p->eventCounters);
74  }
75 
76  /* Setup the performance counter ID registers */
77  reg_pmcr_conf.imp = 0x41; // ARM Ltd.
78  reg_pmcr_conf.idcode = 0x00;
79  reg_pmcr_conf.n = p->eventCounters;
80 
81  // Setup the hard-coded cycle counter, which is equivalent to
82  // architected counter event type 0x11.
83  cycleCounter.eventId = 0x11;
84 }
85 
87 {
88 }
89 
90 void
91 PMU::addEventProbe(unsigned int id, SimObject *obj, const char *probe_name)
92 {
93  DPRINTF(PMUVerbose, "PMU: Adding event type '0x%x' as probe %s:%s\n",
94  id, obj->name(), probe_name);
95  pmuEventTypes.insert(std::make_pair(id, EventType(obj, probe_name)));
96 
97  // Flag the event as available in the PMCEID register if it is an
98  // architected event.
99  if (id < 0x40)
100  reg_pmceid |= (ULL(1) << id);
101 }
102 
103 void
105 {
106  // Re-attach enabled counters after a resume in case they changed.
108 }
109 
110 void
112 {
113  DPRINTF(PMUVerbose, "setMiscReg(%s, 0x%x)\n",
114  miscRegName[unflattenMiscReg(misc_reg)], val);
115 
116  switch (unflattenMiscReg(misc_reg)) {
117  case MISCREG_PMCR_EL0:
118  case MISCREG_PMCR:
119  setControlReg(val);
120  return;
121 
123  case MISCREG_PMCNTENSET:
124  reg_pmcnten |= val;
126  return;
127 
129  case MISCREG_PMCNTENCLR:
130  reg_pmcnten &= ~val;
132  return;
133 
135  case MISCREG_PMOVSR:
136  reg_pmovsr &= ~val;
137  return;
138 
139  case MISCREG_PMSWINC_EL0:
140  case MISCREG_PMSWINC:
141  for (int i = 0; i < counters.size(); ++i) {
142  CounterState &ctr(getCounter(i));
143  if (ctr.enabled && (val & (1 << i)))
144  ++ctr.value;
145  }
146  break;
147 
148  case MISCREG_PMCCNTR_EL0:
149  case MISCREG_PMCCNTR:
151  return;
152 
153  case MISCREG_PMSELR_EL0:
154  case MISCREG_PMSELR:
155  reg_pmselr = val;
156  return;
157 
158  case MISCREG_PMCEID0_EL0:
159  case MISCREG_PMCEID0:
160  case MISCREG_PMCEID1_EL0:
161  case MISCREG_PMCEID1:
162  // Ignore writes
163  return;
164 
165  case MISCREG_PMEVTYPER0_EL0...MISCREG_PMEVTYPER5_EL0:
167  return;
168 
169  case MISCREG_PMCCFILTR:
171  DPRINTF(PMUVerbose, "Setting PMCCFILTR: 0x%x\n", val);
173  return;
174 
177  case MISCREG_PMXEVTYPER:
178  DPRINTF(PMUVerbose, "Setting counter type: "
179  "[PMSELR: 0x%x, PMSELER.sel: 0x%x, EVTYPER: 0x%x]\n",
180  reg_pmselr, reg_pmselr.sel, val);
182  return;
183 
184  case MISCREG_PMEVCNTR0_EL0...MISCREG_PMEVCNTR5_EL0:
185  setCounterValue(misc_reg - MISCREG_PMEVCNTR0_EL0, val);
186  return;
187 
189  case MISCREG_PMXEVCNTR:
190  setCounterValue(reg_pmselr.sel, val);
191  return;
192 
194  case MISCREG_PMUSERENR:
195  // TODO
196  break;
197 
199  case MISCREG_PMINTENSET:
200  reg_pminten |= val;
201  return;
202 
204  case MISCREG_PMINTENCLR:
205  reg_pminten &= ~val;
206  return;
207 
209  case MISCREG_PMOVSSET:
210  reg_pmovsr |= val;
211  return;
212 
213  default:
214  panic("Unexpected PMU register: %i\n", miscRegName[misc_reg]);
215  }
216 
217  warn("Not doing anything for write to miscreg %s\n",
218  miscRegName[misc_reg]);
219 }
220 
221 MiscReg
222 PMU::readMiscReg(int misc_reg)
223 {
224  MiscReg val(readMiscRegInt(misc_reg));
225  DPRINTF(PMUVerbose, "readMiscReg(%s): 0x%x\n",
226  miscRegName[unflattenMiscReg(misc_reg)], val);
227  return val;
228 }
229 
230 MiscReg
231 PMU::readMiscRegInt(int misc_reg)
232 {
233  misc_reg = unflattenMiscReg(misc_reg);
234  switch (misc_reg) {
235  case MISCREG_PMCR_EL0:
236  case MISCREG_PMCR:
238 
241  case MISCREG_PMCNTENSET:
242  case MISCREG_PMCNTENCLR:
243  return reg_pmcnten;
244 
247  case MISCREG_PMOVSR: // Overflow Status Register
248  case MISCREG_PMOVSSET:
249  return reg_pmovsr;
250 
251  case MISCREG_PMSWINC_EL0:
252  case MISCREG_PMSWINC: // Software Increment Register (RAZ)
253  return 0;
254 
255  case MISCREG_PMSELR:
256  return reg_pmselr;
257 
258  case MISCREG_PMCEID0_EL0:
259  case MISCREG_PMCEID0: // Common Event ID register
260  return reg_pmceid & 0xFFFFFFFF;
261 
262  case MISCREG_PMCEID1_EL0:
263  case MISCREG_PMCEID1: // Common Event ID register
264  return (reg_pmceid >> 32) & 0xFFFFFFFF;
265 
266  case MISCREG_PMCCNTR_EL0:
267  return cycleCounter.value;
268 
269  case MISCREG_PMCCNTR:
270  return cycleCounter.value & 0xFFFFFFFF;
271 
272  case MISCREG_PMEVTYPER0_EL0...MISCREG_PMEVTYPER5_EL0:
274 
275  case MISCREG_PMCCFILTR:
278 
281  case MISCREG_PMXEVTYPER:
283 
284  case MISCREG_PMEVCNTR0_EL0...MISCREG_PMEVCNTR5_EL0:
285  return getCounterValue(misc_reg - MISCREG_PMEVCNTR0_EL0) & 0xFFFFFFFF;
286 
288  case MISCREG_PMXEVCNTR:
289  return getCounterValue(reg_pmselr.sel) & 0xFFFFFFFF;
290 
292  case MISCREG_PMUSERENR:
293  // TODO
294  return 0;
295 
298  case MISCREG_PMINTENSET:
299  case MISCREG_PMINTENCLR:
300  return reg_pminten;
301 
302  default:
303  panic("Unexpected PMU register: %i\n", miscRegName[misc_reg]);
304  }
305 
306  warn("Not doing anything for read from miscreg %s\n",
307  miscRegName[misc_reg]);
308  return 0;
309 }
310 
311 void
313 {
314  DPRINTF(PMUVerbose, "Set Control Reg 0x%08x.\n", val);
315 
316  if (val.p) {
317  DPRINTF(PMUVerbose, "PMU reset all events to zero.\n");
319  }
320 
321  if (val.c) {
322  DPRINTF(PMUVerbose, "PMU reset cycle counter to zero.\n");
323  cycleCounter.value = 0;
324  }
325 
326  // Reset the clock remainder if divide by 64-mode is toggled.
327  if (reg_pmcr.d != val.d)
328  clock_remainder = 0;
329 
330  reg_pmcr = val & reg_pmcr_wr_mask;
332 }
333 
334 void
336 {
337  const bool global_enable(reg_pmcr.e);
338 
339  for (int i = 0; i < counters.size(); ++i) {
340  CounterState &ctr(counters[i]);
341  const bool enable(global_enable && (reg_pmcnten & (1 << i)));
342  if (ctr.enabled != enable) {
343  ctr.enabled = enable;
344  updateCounter(i, ctr);
345  }
346  }
347 
348  const bool ccntr_enable(global_enable && (reg_pmcnten & (1 << PMCCNTR)));
349  if (cycleCounter.enabled != ccntr_enable) {
350  cycleCounter.enabled = ccntr_enable;
352  }
353 }
354 
355 bool
356 PMU::isFiltered(const CounterState &ctr) const
357 {
358  assert(isa);
359 
360  const PMEVTYPER_t filter(ctr.filter);
361  const SCR scr(isa->readMiscRegNoEffect(MISCREG_SCR));
362  const CPSR cpsr(isa->readMiscRegNoEffect(MISCREG_CPSR));
363  const ExceptionLevel el(opModeToEL((OperatingMode)(uint8_t)cpsr.mode));
364  const bool secure(inSecureState(scr, cpsr));
365 
366  switch (el) {
367  case EL0:
368  return secure ? filter.u : (filter.u != filter.nsu);
369 
370  case EL1:
371  return secure ? filter.p : (filter.p != filter.nsk);
372 
373  case EL2:
374  return !filter.nsh;
375 
376  case EL3:
377  return filter.p != filter.m;
378 
379  default:
380  panic("Unexpected execution level in PMU::isFiltered.\n");
381  }
382 }
383 
384 void
385 PMU::handleEvent(CounterId id, uint64_t delta)
386 {
387  CounterState &ctr(getCounter(id));
388  const bool overflowed(reg_pmovsr & (1 << id));
389 
390  if (isFiltered(ctr))
391  return;
392 
393  // Handle the "count every 64 cycles" mode
394  if (id == PMCCNTR && reg_pmcr.d) {
395  clock_remainder += delta;
396  delta = (clock_remainder >> 6);
397  clock_remainder &= 63;
398  }
399 
400  // Add delta and handle (new) overflows
401  if (ctr.add(delta) && !overflowed) {
402  DPRINTF(PMUVerbose, "PMU counter '%i' overflowed.\n", id);
403  reg_pmovsr |= (1 << id);
404  // Deliver a PMU interrupt if interrupt delivery is enabled
405  // for this counter.
406  if (reg_pminten & (1 << id))
407  raiseInterrupt();
408  }
409 }
410 
411 void
412 PMU::updateCounter(CounterId id, CounterState &ctr)
413 {
414  if (!ctr.enabled) {
415  if (!ctr.listeners.empty()) {
416  DPRINTF(PMUVerbose, "updateCounter(%i): Disabling counter\n", id);
417  ctr.listeners.clear();
418  }
419  } else {
420  DPRINTF(PMUVerbose, "updateCounter(%i): Enable event id 0x%x\n",
421  id, ctr.eventId);
422 
423  // Attach all probes belonging to this event
424  auto range(pmuEventTypes.equal_range(ctr.eventId));
425  for (auto it = range.first; it != range.second; ++it) {
426  const EventType &et(it->second);
427 
428  DPRINTF(PMUVerbose, "\tProbe: %s:%s\n", et.obj->name(), et.name);
429  ctr.listeners.emplace_back(et.create(*this, id));
430  }
431 
432  /* The SW_INCR event type is a special case which doesn't need
433  * any probes since it is controlled by software and the PMU
434  * itself.
435  */
436  if (ctr.listeners.empty() && ctr.eventId != ARCH_EVENT_SW_INCR) {
437  warn("Can't enable PMU counter of type '0x%x': "
438  "No such event type.\n", ctr.eventId);
439  }
440  }
441 }
442 
443 
444 void
446 {
447  for (CounterState &ctr : counters)
448  ctr.value = 0;
449 }
450 
451 void
452 PMU::setCounterValue(CounterId id, uint64_t val)
453 {
454  if (!isValidCounter(id)) {
455  warn_once("Can't change counter value: Counter %i does not exist.\n",
456  id);
457  return;
458  }
459 
460  CounterState &ctr(getCounter(id));
461  ctr.value = val;
462 }
463 
464 PMU::PMEVTYPER_t
465 PMU::getCounterTypeRegister(CounterId id) const
466 {
467  if (!isValidCounter(id))
468  return 0;
469 
470  const CounterState &cs(getCounter(id));
471  PMEVTYPER_t type(cs.filter);
472 
473  type.evtCount = cs.eventId;
474 
475  return type;
476 }
477 
478 void
479 PMU::setCounterTypeRegister(CounterId id, PMEVTYPER_t val)
480 {
481  DPRINTF(PMUVerbose, "Set Event [%d] = 0x%08x\n", id, val);
482  if (!isValidCounter(id)) {
483  warn_once("Can't change counter type: Counter %i does not exist.\n",
484  id);
485  return;
486  }
487 
488  CounterState &ctr(getCounter(id));
489  const EventTypeId old_event_id(ctr.eventId);
490 
491  ctr.filter = val;
492 
493  // If PMCCNTR Register, do not change event type. PMCCNTR can
494  // count processor cycles only. If we change the event type, we
495  // need to update the probes the counter is using.
496  if (id != PMCCNTR && old_event_id != val.evtCount) {
497  ctr.eventId = val.evtCount;
498  updateCounter(reg_pmselr.sel, ctr);
499  }
500 }
501 
502 void
504 {
505  RealView *rv(dynamic_cast<RealView *>(platform));
506  if (!rv || !rv->gic) {
507  warn_once("ARM PMU: GIC missing, can't raise interrupt.\n");
508  return;
509  }
510 
511  DPRINTF(PMUVerbose, "Delivering PMU interrupt.\n");
512  rv->gic->sendInt(pmuInterrupt);
513 }
514 
515 void
517 {
518  DPRINTF(Checkpoint, "Serializing Arm PMU\n");
519 
527 
528  for (size_t i = 0; i < counters.size(); ++i)
529  counters[i].serializeSection(cp, csprintf("counters.%i", i));
530 
531  cycleCounter.serializeSection(cp, "cycleCounter");
532 }
533 
534 void
536 {
537  DPRINTF(Checkpoint, "Unserializing Arm PMU\n");
538 
546 
547  for (size_t i = 0; i < counters.size(); ++i)
548  counters[i].unserializeSection(cp, csprintf("counters.%i", i));
549 
550  cycleCounter.unserializeSection(cp, "cycleCounter");
551 }
552 
553 void
555 {
560 }
561 
562 void
564 {
565  UNSERIALIZE_SCALAR(eventId);
566  UNSERIALIZE_SCALAR(value);
568  UNSERIALIZE_SCALAR(overflow64);
569 }
570 
571 bool
572 PMU::CounterState::add(uint64_t delta)
573 {
574  const uint64_t msb(1ULL << (overflow64 ? 63 : 31));
575  const uint64_t old_value(value);
576 
577  value += delta;
578 
579  // Overflow if the msb goes from 1 to 0
580  return (old_value & msb) && !(value & msb);
581 }
582 
583 } // namespace ArmISA
584 
585 ArmISA::PMU *
586 ArmPMUParams::create()
587 {
588  return new ArmISA::PMU(this);
589 }
const unsigned int pmuInterrupt
Performance monitor interrupt number.
Definition: pmu.hh:482
void updateAllCounters()
Call updateCounter() for each counter in the PMU if the counter's state has changed.
Definition: pmu.cc:335
void drainResume() override
Resume execution after a successful drain.
Definition: pmu.cc:104
#define DPRINTF(x,...)
Definition: trace.hh:212
void handleEvent(CounterId id, uint64_t delta)
Handle an counting event triggered by a probe.
Definition: pmu.cc:385
unsigned clock_remainder
Remainder part when the clock counter is divided by 64.
Definition: pmu.hh:468
uint64_t getCounterValue(CounterId id) const
Get the value of a performance counter.
Definition: pmu.hh:222
Bitfield< 7 > i
Definition: miscregs.hh:1378
#define panic(...)
Definition: misc.hh:153
std::unique_ptr< ProbeListener > create(PMU &pmu, CounterId cid) const
Create and attach a probe used to drive this event.
Definition: pmu.hh:305
uint64_t MiscReg
Definition: registers.hh:70
CounterState & getCounter(CounterId id)
Return the state of a counter.
Definition: pmu.hh:396
void addEventProbe(unsigned int id, SimObject *obj, const char *name)
Definition: pmu.cc:91
void unserializeSection(CheckpointIn &cp, const char *name)
Unserialize an a child object.
Definition: serialize.cc:585
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: pmu.cc:563
Model of an ARM PMU version 3.
Definition: pmu.hh:91
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: pmu.cc:535
bool isFiltered(const CounterState &ctr) const
Check if a counter's settings allow it to be counted.
Definition: pmu.cc:356
PMSELR_t reg_pmselr
Performance Monitor Selection Register.
Definition: pmu.hh:451
PMCR_t reg_pmcr
Performance Monitor Control Register.
Definition: pmu.hh:448
OperatingMode
Definition: types.hh:569
Base class for devices that use the MiscReg interfaces.
Definition: isa_device.hh:58
#define warn_once(...)
Definition: misc.hh:226
CounterState cycleCounter
State of the cycle counter.
Definition: pmu.hh:473
const char *const miscRegName[]
Definition: miscregs.hh:739
Declaration of top level class for the RealView platform chips.
MiscReg readMiscReg(int misc_reg) override
Read a register within the PMU.
Definition: pmu.cc:222
MiscReg reg_pmovsr
Performance Monitor Overflow Status Register.
Definition: pmu.hh:457
Bitfield< 63 > val
Definition: misc.hh:770
ExceptionLevel
Definition: types.hh:562
MiscReg readMiscRegInt(int misc_reg)
Definition: pmu.cc:231
#define warn(...)
Definition: misc.hh:219
MiscReg reg_pminten
Performance Monitor Interrupt Enable Register.
Definition: pmu.hh:454
#define UNSERIALIZE_SCALAR(scalar)
Definition: serialize.hh:145
Bitfield< 11 > enable
Definition: misc.hh:1004
Bitfield< 3, 2 > el
Definition: miscregs.hh:1384
int unflattenMiscReg(int reg)
Definition: miscregs.cc:2090
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
std::vector< CounterState > counters
State of all general-purpose counters supported by PMU.
Definition: pmu.hh:471
SimObject *const obj
SimObject being measured by this probe.
Definition: pmu.hh:314
bool isValidCounter(CounterId id) const
Is this a valid counter ID?
Definition: pmu.hh:385
Platform *const platform
Platform this device belongs to.
Definition: pmu.hh:484
virtual void sendInt(uint32_t num)=0
Post an interrupt from a device that is connected to the GIC.
void raiseInterrupt()
Deliver a PMU interrupt to the GIC.
Definition: pmu.cc:503
BaseGic * gic
Definition: realview.hh:65
void serializeSection(CheckpointOut &cp, const char *name) const
Serialize an object into a new section.
Definition: serialize.cc:578
static ExceptionLevel opModeToEL(OperatingMode mode)
Definition: types.hh:663
#define fatal(...)
Definition: misc.hh:163
uint64_t reg_pmceid
Performance counter ID register.
Definition: pmu.hh:465
Event type configuration.
Definition: pmu.hh:290
void setControlReg(PMCR_t val)
PMCR write handling.
Definition: pmu.cc:312
~PMU()
Definition: pmu.cc:86
Bitfield< 28 > et
MiscReg reg_pmcnten
Performance Monitor Count Enable Register.
Definition: pmu.hh:445
void resetEventCounts()
Reset all event counters excluding the cycle counter to zero.
Definition: pmu.cc:445
#define ULL(N)
uint64_t constant
Definition: types.hh:50
static const MiscReg reg_pmcr_wr_mask
PMCR write mask when accessed from the guest.
Definition: pmu.hh:479
bool enabled()
Definition: statistics.cc:502
PMEVTYPER_t filter
Filtering settings (evtCount is unused)
Definition: pmu.hh:348
void setCounterValue(CounterId id, uint64_t val)
Set the value of a performance counter.
Definition: pmu.cc:452
#define SERIALIZE_SCALAR(scalar)
Definition: serialize.hh:143
PMCR_t reg_pmcr_conf
Constant (configuration-dependent) part of the PMCR.
Definition: pmu.hh:477
PMU(const ArmPMUParams *p)
Definition: pmu.cc:58
type
Definition: misc.hh:728
bool add(uint64_t delta)
Add an event count to the counter and check for overflow.
Definition: pmu.cc:572
virtual const std::string name() const
Definition: sim_object.hh:117
void updateCounter(CounterId id, CounterState &ctr)
Depending on counter configuration, add or remove the probes driving the counter. ...
Definition: pmu.cc:412
Base class for ARM GIC implementations.
std::ostream CheckpointOut
Definition: serialize.hh:67
const std::string name
Probe name within obj.
Definition: pmu.hh:316
void setMiscReg(int misc_reg, MiscReg val) override
Set a register within the PMU.
Definition: pmu.cc:111
bool overflow64
Is this a 64-bit counter?
Definition: pmu.hh:357
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: pmu.cc:516
static const CounterId PMCCNTR
Cycle Count Register Number.
Definition: pmu.hh:177
unsigned int EventTypeId
Event type ID.
Definition: pmu.hh:184
void setCounterTypeRegister(CounterId id, PMEVTYPER_t type)
Set the type and filter settings of a performance counter (PMEVTYPER)
Definition: pmu.cc:479
std::vector< ProbeListenerUPtr > listeners
Probe listeners driving this counter.
Definition: pmu.hh:361
PMEVTYPER_t getCounterTypeRegister(CounterId id) const
Get the type and filter settings of a counter (PMEVTYPER)
Definition: pmu.cc:465
std::multimap< EventTypeId, EventType > pmuEventTypes
Event types supported by this PMU.
Definition: pmu.hh:502
EventTypeId eventId
Counter event ID.
Definition: pmu.hh:345
bool inSecureState(ThreadContext *tc)
Definition: utility.cc:176
Bitfield< 11 > id
Definition: miscregs.hh:124
static const EventTypeId ARCH_EVENT_SW_INCR
ID of the software increment event.
Definition: pmu.hh:187
Bitfield< 0 > p
ProbePointArg< uint64_t > PMU
PMU probe point.
Definition: pmu.hh:56
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: pmu.cc:554
Abstract superclass for simulation objects.
Definition: sim_object.hh:94
MiscReg readMiscRegNoEffect(int misc_reg) const
Definition: isa.cc:483
State of a counter within the PMU.
Definition: pmu.hh:324
uint64_t value
Current value of the counter.
Definition: pmu.hh:351
bool enabled
Is the counter enabled?
Definition: pmu.hh:354

Generated on Fri Jun 9 2017 13:03:39 for gem5 by doxygen 1.8.6