From fea2af5b9c4599637866d0ce2dfc598296c19a5b Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Wed, 9 Oct 2019 22:07:27 -0700 Subject: [PATCH] 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 Maintainer: Gabe Black Tested-by: kokoro --- src/cpu/checker/cpu_impl.hh | 1 - src/cpu/minor/execute.cc | 1 - src/cpu/o3/commit_impl.hh | 2 -- src/cpu/simple/base.cc | 1 - src/sim/system.cc | 18 ++++++++++++++++-- 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 81bf4c100b..9e4bdcd529 100644 --- a/src/cpu/checker/cpu_impl.hh +++ b/src/cpu/checker/cpu_impl.hh @@ -412,7 +412,6 @@ Checker::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 5bf3120c2a..24506fcebe 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 23f10fe2ab..fa2d72494c 100644 --- a/src/cpu/o3/commit_impl.hh +++ b/src/cpu/o3/commit_impl.hh @@ -1112,8 +1112,6 @@ DefaultCommit::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 8cecf70e4f..248494b407 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 e993a738f6..f2bbd8cbc6 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 8c06603764..d205ffb7ac 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 liveEvents; SystemPort _systemPort; public: @@ -186,8 +187,6 @@ class System : public SimObject, public PCEventScope */ unsigned int cacheLineSize() const { return _cacheLineSize; } - PCEventQueue pcEventQueue; - std::vector threadContexts; const bool multiThread;