[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