cpu: Pass the address to check into the PCEventQueue service method.
This prevents having to access it from within the ThreadContext.
Change-Id: I34f5815a11201b8fc41871c18bdbbcd0f40305cf
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22102
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
diff --git a/src/cpu/checker/cpu_impl.hh b/src/cpu/checker/cpu_impl.hh
index 86f022d..95ea3f7 100644
--- a/src/cpu/checker/cpu_impl.hh
+++ b/src/cpu/checker/cpu_impl.hh
@@ -412,7 +412,7 @@
int count = 0;
do {
oldpc = thread->instAddr();
- system->pcEventQueue.service(tc);
+ system->pcEventQueue.service(oldpc, tc);
count++;
} while (oldpc != thread->instAddr());
if (count > 1) {
diff --git a/src/cpu/minor/execute.cc b/src/cpu/minor/execute.cc
index dc79866..a9d51b7 100644
--- a/src/cpu/minor/execute.cc
+++ b/src/cpu/minor/execute.cc
@@ -841,7 +841,7 @@
Addr oldPC;
do {
oldPC = thread->instAddr();
- cpu.system->pcEventQueue.service(thread);
+ cpu.system->pcEventQueue.service(oldPC, thread);
num_pc_event_checks++;
} while (oldPC != thread->instAddr());
diff --git a/src/cpu/o3/commit_impl.hh b/src/cpu/o3/commit_impl.hh
index 2aa9d78..df43945 100644
--- a/src/cpu/o3/commit_impl.hh
+++ b/src/cpu/o3/commit_impl.hh
@@ -1112,7 +1112,8 @@
!thread[tid]->trapPending);
do {
oldpc = pc[tid].instAddr();
- cpu->system->pcEventQueue.service(thread[tid]->getTC());
+ cpu->system->pcEventQueue.service(
+ oldpc, thread[tid]->getTC());
count++;
} while (oldpc != pc[tid].instAddr());
if (count > 1) {
diff --git a/src/cpu/pc_event.cc b/src/cpu/pc_event.cc
index 90c8733..725c051 100644
--- a/src/cpu/pc_event.cc
+++ b/src/cpu/pc_event.cc
@@ -84,11 +84,10 @@
}
bool
-PCEventQueue::doService(ThreadContext *tc)
+PCEventQueue::doService(Addr pc, ThreadContext *tc)
{
- // This will fail to break on Alpha PALcode addresses, but that is
- // a rare use case.
- Addr pc = tc->instAddr();
+ // Using the raw PC address will fail to break on Alpha PALcode addresses,
+ // but that is a rare use case.
int serviced = 0;
range_t range = equal_range(pc);
for (iterator i = range.first; i != range.second; ++i) {
diff --git a/src/cpu/pc_event.hh b/src/cpu/pc_event.hh
index 0654ca5..d5fd4ea 100644
--- a/src/cpu/pc_event.hh
+++ b/src/cpu/pc_event.hh
@@ -105,7 +105,7 @@
protected:
Map pcMap;
- bool doService(ThreadContext *tc);
+ bool doService(Addr pc, ThreadContext *tc);
public:
PCEventQueue();
@@ -113,12 +113,12 @@
bool remove(PCEvent *event) override;
bool schedule(PCEvent *event) override;
- bool service(ThreadContext *tc)
+ bool service(Addr pc, ThreadContext *tc)
{
if (pcMap.empty())
return false;
- return doService(tc);
+ return doService(pc, tc);
}
range_t equal_range(Addr pc);
diff --git a/src/cpu/simple/base.cc b/src/cpu/simple/base.cc
index 461f00f..df3d981 100644
--- a/src/cpu/simple/base.cc
+++ b/src/cpu/simple/base.cc
@@ -144,7 +144,7 @@
Addr oldpc, pc = threadInfo[curThread]->thread->instAddr();
do {
oldpc = pc;
- system->pcEventQueue.service(threadContexts[curThread]);
+ system->pcEventQueue.service(oldpc, threadContexts[curThread]);
pc = threadInfo[curThread]->thread->instAddr();
} while (oldpc != pc);
}