arch-arm: Deprecate usage of legacy bootloader patching
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 29 Oct 2018 11:10:33 +0000 (11:10 +0000)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Wed, 7 Nov 2018 15:22:43 +0000 (15:22 +0000)
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>

src/arch/arm/system.cc

index 063066151369d6874dbcb014182b05d262557204..164c9658b5538708eaf55d6167be0f2e4ea0ce54 100644 (file)
@@ -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);