summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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");