diff options
-rw-r--r-- | resources/utilities/ich9deblob/src/ich9deblob.c | 172 |
1 files changed, 52 insertions, 120 deletions
diff --git a/resources/utilities/ich9deblob/src/ich9deblob.c b/resources/utilities/ich9deblob/src/ich9deblob.c index d025a64..18b5c81 100644 --- a/resources/utilities/ich9deblob/src/ich9deblob.c +++ b/resources/utilities/ich9deblob/src/ich9deblob.c @@ -49,37 +49,18 @@ int main() { - /* - * descriptor region. Will have an actual descriptor struct mapped to it (from the factory.rom dump) - * and then it will be modified (deblobbed) to remove the ME/AMT - */ - uint8_t factoryDescriptorBuffer[DESCRIPTORREGIONSIZE]; - struct DESCRIPTORREGIONRECORD factoryDescriptorStruct; - struct DESCRIPTORREGIONRECORD deblobbedDescriptorStruct; + struct DESCRIPTORREGIONRECORD descriptorStruct; + uint8_t* descriptorBuffer = (uint8_t*)&descriptorStruct; - /* - * gbe region. Well have actual gbe buffer mapped to it (from the factory.rom dump) - * and then it will be modified to correct the main region - */ - uint8_t factoryGbeBuffer8k[GBEREGIONSIZE_8K]; - struct GBEREGIONRECORD_8K factoryGbeStruct8k; - struct GBEREGIONRECORD_8K deblobbedGbeStruct8k; - - /* - * Used to store the location of the Gbe - * region inside the factory.rom image. - */ - uint32_t factoryGbeRegionStart; + struct GBEREGIONRECORD_8K gbeStruct8k; + uint8_t* gbeBuffer8k = (uint8_t*)&gbeStruct8k; + uint32_t gbeRegionStart; - /* names of the files that this utility will handle */ - char* factoryRomFilename = "factory.rom"; /* user-supplied factory.bin dump (original firmware) */ - char* deblobbedDescriptorFilename = "deblobbed_descriptor.bin"; /* descriptor+gbe: to be dd'd to beginning of a libreboot image */ + char* romFilename = "factory.rom"; + char* descriptorGbeFilename = "deblobbed_descriptor.bin"; - /* Used when reading the factory.rom to extract descriptor/gbe regions */ unsigned int bufferLength; - - /* For storing the size of the factory.rom dump in bytes */ - unsigned int factoryRomSize; + unsigned int romSize; /* * ------------------------------------------------------------------ @@ -87,7 +68,7 @@ int main() * ------------------------------------------------------------------ */ - if (systemOrCompilerIncompatible(factoryDescriptorStruct, factoryGbeStruct8k)) return 1; + if (systemOrCompilerIncompatible(descriptorStruct, gbeStruct8k)) return 1; /* If true, fail with error message */ /* @@ -95,92 +76,55 @@ int main() * Extract the descriptor and gbe regions from the factory.rom dump * ------------------------------------------------------------------ */ - FILE* fileStream = NULL; - fileStream = fopen(factoryRomFilename, "rb"); /* open factory.rom */ - if (NULL == fileStream) + FILE* fp = NULL; + fp = fopen(romFilename, "rb"); /* open factory.rom */ + if (NULL == fp) { - printf("\nerror: could not open factory.rom\n"); - fclose(fileStream); + printf("\nerror: could not open %s\n", romFilename); + fclose(fp); return 1; } - printf("\nfactory.rom opened successfully\n"); + printf("\n%s opened successfully\n", romFilename); /* * Get the descriptor region dump from the factory.rom * (goes in factoryDescriptorBuffer variable) */ - bufferLength = fread(factoryDescriptorBuffer, 1, DESCRIPTORREGIONSIZE, fileStream); + bufferLength = fread(descriptorBuffer, 1, DESCRIPTORREGIONSIZE, fp); if (DESCRIPTORREGIONSIZE != bufferLength) // { - printf("\nerror: could not read descriptor from factory.rom (%i) bytes read\n", bufferLength); - fclose(fileStream); + printf("\nerror: could not read descriptor from %s (%i) bytes read\n", romFilename, bufferLength); + fclose(fp); return 1; } printf("\ndescriptor region read successfully\n"); - /* - * copy descriptor buffer into descriptor struct memory - * factoryDescriptorStruct is an instance of a struct that actually - * defines the locations of all these variables in the descriptor, - * as defined in the datasheets. This allows us to map the extracted - * descriptor over the struct so that it can then be modified - * for libreboot's purpose - */ - memcpy(&factoryDescriptorStruct, &factoryDescriptorBuffer, DESCRIPTORREGIONSIZE); - /* - * ^ the above is just for reference if needed. The modifications will be made here: - */ - memcpy(&deblobbedDescriptorStruct, &factoryDescriptorBuffer, DESCRIPTORREGIONSIZE); - /* - * Get the gbe region dump from the factory.rom - */ - - /* - * get original GBe region location - * (it will be moved to the beginning of the flash, after the descriptor region) - * note for example, factoryGbeRegionStart is set to <<FLREGIONBITSHIFT of actual address (in C). this is how the addresses - * are stored in the descriptor. - */ - factoryGbeRegionStart = factoryDescriptorStruct.regionSection.flReg3.BASE << FLREGIONBITSHIFT; + gbeRegionStart = descriptorStruct.regionSection.flReg3.BASE << FLREGIONBITSHIFT; /* * Set offset so that we can read the data from * the gbe region */ - fseek(fileStream, factoryGbeRegionStart, SEEK_SET); + fseek(fp, gbeRegionStart, SEEK_SET); /* Read the gbe data from the factory.rom and put it in factoryGbeBuffer8k */ - bufferLength = fread(factoryGbeBuffer8k, 1, GBEREGIONSIZE_8K, fileStream); + bufferLength = fread(gbeBuffer8k, 1, GBEREGIONSIZE_8K, fp); if (GBEREGIONSIZE_8K != bufferLength) { - printf("\nerror: could not read GBe region from factory.rom (%i) bytes read\n", bufferLength); - fclose(fileStream); + printf("\nerror: could not read GBe region from %s (%i) bytes read\n", romFilename, bufferLength); + fclose(fp); return 1; } printf("\ngbe (8KiB) region read successfully\n"); - /* - * copy gbe buffer into gbe struct memory - * factoryGbeStruct8k is an instance of a struct that actually - * defines the locations of all these variables in the gbe, - * as defined in the datasheets. This allows us to map the extracted - * gbe over the struct so that it can then be modified - * for libreboot's purpose - */ - memcpy(&factoryGbeStruct8k, &factoryGbeBuffer8k, GBEREGIONSIZE_8K); - /* - * the original factoryGbeStruct8k is only reference. Changes go here: - */ - memcpy(&deblobbedGbeStruct8k, &factoryGbeBuffer8k, GBEREGIONSIZE_8K); - - /* - * Get size of ROM image - * This is needed for relocating the BIOS region (per descriptor) - */ - fseek(fileStream, 0L, SEEK_END); - factoryRomSize = ftell(fileStream); - printf("\nfactory.rom size: [%i] bytes\n", factoryRomSize); + fseek(fp, 0L, SEEK_END); + romSize = ftell(fp); + printf("\n%s size: [%i] bytes\n", romFilename, romSize); - fclose(fileStream); + fclose(fp); + + /* Debugging (before modification) */ + printDescriptorRegionLocations(descriptorStruct, "Original"); + printGbeChecksumDataFromStruct8k(gbeStruct8k, "Original"); /* * ------------------------------------------------------------------ @@ -188,29 +132,15 @@ int main() * ------------------------------------------------------------------ */ - /* - * Disable the ME and Platform regions. Put Gbe at the beginning (after descriptor). - * Also, extend the BIOS region to fill the ROM image (after descriptor+gbe). - */ - deblobbedDescriptorStruct = deblobbedDescriptorStructFromFactory(factoryDescriptorStruct, factoryRomSize); - /* - * Debugging: show region locations in the - * original descriptor and the modified one - */ - printDescriptorRegionLocations(factoryDescriptorStruct, "Original"); - printDescriptorRegionLocations(deblobbedDescriptorStruct, "Modified"); + /* Delete the ME/Platform regions, place Gbe after the descriptor, resize BIOS region to fill the gap */ + descriptorStruct = deblobbedDescriptorStructFromFactory(descriptorStruct, romSize); - /* - * Modify the Gbe region (see function for details) - */ - deblobbedGbeStruct8k = deblobbedGbeStructFromFactory(factoryGbeStruct8k); - /* - * Debugging: show difference between Gbe checksums in the - * original gbe and the modified one - */ - printf("\n"); - printGbeChecksumDataFromStruct8k(factoryGbeStruct8k, "Original"); - printGbeChecksumDataFromStruct8k(deblobbedGbeStruct8k, "Modified"); + /* Modify the Gbe region (see function for details) */ + gbeStruct8k = deblobbedGbeStructFromFactory(gbeStruct8k); + + /* Debugging (after modifying the descriptor and gbe regions) */ + printDescriptorRegionLocations(descriptorStruct, "Modified"); + printGbeChecksumDataFromStruct8k(gbeStruct8k, "Modified"); /* * ------------------------------------------------------------------ @@ -219,7 +149,7 @@ int main() */ printf("\n"); - if (notCreatedDescriptorGbeFile(deblobbedDescriptorStruct, deblobbedGbeStruct8k, deblobbedDescriptorFilename)) { + if (notCreatedDescriptorGbeFile(descriptorStruct, gbeStruct8k, descriptorGbeFilename)) { return 1; } @@ -228,23 +158,25 @@ int main() * Generate ich9gen data (C code that will recreate the deblobbed descriptor+gbe from scratch) * ------------------------------------------------------------------ */ - /* Code for generating the Gbe struct */ - /* mkgbe.h */ - if (notCreatedHFileForGbeCFile("mkgbe.h", "mkgbe.c")) { - return 1; - } /* and now mkgbe.c */ - if (notCreatedCFileFromGbeStruct4k(deblobbedGbeStruct8k.backup, "mkgbe.c", "mkgbe.h")) { - return 1; - } /* Code for generating the Descriptor struct */ /* mkdescriptor.h */ if (notCreatedHFileForDescriptorCFile("mkdescriptor.h", "mkdescriptor.c")) { return 1; } /* and now mkdescriptor.c */ - if (notCreatedCFileFromDescriptorStruct(deblobbedDescriptorStruct, "mkdescriptor.c", "mkdescriptor.h")) { + if (notCreatedCFileFromDescriptorStruct(descriptorStruct, "mkdescriptor.c", "mkdescriptor.h")) { + return 1; + } + + /* Code for generating the Gbe struct */ + /* mkgbe.h */ + if (notCreatedHFileForGbeCFile("mkgbe.h", "mkgbe.c")) { + return 1; + } /* and now mkgbe.c */ + if (notCreatedCFileFromGbeStruct4k(gbeStruct8k.backup, "mkgbe.c", "mkgbe.h")) { return 1; } - printf("The modified descriptor and gbe regions have also been dumped as src files: mkgbe.c, mkgbe.h, mkdescriptor.c, mkdescriptor.h\n"); + + printf("The modified descriptor and gbe regions have also been dumped as src files: mkdescriptor.c, mkdescriptor.h, mkgbe.c, mkgbe.h\n"); printf("To use these in ich9gen, place them in src/ich9gen/ and re-build ich9gen.\n\n"); return 0; |