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:
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user