diff options
Diffstat (limited to 'sim')
-rw-r--r-- | sim/faults.cc | 5 | ||||
-rw-r--r-- | sim/faults.hh | 13 | ||||
-rw-r--r-- | sim/serialize.cc | 12 | ||||
-rw-r--r-- | sim/serialize.hh | 5 | ||||
-rw-r--r-- | sim/sim_object.cc | 7 | ||||
-rw-r--r-- | sim/sim_object.hh | 9 |
6 files changed, 45 insertions, 6 deletions
diff --git a/sim/faults.cc b/sim/faults.cc index f7e9a0691..cb095f852 100644 --- a/sim/faults.cc +++ b/sim/faults.cc @@ -45,3 +45,8 @@ void FaultBase::invoke(ExecContext * xc) assert(!xc->misspeculating()); } #endif + +void UnimpFault::invoke(ExecContext * xc) +{ + panic("Unimpfault: %s\n", panicStr.c_str()); +} diff --git a/sim/faults.hh b/sim/faults.hh index 18601e8f1..9b3bc9103 100644 --- a/sim/faults.hh +++ b/sim/faults.hh @@ -64,4 +64,17 @@ class FaultBase : public RefCounted FaultBase * const NoFault = 0; +class UnimpFault : public FaultBase +{ + private: + std::string panicStr; + public: + UnimpFault(std::string _str) + : panicStr(_str) + { } + + FaultName name() {return "Unimplemented simulator feature";} + void invoke(ExecContext * xc); +}; + #endif // __FAULTS_HH__ diff --git a/sim/serialize.cc b/sim/serialize.cc index ec7241498..c4ef124bb 100644 --- a/sim/serialize.cc +++ b/sim/serialize.cc @@ -51,8 +51,9 @@ using namespace std; -int Serializable::maxCount = 0; -int Serializable::count = 0; +int Serializable::ckptMaxCount = 0; +int Serializable::ckptCount = 0; +int Serializable::ckptPrevCount = -1; void Serializable::nameOut(ostream &os) @@ -241,8 +242,11 @@ Serializable::serializeAll() globals.serialize(outstream); SimObject::serializeAll(outstream); - if (maxCount && ++count >= maxCount) + assert(Serializable::ckptPrevCount + 1 == Serializable::ckptCount); + Serializable::ckptPrevCount++; + if (ckptMaxCount && ++ckptCount >= ckptMaxCount) SimExit(curTick + 1, "Maximum number of checkpoints dropped"); + } @@ -352,7 +356,7 @@ SerializeParamContext::checkParams() if (serialize_cycle > 0) Checkpoint::setup(serialize_cycle, serialize_period); - Serializable::maxCount = serialize_count; + Serializable::ckptMaxCount = serialize_count; } void diff --git a/sim/serialize.hh b/sim/serialize.hh index bc82bf9b8..d8f5f8fc5 100644 --- a/sim/serialize.hh +++ b/sim/serialize.hh @@ -119,8 +119,9 @@ class Serializable static Serializable *create(Checkpoint *cp, const std::string §ion); - static int count; - static int maxCount; + static int ckptCount; + static int ckptMaxCount; + static int ckptPrevCount; static void serializeAll(); static void unserializeGlobals(Checkpoint *cp); }; diff --git a/sim/sim_object.cc b/sim/sim_object.cc index 151ba68a7..17d58ba4f 100644 --- a/sim/sim_object.cc +++ b/sim/sim_object.cc @@ -34,6 +34,7 @@ #include "base/misc.hh" #include "base/trace.hh" #include "base/stats/events.hh" +#include "base/serializer.hh" #include "sim/configfile.hh" #include "sim/host.hh" #include "sim/sim_object.hh" @@ -248,4 +249,10 @@ SimObject::recordEvent(const std::string &stat) Stats::recordEvent(stat); } +void +SimObject::drain(Serializer *serializer) +{ + serializer->signalDrained(); +} + DEFINE_SIM_OBJECT_CLASS_NAME("SimObject", SimObject) diff --git a/sim/sim_object.hh b/sim/sim_object.hh index 5db62dd51..76aba7ea1 100644 --- a/sim/sim_object.hh +++ b/sim/sim_object.hh @@ -41,6 +41,8 @@ #include "sim/serialize.hh" #include "sim/startup.hh" +class Serializer; + /* * Abstract superclass for simulation objects. Represents things that * correspond to physical components and can be specified via the @@ -96,6 +98,13 @@ class SimObject : public Serializable, protected StartupCallback // static: call nameOut() & serialize() on all SimObjects static void serializeAll(std::ostream &); + // Methods to drain objects in order to take checkpoints + // Or switch from timing -> atomic memory model + virtual void drain(Serializer *serializer); + virtual void resume() { return;} ; + virtual void serializationComplete() + { assert(0 && "Unimplemented"); }; + #ifdef DEBUG public: bool doDebugBreak; |