diff options
author | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2018-10-29 11:10:33 +0000 |
---|---|---|
committer | Giacomo Travaglini <giacomo.travaglini@arm.com> | 2018-11-07 15:22:43 +0000 |
commit | 4c7051c23e6b0402939f23ea474ec59099ab4751 (patch) | |
tree | 06d36dc23dd692a05ed6667798e5ee172629a356 | |
parent | 6fa49382ef22e1b01fb24503e3bbe5ab3556750a (diff) | |
download | gem5-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.cc | 24 |
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); |