[U-Boot] [PATCH] tools: zynqmpimage: round up partition size

Alexander Graf agraf at suse.de
Mon Dec 3 13:42:59 UTC 2018



On 03.12.18 14:14, Michal Simek wrote:
> +Alex
> 
> On 28. 11. 18 11:47, Michael Tretter wrote:
>> The FSBL copies "Total Partition Word Length" * 4 bytes from the boot.bin,
>> which implies that the partition size is 4 byte aligned. When writing the
>> partition, mkimage calculates "Total Partition Word Length" by dividing
>> the size by 4. This implicitly cuts unaligned bytes at the end of the
>> added binary.
>>
>> Instead of rounding down, the size must be round up to 4 bytes and the
>> binary padded accordingly.
>>
>> Signed-off-by: Michael Tretter <m.tretter at pengutronix.de>
>> ---
>>  tools/zynqmpbif.c | 18 ++++++++++++++----
>>  1 file changed, 14 insertions(+), 4 deletions(-)
>>
>> diff --git a/tools/zynqmpbif.c b/tools/zynqmpbif.c
>> index 6c8f66055d..885a037da6 100644
>> --- a/tools/zynqmpbif.c
>> +++ b/tools/zynqmpbif.c
>> @@ -316,19 +316,29 @@ static int bif_add_pmufw(struct bif_entry *bf, const char *data, size_t len)
>>  	return 0;
>>  }
>>  
>> -static int bif_add_part(struct bif_entry *bf, const char *data, size_t len)
>> +static int bif_add_part(struct bif_entry *bf, char *data, size_t len)
>>  {
>>  	size_t parthdr_offset = 0;
>> +	size_t len_padded = ROUND(len, 4);
>> +
>>  	struct partition_header parthdr = {
>> -		.len_enc = cpu_to_le32(len / 4),
>> -		.len_unenc = cpu_to_le32(len / 4),
>> -		.len = cpu_to_le32(len / 4),
>> +		.len_enc = cpu_to_le32(len_padded / 4),
>> +		.len_unenc = cpu_to_le32(len_padded / 4),
>> +		.len = cpu_to_le32(len_padded / 4),
>>  		.entry_point = cpu_to_le64(bf->entry),
>>  		.load_address = cpu_to_le64(bf->load),
>>  	};
>>  	int r;
>>  	uint32_t csum;
>>  
>> +	if (len != len_padded) {
>> +		data = realloc(data, len_padded);
>> +		while (len < len_padded) {
>> +			data[len] = 0;
>> +			len++;
>> +		}
>> +	}
>> +
>>  	if (bf->flags & (1ULL << BIF_FLAG_PMUFW_IMAGE))
>>  		return bif_add_pmufw(bf, data, len);
>>  
>>
> 
> I am not using this for creating boot image but I have tested it on
> regular example and it is still working.
> 
> I have applied this to my branch.
> Alex: If you have any comment on this please let us know and I can
> remove it from my queue.

I don't think I've ever had a not-multiple-of-4 payload, so I never ran
into this.

The one thing that I'm not fully sure of is the realloc(). I don't think
that data is necessarily always a pointer that way allocated using malloc().

If you look at bif_add_bit() for example the data pointer is an offset
into a pointer from read_full_file(). So realloc() won't work on it.

I think it's safer to just allocate a completely new buffer here and
copy the payload if unaligned.


Alex


More information about the U-Boot mailing list