[PATCH v4 07/12] bloblist: Checksum the entire bloblist

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Dec 28 11:19:51 CET 2023


On Wed, 27 Dec 2023 at 23:08, Raymond Mao <raymond.mao at linaro.org> wrote:
>
> From: Simon Glass <sjg at chromium.org>
>
> Use a sinple 8-bit checksum for bloblist, as specified by the spec
> version 0.9.
> Spec v0.9 specifies that the entire bloblist area is checksummed,
> including unused portions. Update the code to follow this.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Co-developed-by: Raymond Mao <raymond.mao at linaro.org>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
> Changes in v4
> - Patch #7 and #8 from v3 are squashed into this patch.
>
>  common/bloblist.c  | 13 ++++---------
>  include/bloblist.h |  5 ++---
>  test/bloblist.c    | 10 ++++++++--
>  3 files changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/common/bloblist.c b/common/bloblist.c
> index 88e2a0f5c0..705d9c6ae9 100644
> --- a/common/bloblist.c
> +++ b/common/bloblist.c
> @@ -13,6 +13,7 @@
>  #include <malloc.h>
>  #include <mapmem.h>
>  #include <spl.h>
> +#include <tables_csum.h>
>  #include <asm/global_data.h>
>  #include <u-boot/crc.h>
>
> @@ -318,16 +319,10 @@ int bloblist_resize(uint tag, int new_size)
>
>  static u32 bloblist_calc_chksum(struct bloblist_hdr *hdr)
>  {
> -       struct bloblist_rec *rec;
> -       u32 chksum;
> +       u8 chksum;
>
> -       chksum = crc32(0, (unsigned char *)hdr,
> -                      offsetof(struct bloblist_hdr, chksum));
> -       foreach_rec(rec, hdr) {
> -               chksum = crc32(chksum, (void *)rec, rec_hdr_size(rec));
> -               chksum = crc32(chksum, (void *)rec + rec_hdr_size(rec),
> -                              rec->size);
> -       }
> +       chksum = table_compute_checksum(hdr, hdr->alloced);
> +       chksum += hdr->chksum;
>
>         return chksum;
>  }
> diff --git a/include/bloblist.h b/include/bloblist.h
> index 68f97395b7..d2dcad69a1 100644
> --- a/include/bloblist.h
> +++ b/include/bloblist.h
> @@ -174,11 +174,10 @@ enum bloblist_tag_t {
>   *     sizeof(bloblist_hdr) since we need at least that much space to store a
>   *     valid bloblist
>   * @spare: Spare space (for future use)
> - * @chksum: CRC32 for the entire bloblist allocated area. Since any of the
> + * @chksum: checksum for the entire bloblist allocated area. Since any of the
>   *     blobs can be altered after being created, this checksum is only valid
>   *     when the bloblist is finalised before jumping to the next stage of boot.
> - *     Note that chksum is last to make it easier to exclude it from the
> - *     checksum calculation.
> + *     This is the value needed to make all checksummed bytes sum to 0
>   */
>  struct bloblist_hdr {
>         u32 magic;
> diff --git a/test/bloblist.c b/test/bloblist.c
> index 8b435e27ca..49ac4b92ae 100644
> --- a/test/bloblist.c
> +++ b/test/bloblist.c
> @@ -237,12 +237,18 @@ static int bloblist_test_checksum(struct unit_test_state *uts)
>         *data2 -= 1;
>
>         /*
> -        * Changing data outside the range of valid data should not affect
> -        * the checksum.
> +        * Changing data outside the range of valid data should affect the
> +        * checksum.
>          */
>         ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
>         data[TEST_SIZE]++;
> +       ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
> +       data[TEST_SIZE]--;
> +       ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
> +
>         data2[TEST_SIZE2]++;
> +       ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
> +       data[TEST_SIZE]--;
>         ut_assertok(bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE));
>
>         return 0;
> --
> 2.25.1
>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>


More information about the U-Boot mailing list