diff options
author | Julius Werner <jwerner@chromium.org> | 2024-01-30 19:33:40 -0800 |
---|---|---|
committer | Julius Werner <jwerner@chromium.org> | 2024-02-02 22:49:23 +0000 |
commit | c228beff195a7fe9b99e88eda582c075b7ec05d3 (patch) | |
tree | 45035698a38ac89bc4b179b1271e262670dca1b3 | |
parent | f6e358483bd4d70d552ead732709b3f828a0522a (diff) |
util/cbmem: Use commonlib ipchksum() algorithm
This patch switches the cbmem utility from its own IP checksum
implementation to the commonlib version (which is good because the old
one had a couple of bugs: doesn't work on odd sizes and may overflow
its carry accumulator with input larger than 64K).
Change-Id: I0bef2c85c37ddd3438b7ac6389e9daa3e4955b31
Signed-off-by: Julius Werner <jwerner@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/80256
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-by: Yidi Lin <yidilin@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | util/cbmem/Makefile | 5 | ||||
-rw-r--r-- | util/cbmem/cbmem.c | 24 |
2 files changed, 6 insertions, 23 deletions
diff --git a/util/cbmem/Makefile b/util/cbmem/Makefile index 9219a08f3c..0c88aebbbe 100644 --- a/util/cbmem/Makefile +++ b/util/cbmem/Makefile @@ -4,6 +4,7 @@ PROGRAM = cbmem TOP ?= $(abspath ../..) ROOT = $(TOP)/src +COMMONLIB = $(ROOT)/commonlib CC ?= $(CROSS_COMPILE)gcc INSTALL ?= /usr/bin/env install PREFIX ?= /usr/local @@ -13,14 +14,14 @@ CFLAGS += -Wall -Wextra -Wmissing-prototypes -Wshadow $(WERROR) CPPFLAGS += -I . -I $(ROOT)/commonlib/include -I $(ROOT)/commonlib/bsd/include CPPFLAGS += -include $(ROOT)/commonlib/bsd/include/commonlib/bsd/compiler.h -OBJS = $(PROGRAM).o +OBJS = $(PROGRAM).o $(COMMONLIB)/bsd/ipchksum.o all: $(PROGRAM) $(PROGRAM): $(OBJS) clean: - rm -f $(PROGRAM) *.o .dependencies *~ junit.xml + rm -f $(PROGRAM) $(OBJS:.c=.o) .dependencies *~ junit.xml install: $(PROGRAM) $(INSTALL) -d $(DESTDIR)$(PREFIX)/sbin/ diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c index d33b714d22..15b6770315 100644 --- a/util/cbmem/cbmem.c +++ b/util/cbmem/cbmem.c @@ -19,6 +19,7 @@ #include <assert.h> #include <regex.h> #include <commonlib/bsd/cbmem_id.h> +#include <commonlib/bsd/ipchksum.h> #include <commonlib/bsd/tpm_log_defs.h> #include <commonlib/loglevel.h> #include <commonlib/timestamp_serialized.h> @@ -199,25 +200,6 @@ static void *aligned_memcpy(void *dest, const void *src, size_t n) return dest; } -/* - * calculate ip checksum (16 bit quantities) on a passed in buffer. In case - * the buffer length is odd last byte is excluded from the calculation - */ -static u16 ipchcksum(const void *addr, unsigned size) -{ - const u16 *p = addr; - unsigned i, n = size / 2; /* don't expect odd sized blocks */ - u32 sum = 0; - - for (i = 0; i < n; i++) - sum += p[i]; - - sum = (sum >> 16) + (sum & 0xffff); - sum += (sum >> 16); - sum = ~sum & 0xffff; - return (u16) sum; -} - /* Find the first cbmem entry filling in the details. */ static int find_cbmem_entry(uint32_t id, uint64_t *addr, size_t *size) { @@ -400,7 +382,7 @@ static int parse_cbtable(u64 address, size_t table_size) lbh = buf + i; if (memcmp(lbh->signature, "LBIO", sizeof(lbh->signature)) || !lbh->header_bytes || - ipchcksum(lbh, sizeof(*lbh))) { + ipchksum(lbh, sizeof(*lbh))) { continue; } @@ -411,7 +393,7 @@ static int parse_cbtable(u64 address, size_t table_size) continue; } - if (ipchcksum(mapping_virt(&table_mapping), lbh->table_bytes) != + if (ipchksum(mapping_virt(&table_mapping), lbh->table_bytes) != lbh->table_checksum) { debug("Signature found, but wrong checksum.\n"); unmap_memory(&table_mapping); |