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:
parent
d4e83a4001
commit
f2642e2055
|
@ -35,6 +35,7 @@ class AlphaSystem(System):
|
||||||
pal = Param.String("file that contains palcode")
|
pal = Param.String("file that contains palcode")
|
||||||
system_type = Param.UInt64("Type of system we are emulating")
|
system_type = Param.UInt64("Type of system we are emulating")
|
||||||
system_rev = Param.UInt64("Revision of system we are emulating")
|
system_rev = Param.UInt64("Revision of system we are emulating")
|
||||||
|
load_addr_mask = 0xffffffffff
|
||||||
|
|
||||||
class LinuxAlphaSystem(AlphaSystem):
|
class LinuxAlphaSystem(AlphaSystem):
|
||||||
type = 'LinuxAlphaSystem'
|
type = 'LinuxAlphaSystem'
|
||||||
|
|
|
@ -76,9 +76,6 @@ const Addr K0SegEnd = ULL(0xfffffdffffffffff);
|
||||||
const Addr K1SegBase = ULL(0xfffffe0000000000);
|
const Addr K1SegBase = ULL(0xfffffe0000000000);
|
||||||
const Addr K1SegEnd = ULL(0xffffffffffffffff);
|
const Addr K1SegEnd = ULL(0xffffffffffffffff);
|
||||||
|
|
||||||
// For loading... XXX This maybe could be USegEnd?? --ali
|
|
||||||
const Addr LoadAddrMask = ULL(0xffffffffff);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// Interrupt levels
|
// Interrupt levels
|
||||||
|
|
|
@ -65,8 +65,8 @@ AlphaSystem::AlphaSystem(Params *p)
|
||||||
|
|
||||||
|
|
||||||
// Load program sections into memory
|
// Load program sections into memory
|
||||||
pal->loadSections(&functionalPort, LoadAddrMask);
|
pal->loadSections(&functionalPort, loadAddrMask);
|
||||||
console->loadSections(&functionalPort, LoadAddrMask);
|
console->loadSections(&functionalPort, loadAddrMask);
|
||||||
|
|
||||||
// load symbols
|
// load symbols
|
||||||
if (!console->loadGlobalSymbols(consoleSymtab))
|
if (!console->loadGlobalSymbols(consoleSymtab))
|
||||||
|
|
|
@ -32,4 +32,5 @@ from System import System
|
||||||
|
|
||||||
class ArmSystem(System):
|
class ArmSystem(System):
|
||||||
type = 'ArmSystem'
|
type = 'ArmSystem'
|
||||||
|
load_addr_mask = 0xffffffff
|
||||||
|
|
||||||
|
|
|
@ -91,9 +91,6 @@ namespace ArmISA
|
||||||
const Addr KSeg0Base = ULL(0x80000000);
|
const Addr KSeg0Base = ULL(0x80000000);
|
||||||
const Addr KSeg0Mask = ULL(0x1FFFFFFF);
|
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 VABits = 32;
|
||||||
const unsigned PABits = 32; // Is this correct?
|
const unsigned PABits = 32; // Is this correct?
|
||||||
const Addr VAddrImplMask = (ULL(1) << VABits) - 1;
|
const Addr VAddrImplMask = (ULL(1) << VABits) - 1;
|
||||||
|
|
|
@ -41,6 +41,7 @@ class MipsSystem(System):
|
||||||
hex_file_name = Param.String("test.hex","hex file that contains [address,data] pairs")
|
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_type = Param.UInt64("Type of system we are emulating")
|
||||||
system_rev = Param.UInt64("Revision of system we are emulating")
|
system_rev = Param.UInt64("Revision of system we are emulating")
|
||||||
|
load_addr_mask = 0xffffffffff
|
||||||
|
|
||||||
if buildEnv['FULL_SYSTEM']:
|
if buildEnv['FULL_SYSTEM']:
|
||||||
class LinuxMipsSystem(MipsSystem):
|
class LinuxMipsSystem(MipsSystem):
|
||||||
|
|
|
@ -95,9 +95,6 @@ const Addr KSeg3End = ULL(0xFFFFFFFF);
|
||||||
const Addr KSeg3Base = ULL(0xE0000000);
|
const Addr KSeg3Base = ULL(0xE0000000);
|
||||||
|
|
||||||
|
|
||||||
// For loading... XXX This maybe could be USegEnd?? --ali
|
|
||||||
const Addr LoadAddrMask = ULL(0xffffffffff);
|
|
||||||
|
|
||||||
inline Addr Phys2K0Seg(Addr addr)
|
inline Addr Phys2K0Seg(Addr addr)
|
||||||
{
|
{
|
||||||
return addr | KSeg0Base;
|
return addr | KSeg0Base;
|
||||||
|
|
|
@ -70,7 +70,7 @@ MipsSystem::MipsSystem(Params *p) : System(p)
|
||||||
if (console == NULL)
|
if (console == NULL)
|
||||||
fatal("Could not load console file %s", params()->console);
|
fatal("Could not load console file %s", params()->console);
|
||||||
//Load program sections into memory
|
//Load program sections into memory
|
||||||
console->loadSections(&functionalPort, MipsISA::LoadAddrMask);
|
console->loadSections(&functionalPort, loadAddrMask);
|
||||||
|
|
||||||
//load symbols
|
//load symbols
|
||||||
if (!console->loadGlobalSymbols(consoleSymtab))
|
if (!console->loadGlobalSymbols(consoleSymtab))
|
||||||
|
|
|
@ -71,4 +71,4 @@ class SparcSystem(System):
|
||||||
nvram_bin = Param.String("file that contains the contents of nvram")
|
nvram_bin = Param.String("file that contains the contents of nvram")
|
||||||
hypervisor_desc_bin = Param.String("file that contains the hypervisor description")
|
hypervisor_desc_bin = Param.String("file that contains the hypervisor description")
|
||||||
partition_desc_bin = Param.String("file that contains the partition description")
|
partition_desc_bin = Param.String("file that contains the partition description")
|
||||||
|
load_addr_mask = 0xffffffffff
|
||||||
|
|
|
@ -80,11 +80,6 @@ namespace SparcISA
|
||||||
const Addr BytesInPageMask = ULL(0x1FFF);
|
const Addr BytesInPageMask = ULL(0x1FFF);
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#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
|
enum InterruptTypes
|
||||||
{
|
{
|
||||||
IT_TRAP_LEVEL_ZERO,
|
IT_TRAP_LEVEL_ZERO,
|
||||||
|
|
|
@ -54,6 +54,7 @@ class X86System(System):
|
||||||
'intel mp spec configuration table')
|
'intel mp spec configuration table')
|
||||||
acpi_description_table_pointer = Param.X86ACPIRSDP(
|
acpi_description_table_pointer = Param.X86ACPIRSDP(
|
||||||
X86ACPIRSDP(), 'ACPI root description pointer structure')
|
X86ACPIRSDP(), 'ACPI root description pointer structure')
|
||||||
|
load_addr_mask = 0xffffffffffffffff
|
||||||
|
|
||||||
class LinuxX86System(X86System):
|
class LinuxX86System(X86System):
|
||||||
type = 'LinuxX86System'
|
type = 'LinuxX86System'
|
||||||
|
|
|
@ -72,8 +72,6 @@ namespace X86ISA
|
||||||
|
|
||||||
StaticInstPtr decodeInst(ExtMachInst);
|
StaticInstPtr decodeInst(ExtMachInst);
|
||||||
|
|
||||||
const Addr LoadAddrMask = ULL(-1);
|
|
||||||
|
|
||||||
// Memory accesses can be unaligned
|
// Memory accesses can be unaligned
|
||||||
const bool HasUnalignedMemAcc = true;
|
const bool HasUnalignedMemAcc = true;
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,3 +50,5 @@ class System(SimObject):
|
||||||
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")
|
||||||
|
load_addr_mask = Param.UInt64(0xffffffffff,
|
||||||
|
"Address to mask loading binaries with");
|
||||||
|
|
|
@ -66,6 +66,7 @@ System::System(Params *p)
|
||||||
init_param(p->init_param),
|
init_param(p->init_param),
|
||||||
functionalPort(p->name + "-fport"),
|
functionalPort(p->name + "-fport"),
|
||||||
virtPort(p->name + "-vport"),
|
virtPort(p->name + "-vport"),
|
||||||
|
loadAddrMask(p->load_addr_mask),
|
||||||
#else
|
#else
|
||||||
page_ptr(0),
|
page_ptr(0),
|
||||||
next_PID(0),
|
next_PID(0),
|
||||||
|
@ -109,7 +110,7 @@ System::System(Params *p)
|
||||||
fatal("Could not load kernel file %s", params()->kernel);
|
fatal("Could not load kernel file %s", params()->kernel);
|
||||||
|
|
||||||
// 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();
|
||||||
|
|
|
@ -126,6 +126,14 @@ class System : public SimObject
|
||||||
/** Entry point in the kernel to start at */
|
/** Entry point in the kernel to start at */
|
||||||
Addr kernelEntry;
|
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
|
#else
|
||||||
|
|
||||||
int page_ptr;
|
int page_ptr;
|
||||||
|
|
Loading…
Reference in a new issue