Re: [PATCH 5/7] binman: Create FIT subentries in the FIT section, not its parent

2022-04-19 Thread Simon Glass
Hi Alper,

On Sun, 27 Mar 2022 at 09:32, Alper Nebi Yasak  wrote:
>
> When reading images from a file, each entry's data is read from its
> parent section as specified in the Entry.Create() call that created it.
> The FIT entry type has been creating its subentries under its parent
> (their grandparent), as creating them under the FIT entry resulted in an
> error until FIT was converted into a proper section.
>
> FIT subentries have their offsets relative to the FIT section, and
> reading those offsets in the parent section results in wrong data. The
> subentries rightfully belong under the FIT entries, so create them
> there. Add tests checking that we can extract the correct data for a FIT
> entry and its subentries.
>
> Signed-off-by: Alper Nebi Yasak 
> ---
>
>  tools/binman/etype/fit.py |  2 +-
>  tools/binman/ftest.py | 35 +
>  tools/binman/test/233_fit_extract_replace.dts | 74 +++
>  3 files changed, 110 insertions(+), 1 deletion(-)
>  create mode 100644 tools/binman/test/233_fit_extract_replace.dts

Reviewed-by: Simon Glass 

It's great to be able to replace data in FITs. It's quite a complex
case, but very useful I think.

Regards,
Simon


[PATCH 5/7] binman: Create FIT subentries in the FIT section, not its parent

2022-03-27 Thread Alper Nebi Yasak
When reading images from a file, each entry's data is read from its
parent section as specified in the Entry.Create() call that created it.
The FIT entry type has been creating its subentries under its parent
(their grandparent), as creating them under the FIT entry resulted in an
error until FIT was converted into a proper section.

FIT subentries have their offsets relative to the FIT section, and
reading those offsets in the parent section results in wrong data. The
subentries rightfully belong under the FIT entries, so create them
there. Add tests checking that we can extract the correct data for a FIT
entry and its subentries.

Signed-off-by: Alper Nebi Yasak 
---

 tools/binman/etype/fit.py |  2 +-
 tools/binman/ftest.py | 35 +
 tools/binman/test/233_fit_extract_replace.dts | 74 +++
 3 files changed, 110 insertions(+), 1 deletion(-)
 create mode 100644 tools/binman/test/233_fit_extract_replace.dts

diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
index 035719871e04..12306623af67 100644
--- a/tools/binman/etype/fit.py
+++ b/tools/binman/etype/fit.py
@@ -380,7 +380,7 @@ def _add_entries(base_node, depth, node):
 # section entries for them here to merge the content subnodes
 # together and put the merged contents in the subimage node's
 # 'data' property later.
-entry = Entry.Create(self.section, node, etype='section')
+entry = Entry.Create(self, node, etype='section')
 entry.ReadNode()
 # The hash subnodes here are for mkimage, not binman.
 entry.SetUpdateHash(False)
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 87c072ef9c9c..a31568997f6f 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -5568,6 +5568,41 @@ def testReplaceResizeNoRepackSmallerSize(self):
 self.assertIsNotNone(path)
 self.assertEqual(expected_fdtmap, fdtmap)
 
+def testExtractFit(self):
+"""Test extracting a FIT section"""
+self._DoReadFileRealDtb('233_fit_extract_replace.dts')
+image_fname = tools.get_output_filename('image.bin')
+
+fit_data = control.ReadEntry(image_fname, 'fit')
+fit = fdt.Fdt.FromData(fit_data)
+fit.Scan()
+
+# Check subentry data inside the extracted fit
+for node_path, expected in [
+('/images/kernel', U_BOOT_DATA),
+('/images/fdt-1', U_BOOT_NODTB_DATA),
+('/images/scr-1', COMPRESS_DATA),
+]:
+node = fit.GetNode(node_path)
+data = fit.GetProps(node)['data'].bytes
+self.assertEqual(expected, data)
+
+def testExtractFitSubentries(self):
+"""Test extracting FIT section subentries"""
+self._DoReadFileRealDtb('233_fit_extract_replace.dts')
+image_fname = tools.get_output_filename('image.bin')
+
+for entry_path, expected in [
+('fit/kernel', U_BOOT_DATA),
+('fit/kernel/u-boot', U_BOOT_DATA),
+('fit/fdt-1', U_BOOT_NODTB_DATA),
+('fit/fdt-1/u-boot-nodtb', U_BOOT_NODTB_DATA),
+('fit/scr-1', COMPRESS_DATA),
+('fit/scr-1/blob', COMPRESS_DATA),
+]:
+data = control.ReadEntry(image_fname, entry_path)
+self.assertEqual(expected, data)
+
 
 if __name__ == "__main__":
 unittest.main()
diff --git a/tools/binman/test/233_fit_extract_replace.dts 
b/tools/binman/test/233_fit_extract_replace.dts
new file mode 100644
index ..b44d05afe1af
--- /dev/null
+++ b/tools/binman/test/233_fit_extract_replace.dts
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+   #address-cells = <1>;
+   #size-cells = <1>;
+
+   binman {
+   allow-repack;
+
+   fill {
+   size = <0x1000>;
+   fill-byte = [77];
+   };
+
+   fit {
+   description = "test-desc";
+   #address-cells = <1>;
+
+   images {
+   kernel {
+   description = "test u-boot";
+   type = "kernel";
+   arch = "arm64";
+   os = "linux";
+   compression = "none";
+   load = <>;
+   entry = <>;
+
+   u-boot {
+   };
+   };
+
+   fdt-1 {
+   description = "test u-boot-nodtb";
+   type = "flat_dt";
+   arch = "arm64";
+