[PATCH v2 4/5] binman: Convert FIT entry type to a subclass of Section entry type

Alper Nebi Yasak alpernebiyasak at gmail.com
Fri Feb 18 18:34:37 CET 2022


On 18/02/2022 19:50, Jan Kiszka wrote:
> On 15.02.22 18:06, Jan Kiszka wrote:
>> On 15.02.22 17:50, Jan Kiszka wrote:
>>> On 15.02.22 13:27, Alper Nebi Yasak wrote:
>>>> The AddMissingProperties() and SetCalculatedProperties() methods were
>>>> disabled for FIT as a fixup to this patch, that's why image-pos etc.
>>>> aren't available. See comments at [1] for some context.
>>>>
>>>> Hopefully my two patches [2][3] fix things, can you test with them?
>>>>
>>>> [1] "binman: Correct the error message for a bad hash algorithm"
>>>> https://patchwork.ozlabs.org/project/uboot/patch/20220208105941.1.I8f212a1150defebaf8b7b15a79f7a2fc62c276b2@changeid/
>>>>
>>>> [2] "binman: Skip processing "hash" subnodes of FIT subsections"
>>>> https://patchwork.ozlabs.org/project/uboot/patch/20220209190236.26479-1-alpernebiyasak@gmail.com/
>>>>
>>>
>>> This one helped, indeed.
>>>
>>
>> ...not completely:
>>
>> $ source/tools/binman/binman replace -i flash.bin -f fit at 0x380000.fit
>> fit at 0x380000binman: [Errno 13] Permission denied: '/.fit at 0x380000.itb'
>>
> 
> Ping.
> 
> $ source/tools/binman/binman -D replace -i flash.bin -f fit at 0x380000.fit fit at 0x380000
> binman: [Errno 13] Permission denied: '/.fit at 0x380000.itb'
> 
> Traceback (most recent call last):
>   File "source/tools/binman/binman", line 141, in RunBinman
>     ret_code = control.Binman(args)
>   File "u-boot/tools/binman/control.py", line 644, in Binman
>     allow_resize=not args.fix_size, write_map=args.map)
>   File "u-boot/tools/binman/control.py", line 404, in ReplaceEntries
>     allow_resize=allow_resize, write_map=write_map)
>   File "u-boot/tools/binman/control.py", line 341, in WriteEntryToImage
>     AfterReplace(image, allow_resize=allow_resize, write_map=write_map)
>   File "u-boot/tools/binman/control.py", line 333, in AfterReplace
>     get_contents=False, allow_resize=allow_resize)
>   File "u-boot/tools/binman/control.py", line 560, in ProcessImage
>     image.PackEntries()
>   File "u-boot/tools/binman/image.py", line 155, in PackEntries
>     super().Pack(0)
>   File "u-boot/tools/binman/etype/section.py", line 385, in Pack
>     self._PackEntries()
>   File "u-boot/tools/binman/etype/section.py", line 403, in _PackEntries
>     offset = entry.Pack(offset)
>   File "u-boot/tools/binman/etype/section.py", line 390, in Pack
>     data = self.BuildSectionData(True)
>   File "u-boot/tools/binman/etype/fit.py", line 265, in BuildSectionData
>     tools.write_file(input_fname, data)
>   File "u-boot/tools/patman/tools.py", line 482, in write_file
>     with open(filename(fname), binary and 'wb' or 'w') as fd:
> PermissionError: [Errno 13] Permission denied: '/.fit at 0x380000.itb'
> 
> Something seems fairly broken here. That '/.' does not come from the 
> output directory name, it's generated by Entry.GetUniqueName. Looks like 
> this path should not been taken under these conditions.

I can reproduce this and tried a few things, but more issues just kept
popping up (outside u-boot as well). I got it to a point where the
command re-packs the FIT and the image but quite wrongly. The offset and
image-pos properties get added in the FIT, and the image main-section
just concatenates all entries without regard to set offsets. I'll
need more time to work those out, then to add tests and send patches.

Here's the diff I got so far in case it helps:

diff --git a/tools/binman/control.py b/tools/binman/control.py
index a179f7812988..24ec89b26302 100644
--- a/tools/binman/control.py
+++ b/tools/binman/control.py
@@ -390,6 +390,7 @@ def ReplaceEntries(image_fname, input_fname, indir,
entry_paths,
     """
     image_fname = os.path.abspath(image_fname)
     image = Image.FromFile(image_fname)
+    image.CollectBintools()

     # Replace an entry from a single file, as a special case
     if input_fname:
diff --git a/tools/binman/entry.py b/tools/binman/entry.py
index 631215dfc88a..8173e91af96a 100644
--- a/tools/binman/entry.py
+++ b/tools/binman/entry.py
@@ -767,7 +767,7 @@ def GetUniqueName(self):
         node = self._node
         while node.parent:
             node = node.parent
-            if node.name == 'binman':
+            if node.name == 'binman' or node.name == '/':
                 break
             name = '%s.%s' % (node.name, name)
         return name
diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
index 1e957023f354..9b2c33bc2b34 100644
--- a/tools/binman/etype/fit.py
+++ b/tools/binman/etype/fit.py
@@ -137,10 +137,6 @@ def __init__(self, section, etype, node):
                                                                   str)])[0]
         self.mkimage = None

-    def ReadNode(self):
-        self.ReadEntries()
-        super().ReadNode()
-
     def ReadEntries(self):
         def _AddNode(base_node, depth, node):
             """Add a node to the FIT
@@ -184,11 +180,12 @@ def _AddNode(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)
-                self._entries[rel_path] = entry
+                image_name = rel_path[len('/images/'):]
+                self._entries[image_name] = entry

             for subnode in node.subnodes:
                 if has_images and not (subnode.name.startswith('hash') or
@@ -284,7 +281,8 @@ def _BuildInput(self, fdt):
         Returns:
             New fdt contents (bytes)
         """
-        for path, section in self._entries.items():
+        for image_name, section in self._entries.items():
+            path = f"/images/{image_name}"
             node = fdt.GetNode(path)
             data = section.GetData()
             node.AddData('data', data)
@@ -312,7 +310,8 @@ def SetImagePos(self, image_pos):
         fdt = Fdt.FromData(self.GetData())
         fdt.Scan()

-        for path, section in self._entries.items():
+        for image_name, section in self._entries.items():
+            path = f"/images/{image_name}"
             node = fdt.GetNode(path)

             data_prop = node.props.get("data")


More information about the U-Boot mailing list