summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2019-10-09 22:07:27 -0700
committerGabe Black <gabeblack@google.com>2019-10-25 22:42:31 +0000
commitfea2af5b9c4599637866d0ce2dfc598296c19a5b (patch)
tree43a7620bfb5faffee2d72e03abcc24044348e718 /src
parent74a66d8e6706ccaed79facc6df3999f7dee2075a (diff)
downloadgem5-fea2af5b9c4599637866d0ce2dfc598296c19a5b.tar.xz
cpu,sim: Delegate PCEvent scheduling from Systems to ThreadContexts.
The System keeps track of what events are live so new ThreadContexts can have the same set of events as the other ThreadContexts. Change-Id: Id22bfa0af7592a43d97be1564ca067b08ac1de7c Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22106 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Gabe Black <gabeblack@google.com> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'src')
-rw-r--r--src/cpu/checker/cpu_impl.hh1
-rw-r--r--src/cpu/minor/execute.cc1
-rw-r--r--src/cpu/o3/commit_impl.hh2
-rw-r--r--src/cpu/simple/base.cc1
-rw-r--r--src/sim/system.cc18
-rw-r--r--src/sim/system.hh3
6 files changed, 17 insertions, 9 deletions
diff --git a/src/cpu/checker/cpu_impl.hh b/src/cpu/checker/cpu_impl.hh
index 81bf4c100..9e4bdcd52 100644
--- a/src/cpu/checker/cpu_impl.hh
+++ b/src/cpu/checker/cpu_impl.hh
@@ -412,7 +412,6 @@ Checker<Impl>::verify(const DynInstPtr &completed_inst)
int count = 0;
do {
oldpc = thread->instAddr();
- system->pcEventQueue.service(oldpc, tc);
thread->pcEventQueue.service(oldpc, tc);
count++;
} while (oldpc != thread->instAddr());
diff --git a/src/cpu/minor/execute.cc b/src/cpu/minor/execute.cc
index 5bf3120c2..24506fceb 100644
--- a/src/cpu/minor/execute.cc
+++ b/src/cpu/minor/execute.cc
@@ -841,7 +841,6 @@ Execute::tryPCEvents(ThreadID thread_id)
Addr oldPC;
do {
oldPC = thread->instAddr();
- cpu.system->pcEventQueue.service(oldPC, thread);
cpu.threads[thread_id]->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 23f10fe2a..fa2d72494 100644
--- a/src/cpu/o3/commit_impl.hh
+++ b/src/cpu/o3/commit_impl.hh
@@ -1112,8 +1112,6 @@ DefaultCommit<Impl>::commitInsts()
!thread[tid]->trapPending);
do {
oldpc = pc[tid].instAddr();
- cpu->system->pcEventQueue.service(
- oldpc, thread[tid]->getTC());
thread[tid]->pcEventQueue.service(
oldpc, thread[tid]->getTC());
count++;
diff --git a/src/cpu/simple/base.cc b/src/cpu/simple/base.cc
index 8cecf70e4..248494b40 100644
--- a/src/cpu/simple/base.cc
+++ b/src/cpu/simple/base.cc
@@ -144,7 +144,6 @@ BaseSimpleCPU::checkPcEventQueue()
Addr oldpc, pc = threadInfo[curThread]->thread->instAddr();
do {
oldpc = pc;
- system->pcEventQueue.service(oldpc, threadContexts[curThread]);
threadInfo[curThread]->thread->pcEventQueue.service(
oldpc, threadContexts[curThread]);
pc = threadInfo[curThread]->thread->instAddr();
diff --git a/src/sim/system.cc b/src/sim/system.cc
index e993a738f..f2bbd8cbc 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -265,6 +265,8 @@ System::registerThreadContext(ThreadContext *tc, ContextID assigned)
"Cannot have two CPUs with the same id (%d)\n", id);
threadContexts[id] = tc;
+ for (auto *e: liveEvents)
+ tc->schedule(e);
#if THE_ISA != NULL_ISA
int port = getRemoteGDBPort();
@@ -295,13 +297,21 @@ System::registerThreadContext(ThreadContext *tc, ContextID assigned)
bool
System::schedule(PCEvent *event)
{
- return pcEventQueue.schedule(event);
+ bool all = true;
+ liveEvents.push_back(event);
+ for (auto *tc: threadContexts)
+ all = tc->schedule(event) && all;
+ return all;
}
bool
System::remove(PCEvent *event)
{
- return pcEventQueue.remove(event);
+ bool all = true;
+ liveEvents.remove(event);
+ for (auto *tc: threadContexts)
+ all = tc->remove(event) && all;
+ return all;
}
int
@@ -363,6 +373,10 @@ System::replaceThreadContext(ThreadContext *tc, ContextID context_id)
context_id, threadContexts.size());
}
+ for (auto *e: liveEvents) {
+ threadContexts[context_id]->remove(e);
+ tc->schedule(e);
+ }
threadContexts[context_id] = tc;
if (context_id < remoteGDB.size())
remoteGDB[context_id]->replaceThreadContext(tc);
diff --git a/src/sim/system.hh b/src/sim/system.hh
index 8c0660376..d205ffb7a 100644
--- a/src/sim/system.hh
+++ b/src/sim/system.hh
@@ -99,6 +99,7 @@ class System : public SimObject, public PCEventScope
{ panic("SystemPort does not expect retry!\n"); }
};
+ std::list<PCEvent *> liveEvents;
SystemPort _systemPort;
public:
@@ -186,8 +187,6 @@ class System : public SimObject, public PCEventScope
*/
unsigned int cacheLineSize() const { return _cacheLineSize; }
- PCEventQueue pcEventQueue;
-
std::vector<ThreadContext *> threadContexts;
const bool multiThread;