Brandon Potter has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/23145 )

Change subject: base: add features to MemoryImage::Segment
......................................................................

base: add features to MemoryImage::Segment

This changeset adds some helper methods to Segment to allow
usage of standard algorithms in a subsequent changeset. The
following changeset needs to be able to sort and partition
the segments.

Change-Id: I8a481c69b5ec142ee36b6884c009f32d12b411e0
---
M src/base/loader/elf_object.cc
M src/base/loader/memory_image.hh
2 files changed, 15 insertions(+), 8 deletions(-)



diff --git a/src/base/loader/elf_object.cc b/src/base/loader/elf_object.cc
index bbaa27b..69038a3 100644
--- a/src/base/loader/elf_object.cc
+++ b/src/base/loader/elf_object.cc
@@ -258,7 +258,7 @@
     auto name = std::to_string(seg_num);

     image.addSegment({ name, phdr.p_paddr, imageData,
-                       phdr.p_offset, phdr.p_filesz });
+                       phdr.p_offset, phdr.p_filesz, phdr.p_flags });
     Addr uninitialized = phdr.p_memsz - phdr.p_filesz;
     if (uninitialized) {
         // There may be parts of a segment which aren't included in the
@@ -266,7 +266,8 @@
         // data to take up the extra space. This should be zeroed when
         // loaded into memory.
         image.addSegment({ name + "(uninitialized)",
-                           phdr.p_paddr + phdr.p_filesz, uninitialized });
+                           phdr.p_paddr + phdr.p_filesz, uninitialized,
+                           phdr.p_flags});
     }

     const Addr file_start = phdr.p_offset;
diff --git a/src/base/loader/memory_image.hh b/src/base/loader/memory_image.hh
index a10daba..ce91e94 100644
--- a/src/base/loader/memory_image.hh
+++ b/src/base/loader/memory_image.hh
@@ -51,17 +51,19 @@
     struct Segment
     {
         Segment(const std::string &_name, Addr _base,
-                const uint8_t *_data, size_t _size) :
-            name(_name), base(_base), data(_data), size(_size)
+                const uint8_t *_data, size_t _size, unsigned _flags = 0) :
+ name(_name), base(_base), data(_data), size(_size), flags(_flags)
         {}

-        Segment(const std::string &_name, Addr _base, size_t _size) :
-            name(_name), base(_base), size(_size)
+        Segment(const std::string &_name, Addr _base, size_t _size,
+                unsigned _flags = 0) :
+            name(_name), base(_base), size(_size), flags(_flags)
         {}

         Segment(const std::string &_name, Addr _base,
-                const ImageFileDataPtr &_ifd, Addr offset, size_t _size) :
-            ifd(_ifd), name(_name), base(_base), size(_size)
+                const ImageFileDataPtr &_ifd, Addr offset, size_t _size,
+                unsigned _flags = 0) :
+            ifd(_ifd), name(_name), base(_base), size(_size), flags(_flags)
         {
             panic_if(offset + size > ifd->len(),
                     "Segment outside the bounds of the image data");
@@ -72,11 +74,15 @@
             Segment(_name, 0, _ifd, 0, _ifd->len())
         {}

+        bool executable() const { return flags & 0x1; }
+        bool operator <(const Segment& o) const { return base < o.base; }
+
         ImageFileDataPtr ifd;
         std::string name;
         Addr base = 0;
         const uint8_t *data = nullptr;
         size_t size = 0;
+        unsigned flags;
     };

     MemoryImage() {}

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/23145
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: I8a481c69b5ec142ee36b6884c009f32d12b411e0
Gerrit-Change-Number: 23145
Gerrit-PatchSet: 1
Gerrit-Owner: Brandon Potter <brandon.pot...@amd.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to