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 81bf4c100..9e4bdcd52 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 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::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 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; -- 2.30.2