Right now a single thread cpu 1 could get assigned context Id != 1, depending

on the order in which it's registered with the system.  To make them match,
here is a little change.
This commit is contained in:
Lisa Hsu 2008-11-05 15:30:49 -05:00
parent c68032ddcb
commit 07969dbbf1
3 changed files with 25 additions and 9 deletions

View file

@ -285,7 +285,17 @@ BaseCPU::registerThreadContexts()
for (int i = 0; i < threadContexts.size(); ++i) {
ThreadContext *tc = threadContexts[i];
tc->setContextId(system->registerThreadContext(tc));
/** This is so that contextId and cpuId match where there is a
* 1cpu:1context relationship. Otherwise, the order of registration
* could affect the assignment and cpu 1 could have context id 3, for
* example. We may even want to do something like this for SMT so that
* cpu 0 has the lowest thread contexts and cpu N has the highest, but
* I'll just do this for now
*/
if (number_of_threads == 1)
tc->setContextId(system->registerThreadContext(tc, _cpuId));
else
tc->setContextId(system->registerThreadContext(tc));
#if !FULL_SYSTEM
tc->getProcessPtr()->assignThreadContext(tc->contextId());
#endif

View file

@ -166,16 +166,22 @@ bool System::breakpoint()
}
int
System::registerThreadContext(ThreadContext *tc)
System::registerThreadContext(ThreadContext *tc, int assigned)
{
int id;
for (id = 0; id < threadContexts.size(); id++) {
if (!threadContexts[id])
break;
}
if (assigned == -1) {
for (id = 0; id < threadContexts.size(); id++) {
if (!threadContexts[id])
break;
}
if (threadContexts.size() <= id)
threadContexts.resize(id + 1);
if (threadContexts.size() <= id)
threadContexts.resize(id + 1);
} else {
if (threadContexts.size() <= assigned)
threadContexts.resize(assigned + 1);
id = assigned;
}
if (threadContexts[id])
panic("Cannot have two CPUs with the same id (%d)\n", id);

View file

@ -224,7 +224,7 @@ class System : public SimObject
#endif // FULL_SYSTEM
int registerThreadContext(ThreadContext *tc);
int registerThreadContext(ThreadContext *tc, int assigned=-1);
void replaceThreadContext(ThreadContext *tc, int context_id);
void serialize(std::ostream &os);