I'm trying to implement a version of context switching that involves
storing the context of a cpu from one point in time in a hardware
storage, then at a later point in time reloading that context,
possibly on a different cpu. Previously I had done something similar,
where the benchmark on core 1 was restarted on core 2. My method for
this was backing up the AlphaLiveProcess ptr until I want to resume
that process. At that point I'd start a drain event, clear the
registers, attach the process to the cpu and replace the process'
thread context with that from the cpu, call startup on the process,
then resume the cpu.
The following code did this (after the drain completed):
// reset the registers in cpu (to 0)
for(int i=0; i<thecpu->regFile.numPhysicalIntRegs; i++){
thecpu->regFile.intRegFile[i] = 0;
}
for(int i=0; i<thecpu->regFile.numPhysicalFloatRegs; i++){
thecpu->regFile.floatRegFile[i].d = 0;
}
for(int i=0; i<AlphaSimpleImpl::MaxThreads; i++){
thecpu->regFile.miscRegs[i].clear();
}
if(pkt->servo_proc->pTable != NULL){
// reset the page table
delete myproc->pTable;
myproc->pTable = new PageTable(myproc->system);
}
// make sure to reset the translating port
if(((AlphaTC<AlphaSimpleImpl> *)(thecpu->threadContexts[0]))->thread-
>port != NULL){
// reset the translating port so it uses the new page
table
delete ((AlphaTC<AlphaSimpleImpl> *)(thecpu->threadContexts[0]))-
>thread->port;
((AlphaTC<AlphaSimpleImpl> *)(thecpu->threadContexts[0]))->thread-
>port = NULL;
}
((AlphaTC<AlphaSimpleImpl> *)(thecpu->threadContexts[0]))->thread-
>process = pkt->servo_proc; // attach the process
thecpu->registerThreadContexts(); // register the process
myproc->replaceThreadContext(thecpu->threadContexts[0], 0); //
attach the thread to the process
myproc->startup(); // perform the initial write of program data into
memory, and reset the cpu state (PC, NPC, SP, etc.)
What I'd like do now is resume from the exact point the process was
executing before. I've backed up the register values, as well as PC
and NPC in an data container. I assumed that I could simply use the
same steps, except instead of using myproc->startup() to set the PC,
I'd set it manually (thecpu->setPC()). Additionally, I wouldn't reset
the page table, as it would be reused.
This doesn't appear to work though, as the PC does not appear to get
reloaded from commit.PC (which is what I gather setPC modifies),
unless I call fetch.takeOverFrom(), at which point other errors in the
different pipeline stages arise. Does anyone have some advice on the
steps required to do this kind of contextual switch?
For information, I'm running this on m5 2.0b2 in ALPHA_SE mode, and
all the processes are independent single-threaded applications.
-Nick
_______________________________________________
m5-users mailing list
m5-users@m5sim.org
http://m5sim.org/cgi-bin/mailman/listinfo/m5-users