Ciro Santilli has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/35335 )
Change subject: sim: factor fs_workload address relocation
......................................................................
sim: factor fs_workload address relocation
The same operation was being done from three different places, this commit
factors them out with KernelWorkload::relocateAddr.
Also always call the function instead of using the member in case the
getter starts doing some extra logic later on.
Change-Id: Idc06ac9fd361c62dec3ef3d7db4d912068a28a88
---
M src/arch/arm/freebsd/fs_workload.cc
M src/arch/arm/fs_workload.cc
M src/arch/arm/linux/fs_workload.cc
M src/sim/kernel_workload.cc
M src/sim/kernel_workload.hh
5 files changed, 29 insertions(+), 23 deletions(-)
diff --git a/src/arch/arm/freebsd/fs_workload.cc
b/src/arch/arm/freebsd/fs_workload.cc
index 080dc35..79bc5e6 100644
--- a/src/arch/arm/freebsd/fs_workload.cc
+++ b/src/arch/arm/freebsd/fs_workload.cc
@@ -81,7 +81,8 @@
// to do this permanently, for but early bootup work
// it is helpful.
if (params()->early_kernel_symbols) {
- auto phys_globals =
kernelObj->symtab().globals()->mask(_loadAddrMask);
+ auto phys_globals = kernelObj->symtab().globals()->mask(
+ loadAddrMask());
kernelSymtab.insert(*phys_globals);
Loader::debugSymbolTable.insert(*phys_globals);
}
@@ -95,7 +96,7 @@
// Kernel supports flattened device tree and dtb file specified.
// Using Device Tree Blob to describe system configuration.
inform("Loading DTB file: %s at address %#x\n", params()->dtb_filename,
- params()->atags_addr + _loadAddrOffset);
+ params()->atags_addr + loadAddrOffset());
auto *dtb_file = new ::Loader::DtbFile(params()->dtb_filename);
@@ -108,7 +109,7 @@
bootReleaseAddr = ra & ~ULL(0x7F);
dtb_file->buildImage().
- offset(params()->atags_addr + _loadAddrOffset).
+ offset(params()->atags_addr + loadAddrOffset()).
write(system->physProxy);
delete dtb_file;
@@ -116,7 +117,7 @@
for (auto *tc: system->threads) {
tc->setIntReg(0, 0);
tc->setIntReg(1, params()->machine_type);
- tc->setIntReg(2, params()->atags_addr + _loadAddrOffset);
+ tc->setIntReg(2, params()->atags_addr + loadAddrOffset());
}
}
diff --git a/src/arch/arm/fs_workload.cc b/src/arch/arm/fs_workload.cc
index 0cafb1b..1fae3ab 100644
--- a/src/arch/arm/fs_workload.cc
+++ b/src/arch/arm/fs_workload.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010, 2012-2013, 2015,2017-2019 ARM Limited
+ * Copyright (c) 2010, 2012-2013, 2015,2017-2020 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -72,8 +72,7 @@
FsWorkload::FsWorkload(Params *p) : KernelWorkload(*p)
{
if (kernelObj) {
- kernelEntry = (kernelObj->entryPoint() & loadAddrMask()) +
- loadAddrOffset();
+ kernelEntry = relocateAddr(kernelObj->entryPoint());
}
bootLoaders.reserve(p->boot_loader.size());
diff --git a/src/arch/arm/linux/fs_workload.cc
b/src/arch/arm/linux/fs_workload.cc
index 8aba285..dc36195 100644
--- a/src/arch/arm/linux/fs_workload.cc
+++ b/src/arch/arm/linux/fs_workload.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2010-2013, 2016 ARM Limited
+ * Copyright (c) 2010-2013, 2016, 2020 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -76,7 +76,8 @@
// to do this permanently, for but early bootup work
// it is helpful.
if (params()->early_kernel_symbols) {
- auto phys_globals =
kernelObj->symtab().globals()->mask(_loadAddrMask);
+ auto phys_globals = kernelObj->symtab().globals()->mask(
+ loadAddrMask());
kernelSymtab.insert(*phys_globals);
Loader::debugSymbolTable.insert(*phys_globals);
}
@@ -92,7 +93,7 @@
// Kernel supports flattened device tree and dtb file specified.
// Using Device Tree Blob to describe system configuration.
inform("Loading DTB file: %s at address %#x\n",
params()->dtb_filename,
- params()->atags_addr + _loadAddrOffset);
+ params()->atags_addr + loadAddrOffset());
auto *dtb_file = new ::Loader::DtbFile(params()->dtb_filename);
@@ -103,7 +104,7 @@
}
dtb_file->buildImage().
- offset(params()->atags_addr + _loadAddrOffset).
+ offset(params()->atags_addr + loadAddrOffset()).
write(system->physProxy);
delete dtb_file;
} else {
@@ -152,7 +153,7 @@
DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2);
DDUMP(Loader, boot_data, size << 2);
- system->physProxy.writeBlob(params()->atags_addr + _loadAddrOffset,
+ system->physProxy.writeBlob(params()->atags_addr +
loadAddrOffset(),
boot_data, size << 2);
delete[] boot_data;
@@ -162,7 +163,7 @@
for (auto *tc: system->threads) {
tc->setIntReg(0, 0);
tc->setIntReg(1, params()->machine_type);
- tc->setIntReg(2, params()->atags_addr + _loadAddrOffset);
+ tc->setIntReg(2, params()->atags_addr + loadAddrOffset());
}
}
diff --git a/src/sim/kernel_workload.cc b/src/sim/kernel_workload.cc
index d144872..74e047f 100644
--- a/src/sim/kernel_workload.cc
+++ b/src/sim/kernel_workload.cc
@@ -56,9 +56,8 @@
if (_loadAddrMask == 0)
_loadAddrMask = mask(findMsbSet(_end - _start) + 1);
- image.move([this](Addr a) {
- return (a & _loadAddrMask) + _loadAddrOffset;
- });
+ image.move(std::bind(&KernelWorkload::relocateAddr, this,
+ std::placeholders::_1));
kernelSymtab = kernelObj->symtab();
Loader::debugSymbolTable.insert(kernelSymtab);
@@ -89,17 +88,14 @@
/**
* Load the kernel code into memory.
*/
- auto mapper = [this](Addr a) {
- return (a & _loadAddrMask) + _loadAddrOffset;
- };
if (params().object_file != "") {
if (params().addr_check) {
// Validate kernel mapping before loading binary
- fatal_if(!system->isMemAddr(mapper(_start)) ||
- !system->isMemAddr(mapper(_end)),
+ fatal_if(!system->isMemAddr(relocateAddr(_start)) ||
+ !system->isMemAddr(relocateAddr(_end)),
"Kernel is mapped to invalid location (not memory). "
"start (%#x) - end (%#x) %#x:%#x\n",
- _start, _end, mapper(_start), mapper(_end));
+ _start, _end, relocateAddr(_start),
relocateAddr(_end));
}
// Load program sections into memory
image.write(phys_mem);
@@ -119,7 +115,8 @@
if (load_addr != MaxAddr)
image = image.offset(load_addr);
else
- image = image.move(mapper);
+ image.move(std::bind(&KernelWorkload::relocateAddr, this,
+ std::placeholders::_1));
image.write(phys_mem);
}
}
@@ -136,6 +133,10 @@
kernelSymtab.unserialize("symtab", cp);
}
+Addr KernelWorkload::relocateAddr(Addr a) const {
+ return (a & loadAddrMask()) + loadAddrOffset();
+}
+
KernelWorkload *
KernelWorkloadParams::create()
{
diff --git a/src/sim/kernel_workload.hh b/src/sim/kernel_workload.hh
index e2aff08..0ea49ac 100644
--- a/src/sim/kernel_workload.hh
+++ b/src/sim/kernel_workload.hh
@@ -140,6 +140,10 @@
return e;
}
/** @} */
+
+ /** Position independent kernels may be relocated in memory to match
our
+ * memory space constraints, this function determines how that is
done. */
+ Addr relocateAddr(Addr a) const;
};
#endif // __SIM_KERNEL_WORKLOAD_HH__
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/35335
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Idc06ac9fd361c62dec3ef3d7db4d912068a28a88
Gerrit-Change-Number: 35335
Gerrit-PatchSet: 1
Gerrit-Owner: Ciro Santilli <ciro.santi...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s