summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2018-10-29 11:10:33 +0000
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2018-11-07 15:22:43 +0000
commit4c7051c23e6b0402939f23ea474ec59099ab4751 (patch)
tree06d36dc23dd692a05ed6667798e5ee172629a356
parent6fa49382ef22e1b01fb24503e3bbe5ab3556750a (diff)
downloadgem5-4c7051c23e6b0402939f23ea474ec59099ab4751.tar.xz
arch-arm: Deprecate usage of legacy bootloader patching
This patch is implicitly deprecating the usage of bootloader patching, which is injecting instructions from gem5 into the bootloader binary. This was probably meant to provide a dynamic bootloader entry point. This is not needed in ARMv8.0, since we can simply update the ArmSystem::resetAddress with the bootloader entry point. Change-Id: I0c469873b8d69f7b49a7383e0754468bc1f2bd72 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/14001 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
-rw-r--r--src/arch/arm/system.cc24
1 files changed, 7 insertions, 17 deletions
diff --git a/src/arch/arm/system.cc b/src/arch/arm/system.cc
index 063066151..164c9658b 100644
--- a/src/arch/arm/system.cc
+++ b/src/arch/arm/system.cc
@@ -104,6 +104,12 @@ ArmSystem::ArmSystem(Params *p)
if (bootldr) {
bootldr->loadGlobalSymbols(debugSymbolTable);
+
+ warn_if(bootldr->entryPoint() != _resetAddr,
+ "Bootloader entry point %#x overriding reset address %#x",
+ bootldr->entryPoint(), _resetAddr);
+ const_cast<Addr&>(_resetAddr) = bootldr->entryPoint();
+
if ((bootldr->getArch() == ObjectFile::Arm64) && !_highestELIs64) {
warn("Highest ARM exception-level set to AArch32 but bootloader "
"is for AArch64. Assuming you wanted these to match.\n");
@@ -132,22 +138,6 @@ ArmSystem::initState()
if (bootldr) {
bootldr->loadSections(physProxy);
- uint8_t jump_to_bl_32[] =
- {
- 0x07, 0xf0, 0xa0, 0xe1 // branch to r7 in aarch32
- };
-
- uint8_t jump_to_bl_64[] =
- {
- 0xe0, 0x00, 0x1f, 0xd6 // instruction "br x7" in aarch64
- };
-
- // write the jump to branch table into address 0
- if (!_highestELIs64)
- physProxy.writeBlob(0x0, jump_to_bl_32, sizeof(jump_to_bl_32));
- else
- physProxy.writeBlob(0x0, jump_to_bl_64, sizeof(jump_to_bl_64));
-
inform("Using bootloader at address %#x\n", bootldr->entryPoint());
// Put the address of the boot loader into r7 so we know
@@ -160,9 +150,9 @@ ArmSystem::initState()
if (!_highestELIs64)
threadContexts[i]->setIntReg(3, (kernelEntry & loadAddrMask) +
loadAddrOffset);
+
threadContexts[i]->setIntReg(4, params()->gic_cpu_addr);
threadContexts[i]->setIntReg(5, params()->flags_addr);
- threadContexts[i]->setIntReg(7, bootldr->entryPoint());
}
inform("Using kernel entry physical address at %#x\n",
(kernelEntry & loadAddrMask) + loadAddrOffset);