gem5 [DEVELOP-FOR-25.0]
Loading...
Searching...
No Matches
pmu.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011-2014, 2017-2018, 2022-2023 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
46#include "arch/arm/system.hh"
47#include "base/cprintf.hh"
48#include "cpu/base.hh"
49#include "debug/PMUVerbose.hh"
51#include "sim/eventq.hh"
52#include "sim/sim_object.hh"
53#include "sim/system.hh"
54
55namespace gem5
56{
57
58struct ArmPMUParams;
59class Platform;
60class ThreadContext;
61class ArmInterruptPin;
62
63namespace ArmISA {
64
65
97class PMU : public SimObject, public ArmISA::BaseISADevice
98{
99 public:
100 PMU(const ArmPMUParams &p);
101 ~PMU();
102
103 void addEventProbe(unsigned int id, SimObject *obj, const char *name);
104 void addSoftwareIncrementEvent(unsigned int id);
105
106 void registerEvent(uint32_t id);
107
108 public: // SimObject and related interfaces
109 void serialize(CheckpointOut &cp) const override;
110 void unserialize(CheckpointIn &cp) override;
111
112 void drainResume() override;
113
114 void regProbeListeners() override;
115
116 public: // ISA Device interface
117 void setThreadContext(ThreadContext *tc) override;
118
125 void setMiscReg(int misc_reg, RegVal val) override;
132 RegVal readMiscReg(int misc_reg) override;
133
134 protected: // PMU register types and constants
136 // PMU Enable
137 Bitfield<0> e;
138 // Event counter reset
139 Bitfield<1> p;
140 // Cycle counter reset
141 Bitfield<2> c;
142 // Cycle counter divider enable
143 Bitfield<3> d;
144 // Export enable
145 Bitfield<4> x;
146 // Disable PMCCNTR when event counting is prohibited
147 Bitfield<5> dp;
148 // Long Cycle counter enable
149 Bitfield<6> lc;
150 // Number of event counters implemented
151 Bitfield<15, 11> n;
152 // Implementation ID
153 Bitfield<23, 16> idcode;
154 // Implementer code
155 Bitfield<31, 24> imp;
157
158 BitUnion32(PMSELR_t)
159 // Performance counter selector
160 Bitfield<4, 0> sel;
161 EndBitUnion(PMSELR_t)
162
163 BitUnion32(PMEVTYPER_t)
164 Bitfield<15, 0> evtCount;
165
166 // Secure EL3 filtering
167 Bitfield<26> m;
168 // Non-secure EL2 mode filtering
169 Bitfield<27> nsh;
170 // Non-secure EL0 mode filtering
171 Bitfield<28> nsu;
172 // Non-secure EL1 mode filtering
173 Bitfield<29> nsk;
174 // EL0 filtering
175 Bitfield<30> u;
176 // EL1 filtering
177 Bitfield<31> p;
178 EndBitUnion(PMEVTYPER_t)
179
187 typedef unsigned int CounterId;
188
190 static const CounterId PMCCNTR = 31;
191
197 typedef unsigned int EventTypeId;
198
199 protected: /* High-level register and interrupt handling */
201
210 void setControlReg(PMCR_t val);
211
215 void resetEventCounts();
216
220 void raiseInterrupt();
221
225 void clearInterrupt();
226
237 uint64_t getCounterValue(CounterId id) const {
238 return isValidCounter(id) ? getCounter(id).getValue() : 0;
239 }
240
248 void setCounterValue(CounterId id, uint64_t val);
249
261 PMEVTYPER_t getCounterTypeRegister(CounterId id) const;
262
276 void setCounterTypeRegister(CounterId id, PMEVTYPER_t type);
277
288 void setOverflowStatus(RegVal new_val);
289
290 protected: /* Probe handling and counter state */
291 struct CounterState;
292
296 struct PMUEvent
297 {
298
300
301 virtual ~PMUEvent() {}
302
308 void attachEvent(PMU::CounterState *user);
309
315 void detachEvent(PMU::CounterState *user);
316
324 virtual void increment(const uint64_t val);
325
329 virtual void enable() = 0;
330
334 virtual void disable() = 0;
335
340 virtual void updateAttachedCounters() {}
341
342 protected:
343
345 std::set<PMU::CounterState*> userCounters;
346 };
347
348 struct RegularEvent : public PMUEvent
349 {
351
353 std::string name) {
354
355 panic_if(!object,"malformed probe-point"
356 " definition with name %s\n", name);
357
358 microArchitectureEventSet.emplace(object, name);
359 }
360
361 protected:
362 struct RegularProbe : public ProbeListenerArgBase<uint64_t>
363 {
364 RegularProbe(RegularEvent *parent, std::string name)
365 : ProbeListenerArgBase(std::move(name)), parentEvent(parent)
366 {}
367
368 RegularProbe() = delete;
369
370 void notify(const uint64_t &val) override;
371
372 protected:
374 };
375
376 struct CacheProbe : public ProbeListenerArgBase<CacheAccessProbeArg>
377 {
378 CacheProbe(RegularEvent *parent, std::string name)
379 : ProbeListenerArgBase(std::move(name)), parentEvent(parent)
380 {}
381
382 CacheProbe() = delete;
383
384 void notify(const CacheAccessProbeArg &val) override
385 {
386 parentEvent->increment(1);
387 };
388
389 protected:
391 };
392
394 std::set<EventTypeEntry> microArchitectureEventSet;
395
400
401 void enable() override;
402
403 void disable() override;
404 };
405
407 {
408 void enable() override {}
409 void disable() override {}
410
411 public:
412
419 void write(uint64_t val);
420 };
421
428 std::shared_ptr<PMUEvent> getEvent(uint64_t eventId);
429
432 {
433 CounterState(PMU &pmuReference, uint64_t counter_id,
434 const bool is_64_bit)
435 : eventId(0), filter(0), enabled(false),
436 overflow64(is_64_bit), sourceEvent(nullptr),
437 counterId(counter_id), value(0), resetValue(false),
438 pmu(pmuReference) {}
439
440 void serialize(CheckpointOut &cp) const override;
441 void unserialize(CheckpointIn &cp) override;
442
449 uint64_t add(uint64_t delta);
450
451 bool isFiltered() const;
452
456 void detach();
457
463 void attach(const std::shared_ptr<PMUEvent> &event);
464
470 uint64_t getCounterId() const{
471 return counterId;
472 }
473
479 uint64_t getValue() const;
480
486 void setValue(uint64_t val);
487
488 public: /* Serializable state */
491
493 PMEVTYPER_t filter;
494
497
500
501 protected: /* Configuration */
503 std::shared_ptr<PMUEvent> sourceEvent;
504
506 uint64_t counterId;
507
509 uint64_t value;
510
513
515
516 template <typename ...Args>
517 void debugCounter(const char* mainString, Args &...args) const {
518
519 std::string userString = csprintf(mainString, args...);
520
521 warn("[counterId = %d, eventId = %d, sourceEvent = 0x%x] %s",
522 counterId, eventId, sourceEvent, userString.c_str());
523
524 }
525 };
526
535 bool isValidCounter(CounterId id) const {
536 return id < counters.size() || id == PMCCNTR;
537 }
538
546 CounterState &getCounter(CounterId id) {
547 assert(isValidCounter(id));
548 return id == PMCCNTR ? cycleCounter : counters[id];
549 }
550
558 const CounterState &getCounter(CounterId id) const {
559 assert(isValidCounter(id));
560 return id == PMCCNTR ? cycleCounter : counters[id];
561 }
562
574 void updateCounter(CounterState &ctr);
575
582 bool isFiltered(const CounterState &ctr) const;
583
590 void updateAllCounters();
591
592 protected: /* State that needs to be serialized */
595
598
600 PMCR_t reg_pmcr;
601
603 PMSELR_t reg_pmselr;
604
607
610
617 uint64_t reg_pmceid0;
618 uint64_t reg_pmceid1;
619
622
625
628
631
633 const uint64_t cycleCounterEventId;
634
636 std::shared_ptr<SWIncrementEvent> swIncrementEvent;
637
638 protected: /* Configuration and constants */
641
644
647
651 std::map<EventTypeId, std::shared_ptr<PMUEvent>> eventMap;
652
657
662};
663
664} // namespace ArmISA
665} // namespace gem5
666
667#endif
#define BitUnion32(name)
Definition bitunion.hh:495
Base class for devices that use the MiscReg interfaces.
Definition isa_device.hh:62
void enable() override
Enable the current event.
Definition pmu.hh:408
void disable() override
Disable the current event.
Definition pmu.hh:409
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:841
BitUnion32(PMCR_t) Bitfield< 0 > e
void regProbeListeners() override
Register probe listeners for this object.
Definition pmu.cc:176
Bitfield< 31, 24 > imp
Definition pmu.hh:155
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition pmu.cc:747
Bitfield< 26 > m
Definition pmu.hh:167
void setControlReg(PMCR_t val)
PMCR write handling.
Definition pmu.cc:405
Bitfield< 30 > u
Definition pmu.hh:175
void raiseInterrupt()
Deliver a PMU interrupt to the GIC.
Definition pmu.cc:698
Bitfield< 5 > dp
Definition pmu.hh:147
PMCR_t reg_pmcr_conf
Constant (configuration-dependent) part of the PMCR.
Definition pmu.hh:640
RegVal readMiscReg(int misc_reg) override
Read a register within the PMU.
Definition pmu.cc:307
RegVal reg_pmcnten
Performance Monitor Count Enable Register.
Definition pmu.hh:597
std::shared_ptr< PMUEvent > getEvent(uint64_t eventId)
Obtain the event of a given id.
Definition pmu.cc:776
void clearInterrupt()
Clear a PMU interrupt.
Definition pmu.cc:714
const uint64_t cycleCounterEventId
The id of the counter hardwired to the cpu cycle counter.
Definition pmu.hh:633
uint64_t maximumCounterCount
The number of regular event counters.
Definition pmu.hh:624
static const RegVal reg_pmcr_wr_mask
PMCR write mask when accessed from the guest.
Definition pmu.hh:643
Bitfield< 2 > c
Definition pmu.hh:141
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:646
unsigned clock_remainder
Remainder part when the clock counter is divided by 64.
Definition pmu.hh:621
uint64_t reg_pmceid1
Definition pmu.hh:618
void updateAllCounters()
Call updateCounter() for each counter in the PMU if the counter's state has changed.
Definition pmu.cc:443
void resetEventCounts()
Reset all event counters excluding the cycle counter to zero.
Definition pmu.cc:626
void registerEvent(uint32_t id)
Definition pmu.cc:153
void setOverflowStatus(RegVal new_val)
Used for writing the Overflow Flag Status Register (SET/CLR)
Definition pmu.cc:684
PMSELR_t reg_pmselr
Performance Monitor Selection Register.
Definition pmu.hh:603
std::map< EventTypeId, std::shared_ptr< PMUEvent > > eventMap
List of event types supported by this PMU.
Definition pmu.hh:651
Bitfield< 29 > nsk
Definition pmu.hh:173
static const CounterId PMCCNTR
Cycle Count Register Number.
Definition pmu.hh:190
void setThreadContext(ThreadContext *tc) override
Definition pmu.cc:99
std::vector< CounterState > counters
State of all general-purpose counters supported by PMU.
Definition pmu.hh:627
void setCounterTypeRegister(CounterId id, PMEVTYPER_t type)
Set the type and filter settings of a performance counter (PMEVTYPER)
Definition pmu.cc:660
Bitfield< 27 > nsh
Definition pmu.hh:169
Bitfield< 3 > d
Definition pmu.hh:143
void drainResume() override
Resume execution after a successful drain.
Definition pmu.cc:169
PMU(const ArmPMUParams &p)
Definition pmu.cc:58
Bitfield< 6 > lc
Definition pmu.hh:149
RegVal readMiscRegInt(int misc_reg)
Definition pmu.cc:316
Bitfield< 15, 11 > n
Definition pmu.hh:151
Bitfield< 4 > x
Definition pmu.hh:145
void setMiscReg(int misc_reg, RegVal val) override
Set a register within the PMU.
Definition pmu.cc:192
CounterState cycleCounter
State of the cycle counter.
Definition pmu.hh:630
uint64_t reg_pmceid0
Performance counter ID register.
Definition pmu.hh:617
bool isValidCounter(CounterId id) const
Is this a valid counter ID?
Definition pmu.hh:535
PMCR_t reg_pmcr
Performance Monitor Control Register.
Definition pmu.hh:600
Bitfield< 1 > p
Definition pmu.hh:139
Bitfield< 23, 16 > idcode
Definition pmu.hh:153
RegVal reg_pmovsr
Performance Monitor Overflow Status Register.
Definition pmu.hh:609
Bitfield< 28 > nsu
Definition pmu.hh:171
ArmInterruptPin * interrupt
Performance monitor interrupt number.
Definition pmu.hh:646
void addSoftwareIncrementEvent(unsigned int id)
Definition pmu.cc:109
CounterState & getCounter(CounterId id)
Return the state of a counter.
Definition pmu.hh:546
bool use64bitCounters
Determine whether to use 64-bit or 32-bit counters.
Definition pmu.hh:594
std::shared_ptr< SWIncrementEvent > swIncrementEvent
The event that implements the software increment.
Definition pmu.hh:636
uint64_t getCounterValue(CounterId id) const
Get the value of a performance counter.
Definition pmu.hh:237
bool exitOnPMUInterrupt
Exit simloop on PMU interrupt.
Definition pmu.hh:661
unsigned int EventTypeId
Event type ID.
Definition pmu.hh:197
void setCounterValue(CounterId id, uint64_t val)
Set the value of a performance counter.
Definition pmu.cc:633
EndBitUnion(PMCR_t) BitUnion32(PMSELR_t) Bitfield< 4
RegVal reg_pminten
Performance Monitor Interrupt Enable Register.
Definition pmu.hh:606
void updateCounter(CounterState &ctr)
Depending on counter configuration, add or remove the probes driving the counter.
Definition pmu.cc:602
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition pmu.cc:726
const CounterState & getCounter(CounterId id) const
Return the state of a counter.
Definition pmu.hh:558
const bool exitOnPMUControl
Exit simloop on PMU reset or disable.
Definition pmu.hh:656
void addEventProbe(unsigned int id, SimObject *obj, const char *name)
Definition pmu.cc:131
Generic representation of an Arm interrupt pin.
Definition base_gic.hh:200
Information provided to probes on a cache event.
virtual std::string name() const
Definition named.hh:60
ProbeListenerArgBase(std::string name)
Definition probe.hh:226
const std::string name
Definition probe.hh:114
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:246
SimObject(const Params &p)
Definition sim_object.cc:58
#define warn(...)
Definition logging.hh:288
Bitfield< 9 > e
Definition misc_types.hh:65
Bitfield< 33 > id
Bitfield< 10, 5 > event
Bitfield< 63 > val
Definition misc.hh:804
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
uint64_t RegVal
Definition types.hh:173
std::ostream CheckpointOut
Definition serialize.hh:66
std::string csprintf(const char *format, const Args &...args)
Definition cprintf.hh:161
Overload hash function for BasicBlockRange type.
Definition binary32.hh:81
State of a counter within the PMU.
Definition pmu.hh:432
bool resetValue
Flag keeping track if the counter has been reset.
Definition pmu.hh:512
void attach(const std::shared_ptr< PMUEvent > &event)
Attach this counter to an event.
Definition pmu.cc:565
PMEVTYPER_t filter
Filtering settings (evtCount is unused)
Definition pmu.hh:493
uint64_t value
Current value of the counter.
Definition pmu.hh:509
bool overflow64
Is this a 64-bit counter?
Definition pmu.hh:499
uint64_t counterId
id of the counter instance
Definition pmu.hh:506
void detach()
Detach the counter from its event.
Definition pmu.cc:552
EventTypeId eventId
Counter event ID.
Definition pmu.hh:490
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition pmu.cc:797
CounterState(PMU &pmuReference, uint64_t counter_id, const bool is_64_bit)
Definition pmu.hh:433
uint64_t getCounterId() const
Obtain the counter id.
Definition pmu.hh:470
uint64_t getValue() const
rReturn the counter value
Definition pmu.cc:576
std::shared_ptr< PMUEvent > sourceEvent
PmuEvent currently in use (if any)
Definition pmu.hh:503
bool enabled
Is the counter enabled?
Definition pmu.hh:496
uint64_t add(uint64_t delta)
Add an event count to the counter and check for overflow.
Definition pmu.cc:805
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition pmu.cc:789
void debugCounter(const char *mainString, Args &...args) const
Definition pmu.hh:517
void setValue(uint64_t val)
overwrite the value of the counter
Definition pmu.cc:588
void attachEvent(PMU::CounterState *user)
attach this event to a given counter
Definition pmu.cc:464
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:345
virtual void updateAttachedCounters()
Method called immediately before a counter access in order for the associated event to update its sta...
Definition pmu.hh:340
void detachEvent(PMU::CounterState *user)
detach this event from a given counter
Definition pmu.cc:482
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:474
void notify(const CacheAccessProbeArg &val) override
Definition pmu.hh:384
CacheProbe(RegularEvent *parent, std::string name)
Definition pmu.hh:378
void notify(const uint64_t &val) override
Definition pmu.cc:492
RegularProbe(RegularEvent *parent, std::string name)
Definition pmu.hh:364
std::set< EventTypeEntry > microArchitectureEventSet
The set of events driving the event value.
Definition pmu.hh:394
void enable() override
Enable the current event.
Definition pmu.cc:498
void disable() override
Disable the current event.
Definition pmu.cc:519
void addMicroarchitectureProbe(SimObject *object, std::string name)
Definition pmu.hh:352
std::vector< ProbeListenerPtr<> > attachedProbePointList
Set of probe listeners tapping onto each of the input micro-arch events which compose this pmu event.
Definition pmu.hh:399
std::pair< SimObject *, std::string > EventTypeEntry
Definition pmu.hh:350

Generated on Mon May 26 2025 09:18:58 for gem5 by doxygen 1.13.2