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>
This commit is contained in:
Gabe Black
2019-10-09 22:07:27 -07:00
parent 74a66d8e67
commit fea2af5b9c
6 changed files with 17 additions and 9 deletions

View File

@@ -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());

View File

@@ -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());

View File

@@ -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++;

View File

@@ -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();

View File

@@ -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);

View File

@@ -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;