diff mbox series

[v2,18/28] binman: Set section contents in GetData()

Message ID 20201026234026.1903778-18-sjg@chromium.org
State Accepted
Commit 63e7ba6c1820def06e7ba88ce357cb605285e70c
Delegated to: Simon Glass
Headers show
Series binman: Support compression of sections | expand

Commit Message

Simon Glass Oct. 26, 2020, 11:40 p.m. UTC
Section contents is not set up when ObtainContents() is called, since
packing often changes the layout of the contents. Ensure that the contents
are correctly recorded by making this function regenerate the section. It
is normally only called by the parent section (when packing) or by the
top-level image code, when writing out the image. So the performance
impact is fairly small.

Now that sections have their contents in their 'data' property, update
testSkipAtStartSectionPad() to check it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Update testSkipAtStartSectionPad() to check section.data

 tools/binman/entry.py         |  6 ++++++
 tools/binman/etype/section.py | 14 +++++++++++++-
 tools/binman/ftest.py         |  4 +++-
 3 files changed, 22 insertions(+), 2 deletions(-)

Comments

Simon Glass Oct. 30, 2020, 3:33 a.m. UTC | #1
Section contents is not set up when ObtainContents() is called, since
packing often changes the layout of the contents. Ensure that the contents
are correctly recorded by making this function regenerate the section. It
is normally only called by the parent section (when packing) or by the
top-level image code, when writing out the image. So the performance
impact is fairly small.

Now that sections have their contents in their 'data' property, update
testSkipAtStartSectionPad() to check it.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

Changes in v2:
- Update testSkipAtStartSectionPad() to check section.data

 tools/binman/entry.py         |  6 ++++++
 tools/binman/etype/section.py | 14 +++++++++++++-
 tools/binman/ftest.py         |  4 +++-
 3 files changed, 22 insertions(+), 2 deletions(-)

Applied to u-boot-dm, thanks!
diff mbox series

Patch

diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index d701eaff8fd..01a5fde84ed 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -437,6 +437,12 @@  class Entry(object):
         return self._node.path
 
     def GetData(self):
+        """Get the contents of an entry
+
+        Returns:
+            bytes content of the entry, excluding any padding. If the entry is
+                compressed, the compressed data is returned
+        """
         self.Detail('GetData: size %s' % ToHexSize(self.data))
         return self.data
 
diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py
index c423a22c80f..6e6f6749727 100644
--- a/tools/binman/etype/section.py
+++ b/tools/binman/etype/section.py
@@ -226,7 +226,19 @@  class Entry_section(Entry):
         return section.GetPaddedDataForEntry(self)
 
     def GetData(self):
-        return self._BuildSectionData()
+        """Get the contents of an entry
+
+        This builds the contents of the section, stores this as the contents of
+        the section and returns it
+
+        Returns:
+            bytes content of the section, made up for all all of its subentries.
+            This excludes any padding. If the section is compressed, the
+            compressed data is returned
+        """
+        data = self._BuildSectionData()
+        self.SetContents(data)
+        return data
 
     def GetOffsets(self):
         """Handle entries that want to set the offset/size of other entries
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 4c94bea6f00..6f47deac3b6 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -1822,6 +1822,8 @@  class TestFunctional(unittest.TestCase):
         orig = self._decompress(entry.data)
         self.assertEqual(orig, entry.uncomp_data)
 
+        self.assertEqual(image.data, entry.data)
+
         expected = {
             'blob:uncomp-size': len(COMPRESS_DATA),
             'blob:size': len(data),
@@ -3890,7 +3892,7 @@  class TestFunctional(unittest.TestCase):
         section = entries['section']
         self.assertEqual(0, section.offset)
         self.assertEqual(len(all), section.size)
-        self.assertIsNone(section.data)
+        self.assertEqual(U_BOOT_DATA, section.data)
         self.assertEqual(all, section.GetPaddedData())
 
         entry = section.GetEntries()['u-boot']