ARM: Add support for switching CPUs

This commit is contained in:
Ali Saidi
2010-11-15 14:04:03 -06:00
parent 08c5673d56
commit 4c2e5c282b
4 changed files with 33 additions and 7 deletions

View File

@@ -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 @@ TableWalker::~TableWalker()
}
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 @@ unsigned int TableWalker::drain(Event *de)
}
}
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)
{

View File

@@ -351,6 +351,7 @@ class TableWalker : public MemObject
}
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,

View File

@@ -133,5 +133,22 @@ skipFunction(ThreadContext *tc)
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());
}
}

View File

@@ -102,11 +102,7 @@ namespace ArmISA {
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)