summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/checker/cpu_impl.hh1
-rw-r--r--src/cpu/minor/execute.cc1
-rw-r--r--src/cpu/o3/commit_impl.hh2
-rw-r--r--src/cpu/simple/base.cc1
-rw-r--r--src/sim/system.cc18
-rw-r--r--src/sim/system.hh3
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;