First steps toward getting full system to work with
[gem5.git] / sim / system.hh
index e5d990e8618b7c795368eedd23c34f1bde8503d9..7e21bd5872d6b108f9e0299e737cad369e514031 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2002-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 #include <string>
 #include <vector>
 
-#include "sim/sim_object.hh"
-#include "cpu/pc_event.hh"
 #include "base/loader/symtab.hh"
-
-#ifdef FS_MEASURE
+#include "base/misc.hh"
 #include "base/statistics.hh"
-#include "sim/sw_context.hh"
+#include "cpu/pc_event.hh"
+#include "mem/port.hh"
+#include "sim/sim_object.hh"
+#if FULL_SYSTEM
+#include "kern/system_events.hh"
+#include "mem/vport.hh"
 #endif
 
-class MemoryController;
+class BaseCPU;
+class ExecContext;
+class ObjectFile;
 class PhysicalMemory;
+
+#if FULL_SYSTEM
 class Platform;
-class RemoteGDB;
 class GDBListener;
-
-class ExecContext;
+class RemoteGDB;
+namespace Kernel { class Binning; }
+#endif
 
 class System : public SimObject
 {
-#ifdef FS_MEASURE
-  protected:
-    std::map<const std::string, Statistics::MainBin *> fnBins;
-    std::map<const Addr, SWContext *> swCtxMap;
-#endif //FS_MEASURE
-
   public:
-    const uint64_t init_param;
-    MemoryController *memCtrl;
     PhysicalMemory *physmem;
-    Platform *platform;
-    bool bin;
-
     PCEventQueue pcEventQueue;
 
     std::vector<ExecContext *> execContexts;
+    int numcpus;
 
-    virtual int registerExecContext(ExecContext *xc);
-    virtual void replaceExecContext(int xcIndex, ExecContext *xc);
+    int getNumCPUs()
+    {
+        if (numcpus != execContexts.size())
+            panic("cpu array not fully populated!");
 
-#ifdef FS_MEASURE
-    Statistics::Scalar<Counter, Statistics::MainBin> fnCalls;
-    Statistics::MainBin *nonPath;
-#endif //FS_MEASURE
+        return numcpus;
+    }
 
-  public:
-    System(const std::string _name, const uint64_t _init_param,
-           MemoryController *, PhysicalMemory *, const bool);
-    ~System();
+#if FULL_SYSTEM
+    Platform *platform;
+    uint64_t init_param;
 
-    virtual Addr getKernelStart() const = 0;
-    virtual Addr getKernelEnd() const = 0;
-    virtual Addr getKernelEntry() const = 0;
-    virtual bool breakpoint() = 0;
+    /** Port to physical memory used for writing object files into ram at
+     * boot.*/
+    FunctionalPort functionalPort;
+    VirtualPort virtPort;
+
+    /** kernel symbol table */
+    SymbolTable *kernelSymtab;
+
+    /** Object pointer for the kernel code */
+    ObjectFile *kernel;
+
+    /** Begining of kernel code */
+    Addr kernelStart;
+
+    /** End of kernel code */
+    Addr kernelEnd;
+
+    /** Entry point in the kernel to start at */
+    Addr kernelEntry;
+
+    Kernel::Binning *kernelBinning;
+
+#else
+
+    int page_ptr;
 
-#ifdef FS_MEASURE
-    Statistics::MainBin * getBin(const std::string &name);
-    virtual bool findCaller(std::string, std::string) const = 0;
 
-    SWContext *findContext(Addr pcb);
-    bool addContext(Addr pcb, SWContext *ctx) {
-        return (swCtxMap.insert(make_pair(pcb, ctx))).second;
+#endif // FULL_SYSTEM
+
+  protected:
+
+#if FULL_SYSTEM
+    /**
+     * Fix up an address used to match PCs for hooking simulator
+     * events on to target function executions.  See comment in
+     * system.cc for details.
+     */
+    virtual Addr fixFuncEventAddr(Addr addr) = 0;
+
+    /**
+     * Add a function-based event to the given function, to be looked
+     * up in the specified symbol table.
+     */
+    template <class T>
+    T *System::addFuncEvent(SymbolTable *symtab, const char *lbl)
+    {
+        Addr addr = 0; // initialize only to avoid compiler warning
+
+        if (symtab->findAddress(lbl, addr)) {
+            T *ev = new T(&pcEventQueue, lbl, fixFuncEventAddr(addr));
+            return ev;
+        }
+
+        return NULL;
     }
-    void remContext(Addr pcb) {
-        swCtxMap.erase(pcb);
-        return;
+
+    /** Add a function-based event to kernel code. */
+    template <class T>
+    T *System::addKernelFuncEvent(const char *lbl)
+    {
+        return addFuncEvent<T>(kernelSymtab, lbl);
     }
 
-    virtual void dumpState(ExecContext *xc) const = 0;
-#endif //FS_MEASURE
+#endif
+  public:
+#if FULL_SYSTEM
+    std::vector<RemoteGDB *> remoteGDB;
+    std::vector<GDBListener *> gdbListen;
+    virtual bool breakpoint() = 0;
+#endif // FULL_SYSTEM
+
+  public:
+    struct Params
+    {
+        std::string name;
+        PhysicalMemory *physmem;
+
+#if FULL_SYSTEM
+        Tick boot_cpu_frequency;
+        std::string boot_osflags;
+        uint64_t init_param;
+        bool bin;
+        std::vector<std::string> binned_fns;
+        bool bin_int;
+
+        std::string kernel_path;
+        std::string readfile;
+#endif
+    };
+
+  protected:
+    Params *_params;
+
+  public:
+    System(Params *p);
+    ~System();
+
+    void startup();
+
+    const Params *params() const { return (const Params *)_params; }
+
+  public:
+
+#if FULL_SYSTEM
+    /**
+     * Returns the addess the kernel starts at.
+     * @return address the kernel starts at
+     */
+    Addr getKernelStart() const { return kernelStart; }
+
+    /**
+     * Returns the addess the kernel ends at.
+     * @return address the kernel ends at
+     */
+    Addr getKernelEnd() const { return kernelEnd; }
+
+    /**
+     * Returns the addess the entry point to the kernel code.
+     * @return entry point of the kernel code
+     */
+    Addr getKernelEntry() const { return kernelEntry; }
+
+#else
+
+    Addr new_page();
+
+#endif // FULL_SYSTEM
+
+    int registerExecContext(ExecContext *xc, int xcIndex);
+    void replaceExecContext(ExecContext *xc, int xcIndex);
+
+    void regStats();
+    void serialize(std::ostream &os);
+    void unserialize(Checkpoint *cp, const std::string &section);
 
   public:
     ////////////////////////////////////////////
@@ -113,6 +222,8 @@ class System : public SimObject
     static int numSystemsRunning;
 
     static void printSystems();
+
+
 };
 
 #endif // __SYSTEM_HH__