diff -r f61e079ad05e -r 029583947cbf src/arch/arm/table_walker.hh --- a/src/arch/arm/table_walker.hh Mon Nov 08 13:59:35 2010 -0600 +++ b/src/arch/arm/table_walker.hh Mon Nov 08 17:29:36 2010 -0600 @@ -351,6 +351,7 @@ } virtual unsigned int drain(Event *de); + virtual void resume(); virtual Port *getPort(const std::string &if_name, int idx = -1); Fault walk(RequestPtr req, ThreadContext *tc, uint8_t cid, TLB::Mode mode, diff -r f61e079ad05e -r 029583947cbf src/arch/arm/table_walker.cc --- a/src/arch/arm/table_walker.cc Mon Nov 08 13:59:35 2010 -0600 +++ b/src/arch/arm/table_walker.cc Mon Nov 08 17:29:36 2010 -0600 @@ -43,6 +43,7 @@ #include "dev/io_device.hh" #include "cpu/base.hh" #include "cpu/thread_context.hh" +#include "sim/system.hh" using namespace ArmISA; @@ -59,9 +60,10 @@ } -unsigned int TableWalker::drain(Event *de) +unsigned int +TableWalker::drain(Event *de) { - if (stateQueueL1.size() != 0 || stateQueueL2.size() != 0) + if (stateQueueL1.size() || stateQueueL2.size() || pendingQueue.size()) { changeState(Draining); DPRINTF(Checkpoint, "TableWalker busy, wait to drain\n"); @@ -75,6 +77,16 @@ } } +void +TableWalker::resume() +{ + MemObject::resume(); + if ((params()->sys->getMemoryMode() == Enums::timing) && currState) { + delete currState; + currState = NULL; + } +} + Port* TableWalker::getPort(const std::string &if_name, int idx) { diff -r f61e079ad05e -r 029583947cbf src/arch/arm/utility.hh --- a/src/arch/arm/utility.hh Mon Nov 08 13:59:35 2010 -0600 +++ b/src/arch/arm/utility.hh Mon Nov 08 17:29:36 2010 -0600 @@ -102,11 +102,7 @@ tc->activate(0); } - static inline void - copyRegs(ThreadContext *src, ThreadContext *dest) - { - panic("Copy Regs Not Implemented Yet\n"); - } + void copyRegs(ThreadContext *src, ThreadContext *dest); static inline void copyMiscRegs(ThreadContext *src, ThreadContext *dest) diff -r f61e079ad05e -r 029583947cbf src/arch/arm/utility.cc --- a/src/arch/arm/utility.cc Mon Nov 08 13:59:35 2010 -0600 +++ b/src/arch/arm/utility.cc Mon Nov 08 17:29:36 2010 -0600 @@ -133,5 +133,22 @@ tc->pcState(newPC); } +void +copyRegs(ThreadContext *src, ThreadContext *dest) +{ + int i; + for(i = 0; i < TheISA::NumIntRegs; i++) + dest->setIntReg(i, src->readIntReg(i)); + for(i = 0; i < TheISA::NumFloatRegs; i++) + dest->setFloatReg(i, src->readFloatReg(i)); + for(i = 0; i < TheISA::NumMiscRegs; i++) + dest->setMiscRegNoEffect(i, src->readMiscRegNoEffect(i)); + // setMiscReg "with effect" will set the misc register mapping correctly. + // e.g. updateRegMap(val) + dest->setMiscReg(MISCREG_CPSR, src->readMiscRegNoEffect(MISCREG_CPSR)); + + // Lastly copy PC/NPC + dest->pcState(src->pcState()); } +} diff -r f61e079ad05e -r 029583947cbf src/cpu/simple_thread.cc --- a/src/cpu/simple_thread.cc Mon Nov 08 13:59:35 2010 -0600 +++ b/src/cpu/simple_thread.cc Mon Nov 08 17:29:36 2010 -0600 @@ -155,6 +155,9 @@ storeCondFailures = 0; oldContext->setStatus(ThreadContext::Halted); + + itb = oldContext->getITBPtr(); + dtb = oldContext->getDTBPtr(); } void