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>
This commit is contained in:
@ -4,6 +4,7 @@
|
|||||||
PROGRAM = cbmem
|
PROGRAM = cbmem
|
||||||
TOP ?= $(abspath ../..)
|
TOP ?= $(abspath ../..)
|
||||||
ROOT = $(TOP)/src
|
ROOT = $(TOP)/src
|
||||||
|
COMMONLIB = $(ROOT)/commonlib
|
||||||
CC ?= $(CROSS_COMPILE)gcc
|
CC ?= $(CROSS_COMPILE)gcc
|
||||||
INSTALL ?= /usr/bin/env install
|
INSTALL ?= /usr/bin/env install
|
||||||
PREFIX ?= /usr/local
|
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 += -I . -I $(ROOT)/commonlib/include -I $(ROOT)/commonlib/bsd/include
|
||||||
CPPFLAGS += -include $(ROOT)/commonlib/bsd/include/commonlib/bsd/compiler.h
|
CPPFLAGS += -include $(ROOT)/commonlib/bsd/include/commonlib/bsd/compiler.h
|
||||||
|
|
||||||
OBJS = $(PROGRAM).o
|
OBJS = $(PROGRAM).o $(COMMONLIB)/bsd/ipchksum.o
|
||||||
|
|
||||||
all: $(PROGRAM)
|
all: $(PROGRAM)
|
||||||
|
|
||||||
$(PROGRAM): $(OBJS)
|
$(PROGRAM): $(OBJS)
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f $(PROGRAM) *.o .dependencies *~ junit.xml
|
rm -f $(PROGRAM) $(OBJS:.c=.o) .dependencies *~ junit.xml
|
||||||
|
|
||||||
install: $(PROGRAM)
|
install: $(PROGRAM)
|
||||||
$(INSTALL) -d $(DESTDIR)$(PREFIX)/sbin/
|
$(INSTALL) -d $(DESTDIR)$(PREFIX)/sbin/
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
#include <commonlib/bsd/cbmem_id.h>
|
#include <commonlib/bsd/cbmem_id.h>
|
||||||
|
#include <commonlib/bsd/ipchksum.h>
|
||||||
#include <commonlib/bsd/tpm_log_defs.h>
|
#include <commonlib/bsd/tpm_log_defs.h>
|
||||||
#include <commonlib/loglevel.h>
|
#include <commonlib/loglevel.h>
|
||||||
#include <commonlib/timestamp_serialized.h>
|
#include <commonlib/timestamp_serialized.h>
|
||||||
@ -199,25 +200,6 @@ static void *aligned_memcpy(void *dest, const void *src, size_t n)
|
|||||||
return dest;
|
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. */
|
/* Find the first cbmem entry filling in the details. */
|
||||||
static int find_cbmem_entry(uint32_t id, uint64_t *addr, size_t *size)
|
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;
|
lbh = buf + i;
|
||||||
if (memcmp(lbh->signature, "LBIO", sizeof(lbh->signature)) ||
|
if (memcmp(lbh->signature, "LBIO", sizeof(lbh->signature)) ||
|
||||||
!lbh->header_bytes ||
|
!lbh->header_bytes ||
|
||||||
ipchcksum(lbh, sizeof(*lbh))) {
|
ipchksum(lbh, sizeof(*lbh))) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,7 +393,7 @@ static int parse_cbtable(u64 address, size_t table_size)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ipchcksum(mapping_virt(&table_mapping), lbh->table_bytes) !=
|
if (ipchksum(mapping_virt(&table_mapping), lbh->table_bytes) !=
|
||||||
lbh->table_checksum) {
|
lbh->table_checksum) {
|
||||||
debug("Signature found, but wrong checksum.\n");
|
debug("Signature found, but wrong checksum.\n");
|
||||||
unmap_memory(&table_mapping);
|
unmap_memory(&table_mapping);
|
||||||
|
Reference in New Issue
Block a user