summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-09 03:51:52 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-09 03:56:50 +0000
commit1a60eabcfe49042a63e23eb161a0bf16e9e80c33 (patch)
treedf42b729e125e7284684818a56ca7e9d253b8fc8
parentc27f8b709a647a740fe246781763607dc1e41cc0 (diff)
util/nvmutil: print expected checksums
Signed-off-by: Leah Rowe <leah@libreboot.org>
-rw-r--r--util/nvmutil/nvmutil.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index b53873e3..83444c03 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -9,6 +9,7 @@
#include <errno.h>
#include <fcntl.h>
+#include <inttypes.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
@@ -88,6 +89,7 @@ static void hexdump(size_t partnum);
static void write_gbe_file(void);
static void override_part_modified(void);
static void set_checksum(size_t part);
+static uint16_t calculated_checksum(size_t p);
static uint16_t nvm_word(size_t pos16, size_t part);
static void set_nvm_word(size_t pos16, size_t part, uint16_t val16);
static void set_part_modified(size_t p);
@@ -739,17 +741,23 @@ read_checksums(void)
static int
good_checksum(size_t partnum)
{
- size_t w;
- uint16_t total = 0;
+ uint16_t expected_checksum = calculated_checksum(partnum);
+ uint16_t current_checksum = nvm_word(NVM_CHECKSUM_WORD, partnum);
- for (w = 0; w <= NVM_CHECKSUM_WORD; w++)
- total += nvm_word(w, partnum);
+ size_t real_partnum = partnum ^ command[cmd_index].invert;
- if (total == NVM_CHECKSUM)
+ if (current_checksum == expected_checksum)
return 1;
- fprintf(stderr, "WARNING: BAD checksum in part %zu\n",
- partnum ^ command[cmd_index].invert);
+ fprintf(stderr,
+ "WARNING: BAD checksum in part %zu\n"
+ "EXPECTED checksum in part %zu: %04x\n"
+ "CURRENT checksum in part %zu: %04x\n",
+ real_partnum,
+ real_partnum,
+ expected_checksum,
+ real_partnum,
+ current_checksum);
set_err(ECANCELED);
return 0;
@@ -1060,17 +1068,20 @@ override_part_modified(void)
static void
set_checksum(size_t p)
{
- size_t c;
- uint16_t val16;
-
check_bin(p, "part number");
+ set_nvm_word(NVM_CHECKSUM_WORD, p, calculated_checksum(p));
+}
- val16 = 0;
+static uint16_t
+calculated_checksum(size_t p)
+{
+ size_t c;
+ uint16_t val16 = 0;
for (c = 0; c < NVM_CHECKSUM_WORD; c++)
val16 += nvm_word(c, p);
- set_nvm_word(NVM_CHECKSUM_WORD, p, NVM_CHECKSUM - val16);
+ return NVM_CHECKSUM - val16;
}
/*