
+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@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.
Thanks, Michal