summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeah Rowe <leah@libreboot.org>2026-03-08 00:21:58 +0000
committerLeah Rowe <leah@libreboot.org>2026-03-08 00:21:58 +0000
commit698d39dd066b88c393fa00e0338d3f69f4a91633 (patch)
tree09e5b2b02f95cb5e0e9813d3e3ea3f98a1f60e30
parent50e20fb8bfc24bde4cb86a29470957c9f315c6d3 (diff)
util/nvmutil: store invert in command struct
handle inversion directly there Signed-off-by: Leah Rowe <leah@libreboot.org>
-rw-r--r--util/nvmutil/nvmutil.c41
1 files changed, 14 insertions, 27 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index 7f6516e1..eee46e73 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -38,7 +38,7 @@ static void open_dev_urandom(void);
#endif
static void xopen(int *fd, const char *path, int flags, struct stat *st);
static void read_gbe_file(void);
-static void read_gbe_file_part(size_t part, uint8_t invert);
+static void read_gbe_file_part(size_t part);
static void cmd_setmac(void);
static void parse_mac_string(void);
static void set_mac_byte(size_t mac_byte_pos);
@@ -140,7 +140,6 @@ static int urandom_fd = -1;
#endif
static int gbe_fd = -1;
static size_t part;
-static uint8_t invert;
static uint8_t part_modified[2];
static const char *mac_str;
@@ -152,14 +151,15 @@ struct commands {
const char *str;
void (*run)(void);
int args;
+ uint8_t invert;
};
static const struct commands command[] = {
- { "dump", cmd_dump, 3 },
- { "setmac", cmd_setmac, 3 },
- { "swap", cmd_swap, 3 },
- { "copy", cmd_copy, 4 },
- { "brick", cmd_brick, 4 },
- { "setchecksum", cmd_setchecksum, 4 },
+ { "dump", cmd_dump, 3, 0 },
+ { "setmac", cmd_setmac, 3, 0 },
+ { "swap", cmd_swap, 3, 1 },
+ { "copy", cmd_copy, 4, 1 },
+ { "brick", cmd_brick, 4, 0 },
+ { "setchecksum", cmd_setchecksum, 4, 0 },
};
#define CMD_NULL -1
#define CMD_DUMP 0
@@ -441,31 +441,18 @@ read_gbe_file(void)
cmd == CMD_SETCHECKSUM)
do_read[part ^ 1] = 0;
- /*
- * SPEED HACK:
- *
- * On copy/swap commands, flip where data gets written to memory,
- * so that cmd_copy and cmd_swap don't have to work on every word
- *
- * NOTE:
- *
- * write_gbe_file() will not use this, but copy/setchecksum commands
- * will directly manipulate part_modified[], telling write_gbe_file()
- * to also write in reverse, as in read_gbe_file().
- */
- if (cmd == CMD_COPY || cmd == CMD_SWAP)
- invert = 1;
-
for (p = 0; p < 2; p++) {
if (do_read[p])
- read_gbe_file_part(p, invert);
+ read_gbe_file_part(p);
}
}
static void
-read_gbe_file_part(size_t p, uint8_t invert)
+read_gbe_file_part(size_t p)
{
- read_file_exact(gbe_fd, gbe_mem_offset(p ^ invert, "pread"),
+ void *mem_offset = gbe_mem_offset(p ^ command[cmd].invert, "pread");
+
+ read_file_exact(gbe_fd, mem_offset,
GBE_PART_SIZE, gbe_file_offset(p, "pread"), fname, "pread");
}
@@ -794,7 +781,7 @@ good_checksum(size_t partnum)
return 1;
fprintf(stderr, "WARNING: BAD checksum in part %zu\n",
- partnum ^ invert);
+ partnum ^ command[cmd].invert);
set_err(ECANCELED);
return 0;