Ciro Santilli has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/35335 )

Change subject: sim: factor fs_workload address relocation
......................................................................

sim: factor fs_workload address relocation

The same operation was being done from three different places, this commit
factors them out with KernelWorkload::relocateAddr.

Also always call the function instead of using the member in case the
getter starts doing some extra logic later on.

Change-Id: Idc06ac9fd361c62dec3ef3d7db4d912068a28a88
---
M src/arch/arm/freebsd/fs_workload.cc
M src/arch/arm/fs_workload.cc
M src/arch/arm/linux/fs_workload.cc
M src/sim/kernel_workload.cc
M src/sim/kernel_workload.hh
5 files changed, 29 insertions(+), 23 deletions(-)



diff --git a/src/arch/arm/freebsd/fs_workload.cc b/src/arch/arm/freebsd/fs_workload.cc
index 080dc35..79bc5e6 100644
--- a/src/arch/arm/freebsd/fs_workload.cc
+++ b/src/arch/arm/freebsd/fs_workload.cc
@@ -81,7 +81,8 @@
     // to do this permanently, for but early bootup work
     // it is helpful.
     if (params()->early_kernel_symbols) {
- auto phys_globals = kernelObj->symtab().globals()->mask(_loadAddrMask);
+        auto phys_globals = kernelObj->symtab().globals()->mask(
+                loadAddrMask());
         kernelSymtab.insert(*phys_globals);
         Loader::debugSymbolTable.insert(*phys_globals);
     }
@@ -95,7 +96,7 @@
     // Kernel supports flattened device tree and dtb file specified.
     // Using Device Tree Blob to describe system configuration.
     inform("Loading DTB file: %s at address %#x\n", params()->dtb_filename,
-            params()->atags_addr + _loadAddrOffset);
+            params()->atags_addr + loadAddrOffset());

     auto *dtb_file = new ::Loader::DtbFile(params()->dtb_filename);

@@ -108,7 +109,7 @@
         bootReleaseAddr = ra & ~ULL(0x7F);

     dtb_file->buildImage().
-        offset(params()->atags_addr + _loadAddrOffset).
+        offset(params()->atags_addr + loadAddrOffset()).
         write(system->physProxy);
     delete dtb_file;

@@ -116,7 +117,7 @@
     for (auto *tc: system->threads) {
         tc->setIntReg(0, 0);
         tc->setIntReg(1, params()->machine_type);
-        tc->setIntReg(2, params()->atags_addr + _loadAddrOffset);
+        tc->setIntReg(2, params()->atags_addr + loadAddrOffset());
     }
 }

diff --git a/src/arch/arm/fs_workload.cc b/src/arch/arm/fs_workload.cc
index 0cafb1b..1fae3ab 100644
--- a/src/arch/arm/fs_workload.cc
+++ b/src/arch/arm/fs_workload.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010, 2012-2013, 2015,2017-2019 ARM Limited
+ * Copyright (c) 2010, 2012-2013, 2015,2017-2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -72,8 +72,7 @@
 FsWorkload::FsWorkload(Params *p) : KernelWorkload(*p)
 {
     if (kernelObj) {
-        kernelEntry = (kernelObj->entryPoint() & loadAddrMask()) +
-            loadAddrOffset();
+        kernelEntry = relocateAddr(kernelObj->entryPoint());
     }

     bootLoaders.reserve(p->boot_loader.size());
diff --git a/src/arch/arm/linux/fs_workload.cc b/src/arch/arm/linux/fs_workload.cc
index 8aba285..dc36195 100644
--- a/src/arch/arm/linux/fs_workload.cc
+++ b/src/arch/arm/linux/fs_workload.cc
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2010-2013, 2016 ARM Limited
+ * Copyright (c) 2010-2013, 2016, 2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -76,7 +76,8 @@
     // to do this permanently, for but early bootup work
     // it is helpful.
     if (params()->early_kernel_symbols) {
- auto phys_globals = kernelObj->symtab().globals()->mask(_loadAddrMask);
+        auto phys_globals = kernelObj->symtab().globals()->mask(
+                loadAddrMask());
         kernelSymtab.insert(*phys_globals);
         Loader::debugSymbolTable.insert(*phys_globals);
     }
@@ -92,7 +93,7 @@
         // Kernel supports flattened device tree and dtb file specified.
         // Using Device Tree Blob to describe system configuration.
inform("Loading DTB file: %s at address %#x\n", params()->dtb_filename,
-                params()->atags_addr + _loadAddrOffset);
+                params()->atags_addr + loadAddrOffset());

         auto *dtb_file = new ::Loader::DtbFile(params()->dtb_filename);

@@ -103,7 +104,7 @@
         }

         dtb_file->buildImage().
-            offset(params()->atags_addr + _loadAddrOffset).
+            offset(params()->atags_addr + loadAddrOffset()).
             write(system->physProxy);
         delete dtb_file;
     } else {
@@ -152,7 +153,7 @@
         DPRINTF(Loader, "Boot atags was %d bytes in total\n", size << 2);
         DDUMP(Loader, boot_data, size << 2);

-        system->physProxy.writeBlob(params()->atags_addr + _loadAddrOffset,
+ system->physProxy.writeBlob(params()->atags_addr + loadAddrOffset(),
                                     boot_data, size << 2);

         delete[] boot_data;
@@ -162,7 +163,7 @@
     for (auto *tc: system->threads) {
         tc->setIntReg(0, 0);
         tc->setIntReg(1, params()->machine_type);
-        tc->setIntReg(2, params()->atags_addr + _loadAddrOffset);
+        tc->setIntReg(2, params()->atags_addr + loadAddrOffset());
     }
 }

diff --git a/src/sim/kernel_workload.cc b/src/sim/kernel_workload.cc
index d144872..74e047f 100644
--- a/src/sim/kernel_workload.cc
+++ b/src/sim/kernel_workload.cc
@@ -56,9 +56,8 @@
         if (_loadAddrMask == 0)
             _loadAddrMask = mask(findMsbSet(_end - _start) + 1);

-        image.move([this](Addr a) {
-            return (a & _loadAddrMask) + _loadAddrOffset;
-        });
+        image.move(std::bind(&KernelWorkload::relocateAddr, this,
+                std::placeholders::_1));

         kernelSymtab = kernelObj->symtab();
         Loader::debugSymbolTable.insert(kernelSymtab);
@@ -89,17 +88,14 @@
     /**
      * Load the kernel code into memory.
      */
-    auto mapper = [this](Addr a) {
-        return (a & _loadAddrMask) + _loadAddrOffset;
-    };
     if (params().object_file != "")  {
         if (params().addr_check) {
             // Validate kernel mapping before loading binary
-            fatal_if(!system->isMemAddr(mapper(_start)) ||
-                    !system->isMemAddr(mapper(_end)),
+            fatal_if(!system->isMemAddr(relocateAddr(_start)) ||
+                    !system->isMemAddr(relocateAddr(_end)),
                     "Kernel is mapped to invalid location (not memory). "
                     "start (%#x) - end (%#x) %#x:%#x\n",
-                    _start, _end, mapper(_start), mapper(_end));
+ _start, _end, relocateAddr(_start), relocateAddr(_end));
         }
         // Load program sections into memory
         image.write(phys_mem);
@@ -119,7 +115,8 @@
         if (load_addr != MaxAddr)
             image = image.offset(load_addr);
         else
-            image = image.move(mapper);
+            image.move(std::bind(&KernelWorkload::relocateAddr, this,
+                    std::placeholders::_1));
         image.write(phys_mem);
     }
 }
@@ -136,6 +133,10 @@
     kernelSymtab.unserialize("symtab", cp);
 }

+Addr KernelWorkload::relocateAddr(Addr a) const {
+    return (a & loadAddrMask()) + loadAddrOffset();
+}
+
 KernelWorkload *
 KernelWorkloadParams::create()
 {
diff --git a/src/sim/kernel_workload.hh b/src/sim/kernel_workload.hh
index e2aff08..0ea49ac 100644
--- a/src/sim/kernel_workload.hh
+++ b/src/sim/kernel_workload.hh
@@ -140,6 +140,10 @@
         return e;
     }
     /** @} */
+
+ /** Position independent kernels may be relocated in memory to match our + * memory space constraints, this function determines how that is done. */
+    Addr relocateAddr(Addr a) const;
 };

 #endif // __SIM_KERNEL_WORKLOAD_HH__

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/35335
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: Idc06ac9fd361c62dec3ef3d7db4d912068a28a88
Gerrit-Change-Number: 35335
Gerrit-PatchSet: 1
Gerrit-Owner: Ciro Santilli <ciro.santi...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to