[PATCH v5 6/6] binman: Mark mkimage entry missing when its subnodes is missing

Kever Yang kever.yang at rock-chips.com
Tue Feb 28 03:46:53 CET 2023


On 2023/2/26 03:01, Jonas Karlman wrote:
> Using the mkimage entry with the multiple-data-files prop and having a
> missing external blob result in an unexpected ValueError exception using
> the --allow-missing flag.
>
>    ValueError: Filename 'missing.bin' not found in input path (...)
>
> Fix this by using _pathname that is resolved by ObtainContents for blob
> entries, ObtainContents also handles allow missing for external blobs.
>
> Mark mkimage entry as missing and return without running mkimage when
> missing entries is reported by CheckMissing.
>
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>

Thanks,
- Kever
> ---
> v5:
> - New patch based on [1]
>
> [1] https://patchwork.ozlabs.org/project/uboot/patch/20230219220158.4160763-7-jonas@kwiboo.se/
>
>   tools/binman/etype/mkimage.py                 | 24 ++++++++++++++++++-
>   tools/binman/ftest.py                         | 11 +++++++++
>   .../test/278_mkimage_missing_multiple.dts     | 19 +++++++++++++++
>   3 files changed, 53 insertions(+), 1 deletion(-)
>   create mode 100644 tools/binman/test/278_mkimage_missing_multiple.dts
>
> diff --git a/tools/binman/etype/mkimage.py b/tools/binman/etype/mkimage.py
> index cb264c3cad0b..8a13d5ea8d77 100644
> --- a/tools/binman/etype/mkimage.py
> +++ b/tools/binman/etype/mkimage.py
> @@ -156,7 +156,8 @@ class Entry_mkimage(Entry):
>               for entry in self._mkimage_entries.values():
>                   if not entry.ObtainContents(fake_size=fake_size):
>                       return False
> -                fnames.append(tools.get_input_filename(entry.GetDefaultFilename()))
> +                if entry._pathname:
> +                    fnames.append(entry._pathname)
>               input_fname = ":".join(fnames)
>           else:
>               data, input_fname, uniq = self.collect_contents_to_file(
> @@ -171,6 +172,13 @@ class Entry_mkimage(Entry):
>           outfile = self._filename if self._filename else 'mkimage-out.%s' % uniq
>           output_fname = tools.get_output_filename(outfile)
>   
> +        missing_list = []
> +        self.CheckMissing(missing_list)
> +        self.missing = bool(missing_list)
> +        if self.missing:
> +            self.SetContents(b'')
> +            return self.allow_missing
> +
>           args = ['-d', input_fname]
>           if self._data_to_imagename:
>               args += ['-n', input_fname]
> @@ -216,6 +224,20 @@ class Entry_mkimage(Entry):
>           if self._imagename:
>               self._imagename.SetAllowFakeBlob(allow_fake)
>   
> +    def CheckMissing(self, missing_list):
> +        """Check if any entries in this section have missing external blobs
> +
> +        If there are missing (non-optional) blobs, the entries are added to the
> +        list
> +
> +        Args:
> +            missing_list: List of Entry objects to be added to
> +        """
> +        for entry in self._mkimage_entries.values():
> +            entry.CheckMissing(missing_list)
> +        if self._imagename:
> +            self._imagename.CheckMissing(missing_list)
> +
>       def CheckFakedBlobs(self, faked_blobs_list):
>           """Check if any entries in this section have faked external blobs
>   
> diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
> index 48ac1540bfd8..d74aa90a6207 100644
> --- a/tools/binman/ftest.py
> +++ b/tools/binman/ftest.py
> @@ -6393,6 +6393,17 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
>           data = self._DoReadFile('277_rockchip_tpl.dts')
>           self.assertEqual(ROCKCHIP_TPL_DATA, data[:len(ROCKCHIP_TPL_DATA)])
>   
> +    def testMkimageMissingBlobMultiple(self):
> +        """Test missing blob with mkimage entry and multiple-data-files"""
> +        with test_util.capture_sys_output() as (stdout, stderr):
> +            self._DoTestFile('278_mkimage_missing_multiple.dts', allow_missing=True)
> +        err = stderr.getvalue()
> +        self.assertIn("is missing external blobs and is non-functional", err)
> +
> +        with self.assertRaises(ValueError) as e:
> +            self._DoTestFile('278_mkimage_missing_multiple.dts', allow_missing=False)
> +        self.assertIn("not found in input path", str(e.exception))
> +
>   
>   if __name__ == "__main__":
>       unittest.main()
> diff --git a/tools/binman/test/278_mkimage_missing_multiple.dts b/tools/binman/test/278_mkimage_missing_multiple.dts
> new file mode 100644
> index 000000000000..f84aea49ead9
> --- /dev/null
> +++ b/tools/binman/test/278_mkimage_missing_multiple.dts
> @@ -0,0 +1,19 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +
> +/dts-v1/;
> +
> +/ {
> +	#address-cells = <1>;
> +	#size-cells = <1>;
> +
> +	binman {
> +		mkimage {
> +			args = "-n test -T script";
> +			multiple-data-files;
> +
> +			blob-ext {
> +				filename = "missing.bin";
> +			};
> +		};
> +	};
> +};


More information about the U-Boot mailing list