From: Giacomo Travaglini Date: Mon, 29 Oct 2018 11:10:33 +0000 (+0000) Subject: arch-arm: Deprecate usage of legacy bootloader patching X-Git-Tag: v19.0.0.0~1422 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4c7051c23e6b0402939f23ea474ec59099ab4751;p=gem5.git 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 Reviewed-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/c/14001 Maintainer: Andreas Sandberg --- 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(_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);