diff options
| author | lbmkplaceholder <placeholder@lbmkplaceholder.com> | 2022-12-23 08:41:18 +0000 | 
|---|---|---|
| committer | lbmkplaceholder <placeholder@lbmkplaceholder.com> | 2022-12-23 08:41:18 +0000 | 
| commit | 6e5828e4a8d11ce7f6d8a4868a6e0afa54e6ebf0 (patch) | |
| tree | 2e67af6610db9a8fad18cd4b3c6b4b888c429e99 /util/nvmutil | |
| parent | 7aafc62bf7f4d062ce006bea2a6d80e28e5c0f9a (diff) | |
util/nvmutil: greatly optimise cmd_swap()
instead of XOR-swapping every byte, have pointers to the
two parts and *XOR swap the pointers*. at the end of the
program execution, when writing, pwrite the two parts into
the same file
Diffstat (limited to 'util/nvmutil')
| -rw-r--r-- | util/nvmutil/nvmutil.c | 27 | 
1 files changed, 18 insertions, 9 deletions
diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index 80d515f7..b80616ae 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -57,7 +57,7 @@ void writeGbeFile(int *fd, const char *filename);  #define SIZE_4KB 0x1000  #define SIZE_8KB 0x2000 -uint8_t gbe[SIZE_8KB]; +uint8_t *gbe = NULL, *gbe2 = NULL;  int part, gbeFileModified = 0;  uint8_t nvmPartModified[2]; @@ -73,6 +73,10 @@ main(int argc, char *argv[])  	char *strRMac = "??:??:??:??:??:??";  	void (*cmd)(void) = NULL; +	if ((gbe = (uint8_t *) malloc(SIZE_8KB)) == NULL) +		err(errno, NULL); +	gbe2 = gbe + SIZE_4KB; +  	nvmPartModified[0] = 0;  	nvmPartModified[1] = 0; @@ -351,16 +355,18 @@ void  cmd_swap(void)  {  	int part0, part1; +	size_t g1 = (size_t) gbe; +	size_t g2 = (size_t) gbe2;  	part0 = validChecksum(0);  	part1 = validChecksum(1);  	if (part0 || part1) { -		for(part0 = 0; part0 < SIZE_4KB; part0++) { -			gbe[part0] ^= gbe[part1 = (part0 | SIZE_4KB)]; -			gbe[part1] ^= gbe[part0]; -			gbe[part0] ^= gbe[part1]; -		} +		g1 ^= g2; +		g2 ^= g1; +		g1 ^= g2; +		gbe = (uint8_t *) g1; +		gbe2 = (uint8_t *) g2;  		gbeFileModified = 1;  		nvmPartModified[0] = 1; @@ -438,9 +444,12 @@ writeGbeFile(int *fd, const char *filename)  	int partnum;  	errno = 0; -	if (pwrite((*fd), gbe, SIZE_8KB, 0) == SIZE_8KB) -		if (close((*fd))) -			err(errno, "%s", filename); +	if (pwrite((*fd), gbe, SIZE_4KB, 0) != SIZE_4KB) +		err(errno, "%s", filename); +	if (pwrite((*fd), gbe2, SIZE_4KB, SIZE_4KB) != SIZE_4KB) +		err(errno, "%s", filename); +	if (close((*fd))) +		err(errno, "%s", filename);  	if (errno != 0)  		return;  | 
