Offhand it seems like takeOverFrom() should work... what other errors do you get when you use it?
On 11/12/07, Nicolas Zea <[EMAIL PROTECTED]> wrote: > 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 > _______________________________________________ m5-users mailing list m5-users@m5sim.org http://m5sim.org/cgi-bin/mailman/listinfo/m5-users