util/nvmutil: optimise swap command

handle it exclusively in writeGbeFile()

this reduces nvmutil.c sloccount to 261, versus 265

Signed-off-by: Leah Rowe <leah@libreboot.org>
btrfsvols
Leah Rowe 2023-09-19 15:56:55 +01:00
parent 4d44820163
commit 137a548b04
1 changed files with 11 additions and 16 deletions

View File

@ -24,7 +24,6 @@ void showmac(int partnum);
void hexdump(int partnum);
void cmd_setchecksum(void);
void cmd_brick(void);
void cmd_swap(void);
void cmd_copy(void);
int validChecksum(int partnum);
void setWord(int pos16, int partnum, uint16_t val16);
@ -52,7 +51,7 @@ typedef struct op {
op_t op[] = {
{ .str = "dump", .cmd = cmd_dump, .args = 3},
{ .str = "setmac", .cmd = cmd_setmac, .args = 3},
{ .str = "swap", .cmd = cmd_swap, .args = 3},
{ .str = "swap", .cmd = writeGbeFile, .args = 3},
{ .str = "copy", .cmd = cmd_copy, .args = 4},
{ .str = "brick", .cmd = cmd_brick, .args = 4},
{ .str = "setchecksum", .cmd = cmd_setchecksum, .args = 4},
@ -102,7 +101,7 @@ main(int argc, char *argv[])
readGbeFile();
(*cmd)();
if ((gbeFileModified) && (flags != O_RDONLY))
if ((gbeFileModified) && (flags != O_RDONLY) && (cmd != writeGbeFile))
writeGbeFile();
err_if((errno != 0) && (cmd != &cmd_dump));
return errno;
@ -122,7 +121,7 @@ openFiles(const char *path)
void
readGbeFile(void)
{
nf = ((cmd == cmd_swap) || (cmd == cmd_copy)) ? SIZE_4KB : nf;
nf = ((cmd == writeGbeFile) || (cmd == cmd_copy)) ? SIZE_4KB : nf;
skipread[part ^ 1] = (cmd == &cmd_copy) | (cmd == &cmd_setchecksum)
| (cmd == &cmd_brick);
gbe[1] = (gbe[0] = (size_t) buf) + SIZE_4KB;
@ -242,14 +241,6 @@ cmd_brick(void)
setWord(0x3F, part, (word(0x3F, part)) ^ 0xFF);
}
void
cmd_swap(void)
{
if ((gbeFileModified = nvmPartModified[0] = nvmPartModified[1]
= validChecksum(1) | validChecksum(0)))
xorswap(gbe[0], gbe[1]); /* speedhack: swap ptr, not words */
}
void
cmd_copy(void)
{
@ -288,11 +279,15 @@ void
writeGbeFile(void)
{
errno = 0;
for (int x = gbe[0] > gbe[1] ? 1 : 0, p = 0; p < 2; p++, x ^= 1) {
if (!nvmPartModified[x])
if (cmd == writeGbeFile) {
err_if(!(validChecksum(0) || validChecksum(1)));
xorswap(gbe[0], gbe[1]);
}
for (int p = 0; p < 2; p++) {
if ((!nvmPartModified[p]) && (gbe[0] <= gbe[1]))
continue;
handle_endianness(x);
err_if(pwrite(fd, (uint8_t *) gbe[x], nf, x << 12) == -1);
handle_endianness(p);
err_if(pwrite(fd, (uint8_t *) gbe[p], nf, p << 12) == -1);
}
err_if(close(fd) == -1);
}