summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/nvmutil/nvmutil.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c
index 55d7e5f6..b6deaeaa 100644
--- a/util/nvmutil/nvmutil.c
+++ b/util/nvmutil/nvmutil.c
@@ -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;
@@ -243,14 +242,6 @@ cmd_brick(void)
}
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)
{
if ((gbeFileModified = nvmPartModified[part ^ 1] = validChecksum(part)))
@@ -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);
}