Loader: Make the load address mask be a parameter of the system rather than a constant.

This allows one two different OS requirements for the same ISA to be handled.
Some OSes are compiled for a virtual address and need to be loaded into physical
memory that starts at address 0, while other bare metal tools generate
images that start at address 0.
This commit is contained in:
Ali Saidi 2010-08-23 11:18:39 -05:00
parent d4e83a4001
commit f2642e2055
15 changed files with 20 additions and 21 deletions

View file

@ -35,6 +35,7 @@ class AlphaSystem(System):
pal = Param.String("file that contains palcode")
system_type = Param.UInt64("Type of system we are emulating")
system_rev = Param.UInt64("Revision of system we are emulating")
load_addr_mask = 0xffffffffff
class LinuxAlphaSystem(AlphaSystem):
type = 'LinuxAlphaSystem'

View file

@ -76,9 +76,6 @@ const Addr K0SegEnd = ULL(0xfffffdffffffffff);
const Addr K1SegBase = ULL(0xfffffe0000000000);
const Addr K1SegEnd = ULL(0xffffffffffffffff);
// For loading... XXX This maybe could be USegEnd?? --ali
const Addr LoadAddrMask = ULL(0xffffffffff);
////////////////////////////////////////////////////////////////////////
//
// Interrupt levels

View file

@ -65,8 +65,8 @@ AlphaSystem::AlphaSystem(Params *p)
// Load program sections into memory
pal->loadSections(&functionalPort, LoadAddrMask);
console->loadSections(&functionalPort, LoadAddrMask);
pal->loadSections(&functionalPort, loadAddrMask);
console->loadSections(&functionalPort, loadAddrMask);
// load symbols
if (!console->loadGlobalSymbols(consoleSymtab))

View file

@ -32,4 +32,5 @@ from System import System
class ArmSystem(System):
type = 'ArmSystem'
load_addr_mask = 0xffffffff

View file

@ -91,9 +91,6 @@ namespace ArmISA
const Addr KSeg0Base = ULL(0x80000000);
const Addr KSeg0Mask = ULL(0x1FFFFFFF);
// For loading... XXX This maybe could be USegEnd?? --ali
const Addr LoadAddrMask = ULL(0xffffffffff);
const unsigned VABits = 32;
const unsigned PABits = 32; // Is this correct?
const Addr VAddrImplMask = (ULL(1) << VABits) - 1;

View file

@ -41,6 +41,7 @@ class MipsSystem(System):
hex_file_name = Param.String("test.hex","hex file that contains [address,data] pairs")
system_type = Param.UInt64("Type of system we are emulating")
system_rev = Param.UInt64("Revision of system we are emulating")
load_addr_mask = 0xffffffffff
if buildEnv['FULL_SYSTEM']:
class LinuxMipsSystem(MipsSystem):

View file

@ -95,9 +95,6 @@ const Addr KSeg3End = ULL(0xFFFFFFFF);
const Addr KSeg3Base = ULL(0xE0000000);
// For loading... XXX This maybe could be USegEnd?? --ali
const Addr LoadAddrMask = ULL(0xffffffffff);
inline Addr Phys2K0Seg(Addr addr)
{
return addr | KSeg0Base;

View file

@ -70,7 +70,7 @@ MipsSystem::MipsSystem(Params *p) : System(p)
if (console == NULL)
fatal("Could not load console file %s", params()->console);
//Load program sections into memory
console->loadSections(&functionalPort, MipsISA::LoadAddrMask);
console->loadSections(&functionalPort, loadAddrMask);
//load symbols
if (!console->loadGlobalSymbols(consoleSymtab))

View file

@ -71,4 +71,4 @@ class SparcSystem(System):
nvram_bin = Param.String("file that contains the contents of nvram")
hypervisor_desc_bin = Param.String("file that contains the hypervisor description")
partition_desc_bin = Param.String("file that contains the partition description")
load_addr_mask = 0xffffffffff

View file

@ -80,11 +80,6 @@ namespace SparcISA
const Addr BytesInPageMask = ULL(0x1FFF);
#if FULL_SYSTEM
// I don't know what it's for, so I don't
// know what SPARC's value should be
// For loading... XXX This maybe could be USegEnd?? --ali
const Addr LoadAddrMask = ULL(0xffffffffff);
enum InterruptTypes
{
IT_TRAP_LEVEL_ZERO,

View file

@ -54,6 +54,7 @@ class X86System(System):
'intel mp spec configuration table')
acpi_description_table_pointer = Param.X86ACPIRSDP(
X86ACPIRSDP(), 'ACPI root description pointer structure')
load_addr_mask = 0xffffffffffffffff
class LinuxX86System(X86System):
type = 'LinuxX86System'

View file

@ -72,8 +72,6 @@ namespace X86ISA
StaticInstPtr decodeInst(ExtMachInst);
const Addr LoadAddrMask = ULL(-1);
// Memory accesses can be unaligned
const bool HasUnalignedMemAcc = true;
};

View file

@ -50,3 +50,5 @@ class System(SimObject):
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")
load_addr_mask = Param.UInt64(0xffffffffff,
"Address to mask loading binaries with");

View file

@ -66,6 +66,7 @@ System::System(Params *p)
init_param(p->init_param),
functionalPort(p->name + "-fport"),
virtPort(p->name + "-vport"),
loadAddrMask(p->load_addr_mask),
#else
page_ptr(0),
next_PID(0),
@ -109,7 +110,7 @@ System::System(Params *p)
fatal("Could not load kernel file %s", params()->kernel);
// Load program sections into memory
kernel->loadSections(&functionalPort, LoadAddrMask);
kernel->loadSections(&functionalPort, loadAddrMask);
// setup entry points
kernelStart = kernel->textBase();

View file

@ -126,6 +126,14 @@ class System : public SimObject
/** Entry point in the kernel to start at */
Addr kernelEntry;
/** Mask that should be anded for binary/symbol loading.
* This allows one two different OS requirements for the same ISA to be
* handled. Some OSes are compiled for a virtual address and need to be
* loaded into physical memory that starts at address 0, while other
* bare metal tools generate images that start at address 0.
*/
Addr loadAddrMask;
#else
int page_ptr;