[PATCH] imx: hab: fix size of IVT+CSF blob tacked on to u-boot.itb
Marek Vasut
marex at denx.de
Fri Oct 25 17:09:15 CEST 2024
On 10/25/24 9:10 AM, Rasmus Villemoes wrote:
> On Thu, Oct 24 2024, Marek Vasut <marex at denx.de> wrote:
>
>> On 10/24/24 2:27 PM, Rasmus Villemoes wrote:
>>> Loading flash.bin using uuu fails when flash.bin does not have the
>>> right size.
>>> When flash.bin is loaded from some storage medium (sd card/emmc),
>>> SPL
>>> just loads some random garbage bytes from beyond what has been
>>> populated when flash.bin was written, but when loaded via uuu, SPL
>>> hangs waiting for the host to send the expected number of bytes. Which
>>> is (size of FIT image aligned to 0x1000)+CONFIG_CSF_SIZE. The
>>> alignment to 0x1000 is already done and is necessary in all cases
>>> because that's the exact expected location of the 32 byte IVT
>>> header. But the IVT+CSF blob tacked onto the end must be a total of
>>> CONFIG_CSF_SIZE.
>>> This is exactly the same fix as 89f19f45d650, except that this time
>>> around I don't know how to cleanly get CONFIG_CSF_SIZE.
>>> Fixes: bc6beae7c55f (binman: Add nxp_imx8mcst etype for i.MX8M
>>> flash.bin signing)
>>> Signed-off-by: Rasmus Villemoes <ravi at prevas.dk>
>>> ---
>>> Heiko, can you check if this works for you?
>>> And if somebody wants to pick this up and knows how to get at
>>> CONFIG_
>>> values, feel free to fix up and take authorship. But perhaps it's not
>>> really configurable at all; imx8mimage.c has the value 0x2000
>>> hard-coded, so I don't think anything good could ever come from
>>> modifying CONFIG_CSF_SIZE. If so, the right fix is probably just to
>>> make that knob non-settable.
>>> tools/binman/etype/nxp_imx8mcst.py | 2 ++
>>> 1 file changed, 2 insertions(+)
>>> diff --git a/tools/binman/etype/nxp_imx8mcst.py
>>> b/tools/binman/etype/nxp_imx8mcst.py
>>> index 8221517b0c4..9a1974cc522 100644
>>> --- a/tools/binman/etype/nxp_imx8mcst.py
>>> +++ b/tools/binman/etype/nxp_imx8mcst.py
>>> @@ -137,6 +137,8 @@ class Entry_nxp_imx8mcst(Entry_mkimage):
>>> args = ['-i', cfg_fname, '-o', output_fname]
>>> if self.cst.run_cmd(*args) is not None:
>>> outdata = tools.read_file(output_fname)
>>> + # fixme: 0x2000 should be CONFIG_CSF_SIZE
>>> + outdata += tools.get_bytes(0, 0x2000 - 0x20 - len(outdata))
>>> return data + outdata
>>> else:
>>> # Bintool is missing; just use the input data as the output
>>
>> I have to admit, I never really figured out this binman stuff, but
>> shouldn't the fix be also in tools/binman/etype/nxp_imx8mimage.py ?
>
> No, why? That logic is all about generating the imx-specific header in
> front of SPL.bin, there's no CSF being generated.
This patch is modifying tools/binman/etype/nxp_imx8mcst.py which is the
Code-Signing-Tool binman etype, the thing used for generating SIGNED
images during HAB use.
Shouldn't this patch modify tools/binman/etype/nxp_imx8mimage.py which
is the etype used when generating flash.bin itself ?
My understanding was that the problem Heiko reported was alignment of
flash.bin , independently of it being signed or not ?
> Or maybe mkimage tacks
> on some dummy bytes, but then that's explicitly ignored by the signing
> step, I think that's what the
>
> signbase -= 0x40
> signsize = struct.unpack('<I', data[24:28])[0] - signbase
> # Remove mkimage generated padding from the end of data
> data = data[:signsize]
>
> is about, so the signing step generates a new IVT and a new (real) CSF
> for the SPL. And none of that matters for the size of the final
> flash.bin, because the FIT image is located far ahead at a fixed 0x58000
> position.
>
>> And ... shouldn't it somehow use SetImagePos() ?
>
> Again, why? I'm padding a blob (in this case the CSF data) to a required
> size before tacking it on. Exactly as the existing code does
>
> # Align fitImage to 4k
> signsize = tools.align(len(data), 0x1000)
> data += tools.get_bytes(0, signsize - len(data))
>
> before writing out the (padded FIT image + 32 byte IVT) for cst to chew
> on and generate the CSF data.
>
> This is all about ensuring that the FIT+IVT+CSF blob has (exactly) the size
> computed by board_spl_fit_size_align, which is
>
> size = ALIGN(size, 0x1000);
> size += CONFIG_CSF_SIZE;
>
> The 0x1000 part is done in the existing code, I'm just making sure that
> the data we append after that is exactly CONFIG_CSF_SIZE. The CSF blob
> itself is what is originally in outdata, and because the IVT must be
> included in the data which is signed, the IVT has already been appended
> after the 0x1000 padded FIT image; that's why the computation of the
> extra bytes ends up being a little complicated. [If we just appended a
> full CONFIG_CSF_SIZE bytes, the board would boot, but then uuu would be
> hanging while waiting to deliver the remaining part of the file, so the
> size should match exactly.]
>
> I also don't grok the binman stuff, but there's really no separate image
> to set a "position" for, the csf blob (or ivt+csf blob) is not
> represented as its own image in the binman description.
It is probably best to let Simon comment on this.
More information about the U-Boot
mailing list