Load the hypervisor symbols twice, once with an address mask so that we can get symbols for where it's copied to in memory

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
This commit is contained in:
Ali Saidi 2006-11-30 15:51:54 -05:00
parent 7b9ef9716b
commit 8c4f7a0404
19 changed files with 90 additions and 72 deletions

View file

@ -99,7 +99,6 @@ def makeSparcSystem(mem_mode, mdesc = None):
self.partition_desc.port = self.membus.port self.partition_desc.port = self.membus.port
self.intrctrl = IntrControl() self.intrctrl = IntrControl()
self.mem_mode = mem_mode self.mem_mode = mem_mode
self.kernel = binary('vmlinux')
self.reset_bin = binary('reset.bin') self.reset_bin = binary('reset.bin')
self.hypervisor_bin = binary('q.bin') self.hypervisor_bin = binary('q.bin')

View file

@ -155,6 +155,11 @@ SparcSystem::SparcSystem(Params *p)
if (!hypervisor->loadLocalSymbols(debugSymbolTable)) if (!hypervisor->loadLocalSymbols(debugSymbolTable))
panic("could not load hypervisor symbols\n"); 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)) if (!nvram->loadGlobalSymbols(debugSymbolTable))
panic("could not load reset symbols\n"); panic("could not load reset symbols\n");

View file

@ -82,14 +82,14 @@ AoutObject::AoutObject(const string &_filename, int _fd,
bool bool
AoutObject::loadGlobalSymbols(SymbolTable *symtab) AoutObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
// a.out symbols not supported yet // a.out symbols not supported yet
return false; return false;
} }
bool bool
AoutObject::loadLocalSymbols(SymbolTable *symtab) AoutObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
// a.out symbols not supported yet // a.out symbols not supported yet
return false; return false;

View file

@ -48,8 +48,10 @@ class AoutObject : public ObjectFile
public: public:
virtual ~AoutObject() {} virtual ~AoutObject() {}
virtual bool loadGlobalSymbols(SymbolTable *symtab); virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
virtual bool loadLocalSymbols(SymbolTable *symtab); 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, static ObjectFile *tryFile(const std::string &fname, int fd,
size_t len, uint8_t *data); size_t len, uint8_t *data);

View file

@ -86,7 +86,7 @@ EcoffObject::EcoffObject(const string &_filename, int _fd,
bool bool
EcoffObject::loadGlobalSymbols(SymbolTable *symtab) EcoffObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
if (!symtab) if (!symtab)
return false; return false;
@ -115,7 +115,7 @@ EcoffObject::loadGlobalSymbols(SymbolTable *symtab)
} }
bool bool
EcoffObject::loadLocalSymbols(SymbolTable *symtab) EcoffObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
if (!symtab) if (!symtab)
return false; return false;

View file

@ -52,8 +52,10 @@ class EcoffObject : public ObjectFile
public: public:
virtual ~EcoffObject() {} virtual ~EcoffObject() {}
virtual bool loadGlobalSymbols(SymbolTable *symtab); virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
virtual bool loadLocalSymbols(SymbolTable *symtab); 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, static ObjectFile *tryFile(const std::string &fname, int fd,
size_t len, uint8_t *data); size_t len, uint8_t *data);

View file

@ -330,13 +330,13 @@ ElfObject::loadSomeSymbols(SymbolTable *symtab, int binding)
} }
bool bool
ElfObject::loadGlobalSymbols(SymbolTable *symtab) ElfObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
return loadSomeSymbols(symtab, STB_GLOBAL); return loadSomeSymbols(symtab, STB_GLOBAL);
} }
bool bool
ElfObject::loadLocalSymbols(SymbolTable *symtab) ElfObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
return loadSomeSymbols(symtab, STB_LOCAL); return loadSomeSymbols(symtab, STB_LOCAL);
} }

View file

@ -53,8 +53,10 @@ class ElfObject : public ObjectFile
public: public:
virtual ~ElfObject() {} virtual ~ElfObject() {}
virtual bool loadGlobalSymbols(SymbolTable *symtab); virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
virtual bool loadLocalSymbols(SymbolTable *symtab); 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, static ObjectFile *tryFile(const std::string &fname, int fd,
size_t len, uint8_t *data); size_t len, uint8_t *data);

View file

@ -78,8 +78,10 @@ class ObjectFile
virtual bool loadSections(Port *memPort, Addr addrMask = virtual bool loadSections(Port *memPort, Addr addrMask =
std::numeric_limits<Addr>::max()); std::numeric_limits<Addr>::max());
virtual bool loadGlobalSymbols(SymbolTable *symtab) = 0; virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
virtual bool loadLocalSymbols(SymbolTable *symtab) = 0; std::numeric_limits<Addr>::max()) = 0;
virtual bool loadLocalSymbols(SymbolTable *symtab, Addr addrMask =
std::numeric_limits<Addr>::max()) = 0;
Arch getArch() const { return arch; } Arch getArch() const { return arch; }
OpSys getOpSys() const { return opSys; } OpSys getOpSys() const { return opSys; }

View file

@ -61,21 +61,21 @@ RawObject::RawObject(const std::string &_filename, int _fd, size_t _len,
} }
bool bool
RawObject::loadGlobalSymbols(SymbolTable *symtab) RawObject::loadGlobalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
int fnameStart = filename.rfind('/',filename.size()) + 1; int fnameStart = filename.rfind('/',filename.size()) + 1;
int extStart = filename.rfind('.',filename.size()); int extStart = filename.rfind('.',filename.size());
symtab->insert(text.baseAddr, filename.substr(fnameStart, symtab->insert(text.baseAddr & addrMask, filename.substr(fnameStart,
extStart-fnameStart) + "_start"); extStart-fnameStart) + "_start");
return true; return true;
} }
bool bool
RawObject::loadLocalSymbols(SymbolTable *symtab) RawObject::loadLocalSymbols(SymbolTable *symtab, Addr addrMask)
{ {
int fnameStart = filename.rfind('/',filename.size()) + 1; int fnameStart = filename.rfind('/',filename.size()) + 1;
int extStart = filename.rfind('.',filename.size()); int extStart = filename.rfind('.',filename.size());
symtab->insert(text.baseAddr, filename.substr(fnameStart, symtab->insert(text.baseAddr & addrMask, filename.substr(fnameStart,
extStart-fnameStart) + "_start"); extStart-fnameStart) + "_start");
return true; return true;
} }

View file

@ -41,8 +41,10 @@ class RawObject: public ObjectFile
public: public:
virtual ~RawObject() {} virtual ~RawObject() {}
virtual bool loadGlobalSymbols(SymbolTable *symtab); virtual bool loadGlobalSymbols(SymbolTable *symtab, Addr addrMask =
virtual bool loadLocalSymbols(SymbolTable *symtab); 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, static ObjectFile *tryFile(const std::string &fname, int fd, size_t len,
uint8_t *data); uint8_t *data);

View file

@ -56,50 +56,56 @@ T1000::T1000(const string &name, System *s, IntrControl *ic)
Tick Tick
T1000::intrFrequency() T1000::intrFrequency()
{ {
return (Tick)0; panic("Need implementation\n");
} }
void void
T1000::postConsoleInt() T1000::postConsoleInt()
{ {
panic("Need implementation\n");
} }
void void
T1000::clearConsoleInt() T1000::clearConsoleInt()
{ {
panic("Need implementation\n");
} }
void void
T1000::postPciInt(int line) T1000::postPciInt(int line)
{ {
panic("Need implementation\n");
} }
void void
T1000::clearPciInt(int line) T1000::clearPciInt(int line)
{ {
panic("Need implementation\n");
} }
Addr Addr
T1000::pciToDma(Addr pciAddr) const T1000::pciToDma(Addr pciAddr) const
{ {
return (Addr)0; panic("Need implementation\n");
} }
Addr Addr
T1000::calcConfigAddr(int bus, int dev, int func) T1000::calcConfigAddr(int bus, int dev, int func)
{ {
return (Addr)0; panic("Need implementation\n");
} }
void void
T1000::serialize(std::ostream &os) T1000::serialize(std::ostream &os)
{ {
panic("Need implementation\n");
} }
void void
T1000::unserialize(Checkpoint *cp, const std::string &section) T1000::unserialize(Checkpoint *cp, const std::string &section)
{ {
panic("Need implementation\n");
} }
BEGIN_DECLARE_SIM_OBJECT_PARAMS(T1000) BEGIN_DECLARE_SIM_OBJECT_PARAMS(T1000)

View file

@ -30,7 +30,7 @@
/** /**
* @file * @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. * retains pointers to all its children so the children can communicate.
*/ */
@ -69,7 +69,7 @@ class T1000 : public Platform
virtual void postConsoleInt(); virtual void postConsoleInt();
/** /**
* Clear a posted CPU interrupt (id=55) * Clear a posted CPU interrupt
*/ */
virtual void clearConsoleInt(); virtual void clearConsoleInt();

View file

@ -2,7 +2,7 @@ from m5 import build_env
from m5.params import * from m5.params import *
from m5.proxy import * from m5.proxy import *
from MemObject import MemObject from MemObject import MemObject
from Tsunami import BadAddr from Device import BadAddr
class Bus(MemObject): class Bus(MemObject):
type = 'Bus' type = 'Bus'
@ -12,7 +12,7 @@ class Bus(MemObject):
width = Param.Int(64, "bus width (bytes)") width = Param.Int(64, "bus width (bytes)")
responder_set = Param.Bool(False, "Did the user specify a default responder.") responder_set = Param.Bool(False, "Did the user specify a default responder.")
if build_env['FULL_SYSTEM']: 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") 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: else:
default = Port("Default port for requests that aren't handled by a device.") default = Port("Default port for requests that aren't handled by a device.")

View file

@ -19,3 +19,14 @@ class DmaDevice(PioDevice):
type = 'DmaDevice' type = 'DmaDevice'
abstract = True abstract = True
dma = Port(Self.pio.peerObj.port, "DMA port") 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")

View file

@ -15,7 +15,7 @@ class System(SimObject):
"boot processor frequency") "boot processor frequency")
init_param = Param.UInt64(0, "numerical value to pass into simulator") init_param = Param.UInt64(0, "numerical value to pass into simulator")
boot_osflags = Param.String("a", "boot flags to pass to the kernel") 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") readfile = Param.String("", "file to read startup script from")
symbolfile = Param.String("", "file to get the symbols from") symbolfile = Param.String("", "file to get the symbols from")

View file

@ -1,19 +1,10 @@
from m5.params import * from m5.params import *
from m5.proxy import * from m5.proxy import *
from Device import BasicPioDevice from Device import BasicPioDevice, IsaFake, BadAddr
from Uart import Uart8250 from Uart import Uart8250
from Platform import Platform from Platform import Platform
from SimConsole import SimConsole, ConsoleListener 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): class T1000(Platform):
type = 'T1000' type = 'T1000'
system = Param.System(Parent.any, "system") system = Param.System(Parent.any, "system")

View file

@ -1,6 +1,6 @@
from m5.params import * from m5.params import *
from m5.proxy import * from m5.proxy import *
from Device import BasicPioDevice from Device import BasicPioDevice, IsaFake, BadAddr
from Platform import Platform from Platform import Platform
from AlphaConsole import AlphaConsole from AlphaConsole import AlphaConsole
from Uart import Uart8250 from Uart import Uart8250
@ -11,15 +11,6 @@ class TsunamiCChip(BasicPioDevice):
type = 'TsunamiCChip' type = 'TsunamiCChip'
tsunami = Param.Tsunami(Parent.any, "Tsunami") 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): class TsunamiIO(BasicPioDevice):
type = 'TsunamiIO' type = 'TsunamiIO'
time = Param.UInt64(1136073600, time = Param.UInt64(1136073600,

View file

@ -89,36 +89,41 @@ System::System(Params *p)
/** /**
* Load the kernel code into memory * Load the kernel code into memory
*/ */
// Load kernel code if (params()->kernel_path == "") {
kernel = createObjectFile(params()->kernel_path); warn("No kernel set for full system simulation. Assuming you know what"
if (kernel == NULL) " you're doing...\n");
fatal("Could not load kernel file %s", params()->kernel_path); } 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 // Load program sections into memory
kernel->loadSections(&functionalPort, LoadAddrMask); kernel->loadSections(&functionalPort, LoadAddrMask);
// setup entry points // setup entry points
kernelStart = kernel->textBase(); kernelStart = kernel->textBase();
kernelEnd = kernel->bssBase() + kernel->bssSize(); kernelEnd = kernel->bssBase() + kernel->bssSize();
kernelEntry = kernel->entryPoint(); kernelEntry = kernel->entryPoint();
// load symbols // load symbols
if (!kernel->loadGlobalSymbols(kernelSymtab)) if (!kernel->loadGlobalSymbols(kernelSymtab))
panic("could not load kernel symbols\n"); panic("could not load kernel symbols\n");
if (!kernel->loadLocalSymbols(kernelSymtab)) if (!kernel->loadLocalSymbols(kernelSymtab))
panic("could not load kernel local symbols\n"); panic("could not load kernel local symbols\n");
if (!kernel->loadGlobalSymbols(debugSymbolTable)) if (!kernel->loadGlobalSymbols(debugSymbolTable))
panic("could not load kernel symbols\n"); panic("could not load kernel symbols\n");
if (!kernel->loadLocalSymbols(debugSymbolTable)) if (!kernel->loadLocalSymbols(debugSymbolTable))
panic("could not load kernel local symbols\n"); panic("could not load kernel local symbols\n");
DPRINTF(Loader, "Kernel start = %#x\n", kernelStart); DPRINTF(Loader, "Kernel start = %#x\n", kernelStart);
DPRINTF(Loader, "Kernel end = %#x\n", kernelEnd); DPRINTF(Loader, "Kernel end = %#x\n", kernelEnd);
DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry); DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
DPRINTF(Loader, "Kernel loaded...\n"); DPRINTF(Loader, "Kernel loaded...\n");
}
#endif // FULL_SYSTEM #endif // FULL_SYSTEM
// increment the number of running systms // increment the number of running systms