diff options
| -rw-r--r-- | util/nvmutil/nvmutil.c | 53 | 
1 files changed, 16 insertions, 37 deletions
| diff --git a/util/nvmutil/nvmutil.c b/util/nvmutil/nvmutil.c index 508f76ee..4303337e 100644 --- a/util/nvmutil/nvmutil.c +++ b/util/nvmutil/nvmutil.c @@ -91,13 +91,13 @@ main(int argc, char *argv[])  	gbe[1] = (gbe[0] = (size_t) buf) + SIZE_4KB;  	test = 1; -	big_endian = ((uint8_t *) &test)[0] ^ 1; /* check host endianness */ +	big_endian = ((uint8_t *) &test)[0] ^ 1;  	if (argc == 3) {  		if (strcmp(COMMAND, "dump") == 0) {  #ifdef HAVE_PLEDGE -			if (pledge("stdio rpath", NULL) == -1) -				err(errno, "pledge"); /* not very puffy */ +			if (pledge("stdio rpath", NULL) == -1) /* openbsd */ +				err(errno, "pledge");  #endif  			flags = O_RDONLY;  			cmd = &cmd_dump; @@ -126,19 +126,18 @@ main(int argc, char *argv[])  	nr = SIZE_4KB; /* copy/swap commands need everything to be read */  	if ((cmd != &cmd_copy) && (cmd != &cmd_swap)) -		nr = 128; /* read only the nvm part */ +		nr = 128; /* speedhack: read only the nvm part */  	if ((cmd == &cmd_copy) || (cmd == &cmd_setchecksum) ||  	    (cmd == &cmd_brick)) -		skipread[part ^ 1] = 1; /* skip reading the unused part */ +		skipread[part ^ 1] = 1; /* speedhack: don't read unused part */  	readGbeFile(&fd, FILENAME, flags, nr); -	/* perform operation specified by the user */  	if (strMac != NULL) -		cmd_setmac(strMac); +		cmd_setmac(strMac); /* nvm gbe.bin setmac */  	else if (cmd != NULL) -		(*cmd)(); +		(*cmd)(); /* all other commands except setmac */  	if (gbeFileModified)  		writeGbeFile(&fd, FILENAME); @@ -151,7 +150,6 @@ nvmutil_exit:  	return errno;  } -/* load the gbe file into memory */  void  readGbeFile(int *fd, const char *path, int flags, size_t nr)  { @@ -181,7 +179,6 @@ readGbeFile(int *fd, const char *path, int flags, size_t nr)  	}  } -/* set mac address on valid nvm parts, per user input */  void  cmd_setmac(const char *strMac)  { @@ -193,20 +190,18 @@ cmd_setmac(const char *strMac)  		if (!validChecksum(partnum))  			continue;  		for (int w = 0; w < 3; w++) -			setWord(w, partnum, mac[w]); /* do not use memcpy! */ +			setWord(w, partnum, mac[w]);  		byteswap(6, partnum); /* mac words are stored big-endian */  		part = partnum;  		cmd_setchecksum();  	}  } -/* read mac address from user input */  int  parseMacAddress(const char *strMac, uint16_t *mac)  {  	uint8_t h;  	uint64_t total = 0; -  	if (strnlen(strMac, 20) != 17)  		return -1; @@ -226,10 +221,8 @@ parseMacAddress(const char *strMac, uint16_t *mac)  				<< ((8 * ((byte % 2) ^ 1)) + (4 * (nib ^ 1)));  		}  	} - -	/* Disallow multicast and all-zero MAC addresses */  	return ((total == 0) || (mac[0] & 0x100)) -		? -1 : 0; +		? -1 : 0; /* disallow multicast/zero mac addresses */  }  uint8_t @@ -247,7 +240,6 @@ hextonum(char ch)  		return 16;  } -/* generate a random number from 0 to 15, the unix way */  uint8_t  rhex(void)  { @@ -265,7 +257,6 @@ rhex(void)  	return rval;  } -/* show mac address and hexdump of each nvm part */  void  cmd_dump(void)  { @@ -281,7 +272,6 @@ cmd_dump(void)  		errno = 0;  } -/* show formatted mac address contained within the nvm part */  void  showmac(int partnum)  { @@ -296,7 +286,6 @@ showmac(int partnum)  	}  } -/* output a hexdump of both nvm parts, bytes reversed to big-endian order */  void  hexdump(int partnum)  { @@ -311,7 +300,6 @@ hexdump(int partnum)  	}  } -/* set a valid checksum on a given part */  void  cmd_setchecksum(void)  { @@ -321,7 +309,6 @@ cmd_setchecksum(void)  	setWord(0x3F, part, 0xBABA - val16);  } -/* set invalid checksum, intentionally */  void  cmd_brick(void)  { @@ -329,12 +316,11 @@ cmd_brick(void)  		setWord(0x3F, part, (word(0x3F, part)) ^ 0xFF);  } -/* swap the words of each part with each other */  void  cmd_swap(void)  {  	if (validChecksum(1) || validChecksum(0)) { -		gbe[0] ^= gbe[1]; /* speed hack: xorswap pointers, not words */ +		gbe[0] ^= gbe[1]; /* speedhack: xorswap pointers, not words */  		gbe[1] ^= gbe[0];  		gbe[0] ^= gbe[1];  		gbeFileModified = 1; /* not using setWord, so must set these */ @@ -344,12 +330,11 @@ cmd_swap(void)  	}  } -/* overwrite one part with the other */  void  cmd_copy(void)  {  	if (validChecksum(part)) { -		gbe[part ^ 1] = gbe[part]; /* pointer-based speed hack */ +		gbe[part ^ 1] = gbe[part]; /* speedhack: copy ptr, not words */  		gbeFileModified = 1; /* not using setWord, so must set these */  		nvmPartModified[part ^ 1] = 1;  	} @@ -369,14 +354,12 @@ validChecksum(int partnum)  	return 0;  } -/* fetch a word from gbe buffer */  uint16_t  word(int pos16, int partnum)  {  	return buf16[pos16 + (partnum << 11)];  } -/* write a word to gbe buffer, and record that a write has occured */  void  setWord(int pos16, int partnum, uint16_t val16)  { @@ -388,7 +371,6 @@ setWord(int pos16, int partnum, uint16_t val16)  	nvmPartModified[partnum] = 1;  } -/* big-endian host compatibility: called post-read and again pre-write */  void  byteswap(int n, int partnum)  { @@ -396,28 +378,25 @@ byteswap(int n, int partnum)  	uint8_t *nbuf = (uint8_t *) gbe[partnum];  	for (int w = 0; w < wcount; w++) {  		b1 = b2 = w << 1; - -		/* xor-based swap method */ -		nbuf[b1] ^= nbuf[++b2]; +		nbuf[b1] ^= nbuf[++b2]; /* xor swap */  		nbuf[b2] ^= nbuf[b1];  		nbuf[b1] ^= nbuf[b2];  	}  } -/* called after all operations are done, if gbe was modified */  void  writeGbeFile(int *fd, const char *filename)  {  	int p, nw;  	errno = 0;  	if ((gbe[0] != gbe[1]) && (gbe[0] < gbe[1])) -		nw = 128; /* write only the nvm part */ +		nw = 128; /* speedhack: write only the nvm part */  	else  		nw = SIZE_4KB; /* copy/swap, so only write everything */  	for (p = 0; p < 2; p++) { -		if (gbe[0] > gbe[1]) /* write sequentially on-disk */ -			p ^= 1; +		if (gbe[0] > gbe[1]) +			p ^= 1; /* speedhack: write sequentially on-disk */  		if (!nvmPartModified[p])  			goto next_part;  		if (big_endian) @@ -426,7 +405,7 @@ writeGbeFile(int *fd, const char *filename)  			err(errno, "%s", filename);  next_part:  		if (gbe[0] > gbe[1]) -			p ^= 1; +			p ^= 1; /* speedhack: write sequentially on-disk */  	}  	if (close((*fd)))  		err(errno, "%s", filename); | 
