int count = 0;
do {
oldpc = thread->instAddr();
- system->pcEventQueue.service(oldpc, tc);
thread->pcEventQueue.service(oldpc, tc);
count++;
} while (oldpc != thread->instAddr());
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());
!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++;
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();
"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();
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
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);
{ panic("SystemPort does not expect retry!\n"); }
};
+ std::list<PCEvent *> liveEvents;
SystemPort _systemPort;
public:
*/
unsigned int cacheLineSize() const { return _cacheLineSize; }
- PCEventQueue pcEventQueue;
-
std::vector<ThreadContext *> threadContexts;
const bool multiThread;