diff options
author | Francis Rowe <info@gluglug.org.uk> | 2015-01-11 00:51:32 +0000 |
---|---|---|
committer | Francis Rowe <info@gluglug.org.uk> | 2015-01-11 03:04:47 +0000 |
commit | b833801ae4a0179ff29a661a9932fe0f56173d80 (patch) | |
tree | 09f32bce0ed6c6aa8f8c26a1ef6dd4267a8fed52 /resources/utilities/ich9deblob | |
parent | 2e909117e9733070a23d4164ba7c30b2f8d825a9 (diff) | |
download | librebootfr-b833801ae4a0179ff29a661a9932fe0f56173d80.tar.gz librebootfr-b833801ae4a0179ff29a661a9932fe0f56173d80.zip |
ich9deblob/ich9gen: re-factor the gbe checksum function
Diffstat (limited to 'resources/utilities/ich9deblob')
-rw-r--r-- | resources/utilities/ich9deblob/src/gbe/gbe.c | 34 | ||||
-rw-r--r-- | resources/utilities/ich9deblob/src/gbe/gbe.h | 3 |
2 files changed, 8 insertions, 29 deletions
diff --git a/resources/utilities/ich9deblob/src/gbe/gbe.c b/resources/utilities/ich9deblob/src/gbe/gbe.c index 5f4cffce..9a7f44ff 100644 --- a/resources/utilities/ich9deblob/src/gbe/gbe.c +++ b/resources/utilities/ich9deblob/src/gbe/gbe.c @@ -32,42 +32,22 @@ * --------------------------------------------------------------------- */ -/* Read a 16-bit unsigned int from a supplied region buffer */ -uint16_t gbeGetRegionWordFrom8kBuffer(int wordOffset, uint8_t* regionData) -{ - int byteOffset = wordOffset << 1; - - uint16_t* regionDataWordAddress = (uint16_t*)(regionData+byteOffset); - uint16_t regionWord = *regionDataWordAddress; - - return regionWord; -} - /* gbe checksum calculation (algorithm based on datasheet) */ -uint16_t gbeGetChecksumFrom8kBuffer(uint8_t* regionData, uint16_t desiredValue, int byteOffset) +uint16_t gbeGetChecksumFrom8kBuffer(uint16_t* regionData, uint16_t desiredValue, int gbeRegionBase) { - int i; - int wordOffset = byteOffset >> 1; - - uint16_t regionWord; /* store words here for adding to checksum */ - uint16_t checksum = 0; /* this gbe's checksum */ + int wordOffset; + uint16_t total = 0; - for (i = 0; i < 0x3F; i++) { - regionWord = gbeGetRegionWordFrom8kBuffer(i+wordOffset, regionData); - checksum += regionWord; - } - checksum = desiredValue - checksum; + for (wordOffset = 0; wordOffset < 0x3F; wordOffset++) + total += regionData[wordOffset + (gbeRegionBase>>1)]; - return checksum; + return desiredValue - total; } /* checksum calculation for 4k gbe struct (algorithm based on datasheet) */ uint16_t gbeGetChecksumFrom4kStruct(struct GBEREGIONRECORD_4K gbeStruct4k, uint16_t desiredValue) { - uint8_t gbeBuffer4k[GBEREGIONSIZE_4K]; - memcpy(&gbeBuffer4k, &gbeStruct4k, GBEREGIONSIZE_4K); - - return gbeGetChecksumFrom8kBuffer(gbeBuffer4k, desiredValue, 0); + return gbeGetChecksumFrom8kBuffer((uint16_t*)&gbeStruct4k, desiredValue, 0); } /* modify the gbe region extracted from a factory.rom dump */ diff --git a/resources/utilities/ich9deblob/src/gbe/gbe.h b/resources/utilities/ich9deblob/src/gbe/gbe.h index 68b9ed70..ff620c44 100644 --- a/resources/utilities/ich9deblob/src/gbe/gbe.h +++ b/resources/utilities/ich9deblob/src/gbe/gbe.h @@ -424,8 +424,7 @@ struct GBEREGIONRECORD_8K { * --------------------------------------------------------------------- */ -uint16_t gbeGetRegionWordFrom8kBuffer(int wordOffset, uint8_t* regionData); -uint16_t gbeGetChecksumFrom8kBuffer(uint8_t* regionData, uint16_t desiredValue, int byteOffset); +uint16_t gbeGetChecksumFrom8kBuffer(uint16_t* regionData, uint16_t desiredValue, int gbeRegionBase); uint16_t gbeGetChecksumFrom4kStruct(struct GBEREGIONRECORD_4K gbeStruct4k, uint16_t desiredValue); struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8K factoryGbeStruct8k); int notCreatedHFileForGbeCFile(char* outFileName, char* cFileName); |