#include "dev/io_device.hh"
#include "cpu/base.hh"
#include "cpu/thread_context.hh"
+#include "sim/system.hh"
using namespace ArmISA;
}
-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");
}
}
+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)
{
}
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,
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());
+}
}
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)