gem5  v22.1.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
pmu.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2014, 2017-2018 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 
38 #ifndef __ARCH_ARM_PMU_HH__
39 #define __ARCH_ARM_PMU_HH__
40 
41 #include <map>
42 #include <memory>
43 #include <vector>
44 
45 #include "arch/arm/isa_device.hh"
46 #include "arch/arm/system.hh"
47 #include "base/cprintf.hh"
48 #include "cpu/base.hh"
49 #include "debug/PMUVerbose.hh"
50 #include "sim/eventq.hh"
51 #include "sim/sim_object.hh"
52 #include "sim/system.hh"
53 
54 namespace gem5
55 {
56 
57 struct ArmPMUParams;
58 class Platform;
59 class ThreadContext;
60 class ArmInterruptPin;
61 
62 namespace ArmISA {
63 
64 
96 class PMU : public SimObject, public ArmISA::BaseISADevice
97 {
98  public:
99  PMU(const ArmPMUParams &p);
100  ~PMU();
101 
102  void addEventProbe(unsigned int id, SimObject *obj, const char *name);
103  void addSoftwareIncrementEvent(unsigned int id);
104 
105  void registerEvent(uint32_t id);
106 
107  public: // SimObject and related interfaces
108  void serialize(CheckpointOut &cp) const override;
109  void unserialize(CheckpointIn &cp) override;
110 
111  void drainResume() override;
112 
113  void regProbeListeners() override;
114 
115  public: // ISA Device interface
116  void setThreadContext(ThreadContext *tc) override;
117 
124  void setMiscReg(int misc_reg, RegVal val) override;
131  RegVal readMiscReg(int misc_reg) override;
132 
133  protected: // PMU register types and constants
134  BitUnion32(PMCR_t)
135  // PMU Enable
136  Bitfield<0> e;
137  // Event counter reset
138  Bitfield<1> p;
139  // Cycle counter reset
140  Bitfield<2> c;
141  // Cycle counter divider enable
142  Bitfield<3> d;
143  // Export enable
144  Bitfield<4> x;
145  // Disable PMCCNTR when event counting is prohibited
146  Bitfield<5> dp;
147  // Long Cycle counter enable
148  Bitfield<6> lc;
149  // Number of event counters implemented
150  Bitfield<15, 11> n;
151  // Implementation ID
152  Bitfield<23, 16> idcode;
153  // Implementer code
154  Bitfield<31, 24> imp;
155  EndBitUnion(PMCR_t)
156 
157  BitUnion32(PMSELR_t)
158  // Performance counter selector
159  Bitfield<4, 0> sel;
160  EndBitUnion(PMSELR_t)
161 
162  BitUnion32(PMEVTYPER_t)
163  Bitfield<15, 0> evtCount;
164 
165  // Secure EL3 filtering
166  Bitfield<26> m;
167  // Non-secure EL2 mode filtering
168  Bitfield<27> nsh;
169  // Non-secure EL0 mode filtering
170  Bitfield<28> nsu;
171  // Non-secure EL1 mode filtering
172  Bitfield<29> nsk;
173  // EL0 filtering
174  Bitfield<30> u;
175  // EL1 filtering
176  Bitfield<31> p;
177  EndBitUnion(PMEVTYPER_t)
178 
186  typedef unsigned int CounterId;
187 
189  static const CounterId PMCCNTR = 31;
190 
196  typedef unsigned int EventTypeId;
197 
198  protected: /* High-level register and interrupt handling */
199  RegVal readMiscRegInt(int misc_reg);
200 
209  void setControlReg(PMCR_t val);
210 
214  void resetEventCounts();
215 
219  void raiseInterrupt();
220 
224  void clearInterrupt();
225 
236  uint64_t getCounterValue(CounterId id) const {
237  return isValidCounter(id) ? getCounter(id).getValue() : 0;
238  }
239 
247  void setCounterValue(CounterId id, uint64_t val);
248 
260  PMEVTYPER_t getCounterTypeRegister(CounterId id) const;
261 
275  void setCounterTypeRegister(CounterId id, PMEVTYPER_t type);
276 
287  void setOverflowStatus(RegVal new_val);
288 
289  protected: /* Probe handling and counter state */
290  struct CounterState;
291 
295  struct PMUEvent
296  {
297 
298  PMUEvent() {}
299 
300  virtual ~PMUEvent() {}
301 
307  void attachEvent(PMU::CounterState *user);
308 
314  void detachEvent(PMU::CounterState *user);
315 
323  virtual void increment(const uint64_t val);
324 
328  virtual void enable() = 0;
329 
333  virtual void disable() = 0;
334 
339  virtual void updateAttachedCounters() {}
340 
341  protected:
342 
344  std::set<PMU::CounterState*> userCounters;
345  };
346 
347  struct RegularEvent : public PMUEvent
348  {
350 
352  std::string name) {
353 
354  panic_if(!object,"malformed probe-point"
355  " definition with name %s\n", name);
356 
357  microArchitectureEventSet.emplace(object, name);
358  }
359 
360  protected:
361  struct RegularProbe: public ProbeListenerArgBase<uint64_t>
362  {
364  std::string name)
366  parentEvent(parent) {}
367 
368  RegularProbe() = delete;
369 
370  void notify(const uint64_t &val);
371 
372  protected:
374  };
375 
377  std::set<EventTypeEntry> microArchitectureEventSet;
378 
383 
384  void enable() override;
385 
386  void disable() override;
387  };
388 
389  class SWIncrementEvent : public PMUEvent
390  {
391  void enable() override {}
392  void disable() override {}
393 
394  public:
395 
402  void write(uint64_t val);
403  };
404 
411  std::shared_ptr<PMUEvent> getEvent(uint64_t eventId);
412 
414  struct CounterState : public Serializable
415  {
416  CounterState(PMU &pmuReference, uint64_t counter_id)
417  : eventId(0), filter(0), enabled(false),
418  overflow64(false), sourceEvent(nullptr),
419  counterId(counter_id), value(0), resetValue(false),
420  pmu(pmuReference) {}
421 
422  void serialize(CheckpointOut &cp) const override;
423  void unserialize(CheckpointIn &cp) override;
424 
431  uint64_t add(uint64_t delta);
432 
433  bool isFiltered() const;
434 
438  void detach();
439 
445  void attach(const std::shared_ptr<PMUEvent> &event);
446 
452  uint64_t getCounterId() const{
453  return counterId;
454  }
455 
461  uint64_t getValue() const;
462 
468  void setValue(uint64_t val);
469 
470  public: /* Serializable state */
473 
475  PMEVTYPER_t filter;
476 
478  bool enabled;
479 
482 
483  protected: /* Configuration */
485  std::shared_ptr<PMUEvent> sourceEvent;
486 
488  uint64_t counterId;
489 
491  uint64_t value;
492 
495 
497 
498  template <typename ...Args>
499  void debugCounter(const char* mainString, Args &...args) const {
500 
501  std::string userString = csprintf(mainString, args...);
502 
503  warn("[counterId = %d, eventId = %d, sourceEvent = 0x%x] %s",
504  counterId, eventId, sourceEvent, userString.c_str());
505 
506  }
507  };
508 
517  bool isValidCounter(CounterId id) const {
518  return id < counters.size() || id == PMCCNTR;
519  }
520 
528  CounterState &getCounter(CounterId id) {
529  assert(isValidCounter(id));
530  return id == PMCCNTR ? cycleCounter : counters[id];
531  }
532 
540  const CounterState &getCounter(CounterId id) const {
541  assert(isValidCounter(id));
542  return id == PMCCNTR ? cycleCounter : counters[id];
543  }
544 
556  void updateCounter(CounterState &ctr);
557 
564  bool isFiltered(const CounterState &ctr) const;
565 
572  void updateAllCounters();
573 
574  protected: /* State that needs to be serialized */
577 
579  PMCR_t reg_pmcr;
580 
582  PMSELR_t reg_pmselr;
583 
586 
589 
596  uint64_t reg_pmceid0;
597  uint64_t reg_pmceid1;
598 
600  unsigned clock_remainder;
601 
604 
607 
610 
612  const uint64_t cycleCounterEventId;
613 
615  std::shared_ptr<SWIncrementEvent> swIncrementEvent;
616 
617  protected: /* Configuration and constants */
620 
622  static const RegVal reg_pmcr_wr_mask;
623 
626 
630  std::map<EventTypeId, std::shared_ptr<PMUEvent>> eventMap;
631 };
632 
633 } // namespace ArmISA
634 } // namespace gem5
635 
636 #endif
Base class for devices that use the MiscReg interfaces.
Definition: isa_device.hh:62
void enable() override
Enable the current event.
Definition: pmu.hh:391
void disable() override
Disable the current event.
Definition: pmu.hh:392
void write(uint64_t val)
write on the sw increment register inducing an increment of the counters with this event selected acc...
Definition: pmu.cc:797
Model of an ARM PMU version 3.
Definition: pmu.hh:97
BitUnion32(PMCR_t) Bitfield< 0 > e
void regProbeListeners() override
Register probe listeners for this object.
Definition: pmu.cc:172
Bitfield< 31, 24 > imp
Definition: pmu.hh:154
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: pmu.cc:704
Bitfield< 26 > m
Definition: pmu.hh:166
void setControlReg(PMCR_t val)
PMCR write handling.
Definition: pmu.cc:396
Bitfield< 30 > u
Definition: pmu.hh:174
void raiseInterrupt()
Deliver a PMU interrupt to the GIC.
Definition: pmu.cc:660
Bitfield< 5 > dp
Definition: pmu.hh:146
PMCR_t reg_pmcr_conf
Constant (configuration-dependent) part of the PMCR.
Definition: pmu.hh:619
RegVal readMiscReg(int misc_reg) override
Read a register within the PMU.
Definition: pmu.cc:297
RegVal reg_pmcnten
Performance Monitor Count Enable Register.
Definition: pmu.hh:576
std::shared_ptr< PMUEvent > getEvent(uint64_t eventId)
Obtain the event of a given id.
Definition: pmu.cc:732
void clearInterrupt()
Clear a PMU interrupt.
Definition: pmu.cc:672
const uint64_t cycleCounterEventId
The id of the counter hardwired to the cpu cycle counter.
Definition: pmu.hh:612
uint64_t maximumCounterCount
The number of regular event counters.
Definition: pmu.hh:603
static const RegVal reg_pmcr_wr_mask
PMCR write mask when accessed from the guest.
Definition: pmu.hh:622
Bitfield< 2 > c
Definition: pmu.hh:140
bool isFiltered(const CounterState &ctr) const
Check if a counter's settings allow it to be counted.
PMEVTYPER_t getCounterTypeRegister(CounterId id) const
Get the type and filter settings of a counter (PMEVTYPER)
Definition: pmu.cc:608
unsigned clock_remainder
Remainder part when the clock counter is divided by 64.
Definition: pmu.hh:600
uint64_t reg_pmceid1
Definition: pmu.hh:597
void updateAllCounters()
Call updateCounter() for each counter in the PMU if the counter's state has changed.
Definition: pmu.cc:419
void resetEventCounts()
Reset all event counters excluding the cycle counter to zero.
Definition: pmu.cc:588
void registerEvent(uint32_t id)
Definition: pmu.cc:149
void setOverflowStatus(RegVal new_val)
Used for writing the Overflow Flag Status Register (SET/CLR)
Definition: pmu.cc:646
PMSELR_t reg_pmselr
Performance Monitor Selection Register.
Definition: pmu.hh:582
std::map< EventTypeId, std::shared_ptr< PMUEvent > > eventMap
List of event types supported by this PMU.
Definition: pmu.hh:630
Bitfield< 29 > nsk
Definition: pmu.hh:172
static const CounterId PMCCNTR
Cycle Count Register Number.
Definition: pmu.hh:189
void setThreadContext(ThreadContext *tc) override
Definition: pmu.cc:95
CounterState & getCounter(CounterId id)
Return the state of a counter.
Definition: pmu.hh:528
std::vector< CounterState > counters
State of all general-purpose counters supported by PMU.
Definition: pmu.hh:606
void setCounterTypeRegister(CounterId id, PMEVTYPER_t type)
Set the type and filter settings of a performance counter (PMEVTYPER)
Definition: pmu.cc:622
Bitfield< 27 > nsh
Definition: pmu.hh:168
Bitfield< 3 > d
Definition: pmu.hh:142
void drainResume() override
Resume execution after a successful drain.
Definition: pmu.cc:165
PMU(const ArmPMUParams &p)
Definition: pmu.cc:57
Bitfield< 6 > lc
Definition: pmu.hh:148
RegVal readMiscRegInt(int misc_reg)
Definition: pmu.cc:306
Bitfield< 15, 11 > n
Definition: pmu.hh:150
Bitfield< 4 > x
Definition: pmu.hh:144
void setMiscReg(int misc_reg, RegVal val) override
Set a register within the PMU.
Definition: pmu.cc:188
CounterState cycleCounter
State of the cycle counter.
Definition: pmu.hh:609
uint64_t reg_pmceid0
Performance counter ID register.
Definition: pmu.hh:596
bool isValidCounter(CounterId id) const
Is this a valid counter ID?
Definition: pmu.hh:517
PMCR_t reg_pmcr
Performance Monitor Control Register.
Definition: pmu.hh:579
Bitfield< 1 > p
Definition: pmu.hh:138
const CounterState & getCounter(CounterId id) const
Return the state of a counter.
Definition: pmu.hh:540
Bitfield< 23, 16 > idcode
Definition: pmu.hh:152
RegVal reg_pmovsr
Performance Monitor Overflow Status Register.
Definition: pmu.hh:588
Bitfield< 28 > nsu
Definition: pmu.hh:170
ArmInterruptPin * interrupt
Performance monitor interrupt number.
Definition: pmu.hh:625
void addSoftwareIncrementEvent(unsigned int id)
Definition: pmu.cc:105
std::shared_ptr< SWIncrementEvent > swIncrementEvent
The event that implements the software increment.
Definition: pmu.hh:615
uint64_t getCounterValue(CounterId id) const
Get the value of a performance counter.
Definition: pmu.hh:236
unsigned int EventTypeId
Event type ID.
Definition: pmu.hh:196
void setCounterValue(CounterId id, uint64_t val)
Set the value of a performance counter.
Definition: pmu.cc:595
EndBitUnion(PMCR_t) BitUnion32(PMSELR_t) Bitfield< 4
RegVal reg_pminten
Performance Monitor Interrupt Enable Register.
Definition: pmu.hh:585
void updateCounter(CounterState &ctr)
Depending on counter configuration, add or remove the probes driving the counter.
Definition: pmu.cc:565
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: pmu.cc:684
void addEventProbe(unsigned int id, SimObject *obj, const char *name)
Definition: pmu.cc:127
Generic representation of an Arm interrupt pin.
Definition: base_gic.hh:200
virtual std::string name() const
Definition: named.hh:47
ProbeListenerArgBase is used to define the base interface to a ProbeListenerArg (i....
Definition: probe.hh:212
const std::string name
Definition: probe.hh:138
Basic support for object serialization.
Definition: serialize.hh:170
Abstract superclass for simulation objects.
Definition: sim_object.hh:148
ThreadContext is the external interface to all thread state for anything outside of the CPU.
STL pair class.
Definition: stl.hh:58
STL vector class.
Definition: stl.hh:37
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:204
ProbeManager * getProbeManager()
Get the probe manager for this object.
Definition: sim_object.cc:120
#define warn(...)
Definition: logging.hh:246
Bitfield< 9 > e
Definition: misc_types.hh:65
Bitfield< 33 > id
Definition: misc_types.hh:257
Bitfield< 10, 5 > event
Bitfield< 63 > val
Definition: misc.hh:776
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
std::ostream CheckpointOut
Definition: serialize.hh:66
uint64_t RegVal
Definition: types.hh:173
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
State of a counter within the PMU.
Definition: pmu.hh:415
bool resetValue
Flag keeping track if the counter has been reset.
Definition: pmu.hh:494
void attach(const std::shared_ptr< PMUEvent > &event)
Attach this counter to an event.
Definition: pmu.cc:528
PMEVTYPER_t filter
Filtering settings (evtCount is unused)
Definition: pmu.hh:475
uint64_t value
Current value of the counter.
Definition: pmu.hh:491
bool overflow64
Is this a 64-bit counter?
Definition: pmu.hh:481
uint64_t counterId
id of the counter instance
Definition: pmu.hh:488
void detach()
Detach the counter from its event.
Definition: pmu.cc:516
EventTypeId eventId
Counter event ID.
Definition: pmu.hh:472
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: pmu.cc:753
CounterState(PMU &pmuReference, uint64_t counter_id)
Definition: pmu.hh:416
uint64_t getCounterId() const
Obtain the counter id.
Definition: pmu.hh:452
uint64_t getValue() const
rReturn the counter value
Definition: pmu.cc:539
std::shared_ptr< PMUEvent > sourceEvent
PmuEvent currently in use (if any)
Definition: pmu.hh:485
bool enabled
Is the counter enabled?
Definition: pmu.hh:478
uint64_t add(uint64_t delta)
Add an event count to the counter and check for overflow.
Definition: pmu.cc:761
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: pmu.cc:745
void debugCounter(const char *mainString, Args &...args) const
Definition: pmu.hh:499
void setValue(uint64_t val)
overwrite the value of the counter
Definition: pmu.cc:551
Event definition base class.
Definition: pmu.hh:296
void attachEvent(PMU::CounterState *user)
attach this event to a given counter
Definition: pmu.cc:440
virtual void enable()=0
Enable the current event.
virtual void disable()=0
Disable the current event.
std::set< PMU::CounterState * > userCounters
set of counters using this event
Definition: pmu.hh:344
virtual void updateAttachedCounters()
Method called immediately before a counter access in order for the associated event to update its sta...
Definition: pmu.hh:339
void detachEvent(PMU::CounterState *user)
detach this event from a given counter
Definition: pmu.cc:458
virtual void increment(const uint64_t val)
notify an event increment of val units, all the attached counters' value is incremented by val units.
Definition: pmu.cc:450
void notify(const uint64_t &val)
Definition: pmu.cc:468
RegularProbe(RegularEvent *parent, SimObject *obj, std::string name)
Definition: pmu.hh:363
std::set< EventTypeEntry > microArchitectureEventSet
The set of events driving the event value.
Definition: pmu.hh:377
void enable() override
Enable the current event.
Definition: pmu.cc:474
std::vector< std::unique_ptr< RegularProbe > > attachedProbePointList
Set of probe listeners tapping onto each of the input micro-arch events which compose this pmu event.
Definition: pmu.hh:382
void disable() override
Disable the current event.
Definition: pmu.cc:483
void addMicroarchitectureProbe(SimObject *object, std::string name)
Definition: pmu.hh:351
std::pair< SimObject *, std::string > EventTypeEntry
Definition: pmu.hh:349

Generated on Wed Dec 21 2022 10:22:26 for gem5 by doxygen 1.9.1