Load the hypervisor symbols twice, once with an address mask so that we can get symbo...
authorAli Saidi <saidi@eecs.umich.edu>
Thu, 30 Nov 2006 20:51:54 +0000 (15:51 -0500)
committerAli Saidi <saidi@eecs.umich.edu>
Thu, 30 Nov 2006 20:51:54 +0000 (15:51 -0500)
Add the ability to use an address mask for symbol loading
Rather then silently failing on platform accesses panic
Move BadAddr/IsaFake no Device from Tsunami
Let the system kernel be none, but warn about it

configs/common/FSConfig.py:
    We don't have a kernel for sparc yet
src/arch/sparc/system.cc:
    Load the hypervisor symbols twice, once with an address mask so that we can get symbols for where it's copied to in memory
src/base/loader/aout_object.cc:
src/base/loader/aout_object.hh:
src/base/loader/ecoff_object.cc:
src/base/loader/ecoff_object.hh:
src/base/loader/elf_object.cc:
src/base/loader/elf_object.hh:
src/base/loader/object_file.hh:
src/base/loader/raw_object.cc:
src/base/loader/raw_object.hh:
    Add the ability to use an address mask for symbol loading
src/dev/sparc/t1000.cc:
    Rather then silently failing on platform accesses panic
src/dev/sparc/t1000.hh:
    fix up a couple of platform comments
src/python/m5/objects/Bus.py:
src/python/m5/objects/Device.py:
src/python/m5/objects/T1000.py:
src/python/m5/objects/Tsunami.py:
    Move BadAddr/IsaFake no Device from Tsunami
src/python/m5/objects/System.py:
    Let kernel be none
src/sim/system.cc:
    Let the system kernel be none, but warn about it

--HG--
extra : convert_revision : 92f6afef599a3d3c7c5026d03434102c41c7b5f4

19 files changed:
configs/common/FSConfig.py
src/arch/sparc/system.cc
src/base/loader/aout_object.cc
src/base/loader/aout_object.hh
src/base/loader/ecoff_object.cc
src/base/loader/ecoff_object.hh
src/base/loader/elf_object.cc
src/base/loader/elf_object.hh
src/base/loader/object_file.hh
src/base/loader/raw_object.cc
src/base/loader/raw_object.hh
src/dev/sparc/t1000.cc
src/dev/sparc/t1000.hh
src/python/m5/objects/Bus.py
src/python/m5/objects/Device.py
src/python/m5/objects/System.py
src/python/m5/objects/T1000.py
src/python/m5/objects/Tsunami.py
src/sim/system.cc

index 1c0a56362999fed07b4f11ac8f4e062c62ab584b..e6bc457374d1c5af0502671c3769e4c4e0b6f22e 100644 (file)
@@ -99,7 +99,6 @@ def makeSparcSystem(mem_mode, mdesc = None):
     self.partition_desc.port = self.membus.port
     self.intrctrl = IntrControl()
     self.mem_mode = mem_mode
-    self.kernel = binary('vmlinux')
 
     self.reset_bin = binary('reset.bin')
     self.hypervisor_bin = binary('q.bin')
index 72c87f0ad3f5e2a6c8e94890f7d97c04d851431b..da83d86fcc6f4949121b6a697b51781f3e87149e 100644 (file)
@@ -155,6 +155,11 @@ SparcSystem::SparcSystem(Params *p)
     if (!hypervisor->loadLocalSymbols(debugSymbolTable))
         panic("could not load hypervisor symbols\n");
 
+    // Strip off the rom address so when the hypervisor is copied into memory we
+    // have symbols still
+    if (!hypervisor->loadLocalSymbols(debugSymbolTable, 0xFFFFFF))
+        panic("could not load hypervisor symbols\n");
+
     if (!nvram->loadGlobalSymbols(debugSymbolTable))
         panic("could not load reset symbols\n");
 
index 6691bd4aebd452ea7c480f8c2754fbdf901ff892..8fbad8030875462394145577da523438b0e58ee8 100644 (file)
@@ -82,14 +82,14 @@ AoutObject::AoutObject(const string &_filename, int _fd,
 
 
 bool
-AoutObject::loadGlobalSymbols(SymbolTable *symtab)
+AoutObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     // a.out symbols not supported yet
     return false;
 }
 
 bool
-AoutObject::loadLocalSymbols(SymbolTable *symtab)
+AoutObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     // a.out symbols not supported yet
     return false;
index d180d69f3b28d7f5a195d8c664d4ffaf095b9a73..7bac5be65576b565623b8e36dc45a8e04ed2a7f2 100644 (file)
@@ -48,8 +48,10 @@ class AoutObject : public ObjectFile
   public:
     virtual ~AoutObject() {}
 
-    virtual bool loadGlobalSymbols(SymbolTable *symtab);
-    virtual bool loadLocalSymbols(SymbolTable *symtab);
+    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
+    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
 
     static ObjectFile *tryFile(const std::string &fname, int fd,
                                size_t len, uint8_t *data);
index 134f2d98d48d23c0e2c519080e75af7410bc1f7c..a5a0ad9a46cd6168f4ccd0286059f6316c354e77 100644 (file)
@@ -86,7 +86,7 @@ EcoffObject::EcoffObject(const string &_filename, int _fd,
 
 
 bool
-EcoffObject::loadGlobalSymbols(SymbolTable *symtab)
+EcoffObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     if (!symtab)
         return false;
@@ -115,7 +115,7 @@ EcoffObject::loadGlobalSymbols(SymbolTable *symtab)
 }
 
 bool
-EcoffObject::loadLocalSymbols(SymbolTable *symtab)
+EcoffObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     if (!symtab)
         return false;
index 05c604b2bb5b4d7d541d09031fa7ca0f13278141..ca6fa2dd071da9ccc6f1dd1e109d959e3049b1b3 100644 (file)
@@ -52,8 +52,10 @@ class EcoffObject : public ObjectFile
   public:
     virtual ~EcoffObject() {}
 
-    virtual bool loadGlobalSymbols(SymbolTable *symtab);
-    virtual bool loadLocalSymbols(SymbolTable *symtab);
+    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
+    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
 
     static ObjectFile *tryFile(const std::string &fname, int fd,
                                size_t len, uint8_t *data);
index 2ca0d4f4afeb84f218a3c797bfeadcd0349d5662..7339507f65720533d488590009a55e12cea62b1b 100644 (file)
@@ -330,13 +330,13 @@ ElfObject::loadSomeSymbols(SymbolTable *symtab, int binding)
 }
 
 bool
-ElfObject::loadGlobalSymbols(SymbolTable *symtab)
+ElfObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     return loadSomeSymbols(symtab, STB_GLOBAL);
 }
 
 bool
-ElfObject::loadLocalSymbols(SymbolTable *symtab)
+ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     return loadSomeSymbols(symtab, STB_LOCAL);
 }
index 9755426b470a9aa4293e6ac0873477440155fc6d..fb728b3c59d8717c7aaae74f58e7691aa2669f39 100644 (file)
@@ -53,8 +53,10 @@ class ElfObject : public ObjectFile
   public:
     virtual ~ElfObject() {}
 
-    virtual bool loadGlobalSymbols(SymbolTable *symtab);
-    virtual bool loadLocalSymbols(SymbolTable *symtab);
+    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
+    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
 
     static ObjectFile *tryFile(const std::string &fname, int fd,
                                size_t len, uint8_t *data);
index 64085185d9b1eb5d6a7e3916c7e9c5fbe27035d9..6e98332c57dcf8ca38b89eddd720e346e3678f66 100644 (file)
@@ -78,8 +78,10 @@ class ObjectFile
 
     virtual bool loadSections(Port *memPort, Addr addrMask =
             std::numeric_limits<Addr>::max());
-    virtual bool loadGlobalSymbols(SymbolTable *symtab) = 0;
-    virtual bool loadLocalSymbols(SymbolTable *symtab) = 0;
+    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max()) = 0;
+    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max()) = 0;
 
     Arch  getArch()  const { return arch; }
     OpSys getOpSys() const { return opSys; }
index 1faf33426825fe160e770fe244af584e959039fd..2a52b0d6eeed687ebca21aadbdcc5526e5bde129 100644 (file)
@@ -61,21 +61,21 @@ RawObject::RawObject(const std::string &_filename, int _fd, size_t _len,
 }
 
 bool
-RawObject::loadGlobalSymbols(SymbolTable *symtab)
+RawObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     int fnameStart = filename.rfind('/',filename.size()) + 1;
     int extStart = filename.rfind('.',filename.size());
-    symtab->insert(text.baseAddr, filename.substr(fnameStart,
+    symtab->insert(text.baseAddr & addrMask, filename.substr(fnameStart,
                 extStart-fnameStart) + "_start");
     return true;
 }
 
 bool
-RawObject::loadLocalSymbols(SymbolTable *symtab)
+RawObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     int fnameStart = filename.rfind('/',filename.size()) + 1;
     int extStart = filename.rfind('.',filename.size());
-    symtab->insert(text.baseAddr, filename.substr(fnameStart,
+    symtab->insert(text.baseAddr & addrMask, filename.substr(fnameStart,
                 extStart-fnameStart) + "_start");
     return true;
 }
index c7fff4e6600a7a9a8c1c7aa2432c4840056dd482..9014a2d300c59c32d45f611f6e1dafef4c7286de 100644 (file)
@@ -41,8 +41,10 @@ class RawObject: public ObjectFile
   public:
     virtual ~RawObject() {}
 
-    virtual bool loadGlobalSymbols(SymbolTable *symtab);
-    virtual bool loadLocalSymbols(SymbolTable *symtab);
+    virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
+    virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
+            std::numeric_limits<Addr>::max());
 
     static ObjectFile *tryFile(const std::string &fname, int fd, size_t len,
             uint8_t *data);
index 1df6bf15fe3dc505b532828666dea3b64553b82a..5fc7870845671bc10f5b20548d815ffaec24758e 100644 (file)
@@ -56,50 +56,56 @@ T1000::T1000(const string &name, System *s, IntrControl *ic)
 Tick
 T1000::intrFrequency()
 {
-    return (Tick)0;
+    panic("Need implementation\n");
 }
 
 void
 T1000::postConsoleInt()
 {
+    panic("Need implementation\n");
 }
 
 void
 T1000::clearConsoleInt()
 {
+    panic("Need implementation\n");
 }
 
 void
 T1000::postPciInt(int line)
 {
+    panic("Need implementation\n");
 }
 
 void
 T1000::clearPciInt(int line)
 {
+    panic("Need implementation\n");
 }
 
 Addr
 T1000::pciToDma(Addr pciAddr) const
 {
-    return (Addr)0;
+    panic("Need implementation\n");
 }
 
 
 Addr
 T1000::calcConfigAddr(int bus, int dev, int func)
 {
-    return (Addr)0;
+    panic("Need implementation\n");
 }
 
 void
 T1000::serialize(std::ostream &os)
 {
+    panic("Need implementation\n");
 }
 
 void
 T1000::unserialize(Checkpoint *cp, const std::string &section)
 {
+    panic("Need implementation\n");
 }
 
 BEGIN_DECLARE_SIM_OBJECT_PARAMS(T1000)
index fb82dff11ec3202b1ea0f54999e1558d6afdb21f..2955763a995716e11e3a7c10500c99a90d4163f7 100644 (file)
@@ -30,7 +30,7 @@
 
 /**
  * @file
- * Declaration of top level class for the Tsunami chipset. This class just
+ * Declaration of top level class for the T1000 platform chips. This class just
  * retains pointers to all its children so the children can communicate.
  */
 
@@ -69,7 +69,7 @@ class T1000 : public Platform
     virtual void postConsoleInt();
 
     /**
-     * Clear a posted CPU interrupt (id=55)
+     * Clear a posted CPU interrupt
      */
     virtual void clearConsoleInt();
 
index e7019f3ac4cc844a219a935fe5c009b3cdedc5a9..8226fe8d2619ab8914b2f51ff9e86c37119d26df 100644 (file)
@@ -2,7 +2,7 @@ from m5 import build_env
 from m5.params import *
 from m5.proxy import *
 from MemObject import MemObject
-from Tsunami import BadAddr
+from Device import BadAddr
 
 class Bus(MemObject):
     type = 'Bus'
@@ -12,7 +12,7 @@ class Bus(MemObject):
     width = Param.Int(64, "bus width (bytes)")
     responder_set = Param.Bool(False, "Did the user specify a default responder.")
     if build_env['FULL_SYSTEM']:
-        default = Port(Self.responder.pio, "Default port for requests that aren't handled by a device.")
         responder = BadAddr(pio_addr=0x0, pio_latency="1ps")
+        default = Port(Self.responder.pio, "Default port for requests that aren't handled by a device.")
     else:
         default = Port("Default port for requests that aren't handled by a device.")
index 4672d1065acb39964c45cade61d9a3975b354bc3..9a3c258de3fc283e63a68f271e9f9376fda71640 100644 (file)
@@ -19,3 +19,14 @@ class DmaDevice(PioDevice):
     type = 'DmaDevice'
     abstract = True
     dma = Port(Self.pio.peerObj.port, "DMA port")
+
+class IsaFake(BasicPioDevice):
+    type = 'IsaFake'
+    pio_size = Param.Addr(0x8, "Size of address range")
+    ret_data = Param.UInt8(0xFF, "Default data to return")
+    ret_bad_addr = Param.Bool(False, "Return pkt status bad address on access")
+
+class BadAddr(IsaFake):
+    ret_bad_addr = Param.Bool(True, "Return pkt status bad address on access")
+
+
index 7ac4dd701310a5606b5e59c23a45598409abf98d..810a320be9757b9b51c566d66ce92f863fe4ac0a 100644 (file)
@@ -15,7 +15,7 @@ class System(SimObject):
                                              "boot processor frequency")
         init_param = Param.UInt64(0, "numerical value to pass into simulator")
         boot_osflags = Param.String("a", "boot flags to pass to the kernel")
-        kernel = Param.String("file that contains the kernel code")
+        kernel = Param.String("", "file that contains the kernel code")
         readfile = Param.String("", "file to read startup script from")
         symbolfile = Param.String("", "file to get the symbols from")
 
index bb0d37bf80e2aa0d147c9daa50b72c4a17349645..235171a51d2cc9ffaf1c526fa1b3faa8cb08e328 100644 (file)
@@ -1,19 +1,10 @@
 from m5.params import *
 from m5.proxy import *
-from Device import BasicPioDevice
+from Device import BasicPioDevice, IsaFake, BadAddr
 from Uart import Uart8250
 from Platform import Platform
 from SimConsole import SimConsole, ConsoleListener
 
-class IsaFake(BasicPioDevice):
-    type = 'IsaFake'
-    pio_size = Param.Addr(0x8, "Size of address range")
-    ret_data = Param.UInt8(0xFF, "Default data to return")
-    ret_bad_addr = Param.Bool(False, "Return pkt status bad address on access")
-
-class BadAddr(IsaFake):
-    ret_bad_addr = Param.Bool(True, "Return pkt status bad address on access")
-
 class T1000(Platform):
     type = 'T1000'
     system = Param.System(Parent.any, "system")
index ffe93727b21907923369d3c6fe68de24bbc26f82..c18210bba9bd678def409d16d2907b84078ce95a 100644 (file)
@@ -1,6 +1,6 @@
 from m5.params import *
 from m5.proxy import *
-from Device import BasicPioDevice
+from Device import BasicPioDevice, IsaFake, BadAddr
 from Platform import Platform
 from AlphaConsole import AlphaConsole
 from Uart import Uart8250
@@ -11,15 +11,6 @@ class TsunamiCChip(BasicPioDevice):
     type = 'TsunamiCChip'
     tsunami = Param.Tsunami(Parent.any, "Tsunami")
 
-class IsaFake(BasicPioDevice):
-    type = 'IsaFake'
-    pio_size = Param.Addr(0x8, "Size of address range")
-    ret_data = Param.UInt8(0xFF, "Default data to return")
-    ret_bad_addr = Param.Bool(False, "Return pkt status bad address on access")
-
-class BadAddr(IsaFake):
-    ret_bad_addr = Param.Bool(True, "Return pkt status bad address on access")
-
 class TsunamiIO(BasicPioDevice):
     type = 'TsunamiIO'
     time = Param.UInt64(1136073600,
index 4b42d41fcc7e2b786b3da822e252dcd08d6c07dd..b3ba1b8f147069e94b55fe1ef7a22a1996713197 100644 (file)
@@ -89,36 +89,41 @@ System::System(Params *p)
     /**
      * Load the kernel code into memory
      */
-    // Load kernel code
-    kernel = createObjectFile(params()->kernel_path);
-    if (kernel == NULL)
-        fatal("Could not load kernel file %s", params()->kernel_path);
-
-    // Load program sections into memory
-    kernel->loadSections(&functionalPort, LoadAddrMask);
-
-    // setup entry points
-    kernelStart = kernel->textBase();
-    kernelEnd = kernel->bssBase() + kernel->bssSize();
-    kernelEntry = kernel->entryPoint();
-
-    // load symbols
-    if (!kernel->loadGlobalSymbols(kernelSymtab))
-        panic("could not load kernel symbols\n");
-
-    if (!kernel->loadLocalSymbols(kernelSymtab))
-        panic("could not load kernel local symbols\n");
-
-    if (!kernel->loadGlobalSymbols(debugSymbolTable))
-        panic("could not load kernel symbols\n");
-
-    if (!kernel->loadLocalSymbols(debugSymbolTable))
-        panic("could not load kernel local symbols\n");
-
-    DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
-    DPRINTF(Loader, "Kernel end   = %#x\n", kernelEnd);
-    DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
-    DPRINTF(Loader, "Kernel loaded...\n");
+    if (params()->kernel_path == "") {
+        warn("No kernel set for full system simulation. Assuming you know what"
+                " you're doing...\n");
+    } else {
+        // Load kernel code
+        kernel = createObjectFile(params()->kernel_path);
+        if (kernel == NULL)
+            fatal("Could not load kernel file %s", params()->kernel_path);
+
+        // Load program sections into memory
+        kernel->loadSections(&functionalPort, LoadAddrMask);
+
+        // setup entry points
+        kernelStart = kernel->textBase();
+        kernelEnd = kernel->bssBase() + kernel->bssSize();
+        kernelEntry = kernel->entryPoint();
+
+        // load symbols
+        if (!kernel->loadGlobalSymbols(kernelSymtab))
+            panic("could not load kernel symbols\n");
+
+        if (!kernel->loadLocalSymbols(kernelSymtab))
+            panic("could not load kernel local symbols\n");
+
+        if (!kernel->loadGlobalSymbols(debugSymbolTable))
+            panic("could not load kernel symbols\n");
+
+        if (!kernel->loadLocalSymbols(debugSymbolTable))
+            panic("could not load kernel local symbols\n");
+
+        DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
+        DPRINTF(Loader, "Kernel end   = %#x\n", kernelEnd);
+        DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
+        DPRINTF(Loader, "Kernel loaded...\n");
+    }
 #endif // FULL_SYSTEM
 
     // increment the number of running systms