sim-se: Add prlimit system call
[gem5.git] / src / sim / sim_object.hh
index c1238e23fd74528df4f34ef08c43f809f563c8c3..42a19bbe7cc8ddfafca16a960a6ee96dac01c008 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2015 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2001-2005 The Regents of The University of Michigan
  * Copyright (c) 2010 Advanced Micro Devices, Inc.
  * All rights reserved.
 #ifndef __SIM_OBJECT_HH__
 #define __SIM_OBJECT_HH__
 
-#include <iostream>
-#include <list>
-#include <map>
 #include <string>
 #include <vector>
 
-#include "enums/MemoryMode.hh"
 #include "params/SimObject.hh"
+#include "sim/drain.hh"
 #include "sim/eventq.hh"
+#include "sim/eventq_impl.hh"
 #include "sim/serialize.hh"
 
-class BaseCPU;
-class Event;
+class EventManager;
+class ProbeManager;
 
 /**
  * Abstract superclass for simulation objects.  Represents things that
@@ -72,40 +82,7 @@ class Event;
  *     </ul>
  * <li>SimObject::resetStats()
  * <li>SimObject::startup()
- * <li>SimObject::resume() if resuming from a checkpoint.
- * </ol>
- *
- * An object's internal state needs to be drained when creating a
- * checkpoint, switching between CPU models, or switching between
- * timing models. Once the internal state has been drained from
- * <i>all</i> objects in the system, the objects are serialized to
- * disc or the configuration change takes place. The process works as
- * follows (see simulate.py for details):
- *
- * <ol>
- * <li>An instance of a CountedDrainEvent is created to keep track of
- *     how many objects need to be drained. The object maintains an
- *     internal counter that is decreased every time its
- *     CountedDrainEvent::process() method is called. When the counter
- *     reaches zero, the simulation is stopped.
- *
- * <li>Call SimObject::drain() for every object in the
- *     system. Draining has completed if all of them return
- *     zero. Otherwise, the sum of the return values is loaded into
- *     the counter of the CountedDrainEvent. A pointer of the drain
- *     event is passed as an argument to the drain() method.
- *
- * <li>Continue simulation. When an object has finished draining its
- *     internal state, it calls CountedDrainEvent::process() on the
- *     CountedDrainEvent. When counter in the CountedDrainEvent reaches
- *     zero, the simulation stops.
- *
- * <li>Check if any object still needs draining, if so repeat the
- *     process above.
- *
- * <li>Serialize objects, switch CPU model, or change timing model.
- *
- * <li>Call SimObject::resume() and continue the simulation.
+ * <li>Drainable::drainResume() if resuming from a checkpoint.
  * </ol>
  *
  * @note Whenever a method is called on all objects in the simulator's
@@ -114,48 +91,17 @@ class Event;
  * SimObject.py). This has the effect of calling the method on the
  * parent node <i>before</i> its children.
  */
-class SimObject : public EventManager, public Serializable
+class SimObject : public EventManager, public Serializable, public Drainable
 {
-  public:
-    /**
-     * Object drain/handover states
-     *
-     * An object starts out in the Running state. When the simulator
-     * prepares to take a snapshot or prepares a CPU for handover, it
-     * calls the drain() method to transfer the object into the
-     * Draining or Drained state. If any object enters the Draining
-     * state (drain() returning >0), simulation continues until it all
-     * objects have entered the Drained.
-     *
-     * The before resuming simulation, the simulator calls resume() to
-     * transfer the object to the Running state.
-     *
-     * \note Even though the state of an object (visible to the rest
-     * of the world through getState()) could be used to determine if
-     * all objects have entered the Drained state, the protocol is
-     * actually a bit more elaborate. See drain() for details.
-     */
-    enum State {
-        Running,  /** Running normally */
-        Draining, /** Draining buffers pending serialization/handover */
-        Drained   /** Buffers drained, ready for serialization/handover */
-    };
-
-  private:
-    State state;
-
-  protected:
-    void changeState(State new_state) { state = new_state; }
-
-  public:
-    State getState() { return state; }
-
   private:
     typedef std::vector<SimObject *> SimObjectList;
 
     /** List of all instantiated simulation objects. */
     static SimObjectList simObjectList;
 
+    /** Manager coordinates hooking up probe points with listeners. */
+    ProbeManager *probeManager;
+
   protected:
     /** Cached copy of the object parameters. */
     const SimObjectParams *_params;
@@ -164,7 +110,7 @@ class SimObject : public EventManager, public Serializable
     typedef SimObjectParams Params;
     const Params *params() const { return _params; }
     SimObject(const Params *_params);
-    virtual ~SimObject() {}
+    virtual ~SimObject();
 
   public:
 
@@ -189,7 +135,7 @@ class SimObject : public EventManager, public Serializable
      *
      * @param cp Checkpoint to restore the state from.
      */
-    virtual void loadState(Checkpoint *cp);
+    virtual void loadState(CheckpointIn &cp);
 
     /**
      * initState() is called on each SimObject when *not* restoring
@@ -208,6 +154,21 @@ class SimObject : public EventManager, public Serializable
      */
     virtual void resetStats();
 
+    /**
+     * Register probe points for this object.
+     */
+    virtual void regProbePoints();
+
+    /**
+     * Register probe listeners for this object.
+     */
+    virtual void regProbeListeners();
+
+    /**
+     * Get the probe manager for this object.
+     */
+    ProbeManager *getProbeManager();
+
     /**
      * startup() is the final initialization call before simulation.
      * All state is initialized (including unserialized state, if any,
@@ -217,43 +178,41 @@ class SimObject : public EventManager, public Serializable
     virtual void startup();
 
     /**
-     * Serialize all SimObjects in the system.
+     * Provide a default implementation of the drain interface for
+     * objects that don't need draining.
      */
-    static void serializeAll(std::ostream &os);
+    DrainState drain() override { return DrainState::Drained; }
 
     /**
-     * Determine if an object needs draining and register a drain
-     * event.
-     *
-     * When draining the state of an object, the simulator calls drain
-     * with a pointer to a drain event. If the object does not need
-     * further simulation to drain internal buffers, it switched to
-     * the Drained state and returns 0, otherwise it switches to the
-     * Draining state and returns the number of times that it will
-     * call Event::process() on the drain event. Most objects are
-     * expected to return either 0 or 1.
-     *
-     * The default implementation simply switches to the Drained state
-     * and returns 0.
+     * Write back dirty buffers to memory using functional writes.
      *
-     * @note An object that has entered the Drained state can be
-     * disturbed by other objects in the system and consequently be
-     * forced to enter the Draining state again. The simulator
-     * therefore repeats the draining process until all objects return
-     * 0 on the first call to drain().
+     * After returning, an object implementing this method should have
+     * written all its dirty data back to memory. This method is
+     * typically used to prepare a system with caches for
+     * checkpointing.
+     */
+    virtual void memWriteback() {};
+
+    /**
+     * Invalidate the contents of memory buffers.
      *
-     * @param drain_event Event to use to inform the simulator when
-     * the draining has completed.
+     * When the switching to hardware virtualized CPU models, we need
+     * to make sure that we don't have any cached state in the system
+     * that might become stale when we return. This method is used to
+     * flush all such state back to main memory.
      *
-     * @return 0 if the object is ready for serialization now, >0 if
-     * it needs further simulation.
+     * @warn This does <i>not</i> cause any dirty state to be written
+     * back to memory.
      */
-    virtual unsigned int drain(Event *drain_event);
+    virtual void memInvalidate() {};
+
+    void serialize(CheckpointOut &cp) const override {};
+    void unserialize(CheckpointIn &cp) override {};
 
     /**
-     * Switch an object in the Drained stated into the Running state.
+     * Serialize all SimObjects in the system.
      */
-    virtual void resume();
+    static void serializeAll(CheckpointOut &cp);
 
 #ifdef DEBUG
   public:
@@ -269,4 +228,23 @@ class SimObject : public EventManager, public Serializable
     static SimObject *find(const char *name);
 };
 
+/**
+ * Base class to wrap object resolving functionality.
+ *
+ * This can be provided to the serialization framework to allow it to
+ * map object names onto C++ objects.
+ */
+class SimObjectResolver
+{
+  public:
+    virtual ~SimObjectResolver() { }
+
+    // Find a SimObject given a full path name
+    virtual SimObject *resolveSimObject(const std::string &name) = 0;
+};
+
+#ifdef DEBUG
+void debugObjectBreak(const char *objs);
+#endif
+
 #endif // __SIM_OBJECT_HH__