binman: Avoid needing the section size in advance
authorSimon Glass <sjg@chromium.org>
Sat, 24 Aug 2019 13:23:03 +0000 (07:23 -0600)
committerSimon Glass <sjg@chromium.org>
Tue, 15 Oct 2019 14:40:02 +0000 (08:40 -0600)
Entries which include a section and need to obtain its contents call
GetData(), as with any other entry. But the current implementation of this
method in entry_Section requires the size of the section to be known. If
it is unknown, an error is produced, since size is None:

   TypeError: can't multiply sequence by non-int of type 'NoneType'

There is no need to know the size in advance since the code can be
adjusted to build up the section piece by piece, instead of patching each
entry into an existing bytearray.

Update the code to handle this and add a test.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/binman/etype/section.py
tools/binman/ftest.py
tools/binman/test/151_x86_rom_ifwi_section.dts [new file with mode: 0644]

index 8179daf5628da928346c853e375617c88ed0db5f..8fea6e0b24e3f7ec34bf22f57c46e57494ee3ba9 100644 (file)
@@ -142,13 +142,19 @@ class Entry_section(Entry):
         return self.GetEntryContents()
 
     def GetData(self):
-        section_data = tools.GetBytes(self._pad_byte, self.size)
+        section_data = b''
 
         for entry in self._entries.values():
             data = entry.GetData()
-            base = self.pad_before + entry.offset - self._skip_at_start
-            section_data = (section_data[:base] + data +
-                            section_data[base + len(data):])
+            base = self.pad_before + (entry.offset or 0) - self._skip_at_start
+            pad = base - len(section_data)
+            if pad > 0:
+                section_data += tools.GetBytes(self._pad_byte, pad)
+            section_data += data
+        if self.size:
+            pad = self.size - len(section_data)
+            if pad > 0:
+                section_data += tools.GetBytes(self._pad_byte, pad)
         self.Detail('GetData: %d entries, total size %#x' %
                     (len(self._entries), len(section_data)))
         return section_data
index fe3365255f14de961ba0249837fb70a377bd1949..6b0ab7fdc2a830a91ef8697265a2f5c35bcce731 100644 (file)
@@ -3321,6 +3321,12 @@ class TestFunctional(unittest.TestCase):
         expected4 = sym_values + U_BOOT_TPL_DATA[16:]
         self.assertEqual(expected4, data[upto3:])
 
+    def testPackX86RomIfwiSectiom(self):
+        """Test that a section can be placed in an IFWI region"""
+        self._SetupIfwi('fitimage.bin')
+        data = self._DoReadFile('151_x86_rom_ifwi_section.dts')
+        self._CheckIfwi(data)
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/test/151_x86_rom_ifwi_section.dts b/tools/binman/test/151_x86_rom_ifwi_section.dts
new file mode 100644 (file)
index 0000000..7e455c3
--- /dev/null
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+       #address-cells = <1>;
+       #size-cells = <1>;
+
+       binman {
+               sort-by-offset;
+               end-at-4gb;
+               size = <0x800000>;
+               intel-descriptor {
+                       filename = "descriptor.bin";
+               };
+
+               intel-ifwi {
+                       offset-unset;
+                       filename = "fitimage.bin";
+                       convert-fit;
+
+                       section {
+                               ifwi-replace;
+                               ifwi-subpart = "IBBP";
+                               ifwi-entry = "IBBL";
+                               u-boot-tpl {
+                               };
+                               u-boot-dtb {
+                               };
+                       };
+               };
+       };
+};