[PATCH 16/25] binman: Avoid reporting image-pos with compression

Alper Nebi Yasak alpernebiyasak at gmail.com
Mon Oct 19 23:15:10 CEST 2020


On 19/10/2020 05:41, Simon Glass wrote:
> When a section is compressed, all entries within it are grouped together
> into a compressed block of data. This obscures the start of each
> individual child entry.
> 
> Avoid reporting bogus 'image-pos' properties in this case, since it is
> not possible to access the entry at the location provided. The entire
> section must be decompressed first.
> 
> CBFS does not support compressing whole sections, only individual files,
> so needs no special handling here.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---

Maybe instead of this, 'image-pos' could be overloaded to a list of
recursive relative positions within compressed archives? Something like:

    section {
        offset = <1000>;
        compress = "lz4";
        /* image-pos = <1000>; */

        blob {
            filename = "foo";
            offset = <100>;
            /* image-pos = <1000>, <100>; */
        };
    };

    cbfs {
        offset = <2000>;
        /* image-pos = <2000>; */

        blob {
            filename = "bar";
            cbfs-compress = "lz4";
            cbfs-offset = <200>;
            /* image-pos = <2200>, <0>; */
        };

        blob2 {
            filename = "baz";
            cbfs-offset = <800>;
            /* image-pos = <2800>; */
        };
    };

>  tools/binman/control.py       |  2 +-
>  tools/binman/entry.py         | 18 ++++++++++++++----
>  tools/binman/etype/cbfs.py    |  6 +++---
>  tools/binman/etype/section.py | 13 ++++++++-----
>  4 files changed, 26 insertions(+), 13 deletions(-)
> 
> diff --git a/tools/binman/control.py b/tools/binman/control.py
> index ee5771e7292..26f1cf462ec 100644
> --- a/tools/binman/control.py
> +++ b/tools/binman/control.py
> @@ -462,7 +462,7 @@ def PrepareImagesAndDtbs(dtb_fname, select_images, update_fdt):
>      for image in images.values():
>          image.ExpandEntries()
>          if update_fdt:
> -            image.AddMissingProperties()
> +            image.AddMissingProperties(True)
>          image.ProcessFdt(dtb)
>  
>      for dtb_item in state.GetAllFdts():
> diff --git a/tools/binman/entry.py b/tools/binman/entry.py
> index 01a5fde84ed..8fa1dcef2da 100644
> --- a/tools/binman/entry.py
> +++ b/tools/binman/entry.py
> @@ -213,11 +213,20 @@ class Entry(object):
>      def ExpandEntries(self):
>          pass
>  
> -    def AddMissingProperties(self):
> -        """Add new properties to the device tree as needed for this entry"""
> -        for prop in ['offset', 'size', 'image-pos']:
> +    def AddMissingProperties(self, have_image_pos):
> +        """Add new properties to the device tree as needed for this entry
> +
> +        Args:
> +            have_image_pos: True if this entry has an image position. This can
> +                be False if its parent section is compressed, since compression
> +                groups all entries together into a compressed block of data,
> +                obscuring the start of each individual child entry
> +        """
> +        for prop in ['offset', 'size']:
>              if not prop in self._node.props:
>                  state.AddZeroProp(self._node, prop)
> +        if have_image_pos and 'image-pos' not in self._node.props:
> +            state.AddZeroProp(self._node, 'image-pos')
>          if self.GetImage().allow_repack:
>              if self.orig_offset is not None:
>                  state.AddZeroProp(self._node, 'orig-offset', True)
> @@ -235,7 +244,8 @@ class Entry(object):
>          state.SetInt(self._node, 'offset', self.offset)
>          state.SetInt(self._node, 'size', self.size)
>          base = self.section.GetRootSkipAtStart() if self.section else 0
> -        state.SetInt(self._node, 'image-pos', self.image_pos - base)
> +        if self.image_pos is not None:
> +            state.SetInt(self._node, 'image-pos', self.image_pos)
>          if self.GetImage().allow_repack:
>              if self.orig_offset is not None:
>                  state.SetInt(self._node, 'orig-offset', self.orig_offset, True)
> diff --git a/tools/binman/etype/cbfs.py b/tools/binman/etype/cbfs.py
> index 650ab2c292f..6cdbaa085f5 100644
> --- a/tools/binman/etype/cbfs.py
> +++ b/tools/binman/etype/cbfs.py
> @@ -237,10 +237,10 @@ class Entry_cbfs(Entry):
>              if entry._cbfs_compress:
>                  entry.uncomp_size = cfile.memlen
>  
> -    def AddMissingProperties(self):
> -        super().AddMissingProperties()
> +    def AddMissingProperties(self, have_image_pos):
> +        super().AddMissingProperties(have_image_pos)
>          for entry in self._cbfs_entries.values():
> -            entry.AddMissingProperties()
> +            entry.AddMissingProperties(have_image_pos)
>              if entry._cbfs_compress:
>                  state.AddZeroProp(entry._node, 'uncomp-size')
>                  # Store the 'compress' property, since we don't look at
> diff --git a/tools/binman/etype/section.py b/tools/binman/etype/section.py
> index 6e6f6749727..2812989ba1a 100644
> --- a/tools/binman/etype/section.py
> +++ b/tools/binman/etype/section.py
> @@ -136,11 +136,13 @@ class Entry_section(Entry):
>          for entry in self._entries.values():
>              entry.ExpandEntries()
>  
> -    def AddMissingProperties(self):
> +    def AddMissingProperties(self, have_image_pos):
>          """Add new properties to the device tree as needed for this entry"""
> -        super().AddMissingProperties()
> +        super().AddMissingProperties(have_image_pos)
> +        if self.compress != 'none':
> +            have_image_pos = False
>          for entry in self._entries.values():
> -            entry.AddMissingProperties()
> +            entry.AddMissingProperties(have_image_pos)
>  
>      def ObtainContents(self):
>          return self.GetEntryContents()
> @@ -323,8 +325,9 @@ class Entry_section(Entry):
>  
>      def SetImagePos(self, image_pos):
>          super().SetImagePos(image_pos)
> -        for entry in self._entries.values():
> -            entry.SetImagePos(image_pos + self.offset)
> +        if self.compress == 'none':
> +            for entry in self._entries.values():
> +                entry.SetImagePos(image_pos + self.offset)
>  
>      def ProcessContents(self):
>          sizes_ok_base = super(Entry_section, self).ProcessContents()
> 


More information about the U-Boot mailing list