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
     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')
 
     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");
 
 
 
 
 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;
 
   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);
 
 
 
 bool
-EcoffObject::loadGlobalSymbols(SymbolTable *symtab)
+EcoffObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     if (!symtab)
         return false;
 }
 
 bool
-EcoffObject::loadLocalSymbols(SymbolTable *symtab)
+EcoffObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
 {
     if (!symtab)
         return false;
 
   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);
 
 }
 
 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);
 }
 
   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);
 
 
     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; }
 
 }
 
 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;
 }
 
   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);
 
 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 §ion)
 {
+    panic("Need implementation\n");
 }
 
 BEGIN_DECLARE_SIM_OBJECT_PARAMS(T1000)
 
 
 /**
  * @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.
  */
 
     virtual void postConsoleInt();
 
     /**
-     * Clear a posted CPU interrupt (id=55)
+     * Clear a posted CPU interrupt
      */
     virtual void clearConsoleInt();
 
 
 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'
     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.")
 
     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")
+
+
 
                                              "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")
 
 
 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")
 
 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
     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,
 
     /**
      * 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