mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-17 10:24:49 +00:00
bloblist: Handle alignment with a void entry
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>
This commit is contained in:
parent
997dac6ede
commit
f9ef9fb033
1 changed files with 19 additions and 4 deletions
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue