changeset 7bf78d12b359 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=7bf78d12b359
description:
ARM: Add support for switching CPUs
diffstat:
src/arch/arm/table_walker.cc | 16 ++++++++++++++--
src/arch/arm/table_walker.hh | 1 +
src/arch/arm/utility.cc | 17 +++++++++++++++++
src/arch/arm/utility.hh | 6 +-----
4 files changed, 33 insertions(+), 7 deletions(-)
diffs (94 lines):
diff -r 2b65eb281f5f -r 7bf78d12b359 src/arch/arm/table_walker.cc
--- a/src/arch/arm/table_walker.cc Mon Nov 15 14:04:03 2010 -0600
+++ b/src/arch/arm/table_walker.cc Mon Nov 15 14:04:03 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 2b65eb281f5f -r 7bf78d12b359 src/arch/arm/table_walker.hh
--- a/src/arch/arm/table_walker.hh Mon Nov 15 14:04:03 2010 -0600
+++ b/src/arch/arm/table_walker.hh Mon Nov 15 14:04:03 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 2b65eb281f5f -r 7bf78d12b359 src/arch/arm/utility.cc
--- a/src/arch/arm/utility.cc Mon Nov 15 14:04:03 2010 -0600
+++ b/src/arch/arm/utility.cc Mon Nov 15 14:04:03 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 2b65eb281f5f -r 7bf78d12b359 src/arch/arm/utility.hh
--- a/src/arch/arm/utility.hh Mon Nov 15 14:04:03 2010 -0600
+++ b/src/arch/arm/utility.hh Mon Nov 15 14:04:03 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)
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev