[PATCH v6 3/7] bloblist: refactor of bloblist_reloc()

Ilias Apalodimas ilias.apalodimas at linaro.org
Wed Jan 17 09:36:50 CET 2024


On Tue, 16 Jan 2024 at 19:14, Raymond Mao <raymond.mao at linaro.org> wrote:
>
> The current bloblist pointer and size can be retrieved from global
> data, so we don't need to pass them from the function arguments.
> This change also help to remove all external access of gd->bloblist
> outside of bloblist module.
>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
> Changes in v2
> - New patch file created for v2.
> Changes in v3
> - Check the space size before copying the bloblist.
> - Add return code of bloblist_reloc().
> Changes in v4
> - return error code from bloblist_reloc().
>
>  common/bloblist.c  | 10 ++++++++--
>  common/board_f.c   |  9 +++------
>  include/bloblist.h |  8 ++++----
>  test/bloblist.c    |  6 ++----
>  4 files changed, 17 insertions(+), 16 deletions(-)
>
> diff --git a/common/bloblist.c b/common/bloblist.c
> index 26b0ba33b1..c2fd07575f 100644
> --- a/common/bloblist.c
> +++ b/common/bloblist.c
> @@ -472,13 +472,19 @@ void bloblist_show_list(void)
>         }
>  }
>
> -void bloblist_reloc(void *to, uint to_size, void *from, uint from_size)
> +int bloblist_reloc(void *to, uint to_size)
>  {
>         struct bloblist_hdr *hdr;
>
> -       memcpy(to, from, from_size);
> +       if (to_size < gd->bloblist->total_size)
> +               return -ENOSPC;
> +
> +       memcpy(to, gd->bloblist, gd->bloblist->total_size);
>         hdr = to;
>         hdr->total_size = to_size;
> +       gd->bloblist = to;
> +
> +       return 0;
>  }
>
>  int bloblist_init(void)
> diff --git a/common/board_f.c b/common/board_f.c
> index d4d7d01f8f..f4145a2698 100644
> --- a/common/board_f.c
> +++ b/common/board_f.c
> @@ -676,13 +676,10 @@ static int reloc_bloblist(void)
>                 return 0;
>         }
>         if (gd->new_bloblist) {
> -               int size = CONFIG_BLOBLIST_SIZE;
> -
>                 debug("Copying bloblist from %p to %p, size %x\n",
> -                     gd->bloblist, gd->new_bloblist, size);
> -               bloblist_reloc(gd->new_bloblist, CONFIG_BLOBLIST_SIZE_RELOC,
> -                              gd->bloblist, size);
> -               gd->bloblist = gd->new_bloblist;
> +                     gd->bloblist, gd->new_bloblist, gd->bloblist->total_size);
> +               return bloblist_reloc(gd->new_bloblist,
> +                                     CONFIG_BLOBLIST_SIZE_RELOC);
>         }
>  #endif
>
> diff --git a/include/bloblist.h b/include/bloblist.h
> index cc78259e5a..0ae079d62a 100644
> --- a/include/bloblist.h
> +++ b/include/bloblist.h
> @@ -426,11 +426,11 @@ const char *bloblist_tag_name(enum bloblist_tag_t tag);
>   * bloblist_reloc() - Relocate the bloblist and optionally resize it
>   *
>   * @to: Pointer to new bloblist location (must not overlap old location)
> - * @to_size: New size for bloblist (must be larger than from_size)
> - * @from: Pointer to bloblist to relocate
> - * @from_size: Size of bloblist to relocate
> + * @to_size: New size for bloblist
> + * Return: 0 if OK, -ENOSPC if the new size is small than the bloblist total
> + *        size.
>   */
> -void bloblist_reloc(void *to, uint to_size, void *from, uint from_size);
> +int bloblist_reloc(void *to, uint to_size);
>
>  /**
>   * bloblist_init() - Init the bloblist system with a single bloblist
> diff --git a/test/bloblist.c b/test/bloblist.c
> index 7dab9addf8..1c60bbac36 100644
> --- a/test/bloblist.c
> +++ b/test/bloblist.c
> @@ -376,13 +376,12 @@ static int bloblist_test_reloc(struct unit_test_state *uts)
>  {
>         const uint large_size = TEST_BLOBLIST_SIZE;
>         const uint small_size = 0x20;
> -       void *old_ptr, *new_ptr;
> +       void *new_ptr;
>         void *blob1, *blob2;
>         ulong new_addr;
>         ulong new_size;
>
>         ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0));
> -       old_ptr = map_sysmem(TEST_ADDR, TEST_BLOBLIST_SIZE);
>
>         /* Add one blob and then one that won't fit */
>         blob1 = bloblist_add(TEST_TAG, small_size, 0);
> @@ -394,8 +393,7 @@ static int bloblist_test_reloc(struct unit_test_state *uts)
>         new_addr = TEST_ADDR + TEST_BLOBLIST_SIZE;
>         new_size = TEST_BLOBLIST_SIZE + 0x100;
>         new_ptr = map_sysmem(new_addr, TEST_BLOBLIST_SIZE);
> -       bloblist_reloc(new_ptr, new_size, old_ptr, TEST_BLOBLIST_SIZE);
> -       gd->bloblist = new_ptr;
> +       ut_assertok(bloblist_reloc(new_ptr, new_size));
>
>         /* Check the old blob is there and that we can now add the bigger one */
>         ut_assertnonnull(bloblist_find(TEST_TAG, small_size));
> --
> 2.25.1
>
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>


More information about the U-Boot mailing list