summaryrefslogtreecommitdiff
path: root/src/arch/arm/pmu.cc
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2017-03-23 18:54:56 +0000
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2018-09-10 09:57:26 +0000
commit4c9ba9cd2925c83889c6388b4f5a15820bd9986b (patch)
treede724ce1f3835b0764270be30834ee553b175271 /src/arch/arm/pmu.cc
parentfbaf489e62feb5aef34a00530dbf4e39de9d67d4 (diff)
downloadgem5-4c9ba9cd2925c83889c6388b4f5a15820bd9986b.tar.xz
arm: Use the interrupt adaptor in the PMU
Rewrite interrupt handling in the PMU model to use the new interrupt adaptor. Change-Id: I2cbb99580c46d3e21a1335b897843b7b6e41f10c Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-on: https://gem5-review.googlesource.com/12400 Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Diffstat (limited to 'src/arch/arm/pmu.cc')
-rw-r--r--src/arch/arm/pmu.cc30
1 files changed, 19 insertions, 11 deletions
diff --git a/src/arch/arm/pmu.cc b/src/arch/arm/pmu.cc
index 0bdae4936..13b23c745 100644
--- a/src/arch/arm/pmu.cc
+++ b/src/arch/arm/pmu.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014, 2017 ARM Limited
+ * Copyright (c) 2011-2014, 2017-2018 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -50,7 +50,6 @@
#include "debug/PMUVerbose.hh"
#include "dev/arm/base_gic.hh"
#include "dev/arm/generic_timer.hh"
-#include "dev/arm/realview.hh"
#include "params/ArmPMU.hh"
namespace ArmISA {
@@ -68,8 +67,7 @@ PMU::PMU(const ArmPMUParams *p)
cycleCounterEventId(p->cycleEventId),
swIncrementEvent(nullptr),
reg_pmcr_conf(0),
- pmuInterrupt(p->pmuInterrupt),
- platform(p->platform)
+ interrupt(p->interrupt)
{
DPRINTF(PMUVerbose, "Initializing the PMU.\n");
@@ -78,6 +76,9 @@ PMU::PMU(const ArmPMUParams *p)
maximumCounterCount);
}
+ warn_if(!interrupt, "ARM PMU: No interrupt specified, interrupt " \
+ "delivery disabled.\n");
+
/* Setup the performance counter ID registers */
reg_pmcr_conf.imp = 0x41; // ARM Ltd.
reg_pmcr_conf.idcode = 0x00;
@@ -93,6 +94,14 @@ PMU::~PMU()
}
void
+PMU::setThreadContext(ThreadContext *tc)
+{
+ DPRINTF(PMUVerbose, "Assigning PMU to ContextID %i.\n", tc->contextId());
+ if (interrupt)
+ interrupt->setThreadContext(tc);
+}
+
+void
PMU::addSoftwareIncrementEvent(unsigned int id)
{
auto old_event = eventMap.find(id);
@@ -638,14 +647,13 @@ PMU::setCounterTypeRegister(CounterId id, PMEVTYPER_t val)
void
PMU::raiseInterrupt()
{
- RealView *rv(dynamic_cast<RealView *>(platform));
- if (!rv || !rv->gic) {
- warn_once("ARM PMU: GIC missing, can't raise interrupt.\n");
- return;
+ if (interrupt) {
+ DPRINTF(PMUVerbose, "Delivering PMU interrupt.\n");
+ interrupt->raise();
+ } else {
+ warn_once("Dropping PMU interrupt as no interrupt has "
+ "been specified\n");
}
-
- DPRINTF(PMUVerbose, "Delivering PMU interrupt.\n");
- rv->gic->sendInt(pmuInterrupt);
}
void