]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
bloblist: Handle alignment with a void entry
authorSimon Glass <sjg@chromium.org>
Wed, 27 Dec 2023 21:07:06 +0000 (13:07 -0800)
committerSimon Glass <sjg@chromium.org>
Sun, 31 Dec 2023 14:21:02 +0000 (07:21 -0700)
Rather than setting the alignment using the header size, add an entirely
new entry to cover the gap left by the alignment.

Signed-off-by: Simon Glass <sjg@chromium.org>
Co-developed-by: Raymond Mao <raymond.mao@linaro.org>
Signed-off-by: Raymond Mao <raymond.mao@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
common/bloblist.c

index 705d9c6ae9911ddb371e61d62ba076052e77bfff..73dbbc01c081cef4ad1289dc05e5f4fdeecd16ab 100644 (file)
@@ -142,7 +142,7 @@ static int bloblist_addrec(uint tag, int size, int align_log2,
 {
        struct bloblist_hdr *hdr = gd->bloblist;
        struct bloblist_rec *rec;
-       int data_start, new_alloced;
+       int data_start, aligned_start, new_alloced;
 
        if (!align_log2)
                align_log2 = BLOBLIST_ALIGN_LOG2;
@@ -151,10 +151,25 @@ static int bloblist_addrec(uint tag, int size, int align_log2,
        data_start = map_to_sysmem(hdr) + hdr->alloced + sizeof(*rec);
 
        /* Align the address and then calculate the offset from ->alloced */
-       data_start = ALIGN(data_start, 1U << align_log2) - map_to_sysmem(hdr);
+       aligned_start = ALIGN(data_start, 1U << align_log2) - data_start;
+
+       /* If we need to create a dummy record, create it */
+       if (aligned_start) {
+               int void_size = aligned_start - sizeof(*rec);
+               struct bloblist_rec *vrec;
+               int ret;
+
+               ret = bloblist_addrec(BLOBLISTT_VOID, void_size, 0, &vrec);
+               if (ret)
+                       return log_msg_ret("void", ret);
+
+               /* start the record after that */
+               data_start = map_to_sysmem(hdr) + hdr->alloced + sizeof(*vrec);
+       }
 
        /* Calculate the new allocated total */
-       new_alloced = data_start + ALIGN(size, 1U << align_log2);
+       new_alloced = data_start - map_to_sysmem(hdr) +
+               ALIGN(size, 1U << align_log2);
 
        if (new_alloced > hdr->size) {
                log_err("Failed to allocate %x bytes size=%x, need size=%x\n",
@@ -164,7 +179,7 @@ static int bloblist_addrec(uint tag, int size, int align_log2,
        rec = (void *)hdr + hdr->alloced;
 
        rec->tag = tag;
-       rec->hdr_size = data_start - hdr->alloced;
+       rec->hdr_size = sizeof(struct bloblist_rec);
        rec->size = size;
 
        /* Zero the record data */