summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeoffrey Blake <Geoffrey.Blake@arm.com>2016-05-12 11:47:43 -0500
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-11-17 10:54:24 +0000
commit62ae85c0a2db286bcf1c8df5ad8f97a8bd527a55 (patch)
tree611493f08e164caad33b067b30f7134bcb598684
parent463a4bb6cdaa16e22a4302bbc6301c6d90e524c8 (diff)
downloadgem5-62ae85c0a2db286bcf1c8df5ad8f97a8bd527a55.tar.xz
sim: Implement load_addr_mask auto-calculation
Recent Linux kernels for AArch64 have changed their start addresses but we still want to relocate the kernel to 0x80080000 which required hacking the load_addr_mask in Realview.py to be 0x7ffffff from 0xfffffff to mask off the proper number of MSBs to load the kernel in the desired location. To avoid having to make this change in the future again, we auto-calculate the load_addr_mask if it is specified as 0x0 in the System sim-object to find the most restrictive address mask instead of having the configuration specify it. If the configuration does specify the address mask, we use it instead of auto-calculating. Change-Id: I18aabb5d09945c6e3e3819c9c8036ea24b6c35cf Signed-off-by: Geoffrey Blake <Geoffrey.Blake@arm.com> Reviewed-by: Curtis Dunham <curtis.dunham@arm.com> Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/2323 Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
-rw-r--r--src/arch/arm/ArmSystem.py8
-rw-r--r--src/dev/arm/RealView.py6
-rw-r--r--src/sim/System.py18
-rw-r--r--src/sim/system.cc10
4 files changed, 30 insertions, 12 deletions
diff --git a/src/arch/arm/ArmSystem.py b/src/arch/arm/ArmSystem.py
index 4fa9fd858..b42f219ef 100644
--- a/src/arch/arm/ArmSystem.py
+++ b/src/arch/arm/ArmSystem.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2009, 2012-2013, 2015 ARM Limited
+# Copyright (c) 2009, 2012-2013, 2015-2017 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
@@ -52,7 +52,6 @@ class ArmMachineType(Enum):
class ArmSystem(System):
type = 'ArmSystem'
cxx_header = "arch/arm/system.hh"
- load_addr_mask = 0xffffffff
multi_proc = Param.Bool(True, "Multiprocessor system?")
boot_loader = VectorParam.String([],
"File that contains the boot loader code. Zero or more files may be "
@@ -83,7 +82,6 @@ class ArmSystem(System):
class GenericArmSystem(ArmSystem):
type = 'GenericArmSystem'
cxx_header = "arch/arm/system.hh"
- load_addr_mask = 0x0fffffff
machine_type = Param.ArmMachineType('DTOnly',
"Machine id from http://www.arm.linux.org.uk/developer/machines/")
atags_addr = Param.Addr("Address where default atags structure should " \
@@ -108,6 +106,10 @@ class LinuxArmSystem(GenericArmSystem):
"""Dump dmesg from the simulated kernel to standard out"""
pass
+ # Have Linux systems for ARM auto-calc their load_addr_mask for proper
+ # kernel relocation.
+ load_addr_mask = 0x0
+
class FreebsdArmSystem(GenericArmSystem):
type = 'FreebsdArmSystem'
cxx_header = "arch/arm/freebsd/system.hh"
diff --git a/src/dev/arm/RealView.py b/src/dev/arm/RealView.py
index 08145bf66..699b7dfb7 100644
--- a/src/dev/arm/RealView.py
+++ b/src/dev/arm/RealView.py
@@ -369,7 +369,6 @@ class RealView(Platform):
self.nvmem.port = mem_bus.master
cur_sys.boot_loader = loc('boot.arm')
cur_sys.atags_addr = 0x100
- cur_sys.load_addr_mask = 0xfffffff
cur_sys.load_offset = 0
@@ -746,7 +745,6 @@ class VExpress_EMM(RealView):
if not cur_sys.boot_loader:
cur_sys.boot_loader = loc('boot_emm.arm')
cur_sys.atags_addr = 0x8000000
- cur_sys.load_addr_mask = 0xfffffff
cur_sys.load_offset = 0x80000000
class VExpress_EMM64(VExpress_EMM):
@@ -764,7 +762,6 @@ class VExpress_EMM64(VExpress_EMM):
if not cur_sys.boot_loader:
cur_sys.boot_loader = loc('boot_emm.arm64')
cur_sys.atags_addr = 0x8000000
- cur_sys.load_addr_mask = 0xfffffff
cur_sys.load_offset = 0x80000000
@@ -936,9 +933,6 @@ Interrupts:
if not cur_sys.boot_loader:
cur_sys.boot_loader = [ loc('boot_emm.arm64'), loc('boot_emm.arm') ]
cur_sys.atags_addr = 0x8000000
- # the old load_add_mask 0xfffffff works for 32-bit kernel
- # but not the 64-bit one. The new value 0x7ffffff works for both
- cur_sys.load_addr_mask = 0x7ffffff
cur_sys.load_offset = 0x80000000
# Setup m5ops. It's technically not a part of the boot
diff --git a/src/sim/System.py b/src/sim/System.py
index 68761384b..f45decb6b 100644
--- a/src/sim/System.py
+++ b/src/sim/System.py
@@ -1,3 +1,15 @@
+# Copyright (c) 2017 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder. You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
# Copyright (c) 2005-2007 The Regents of The University of Michigan
# Copyright (c) 2011 Regents of the University of California
# All rights reserved.
@@ -96,8 +108,10 @@ class System(MemObject):
kernel_extras = VectorParam.String([],"Additional object files to load")
readfile = Param.String("", "file to read startup script from")
symbolfile = Param.String("", "file to get the symbols from")
- load_addr_mask = Param.UInt64(0xffffffffff,
- "Address to mask loading binaries with")
+ load_addr_mask = Param.UInt64(0xffffffffffffffff,
+ "Address to mask loading binaries with, if 0, system "
+ "auto-calculates the mask to be the most restrictive, "
+ "otherwise it obeys a custom mask.")
load_offset = Param.UInt64(0, "Address to offset loading binaries with")
multi_thread = Param.Bool(False,
diff --git a/src/sim/system.cc b/src/sim/system.cc
index 9d0b919ca..e720db07a 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2014 ARM Limited
+ * Copyright (c) 2011-2014,2017 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
@@ -158,6 +158,14 @@ System::System(Params *p)
kernelEnd = kernel->bssBase() + kernel->bssSize();
kernelEntry = kernel->entryPoint();
+ // If load_addr_mask is set to 0x0, then auto-calculate
+ // the smallest mask to cover all kernel addresses so gem5
+ // can relocate the kernel to a new offset.
+ if (loadAddrMask == 0) {
+ Addr shift_amt = findMsbSet(kernelEnd - kernelStart) + 1;
+ loadAddrMask = ((Addr)1 << shift_amt) - 1;
+ }
+
// load symbols
if (!kernel->loadGlobalSymbols(kernelSymtab))
fatal("could not load kernel symbols\n");