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:
parent
7b9ef9716b
commit
8c4f7a0404
19 changed files with 90 additions and 72 deletions
|
@ -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')
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 §ion)
|
||||
{
|
||||
panic("Need implementation\n");
|
||||
}
|
||||
|
||||
BEGIN_DECLARE_SIM_OBJECT_PARAMS(T1000)
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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.")
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
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);
|
||||
// Load program sections into memory
|
||||
kernel->loadSections(&functionalPort, LoadAddrMask);
|
||||
|
||||
// setup entry points
|
||||
kernelStart = kernel->textBase();
|
||||
kernelEnd = kernel->bssBase() + kernel->bssSize();
|
||||
kernelEntry = kernel->entryPoint();
|
||||
// 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");
|
||||
// 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->loadLocalSymbols(kernelSymtab))
|
||||
panic("could not load kernel local symbols\n");
|
||||
|
||||
if (!kernel->loadGlobalSymbols(debugSymbolTable))
|
||||
panic("could not load kernel 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");
|
||||
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");
|
||||
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
|
||||
|
|
Loading…
Reference in a new issue