util/nvmutil: do xor swap in a macro
eventually, everything will be a macro! Signed-off-by: Leah Rowe <leah@libreboot.org>fsdg20230625
parent
293ca0fcbb
commit
7ab209d545
|
@ -53,7 +53,7 @@ void cmd_swap(void);
|
||||||
void cmd_copy(void);
|
void cmd_copy(void);
|
||||||
int validChecksum(int partnum);
|
int validChecksum(int partnum);
|
||||||
void setWord(int pos16, int partnum, uint16_t val16);
|
void setWord(int pos16, int partnum, uint16_t val16);
|
||||||
void byteswap(int n, int partnum);
|
void xorswap_buf(int n, int partnum);
|
||||||
void writeGbeFile(int *fd, const char *filename, size_t nw);
|
void writeGbeFile(int *fd, const char *filename, size_t nw);
|
||||||
void xpledge(const char *promises, const char *execpromises);
|
void xpledge(const char *promises, const char *execpromises);
|
||||||
void xunveil(const char *path, const char *permissions);
|
void xunveil(const char *path, const char *permissions);
|
||||||
|
@ -68,6 +68,7 @@ void err_if(int condition);
|
||||||
|
|
||||||
#define word(pos16, partnum) (buf16[pos16 + (partnum << 11)])
|
#define word(pos16, partnum) (buf16[pos16 + (partnum << 11)])
|
||||||
#define ERR() (errno = errno ? errno : ECANCELED)
|
#define ERR() (errno = errno ? errno : ECANCELED)
|
||||||
|
#define xorswap(x, y) x ^= y, y ^= x, x ^= y
|
||||||
|
|
||||||
uint16_t buf16[SIZE_4KB];
|
uint16_t buf16[SIZE_4KB];
|
||||||
uint8_t *buf;
|
uint8_t *buf;
|
||||||
|
@ -166,7 +167,7 @@ readGbeFile(int *fd, const char *path, int flags, size_t nr)
|
||||||
if (pread((*fd), (uint8_t *) gbe[p], nr, p << 12) == -1)
|
if (pread((*fd), (uint8_t *) gbe[p], nr, p << 12) == -1)
|
||||||
err(ERR(), "%s", path);
|
err(ERR(), "%s", path);
|
||||||
if (big_endian)
|
if (big_endian)
|
||||||
byteswap(nr, p);
|
xorswap_buf(nr, p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,9 +299,7 @@ cmd_brick(void)
|
||||||
void
|
void
|
||||||
cmd_swap(void)
|
cmd_swap(void)
|
||||||
{
|
{
|
||||||
gbe[0] ^= gbe[1]; /* speedhack: swap ptr, not words */
|
xorswap(gbe[0], gbe[1]); /* speedhack: swap ptr, not words */
|
||||||
gbe[1] ^= gbe[0];
|
|
||||||
gbe[0] ^= gbe[1];
|
|
||||||
gbeFileModified = nvmPartModified[0] = nvmPartModified[1]
|
gbeFileModified = nvmPartModified[0] = nvmPartModified[1]
|
||||||
= validChecksum(1) | validChecksum(0);
|
= validChecksum(1) | validChecksum(0);
|
||||||
}
|
}
|
||||||
|
@ -335,16 +334,11 @@ setWord(int pos16, int partnum, uint16_t val16)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
byteswap(int n, int partnum)
|
xorswap_buf(int n, int partnum)
|
||||||
{
|
{
|
||||||
int b1, b2, wcount = n >> 1;
|
|
||||||
uint8_t *nbuf = (uint8_t *) gbe[partnum];
|
uint8_t *nbuf = (uint8_t *) gbe[partnum];
|
||||||
for (int w = 0; w < wcount; w++) {
|
for (int w = 0; w < (n >> 1); w++)
|
||||||
b1 = b2 = w << 1;
|
xorswap(nbuf[w << 1], nbuf[(w << 1) + 1]);
|
||||||
nbuf[b1] ^= nbuf[++b2]; /* xor swap */
|
|
||||||
nbuf[b2] ^= nbuf[b1];
|
|
||||||
nbuf[b1] ^= nbuf[b2];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -358,7 +352,7 @@ writeGbeFile(int *fd, const char *filename, size_t nw)
|
||||||
if (!nvmPartModified[p])
|
if (!nvmPartModified[p])
|
||||||
goto next_part;
|
goto next_part;
|
||||||
if (big_endian)
|
if (big_endian)
|
||||||
byteswap(nw, p);
|
xorswap_buf(nw, p);
|
||||||
if (pwrite((*fd), (uint8_t *) gbe[p], nw, p << 12) == -1)
|
if (pwrite((*fd), (uint8_t *) gbe[p], nw, p << 12) == -1)
|
||||||
err(ERR(), "%s", filename);
|
err(ERR(), "%s", filename);
|
||||||
next_part:
|
next_part:
|
||||||
|
|
Loading…
Reference in New Issue