Giacomo Travaglini has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/23566 )

Change subject: sim: kernelExtras optional load addresses
......................................................................

sim: kernelExtras optional load addresses

This patch provides a new "System" parameter named "kernel_extras_addrs".
This allows to optionally specify fixed load addresses for the
additional kernel objects. This is useful to load arbitrary blobs into
memory.

Change-Id: I4725763b86c29f72282d1c184d4284d90f9d3016
Reviewed-by: Giacomo Travaglini <[email protected]>
---
M src/sim/System.py
M src/sim/system.cc
2 files changed, 23 insertions(+), 8 deletions(-)



diff --git a/src/sim/System.py b/src/sim/System.py
index 9928887..619b54e 100644
--- a/src/sim/System.py
+++ b/src/sim/System.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2017 ARM Limited
+# Copyright (c) 2017, 2019 ARM Limited
 # All rights reserved.
 #
 # The license below extends only to copyright in the software and shall
@@ -107,7 +107,9 @@
     kernel = Param.String("", "file that contains the kernel code")
     kernel_addr_check = Param.Bool(True,
         "whether to address check on kernel (disable for baremetal)")
- kernel_extras = VectorParam.String([],"Additional object files to load") + kernel_extras = VectorParam.String([], "Additional object files to load")
+    kernel_extras_addrs = VectorParam.Addr([],
+        "Load addresses for additional object files")
     readfile = Param.String("", "file to read startup script from")
     symbolfile = Param.String("", "file to get the symbols from")
     load_addr_mask = Param.UInt64(0xffffffffffffffff,
diff --git a/src/sim/system.cc b/src/sim/system.cc
index 8c43808..bb278ef 100644
--- a/src/sim/system.cc
+++ b/src/sim/system.cc
@@ -192,10 +192,15 @@
             // connected so it will happen in initState()
         }

-        for (const auto &obj_name : p->kernel_extras) {
-            inform("Loading additional kernel object: %s", obj_name);
-            ObjectFile *obj = createObjectFile(obj_name);
-            fatal_if(!obj, "Failed to additional kernel object '%s'.\n",
+        if (p->kernel_extras_addrs.empty())
+ p->kernel_extras_addrs.resize(p->kernel_extras.size(), MaxAddr);
+        fatal_if(p->kernel_extras.size() != p->kernel_extras_addrs.size(),
+ "Additional kernel objects, not all load addresses specified\n"); + for (int ker_idx = 0; ker_idx < p->kernel_extras.size(); ker_idx++) {
+            const std::string &obj_name = p->kernel_extras[ker_idx];
+            const bool raw = p->kernel_extras_addrs[ker_idx] != MaxAddr;
+            ObjectFile *obj = createObjectFile(obj_name, raw);
+ fatal_if(!obj, "Failed to build additional kernel object '%s'.\n",
                      obj_name);
             kernelExtras.push_back(obj);
         }
@@ -360,8 +365,16 @@
             DPRINTF(Loader, "Kernel entry = %#x\n", kernelEntry);
             DPRINTF(Loader, "Kernel loaded...\n");
         }
-        for (const auto &extra_kernel : kernelExtras)
-            extra_kernel->buildImage().move(mapper).write(physProxy);
+        std::function<Addr(Addr)> extra_mapper;
+        for (int ker_idx = 0; ker_idx < kernelExtras.size(); ker_idx++) {
+            const auto &extra_kernel = kernelExtras[ker_idx];
+            const Addr &load_addr = params()->kernel_extras_addrs[ker_idx];
+            if (load_addr != MaxAddr)
+ extra_mapper = [load_addr](Addr a) { return a + load_addr; };
+            else
+                extra_mapper = mapper;
+            extra_kernel->buildImage().move(extra_mapper).write(physProxy);
+        }
     }
 }


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

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I4725763b86c29f72282d1c184d4284d90f9d3016
Gerrit-Change-Number: 23566
Gerrit-PatchSet: 1
Gerrit-Owner: Giacomo Travaglini <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to