diff options
author | Gabe Black <gabeblack@google.com> | 2019-10-09 22:07:27 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-10-25 22:42:31 +0000 |
commit | fea2af5b9c4599637866d0ce2dfc598296c19a5b (patch) | |
tree | 43a7620bfb5faffee2d72e03abcc24044348e718 /src | |
parent | 74a66d8e6706ccaed79facc6df3999f7dee2075a (diff) | |
download | gem5-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.hh | 1 | ||||
-rw-r--r-- | src/cpu/minor/execute.cc | 1 | ||||
-rw-r--r-- | src/cpu/o3/commit_impl.hh | 2 | ||||
-rw-r--r-- | src/cpu/simple/base.cc | 1 | ||||
-rw-r--r-- | src/sim/system.cc | 18 | ||||
-rw-r--r-- | src/sim/system.hh | 3 |
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; |