diff options
Diffstat (limited to 'projects/ich9gen/sources/src')
-rw-r--r-- | projects/ich9gen/sources/src/common/descriptor_gbe.c | 36 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/common/descriptor_gbe.h | 4 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/common/x86compatibility.c | 48 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/common/x86compatibility.h | 4 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/demefactory.c | 38 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/demefactory.h | 4 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/descriptor/descriptor.c | 94 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/descriptor/descriptor.h | 44 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/gbe/gbe.c | 78 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/gbe/gbe.h | 116 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/ich9deblob.c | 44 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/ich9deblob.h | 4 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/ich9gen.c | 46 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/ich9gen.h | 4 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/ich9gen/mkdescriptor.c | 1 | ||||
-rw-r--r-- | projects/ich9gen/sources/src/ich9gen/mkgbe.c | 1 |
16 files changed, 282 insertions, 284 deletions
diff --git a/projects/ich9gen/sources/src/common/descriptor_gbe.c b/projects/ich9gen/sources/src/common/descriptor_gbe.c index 1c1ad32b..bce8afc3 100644 --- a/projects/ich9gen/sources/src/common/descriptor_gbe.c +++ b/projects/ich9gen/sources/src/common/descriptor_gbe.c @@ -1,7 +1,7 @@ /* * descriptor_gbe.c * This file is part of the ich9deblob utility from the libreboot project - * + * * Purpose: common descriptor/gbe functions used by ich9deblob * * Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org> @@ -20,71 +20,71 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + #include "descriptor_gbe.h" -/* +/* * create 12KiB file with descriptor, and then gbe immediately after. */ int notCreatedDescriptorGbeFile(struct DESCRIPTORREGIONRECORD descriptorStruct, struct GBEREGIONRECORD_8K gbeStruct8k, char* fileName) { FILE* fileStream = NULL; - + /* delete old file before continuing */ remove(fileName); - + /* open new file for writing the descriptor+gbe */ fileStream = fopen(fileName, "ab"); - + /* write the descriptor region into the first part */ if (DESCRIPTORREGIONSIZE != fwrite((uint8_t*)&descriptorStruct, 1, sizeof(descriptorStruct), fileStream)) { printf("\nerror: writing descriptor region failed\n"); return 1; } - + /* add gbe to the end of the file */ if (GBEREGIONSIZE_8K != fwrite((uint8_t*)&gbeStruct8k, 1, sizeof(gbeStruct8k), fileStream)) { printf("\nerror: writing GBe region failed\n"); return 1; } - + fclose(fileStream); - + printf("descriptor and gbe successfully written to the file: %s\n", fileName); printf("Now do: dd if=%s of=libreboot.rom bs=1 count=12k conv=notrunc\n", fileName); printf("(in other words, add the modified descriptor+gbe to your ROM image)\n\n"); - + return 0; } -/* +/* * create 4KiB file with descriptor */ int notCreated4kDescriptorFile(struct DESCRIPTORREGIONRECORD descriptorStruct, char* fileName) { FILE* fileStream = NULL; - + /* delete old file before continuing */ remove(fileName); - + /* open new file for writing the descriptor+gbe */ fileStream = fopen(fileName, "ab"); - + /* write the descriptor region into the first part */ if (DESCRIPTORREGIONSIZE != fwrite((uint8_t*)&descriptorStruct, 1, sizeof(descriptorStruct), fileStream)) { printf("\nerror: writing descriptor region failed\n"); return 1; } - - + + fclose(fileStream); - + printf("descriptor successfully written to the file: %s\n", fileName); printf("Now do: dd if=%s of=yourrom.rom bs=1 count=4k conv=notrunc\n", fileName); printf("(in other words, add the modified descriptor to your ROM image)\n\n"); - + return 0; } diff --git a/projects/ich9gen/sources/src/common/descriptor_gbe.h b/projects/ich9gen/sources/src/common/descriptor_gbe.h index b3713c80..ff685720 100644 --- a/projects/ich9gen/sources/src/common/descriptor_gbe.h +++ b/projects/ich9gen/sources/src/common/descriptor_gbe.h @@ -1,7 +1,7 @@ /* * gbe_descriptor.h * This file is part of the ich9deblob utility from the libreboot project - * + * * Purpose: header file for descriptor_gbe.c * * Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org> @@ -20,7 +20,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + #ifndef COMMON_DESCRIPTOR_GBE_H #define COMMON_DESCRIPTOR_GBE_H diff --git a/projects/ich9gen/sources/src/common/x86compatibility.c b/projects/ich9gen/sources/src/common/x86compatibility.c index 362c634b..522f3e29 100644 --- a/projects/ich9gen/sources/src/common/x86compatibility.c +++ b/projects/ich9gen/sources/src/common/x86compatibility.c @@ -1,7 +1,7 @@ /* * x86compatibility.c * This file is part of the ich9deblob utility from the libreboot project - * + * * Purpose: compiler/cpu compatibility checks. ich9deblob is not portable, yet. * * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> @@ -30,11 +30,11 @@ */ /* fail if struct size is incorrect */ -int structSizesIncorrect(struct DESCRIPTORREGIONRECORD descriptorDummy, struct GBEREGIONRECORD_8K gbe8kDummy) +int structSizesIncorrect(struct DESCRIPTORREGIONRECORD descriptorDummy, struct GBEREGIONRECORD_8K gbe8kDummy) { unsigned int descriptorRegionStructSize = sizeof(descriptorDummy); unsigned int gbeRegion8kStructSize = sizeof(gbe8kDummy); - + /* check compiler bit-packs in a compatible way. basically, it is expected that this code will be used on x86 */ if (DESCRIPTORREGIONSIZE != descriptorRegionStructSize){ printf("\nerror: compiler incompatibility: descriptor struct length is %i bytes (should be %i)\n", descriptorRegionStructSize, DESCRIPTORREGIONSIZE); @@ -44,7 +44,7 @@ int structSizesIncorrect(struct DESCRIPTORREGIONRECORD descriptorDummy, struct G printf("\nerror: compiler incompatibility: gbe struct length is %i bytes (should be %i)\n", gbeRegion8kStructSize, GBEREGIONSIZE_8K); return 1; } - + return 0; } @@ -54,7 +54,7 @@ int structMembersWrongOrder() int i; struct DESCRIPTORREGIONRECORD descriptorDummy; uint8_t *meVsccTablePtr = (uint8_t*)&descriptorDummy.meVsccTable; - + /* These do not use bitfields. */ descriptorDummy.meVsccTable.jid0 = 0x01020304; /* unsigned int 32-bit */ descriptorDummy.meVsccTable.vscc0 = 0x10203040; /* unsigned int 32-bit */ @@ -66,10 +66,10 @@ int structMembersWrongOrder() descriptorDummy.meVsccTable.padding[1] = 0xBB; /* unsigned char 8-bit */ descriptorDummy.meVsccTable.padding[2] = 0xCC; /* unsigned char 8-bit */ descriptorDummy.meVsccTable.padding[3] = 0xDD; /* unsigned char 8-bit */ - + /* * Look from the top down, and concatenate the unsigned ints but - * with each unsigned in little endian order. + * with each unsigned in little endian order. * Then, concatenate the unsigned chars in big endian order. (in the padding array) * * combined, these should become: @@ -77,7 +77,7 @@ int structMembersWrongOrder() * 04030201 40302010 44332211 08070605 80706050 88776655 AA BB CC DD (ignore this. not byte-separated, just working it out:) * 04 03 02 01 40 30 20 10 44 33 22 11 08 07 06 05 80 70 60 50 88 77 66 55 AA BB CC DD <-- it should match this */ - + if ( ! ( @@ -90,65 +90,65 @@ int structMembersWrongOrder() && *(meVsccTablePtr+24) == 0xAA && *(meVsccTablePtr+25) == 0xBB && *(meVsccTablePtr+26) == 0xCC && *(meVsccTablePtr+27) == 0xDD ) ) { - + printf("\nStruct member order check (descriptorDummy.meVsccTable) with junk/dummy data:"); printf("\nShould be: 04 03 02 01 40 30 20 10 44 33 22 11 08 07 06 05 80 70 60 50 88 77 66 55 aa bb cc dd "); printf("\nAnd it is: "); - + for (i = 0; i < 28; i++) { - printf("%02x ", *(meVsccTablePtr + i)); + printf("%02x ", *(meVsccTablePtr + i)); } printf("\nIncorrect order.\n"); - + return 1; } - + return 0; } /* fail if bit fields are presented in the wrong order */ -int structBitfieldWrongOrder() +int structBitfieldWrongOrder() { int i; struct DESCRIPTORREGIONRECORD descriptorDummy; uint8_t *flMap0Ptr = (uint8_t*)&descriptorDummy.flMaps.flMap0; - + descriptorDummy.flMaps.flMap0.FCBA = 0xA2; /* :8 --> 10100010 */ descriptorDummy.flMaps.flMap0.NC = 0x02; /* :2 --> 10 */ descriptorDummy.flMaps.flMap0.reserved1 = 0x38; /* :6 --> 111000 */ descriptorDummy.flMaps.flMap0.FRBA = 0xD2; /* :8 --> 11010010 */ descriptorDummy.flMaps.flMap0.NR = 0x05; /* :3 --> 101 */ descriptorDummy.flMaps.flMap0.reserved2 = 0x1C; /* :5 --> 11100 */ - + /* * Look from the top bottom up, and concatenate the binary strings. * Then, convert the 8-bit groups to hex and reverse the (8-bit)byte order - * + * * combined, these should become (in memory), in binary: * 10100010 11100010 11010010 11100101 * or in hex: * A2 E2 D2 E5 */ - - if (!(*flMap0Ptr == 0xA2 && *(flMap0Ptr+1) == 0xE2 && *(flMap0Ptr+2) == 0xD2 && *(flMap0Ptr+3) == 0xE5)) + + if (!(*flMap0Ptr == 0xA2 && *(flMap0Ptr+1) == 0xE2 && *(flMap0Ptr+2) == 0xD2 && *(flMap0Ptr+3) == 0xE5)) { printf("\nBitfield order check (descriptorDummy.flMaps.flMaps0) with junk/dummy data:"); printf("\nShould be: a2 e2 d2 e5 "); printf("\nAnd it is: "); for (i = 0; i < 4; i++) { - printf("%02x ", *(flMap0Ptr + i)); + printf("%02x ", *(flMap0Ptr + i)); } printf("\nIncorrect order.\n"); - + return 1; } - + return 0; } /* Compatibility checks. This version of ich9deblob is not yet porable. */ -int systemOrCompilerIncompatible(struct DESCRIPTORREGIONRECORD descriptorStruct, struct GBEREGIONRECORD_8K gbeStruct8k) +int systemOrCompilerIncompatible(struct DESCRIPTORREGIONRECORD descriptorStruct, struct GBEREGIONRECORD_8K gbeStruct8k) { if (structSizesIncorrect(descriptorStruct, gbeStruct8k)) return 1; if (IS_BIG_ENDIAN) { @@ -156,6 +156,6 @@ int systemOrCompilerIncompatible(struct DESCRIPTORREGIONRECORD descriptorStruct, return 1; } if (structBitfieldWrongOrder()) return 1; - if (structMembersWrongOrder()) return 1; + if (structMembersWrongOrder()) return 1; return 0; } diff --git a/projects/ich9gen/sources/src/common/x86compatibility.h b/projects/ich9gen/sources/src/common/x86compatibility.h index 5a598adc..a4829888 100644 --- a/projects/ich9gen/sources/src/common/x86compatibility.h +++ b/projects/ich9gen/sources/src/common/x86compatibility.h @@ -1,7 +1,7 @@ /* * x86compatibility.h * This file is part of the ich9deblob utility from the libreboot project - * + * * Purpose: keep gcc/make happy. no actual code here, just function definitions. * * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> @@ -20,7 +20,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + #ifndef X86COMPATIBILITY_H #define X86COMPATIBILITY_H diff --git a/projects/ich9gen/sources/src/demefactory.c b/projects/ich9gen/sources/src/demefactory.c index 596118cf..96bb0d41 100644 --- a/projects/ich9gen/sources/src/demefactory.c +++ b/projects/ich9gen/sources/src/demefactory.c @@ -1,12 +1,12 @@ /* * demefactory.c * This file is part of the demefactory utility from the libreboot project - * + * * Purpose: disable ME on GM45 factory firmware, but leave region intact * enable read-write on all regions * * Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org> - * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> + * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,8 +21,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - -/* + +/* * demfactory utility - main */ @@ -32,15 +32,15 @@ int main() { struct DESCRIPTORREGIONRECORD descriptorStruct; uint8_t* descriptorBuffer = (uint8_t*)&descriptorStruct; - + struct GBEREGIONRECORD_8K gbeStruct8k; /* not needed, except for compatibility checking */ - + char* romFilename = "factory.rom"; char* descriptorFilename = "demefactory_4kdescriptor.bin"; - + unsigned int bufferLength; unsigned int romSize; - + /* * ------------------------------------------------------------------ * Compatibility checks. This version of ich9deblob is not yet portable. @@ -49,7 +49,7 @@ int main() if (systemOrCompilerIncompatible(descriptorStruct, gbeStruct8k)) return 1; /* If true, fail with error message */ - + /* * ------------------------------------------------------------------ * Extract the descriptor region from the factory.rom dump @@ -64,33 +64,33 @@ int main() return 1; } printf("\n%s opened successfully\n", romFilename); - - /* + + /* * Get the descriptor region dump from the factory.rom * (goes in factoryDescriptorBuffer variable) */ bufferLength = fread(descriptorBuffer, 1, DESCRIPTORREGIONSIZE, fp); - if (DESCRIPTORREGIONSIZE != bufferLength) // + if (DESCRIPTORREGIONSIZE != bufferLength) // { printf("\nerror: could not read descriptor from %s (%i) bytes read\n", romFilename, bufferLength); fclose(fp); return 1; } printf("\ndescriptor region read successfully\n"); - + /* ------------------------------------------------- */ fseek(fp, 0L, SEEK_END); romSize = ftell(fp); printf("\n%s size: [%i] bytes\n", romFilename, romSize); - + /* -------------------------------------------------- */ fclose(fp); - + /* Debugging (before modification) */ printDescriptorRegionLocations(descriptorStruct, "Original"); - + /* * ------------------------------------------------------------------ * Modify the descriptor region, ready to go in the modified factory.rom @@ -100,7 +100,7 @@ int main() // Disable the ME/TPM: descriptorStruct = descriptorDisableMe(descriptorStruct); descriptorStruct = descriptorDisableTpm(descriptorStruct); - + /* Host/CPU is allowed to read/write all regions. */ descriptorStruct = descriptorHostRegionsUnlocked(descriptorStruct); /* The ME is disallowed read-write access to all regions @@ -120,7 +120,7 @@ int main() if (notCreated4kDescriptorFile(descriptorStruct, descriptorFilename)) { return 1; } - + /* * ------------------------------------------------------------------ * Generate ich9gen data (C code that will recreate the deactivatedME descriptor from scratch) @@ -134,7 +134,7 @@ int main() if (notCreatedCFileFromDescriptorStruct(descriptorStruct, "mkdescriptor.c", "mkdescriptor.h")) { return 1; } - + printf("The modified descriptor region has also been dumped as src files: mkdescriptor.c, mkdescriptor.h\n\n"); return 0; diff --git a/projects/ich9gen/sources/src/demefactory.h b/projects/ich9gen/sources/src/demefactory.h index 7226886b..3478cef5 100644 --- a/projects/ich9gen/sources/src/demefactory.h +++ b/projects/ich9gen/sources/src/demefactory.h @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* Header file for demefactory.c */ - + #ifndef DEMEFACTORY_H #define DEMEFACTORY_H diff --git a/projects/ich9gen/sources/src/descriptor/descriptor.c b/projects/ich9gen/sources/src/descriptor/descriptor.c index 18e4e17a..61ced67e 100644 --- a/projects/ich9gen/sources/src/descriptor/descriptor.c +++ b/projects/ich9gen/sources/src/descriptor/descriptor.c @@ -1,9 +1,9 @@ /* * descriptor/descriptor.c * This file is part of the ich9deblob utility from the libreboot project - * + * * Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org> - * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> + * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ * --------------------------------------------------------------------- */ -/* Set the Host CPU / BIOS region to have read-write access on all regions */ +/* Set the Host CPU / BIOS region to have read-write access on all regions */ struct DESCRIPTORREGIONRECORD descriptorHostRegionsUnlocked(struct DESCRIPTORREGIONRECORD descriptorStruct) { descriptorStruct.masterAccessSection.flMstr1.fdRegionReadAccess = 0x1; @@ -80,7 +80,7 @@ struct DESCRIPTORREGIONRECORD descriptorPlatformRegionRemoved(struct DESCRIPTORR { descriptorStruct.regionSection.flReg4.BASE = 0x1FFF; descriptorStruct.regionSection.flReg4.LIMIT = 0; - + return descriptorStruct; } @@ -89,7 +89,7 @@ struct DESCRIPTORREGIONRECORD descriptorDisableMe(struct DESCRIPTORREGIONRECORD { descriptorStruct.ichStraps.ichStrap0.meDisable = 1; descriptorStruct.mchStraps.mchStrap0.meDisable = 1; - + return descriptorStruct; } @@ -97,7 +97,7 @@ struct DESCRIPTORREGIONRECORD descriptorDisableMe(struct DESCRIPTORREGIONRECORD struct DESCRIPTORREGIONRECORD descriptorDisableTpm(struct DESCRIPTORREGIONRECORD descriptorStruct) { descriptorStruct.mchStraps.mchStrap0.tpmDisable = 1; - + return descriptorStruct; } @@ -106,7 +106,7 @@ struct DESCRIPTORREGIONRECORD descriptorMoveGbeToStart(struct DESCRIPTORREGIONRE { descriptorStruct.regionSection.flReg3.BASE = DESCRIPTORREGIONSIZE >> FLREGIONBITSHIFT; descriptorStruct.regionSection.flReg3.LIMIT = GBEREGIONSIZE_8K >> FLREGIONBITSHIFT; - + return descriptorStruct; } @@ -115,7 +115,7 @@ struct DESCRIPTORREGIONRECORD descriptorGbeRegionRemoved(struct DESCRIPTORREGION { descriptorStruct.regionSection.flReg3.BASE = 0x1FFF; descriptorStruct.regionSection.flReg3.LIMIT = 0; - + return descriptorStruct; } @@ -124,7 +124,7 @@ struct DESCRIPTORREGIONRECORD descriptorBiosRegionFillImageAfterGbe(struct DESCR { descriptorStruct.regionSection.flReg1.BASE = (DESCRIPTORREGIONSIZE + GBEREGIONSIZE_8K) >> FLREGIONBITSHIFT; descriptorStruct.regionSection.flReg1.LIMIT = (romSize >> FLREGIONBITSHIFT) - 1; - + return descriptorStruct; } @@ -133,7 +133,7 @@ struct DESCRIPTORREGIONRECORD descriptorBiosRegionFillImageAfterDescriptor(struc { descriptorStruct.regionSection.flReg1.BASE = DESCRIPTORREGIONSIZE >> FLREGIONBITSHIFT; descriptorStruct.regionSection.flReg1.LIMIT = (romSize >> FLREGIONBITSHIFT) - 1; - + return descriptorStruct; } @@ -150,7 +150,7 @@ struct DESCRIPTORREGIONRECORD descriptorOemString(struct DESCRIPTORREGIONRECORD descriptorStruct.oemSection.magicString[7] = 0x45; return descriptorStruct; -} +} /* Check whether a GbE region is defined by this descriptor. * Not thorough, but should work in most cases */ @@ -178,7 +178,7 @@ struct DESCRIPTORREGIONRECORD librebootSetGbeBiosDescriptorRegions(struct DESCRI { if (descriptorDefinesGbeRegion(descriptorStruct)) { - /* + /* * set number of regions from 4 -> 2 (0 based, so 4 means 5 and 2 * means 3. We want 3 regions: descriptor, gbe and bios, in that order) */ @@ -193,7 +193,7 @@ struct DESCRIPTORREGIONRECORD librebootSetGbeBiosDescriptorRegions(struct DESCRI descriptorStruct.ichStraps.ichStrap0.lanPhy = 0x1; } else { - /* + /* * set number of regions from 4 -> 2 (0 based, so 4 means 5 and 1 * means 2. We want 2 regions: descriptor and bios, in that order) */ @@ -237,12 +237,12 @@ struct DESCRIPTORREGIONRECORD librebootDescriptorStructFromFactory(struct DESCRI descriptorStruct = descriptorMeRegionRemoved(descriptorStruct); /* Disable the ME/TPM and remove the ME/Platform regions: */ descriptorStruct = descriptorPlatformRegionRemoved(descriptorStruct); - + /* Disable the ME itself, so that it doesn't try to start when this descriptor is in use */ descriptorStruct = descriptorDisableMe(descriptorStruct); /* Also disable the TPM, by default */ descriptorStruct = descriptorDisableTpm(descriptorStruct); - + return descriptorStruct; } @@ -254,64 +254,64 @@ struct DESCRIPTORREGIONRECORD librebootDescriptorStructFromFactory(struct DESCRI /* * Generate a C (.h) header file for the C source file made by notCreatedCFileFromDescriptorStruct() - * + * * Output it to a file. */ -int notCreatedHFileForDescriptorCFile(char* outFileName, char* cFileName) -{ +int notCreatedHFileForDescriptorCFile(char* outFileName, char* cFileName) +{ remove(outFileName); /* Remove the old file before continuing */ - + /* Open the file that will be written to */ FILE* fp = fopen(outFileName, "w+"); /* ------------------------------ */ - + fprintf(fp, "/* %s: generated C code from ich9deblob */\n", outFileName); fprintf(fp, "/* .h header file for the descriptor-generating C code (%s) */\n\n", cFileName); - + fprintf(fp, "#ifndef ICH9GEN_MKDESCRIPTOR_H\n"); fprintf(fp, "#define ICH9GEN_MKDESCRIPTOR_H\n\n"); - + fprintf(fp, "#include <stdio.h>\n"); fprintf(fp, "#include <string.h>\n"); fprintf(fp, "#include \"../descriptor/descriptor.h\"\n\n"); - + fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStruct(unsigned int romSize, int hasGbe);\n"); - + fprintf(fp, "#endif\n"); - + /* ------------------------------ */ - + fclose(fp); /* Always close the file when done. */ - + return 0; } /* * Generate a C source file that initializes the same data from a given * 4KiB Descriptor data structure. - * + * * Output it to a file. */ int notCreatedCFileFromDescriptorStruct(struct DESCRIPTORREGIONRECORD descriptorStruct, char* outFileName, char* headerFileName) { int i, j; - + remove(outFileName); /* Remove the old file before continuing */ - + /* Open the file that will be written to */ FILE* fp = fopen(outFileName, "w+"); /* ------------------------------ */ - + fprintf(fp, "/* %s: generated C code from ich9deblob */\n", outFileName); fprintf(fp, "/* .c source file for the descriptor-generating C code */\n\n"); - + fprintf(fp, "#include \"%s\"\n\n", headerFileName); - + fprintf(fp, "/* Generate a 4KiB Descriptor struct, with default values. */\n"); fprintf(fp, "/* Read ../descriptor/descriptor.h for an explanation of the default values used here */\n\n"); - + fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStruct(unsigned int romSize, int hasGbe)\n"); fprintf(fp, "{\n"); fprintf(fp, " int i;\n"); @@ -600,11 +600,11 @@ int notCreatedCFileFromDescriptorStruct(struct DESCRIPTORREGIONRECORD descriptor fprintf(fp, "\n"); fprintf(fp, " return descriptorStruct;\n"); fprintf(fp, "}\n\n"); - + /* ------------------------------ */ - + fclose(fp); /* Always close the file when done. */ - + return 0; } @@ -620,7 +620,7 @@ int notCreatedCFileFromDescriptorStruct(struct DESCRIPTORREGIONRECORD descriptor void printDescriptorRegionLocations(struct DESCRIPTORREGIONRECORD descriptorStruct, char* romName) { printf("\n"); - + /* Descriptor region */ printf( "%s: Descriptor start block: %08x ; Descriptor end block: %08x\n", @@ -628,23 +628,23 @@ void printDescriptorRegionLocations(struct DESCRIPTORREGIONRECORD descriptorStru descriptorStruct.regionSection.flReg0.BASE << FLREGIONBITSHIFT, descriptorStruct.regionSection.flReg0.LIMIT << FLREGIONBITSHIFT ); - + /* BIOS region */ printf( - "%s: BIOS start block: %08x ; BIOS end block: %08x\n", + "%s: BIOS start block: %08x ; BIOS end block: %08x\n", romName, - descriptorStruct.regionSection.flReg1.BASE << FLREGIONBITSHIFT, + descriptorStruct.regionSection.flReg1.BASE << FLREGIONBITSHIFT, descriptorStruct.regionSection.flReg1.LIMIT << FLREGIONBITSHIFT ); - + /* ME region */ printf( - "%s: ME start block: %08x ; ME end block: %08x\n", + "%s: ME start block: %08x ; ME end block: %08x\n", romName, - descriptorStruct.regionSection.flReg2.BASE << FLREGIONBITSHIFT, + descriptorStruct.regionSection.flReg2.BASE << FLREGIONBITSHIFT, descriptorStruct.regionSection.flReg2.LIMIT << FLREGIONBITSHIFT ); - + /* GBe region */ printf( "%s: GBe start block: %08x ; GBe end block: %08x\n", @@ -652,7 +652,7 @@ void printDescriptorRegionLocations(struct DESCRIPTORREGIONRECORD descriptorStru descriptorStruct.regionSection.flReg3.BASE << FLREGIONBITSHIFT, descriptorStruct.regionSection.flReg3.LIMIT << FLREGIONBITSHIFT ); - + /* Platform region */ printf( "%s: Platform start block: %08x ; Platform end block: %08x\n", @@ -660,6 +660,6 @@ void printDescriptorRegionLocations(struct DESCRIPTORREGIONRECORD descriptorStru descriptorStruct.regionSection.flReg4.BASE << FLREGIONBITSHIFT, descriptorStruct.regionSection.flReg4.LIMIT << FLREGIONBITSHIFT ); - + return; } diff --git a/projects/ich9gen/sources/src/descriptor/descriptor.h b/projects/ich9gen/sources/src/descriptor/descriptor.h index 7fb5c257..c81d451f 100644 --- a/projects/ich9gen/sources/src/descriptor/descriptor.h +++ b/projects/ich9gen/sources/src/descriptor/descriptor.h @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* * Purpose: provide struct representing descriptor region. * Map actual buffers of this regions, directly to instances of these @@ -27,10 +27,10 @@ * bit fields used, corresponding to datasheet. See links to datasheets * and documentation in ich9deblob.c */ - + /* * See docs/hardware/x200_remove_me.html for info plus links to datasheet (also linked below) - * + * * Info about flash descriptor (read page 845 onwards): * http://www.intel.co.uk/content/dam/doc/datasheet/io-controller-hub-9-datasheet.pdf */ @@ -54,7 +54,7 @@ #define ROMSIZE_8MB 0x800000 #define ROMSIZE_16MB 0x1000000 -/* +/* * Related to the flash descriptor * bits 12(0xC)-24(0x18) are represented for words found in the flash descriptor * To manipulate these easily in C, we shift them by FLREGIONBITSHIFT and then shift them back when done @@ -72,7 +72,7 @@ struct FLVALSIG { /* - * 4 bytes. + * 4 bytes. * descriptor mode = 0FF0A55A (hex, big endian). Note: stored in ROM in little endian order. * Anything else is considered invalid and will put the system in non-descriptor mode. */ @@ -92,7 +92,7 @@ struct FLMAP0 /* most significant bits. */ }; -struct FLMAP1 +struct FLMAP1 { /* least significant bits */ uint8_t FMBA : 8; @@ -103,7 +103,7 @@ struct FLMAP1 /* most significant bits */ }; -struct FLMAP2 +struct FLMAP2 { /* least significant bits */ uint8_t FMSBA : 8; @@ -113,7 +113,7 @@ struct FLMAP2 }; /* Flash Map Registers */ -struct FLMAPS +struct FLMAPS { struct FLMAP0 flMap0; struct FLMAP1 flMap1; @@ -121,7 +121,7 @@ struct FLMAPS }; /* Flash Components Register */ -struct FLCOMP +struct FLCOMP { /* least significant bits */ uint8_t component1Density : 3; @@ -138,7 +138,7 @@ struct FLCOMP /* most significant bits */ }; -struct COMPONENTSECTIONRECORD +struct COMPONENTSECTIONRECORD { struct FLCOMP flcomp; uint32_t flill; @@ -146,7 +146,7 @@ struct COMPONENTSECTIONRECORD uint8_t padding[36]; }; -struct FLREG +struct FLREG { /* least significant bits */ uint16_t BASE : 13; @@ -161,7 +161,7 @@ struct FLREG * Defines where all the regions begin/end. * This is very important for disabling ME/AMT */ -struct REGIONSECTIONRECORD +struct REGIONSECTIONRECORD { struct FLREG flReg0; /* Descriptor */ struct FLREG flReg1; /* BIOS */ @@ -171,7 +171,7 @@ struct REGIONSECTIONRECORD uint8_t padding[12]; }; -struct FLMSTR +struct FLMSTR { /* least significant bits */ uint16_t requesterId : 16; @@ -199,7 +199,7 @@ struct MASTERACCESSSECTIONRECORD uint8_t padding[148]; }; -struct ICHSTRAP0 +struct ICHSTRAP0 { /* least significant bits */ /* todo: add MeSmBus2Sel (boring setting) */ @@ -218,7 +218,7 @@ struct ICHSTRAP0 /* most significant bits */ }; -struct ICHSTRAP1 +struct ICHSTRAP1 { /* least significant bits */ uint8_t northMlink : 1; /* North MLink Dynamic Clock Gate Disable : Sets the default value for the South MLink Dynamic Clock Gate Enable registers. */ @@ -233,14 +233,14 @@ struct ICHSTRAP1 }; /* ICH straps */ -struct ICHSTRAPSRECORD +struct ICHSTRAPSRECORD { struct ICHSTRAP0 ichStrap0; struct ICHSTRAP1 ichStrap1; uint8_t padding[248]; }; -struct MCHSTRAP0 +struct MCHSTRAP0 { /* least significant bits */ uint8_t meDisable : 1; /* If true, ME is disabled. */ @@ -255,14 +255,14 @@ struct MCHSTRAP0 }; /* MCH straps */ -struct MCHSTRAPSRECORD +struct MCHSTRAPSRECORD { struct MCHSTRAP0 mchStrap0; uint8_t padding[3292]; }; /* ME VSCC Table */ -struct MEVSCCTABLERECORD +struct MEVSCCTABLERECORD { uint32_t jid0; uint32_t vscc0; @@ -284,14 +284,14 @@ struct DESCRIPTORMAP2RECORD }; /* OEM section */ -struct OEMSECTIONRECORD +struct OEMSECTIONRECORD { uint8_t magicString[8]; uint8_t padding[248]; }; /* 4KiB descriptor region, goes at the beginning of the ROM image */ -struct DESCRIPTORREGIONRECORD +struct DESCRIPTORREGIONRECORD { struct FLVALSIG flValSig; /* Flash Valid Signature Register */ struct FLMAPS flMaps; /* Flash Map Registers */ @@ -310,7 +310,7 @@ struct DESCRIPTORREGIONRECORD * Function declarations (keep gcc/make happy. check them in descriptor.c) * --------------------------------------------------------------------- */ - + struct DESCRIPTORREGIONRECORD descriptorHostRegionsUnlocked(struct DESCRIPTORREGIONRECORD descriptorStruct); struct DESCRIPTORREGIONRECORD descriptorMeRegionsForbidden(struct DESCRIPTORREGIONRECORD descriptorStruct); struct DESCRIPTORREGIONRECORD descriptorMeRegionRemoved(struct DESCRIPTORREGIONRECORD descriptorStruct); diff --git a/projects/ich9gen/sources/src/gbe/gbe.c b/projects/ich9gen/sources/src/gbe/gbe.c index d04b8f2a..6bd41549 100644 --- a/projects/ich9gen/sources/src/gbe/gbe.c +++ b/projects/ich9gen/sources/src/gbe/gbe.c @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* * Provide gbe related functions. */ @@ -40,7 +40,7 @@ uint16_t gbeGetChecksumFrom4kBuffer(uint16_t* gbeWord, uint16_t desiredValue, in for (wordOffset = 0; wordOffset < 0x3F; wordOffset++) total += gbeWord[wordOffset + (gbeRegionBase>>1)]; - + return desiredValue - total; } @@ -51,25 +51,25 @@ uint16_t gbeGetChecksumFrom4kStruct(struct GBEREGIONRECORD_4K gbeStruct4k, uint1 } /* modify the gbe region extracted from a factory.rom dump */ -struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8K gbeStruct8k) -{ +struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8K gbeStruct8k) +{ unsigned int i; - + /* * http://www.intel.co.uk/content/dam/doc/application-note/82573-nvm-map-appl-note.pdf - * That is a datasheet for a later chipset. Word 40H-53H seems (as per this datasheet) to be for AMT. + * That is a datasheet for a later chipset. Word 40H-53H seems (as per this datasheet) to be for AMT. * Writing over it doesn't seem to cause any harm, since the ME/AMT is already removed in libreboot. */ for(i = 0; i < sizeof(gbeStruct8k.backup.padding); i++) { gbeStruct8k.backup.padding[i] = 0xFF; /* FF is correct. In the struct, this is a char buffer. */ } /* We really only need to do this for words 40h-53h, but let's just nuke the whole lot. It's all 0xFF anyway. */ - + /* Fix the checksum */ gbeStruct8k.backup.checkSum = gbeGetChecksumFrom4kStruct(gbeStruct8k.backup, GBECHECKSUMTOTAL); - + /* Main Gbe region on X200 (as shipped by Lenovo) is broken. Fix it by over-writing it with the contents of the backup */ memcpy(&gbeStruct8k.main, &gbeStruct8k.backup, GBEREGIONSIZE_4K); - + return gbeStruct8k; } @@ -81,46 +81,46 @@ struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8 /* * Generate a C (.h) header file for the C source file made by notCreatedCFileFromGbeStruct4k() - * + * * Output it to a file. */ -int notCreatedHFileForGbeCFile(char* outFileName, char* cFileName) -{ +int notCreatedHFileForGbeCFile(char* outFileName, char* cFileName) +{ remove(outFileName); /* Remove the old file before continuing */ - + /* Open the file that will be written to */ FILE* fp = fopen(outFileName, "w+"); /* ------------------------------ */ - + fprintf(fp, "/* %s: generated C code from ich9deblob */\n", outFileName); fprintf(fp, "/* .h header file for the gbe-generating C code (%s) */\n\n", cFileName); - + fprintf(fp, "#ifndef ICH9GEN_MKGBE_H\n"); fprintf(fp, "#define ICH9GEN_MKGBE_H\n\n"); - + fprintf(fp, "#include <stdio.h>\n"); fprintf(fp, "#include <string.h>\n"); fprintf(fp, "#include \"../gbe/gbe.h\"\n\n"); - + fprintf(fp, "struct GBEREGIONRECORD_4K generatedGbeStruct4k();\n"); fprintf(fp, "struct GBEREGIONRECORD_8K generatedGbeStruct8k();\n\n"); - + fprintf(fp, "#endif\n"); - + /* ------------------------------ */ - + fclose(fp); /* Always close the file when done. */ - + return 0; } /* * Generate a C source file that initializes the same data from a given * 4KiB Gbe data structure. - * + * * It will simply copy the 4KiB struct at the end to make a full 8KiB struct. * So just pass a working 4KiB Gbe struct here and you're good to go. - * + * * Output it to a file. */ int notCreatedCFileFromGbeStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* outFileName, char* headerFileName) @@ -128,22 +128,22 @@ int notCreatedCFileFromGbeStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* int i; int paddingSize; int paddingIdentical; - + remove(outFileName); /* Remove the old file before continuing */ - + /* Open the file that will be written to */ FILE* fp = fopen(outFileName, "w+"); /* ------------------------------ */ - + fprintf(fp, "/* %s: generated C code from ich9deblob */\n", outFileName); fprintf(fp, "/* .c source file for the gbe-generating C code */\n\n"); - + fprintf(fp, "#include \"%s\"\n\n", headerFileName); - + fprintf(fp, "/* Generate a 4KiB Gbe struct, with default values. */\n"); fprintf(fp, "/* Read ../gbe/gbe.h for an explanation of the default values used here */\n\n"); - + fprintf(fp, "struct GBEREGIONRECORD_4K generatedGbeStruct4k()\n"); fprintf(fp, "{\n"); fprintf(fp, " int i;\n"); @@ -402,7 +402,7 @@ int notCreatedCFileFromGbeStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* fprintf(fp, "\n"); fprintf(fp, " return gbeStruct4k;\n"); fprintf(fp, "}\n\n"); - + fprintf(fp, "struct GBEREGIONRECORD_8K generatedGbeStruct8k()\n"); fprintf(fp, "{\n"); fprintf(fp, " struct GBEREGIONRECORD_8K gbeStruct8k;\n"); @@ -410,11 +410,11 @@ int notCreatedCFileFromGbeStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* fprintf(fp, " memcpy(&gbeStruct8k.backup, &gbeStruct8k.main, GBEREGIONSIZE_4K);\n"); fprintf(fp, " return gbeStruct8k;\n"); fprintf(fp, "}\n\n"); - + /* ------------------------------ */ - + fclose(fp); /* Always close the file when done. */ - + return 0; } @@ -431,24 +431,24 @@ int notCreatedCFileFromGbeStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* void printGbeChecksumDataFromStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* romName, char* regionName) { printf( - "%s Gbe (%s): calculated Gbe checksum: 0x%hx and actual GBe checksum: 0x%hx\n", + "%s Gbe (%s): calculated Gbe checksum: 0x%hx and actual GBe checksum: 0x%hx\n", romName, regionName, - gbeGetChecksumFrom4kStruct(gbeStruct4k, GBECHECKSUMTOTAL), + gbeGetChecksumFrom4kStruct(gbeStruct4k, GBECHECKSUMTOTAL), gbeStruct4k.checkSum ); - + return; } /* - * show debugging info: show calculated (correct) gbe checksum and what + * show debugging info: show calculated (correct) gbe checksum and what * is actually stored, in a 8K gbe struct. Do so for main and backup regions. */ void printGbeChecksumDataFromStruct8k(struct GBEREGIONRECORD_8K gbeStruct8k, char* romName) -{ +{ printGbeChecksumDataFromStruct4k(gbeStruct8k.main, romName, "main"); printGbeChecksumDataFromStruct4k(gbeStruct8k.backup, romName, "backup"); - + return; } diff --git a/projects/ich9gen/sources/src/gbe/gbe.h b/projects/ich9gen/sources/src/gbe/gbe.h index a1350fdd..14548e71 100644 --- a/projects/ich9gen/sources/src/gbe/gbe.h +++ b/projects/ich9gen/sources/src/gbe/gbe.h @@ -18,21 +18,21 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* * Purpose: provide struct representing gbe region. * Map actual buffers of this regions, directly to instances of these * structs. This makes working with gbe really easy. */ - + /* * bit fields used, corresponding to datasheet. See links to datasheets * and documentation in ich9deblob.c */ - + /* * See docs/hardware/x200_remove_me.html for info plus links to datasheet (also linked below) - * + * * Info about Gbe region (read whole datasheet): * http://www.intel.co.uk/content/dam/doc/application-note/i-o-controller-hub-9m-82567lf-lm-v-nvm-map-appl-note.pdf * https://communities.intel.com/community/wired/blog/2010/10/14/how-to-basic-eeprom-checksums @@ -49,14 +49,14 @@ /* Size of the full gbe region in bytes */ #define GBEREGIONSIZE_8K 0x2000 /* - * Size of each sub-region in gbe. + * Size of each sub-region in gbe. * gbe contains two regions which * can be identical: main and backup. * These are each half the size of the full region */ #define GBEREGIONSIZE_4K 0x1000 -/* +/* * When adding up the first 0x3F 16-bit words * in a 4KiB GBE region, it should be equal * to 0xBABA @@ -74,7 +74,7 @@ * --------------------------------------------------------------------- * Gbe struct representing the data: * --------------------------------------------------------------------- - */ + */ struct GBE_RESERVED_WORD_03H { /* least significant bits */ @@ -147,17 +147,17 @@ struct GBE_EXTENDED_CONFIGURATION_CONTROL_WORD_2 { /* * Word 17h: LED 1 Configuration and Power Management - * + * * Default values for LEDCTL register fields controlling LED1 (LINK_1000) * output behaviours and OEM fields that define PHY power management * parameters loaded to the PHY_CTRL register. */ struct LED_CTL_1 { /* least significant bits */ - + /* See page 16 in the datasheet to show the different modes. deblobbed_descriptor.bin has "ACTIVITY" mode set */ uint8_t led1Mode : 4; /* Default value 0111 (bin) 7 (hex) says datasheet. 1011 (bin) B (hex) according to deblobbed_descriptor.bin */ - + uint8_t reserved1 : 1; /* Reserved. Should be 0 according to datasheet and deblobbed_descriptor.bin */ uint8_t led1BlinkMode : 1; /* 0 = slow blink, 1 = fast blink. should be identical to led0 blink mode. Default is 0 according to datasheet and deblobbed_descriptor.bin */ /* By setting this and led0 blink mode (see word 18h) to 1, you could enable a faster blinking on the LED's where the ethernet cable goes @@ -175,26 +175,26 @@ struct LED_CTL_1 { /* most significant bits */ }; -/* +/* * Word 18: LED 0 and 2 Configuration Defaults - * + * * Hardware defaults for LEDCTL register fields controlling LED0 (LINK/ACTIVITY) * and LED2 (LINK_100) output behaviours. */ struct LED_CTL_02 { /* least significant bits */ - + /* see page 16 in datasheet to show the different modes. deblobbed_descriptor has "LINK-UP" mode set */ uint8_t led0Mode : 4; /* default value 0100 (bin) or 4 (hex) according to datasheet. It's 0010 (bin) or 2 (hex) according to deblobbed_descriptor.bin */ - + uint8_t reserved1 : 1; /* Reserved. Should be set to 0 according to datasheet and deblobbed_descriptor.bin */ uint8_t led0BlinkMode : 1; /* This should be the same as led1BlinkMode (see word 17h). Default is 0 according to datasheet and deblobbed_descriptor.bin */ uint8_t led0Invert : 1; /* initial value of LED0_IVRT field. 0 = led0 has active low output, 1 is high active output. Default is 0 according to datasheet and deblobbed_descriptor.bin */ uint8_t led0Blink : 1; /* LED0_BLINK field. Should be 0 according to datasheet and deblobbed_descriptor.bin */ - + /* see page 16 in datasheet to shew the different modes. deblobbed_descriptor has "LINK_100" mode set */ uint8_t led2Mode : 4; /* default value 0110 (bin) or 6 (hex) according to datasheet and deblobbed_descriptor.bin */ - + uint8_t reserved2 : 1; /* Reserved. Should be 0 according to datasheet and deblobbed_descriptor.bin */ uint8_t led2BlinkMode : 1; /* 0 = slow blink. 1 = fast. default 0 according to datasheet and deblobbed_descriptor.bin */ uint8_t led2Invert : 1; /* LED2_IVRT field. Should be 0 according to datasheet and deblobbed_descriptor.bin */ @@ -218,7 +218,7 @@ struct GBE_PXE_BOOT_AGENT_MAIN_SETUP_OPTIONS { uint8_t efiPresence : 1; /* 1 means that an EFI image is present (0 means not present). deblobbed_descriptor.bin says 0. if 1, eeprom word 33h (efi version) becomes valid. if pxePresent is 1, that means EFI and PXE are both present.*/ uint8_t pxePresence : 1; /* 0 means that a PXE image is present. 1 means to pxe present. deblobbed_descriptor.bin says 0. if 0, then word 32h (PXE version) in eeprom becomes valid */ /* most significant bits */ - + /* This whole data structure is pointless, since libreboot doesn't (read: won't) * include the proprietary intel boot agent. Struct exists here simply for documentations sake. */ }; @@ -232,18 +232,18 @@ struct GBE_PXE_BOOT_AGENT_CONFIGURATION_CUSTOMIZATION_OPTIONS_31H { uint8_t disableLegacyWakeupSupport : 1; /* 1 means no changes in legacy wakeup support menu is allowed. default is 0, and deblobbed_descriptor.bin says 0 */ uint8_t disableFlashUpdate : 1; /* 1 means no changes to flash image using PROset is allowed. default is 0, and deblobbed_descriptor.bin says 0 */ uint8_t reserved1 : 2; /* Reserved. Datasheet says these must be 0, and deblobbed_descriptor.bin sets them to 0. */ - + /* * deblobbed_descriptor says 000 * 000 = normal behaviour * see datasheet (page 21) for other modes. */ uint8_t ibaBootOrderSetupMode : 3; - + uint8_t reserved2 : 3; /* Reserved. Datasheet says these must be set to 0, and deblobbed_descriptor.bin sets them to 0. */ uint8_t signature : 2; /* Must be set to 01 to indicate that this whole word has been configured by the agent or other software. deblobbed_descriptor.bin says 01. */ /* most significant bits */ - + /* This whole data structure is pointless, since libreboot doesn't (read: won't) * include the proprietary intel boot agent. Struct exists here simply for documentations sake. */ }; @@ -254,7 +254,7 @@ struct GBE_PXE_BOOT_AGENT_CONFIGURATION_CUSTOMIZATION_OPTIONS_32H { uint8_t minorVersionNumber : 4; /* PXE boot agent minor number. default is 2 (hex). deblobbed_descriptor.bin says 3 (hex) */ uint8_t majorVersionNumber : 4; /* PXE boot agent major number. default is F (hex). deblobbed_descriptor.bin says 1 (hex) */ /* most significant bits */ - + /* This whole data structure is pointless, since libreboot doesn't (read: won't) * include the proprietary intel boot agent. Struct exists here simply for documentations sake. */ }; @@ -269,7 +269,7 @@ struct GBE_PXE_IBA_CAPABILITIES { uint8_t reserved2_1 : 6; /* ^ part of reserved2_0. split this way so that the bitfields align */ uint8_t signature : 2; /* must be 01 to indicate that the word is configured by the agent or other software. deblobbed_descriptor.bin says 01 */ /* most significant bits */ - + /* This whole data structure is pointless, since libreboot doesn't (read: won't) * include the proprietary intel boot agent. Struct exists here simply for documentations sake. */ }; @@ -279,14 +279,14 @@ struct GBE_PXE_SOFTWARE_REGION { struct GBE_PXE_BOOT_AGENT_CONFIGURATION_CUSTOMIZATION_OPTIONS_31H bootAgentConfigurationCustomizationOptions31h; /* Word 31h */ struct GBE_PXE_BOOT_AGENT_CONFIGURATION_CUSTOMIZATION_OPTIONS_32H bootAgentConfigurationCustomizationOptions32h; /* Word 32h */ struct GBE_PXE_IBA_CAPABILITIES ibaCapabilities; /* Word 33h */ - + /* Words 34h to 3Eh (padding). Set these to 0xFFFF (according to deblobbed_descriptor.bin) */ uint16_t paddingWords34hTo3Eh[11]; - + /* * the pxe software region is practically useless in libreboot, since - * libreboot does not include the intel boot agent (it's proprietary software). - * + * libreboot does not include the intel boot agent (it's proprietary software). + * * Having this struct in place is simply for documentations sake. It is completely * irrelevant what you put here. filling it with 0xFFFF would probably be fine. */ @@ -301,90 +301,90 @@ struct GBEREGIONRECORD_4K { /* * Word 08 and 09 (pba low and pba high): - * + * * Both of these should be set to 0xFFFF by default, according to the datasheet. * "nine digit printed board assembly (PBA) number" for intel cards to be stored - * in a 4 byte (read: 2 word) field. - * + * in a 4 byte (read: 2 word) field. + * * Example: if pba number is 123456-003, then word 08 should be 1234h and word 09 becomes 5603. * Note: 1234 and 5603 above are big endian. In the image it would actually be 34 12 and 0356 - * + * * Example: in mine it was (in the image): 08 10 FF FF. That becomes 1008h and FFFFh, or * basically: 1008FF-0FF. The same was observed in another. - * + * * Setting it to FF FF FF FF should be fine, according to the datasheet. */ uint16_t pbaLow; /* Word 08. Set it to 0x1008 (according to deblobbed_descriptor.bin). */ uint16_t pbaHigh; /* Word 09. Set it to 0xFFFF (according to deblobbed_descriptor.bin). */ - + /* Word 0A */ struct GBE_PCI_INITIALIZATION_CONTROL_WORD pciInitializationControlWord; - - /* + + /* * Word 0B; subsystem ID - * + * * If load subsystem ID bit of word 0A (pci init control word) is * set to 1 (read: it is. in my deblobbed_descriptor.bin), store * the subsystem id here. Datasheet says that the default value is * 0000h, but you should set this to 20EEh (little endian: EE 20) */ uint16_t subsystemId; /* Set this to 0x20EE */ - + /* * Word 0C; subsystem vendor ID - * + * * If load subsystem vendor ID bit of word 0A (pci init control word) * is set to 1 (read: it is. in my deblobbed_descriptor.bin), store - * the subsystem vendor id here. Datasheet says that the default + * the subsystem vendor id here. Datasheet says that the default * value is 8086h, but you should set this to 17AAh (lendian: AA 17). */ uint16_t subsystemVendorId; /* Set this to 0x17AA */ - - /* + + /* * Word 0D: device ID - * + * * If load vendor/device ID in word 0A (pci init control word) is 1 * (it is) then this word is used to init device id using word 21h, * 1Eh or 1Fh. In my case, deviceId is 0x10F5. Word 21h is set to * 0x10CB, word 1Eh is 0x10F5 and 1Fh is 0x10BF - * + * * The datasheet says that 10F5 is for Intel 82567LM gigabit ethernet * controller; 10BF is for Intel 82567LF and 10CB is for Intel 82567V. - * + * * Based on this, the X200 is shown to have the Intel 82567LM ethernet * controller. */ uint16_t deviceId; /* Set this to 0x10F5. */ /* It is important that this is correct, for the linux kernel driver */ - - /* + + /* * Word 0E: vendor ID - * + * * If load vendor/device ID in word 0A (pci init control) is 1 (it is), * then this word used read to initialize the PCI vendor ID. Default - * value is 8086 according to datasheets, and deblobbed_descriptor.bin. - * + * value is 8086 according to datasheets, and deblobbed_descriptor.bin. + * * Intel is often 8086 as a PCI vendor ID. Because 8086. As in the CPU architecture. */ uint16_t vendorId; - + uint16_t deviceRevId; /* Word 0F: reserved bits. Set all bits to 0. */ struct GBE_LAN_POWER_CONSUMPTION lanPowerConsumption; /* Word 10: LAN Power Consumption (see struct definition) */ uint16_t reservedWords11h12h[2]; /* Words 11-12: Reserved. Set both of them to 0x0000 (according to datasheet). */ - + /* Word 13: Shared Initialization Control Word */ struct GBE_SHARED_INITIALIZATION_CONTROL_WORD sharedInitializationControlWord; - + /* Word 14: Extended Configuration Control Word 1 */ struct GBE_EXTENDED_CONFIGURATION_CONTROL_WORD_1 extendedConfigurationControlWord1; - + /* Word 15: Extended Configuration Control Word 2 */ struct GBE_EXTENDED_CONFIGURATION_CONTROL_WORD_2 extendedConfigurationControlWord2; - + /* Word 16: Extended Configuration Control Word 3 */ /* All bits reserved. Datasheet and deblobbed_descriptor.bin say to set it to zero */ uint16_t extendedConfigurationControlWord3; - + struct LED_CTL_1 ledCtl1; /* Word 17: LED 1 Configuration and Power Management */ struct LED_CTL_02 ledCtl02; /* Word 18: LED 0 and 2 Configuration Defaults */ uint16_t reservedWord19h; /* Word 19: Reserved. Default is 0x2B00 according to datasheet, but in deblobbed_descriptor.bin it is 0x2B40 */ @@ -401,16 +401,16 @@ struct GBEREGIONRECORD_4K { uint16_t reservedWords24to2Fh[12]; /* Words 24-2F: Reserved. These should all be 0x0000 according to datasheet and deblobbed_descriptor.bin */ struct GBE_PXE_SOFTWARE_REGION pxeSoftwareRegion; /* Words 30-3E: PXE Software Region */ uint16_t checkSum; /* when added to the sum of all words above, this should match GBECHECKSUMTOTAL */ - + /* set all bytes in here to 0xFF */ uint8_t padding[3968]; }; -/* main and backup region in gbe */ +/* main and backup region in gbe */ struct GBEREGIONRECORD_8K { struct GBEREGIONRECORD_4K main; struct GBEREGIONRECORD_4K backup; - /* + /* * Backup region: * This is actually "main" on X200, since the real main has a bad checksum * and other errors. You should do what you need on this one (if modifying @@ -423,7 +423,7 @@ struct GBEREGIONRECORD_8K { * Function declarations (keep gcc/make happy. check them in gbe.c) * --------------------------------------------------------------------- */ - + uint16_t gbeGetChecksumFrom4kBuffer(uint16_t* gbeWord, uint16_t desiredValue, int gbeRegionBase); uint16_t gbeGetChecksumFrom4kStruct(struct GBEREGIONRECORD_4K gbeStruct4k, uint16_t desiredValue); struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8K factoryGbeStruct8k); diff --git a/projects/ich9gen/sources/src/ich9deblob.c b/projects/ich9gen/sources/src/ich9deblob.c index d79a3a89..b9153ed6 100644 --- a/projects/ich9gen/sources/src/ich9deblob.c +++ b/projects/ich9gen/sources/src/ich9deblob.c @@ -1,7 +1,7 @@ /* * ich9deblob.c * This file is part of the ich9deblob utility from the libreboot project - * + * * Purpose: disable and remove the ME from ich9m/gm45 systems in coreboot. * * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> @@ -20,26 +20,26 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* Initially based on proof of concept by Steve Shenton. */ /* Original utility can be found at https://gitorious.org/ich9descriptortool */ - + /* - * Read a factory.rom dump (ich9m/gm45 systems) and + * Read a factory.rom dump (ich9m/gm45 systems) and * modify the flash descriptor to remove all regions except descriptor, * Gbe and BIOS. Set BIOS region to full size of the ROM image (after * the flash descriptor and gbe). Basically, deblob the descriptor. - * + * * This will will generate a concatenated descriptor+gbe dump suitable * for use in libreboot. Currently tested: ThinkPad X200 (coreboot/libreboot) */ - + /* * See docs/hardware/x200_remove_me.html for info plus links to datasheet (also linked below) - * + * * Info about flash descriptor (read page 845 onwards): * http://www.intel.co.uk/content/dam/doc/datasheet/io-controller-hub-9-datasheet.pdf - * + * * Info about Gbe region (read whole datasheet): * http://www.intel.co.uk/content/dam/doc/application-note/i-o-controller-hub-9m-82567lf-lm-v-nvm-map-appl-note.pdf * https://communities.intel.com/community/wired/blog/2010/10/14/how-to-basic-eeprom-checksums @@ -51,18 +51,18 @@ int main() { struct DESCRIPTORREGIONRECORD descriptorStruct; uint8_t* descriptorBuffer = (uint8_t*)&descriptorStruct; - + struct GBEREGIONRECORD_8K gbeStruct8k; uint8_t* gbeBuffer8k = (uint8_t*)&gbeStruct8k; uint32_t gbeRegionStart; - + char* romFilename = "factory.rom"; char* descriptorGbeFilename = "deblobbed_descriptor.bin"; char* descriptorNoGbeFilename = "deblobbed_4kdescriptor.bin"; - + unsigned int bufferLength; unsigned int romSize; - + /* * ------------------------------------------------------------------ * Compatibility checks. This version of ich9deblob is not yet portable. @@ -71,7 +71,7 @@ int main() if (systemOrCompilerIncompatible(descriptorStruct, gbeStruct8k)) return 1; /* If true, fail with error message */ - + /* * ------------------------------------------------------------------ * Extract the descriptor and gbe regions from the factory.rom dump @@ -86,20 +86,20 @@ int main() return 1; } printf("\n%s opened successfully\n", romFilename); - - /* + + /* * Get the descriptor region dump from the factory.rom * (goes in factoryDescriptorBuffer variable) */ bufferLength = fread(descriptorBuffer, 1, DESCRIPTORREGIONSIZE, fp); - if (DESCRIPTORREGIONSIZE != bufferLength) // + if (DESCRIPTORREGIONSIZE != bufferLength) // { printf("\nerror: could not read descriptor from %s (%i) bytes read\n", romFilename, bufferLength); fclose(fp); return 1; } printf("\ndescriptor region read successfully\n"); - + if (descriptorDefinesGbeRegion(descriptorStruct)) { gbeRegionStart = descriptorStruct.regionSection.flReg3.BASE << FLREGIONBITSHIFT; @@ -125,13 +125,13 @@ int main() printf("\n%s size: [%i] bytes\n", romFilename, romSize); fclose(fp); - + /* Debugging (before modification) */ printDescriptorRegionLocations(descriptorStruct, "Original"); - if (descriptorDefinesGbeRegion(descriptorStruct)) + if (descriptorDefinesGbeRegion(descriptorStruct)) printGbeChecksumDataFromStruct8k(gbeStruct8k, "Original"); else printf("NO GBE REGION\n"); - + /* * ------------------------------------------------------------------ * Modify the descriptor and gbe regions, ready to go in libreboot.rom @@ -179,7 +179,7 @@ int main() return 1; } } - + /* * ------------------------------------------------------------------ * Generate ich9gen data (C code that will recreate the deblobbed descriptor+gbe from scratch) @@ -205,7 +205,7 @@ int main() return 1; } } - + if (descriptorDefinesGbeRegion(descriptorStruct)) { printf("The modified descriptor and gbe regions have also been dumped as src files: mkdescriptor.c, mkdescriptor.h, mkgbe.c, mkgbe.h\n"); diff --git a/projects/ich9gen/sources/src/ich9deblob.h b/projects/ich9gen/sources/src/ich9deblob.h index c11ea290..e00b2c66 100644 --- a/projects/ich9gen/sources/src/ich9deblob.h +++ b/projects/ich9gen/sources/src/ich9deblob.h @@ -1,7 +1,7 @@ /* * ich9deblob.h * This file is part of the ich9deblob utility from the libreboot project - * + * * Purpose: header file for ich9deblob.c * * Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org> @@ -20,7 +20,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + #ifndef ICH9DEBLOB_H #define ICH9DEBLOB_H diff --git a/projects/ich9gen/sources/src/ich9gen.c b/projects/ich9gen/sources/src/ich9gen.c index b3a2c9f1..4d1e767e 100644 --- a/projects/ich9gen/sources/src/ich9gen.c +++ b/projects/ich9gen/sources/src/ich9gen.c @@ -15,16 +15,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* Generate deblobbed descriptor and gbe 12KiB file from scratch * without relying on a factory.rom dump */ - + #include "ich9gen.h" -int main(int argc, char *argv[]) +int main(int argc, char *argv[]) { int i, j; - + struct GBEREGIONRECORD_8K gbeStruct8k = generatedGbeStruct8k(); struct DESCRIPTORREGIONRECORD descriptorStruct4M = generatedDescriptorStruct(ROMSIZE_4MB, WITHGBE); struct DESCRIPTORREGIONRECORD descriptorStruct8M = generatedDescriptorStruct(ROMSIZE_8MB, WITHGBE); @@ -32,11 +32,11 @@ int main(int argc, char *argv[]) struct DESCRIPTORREGIONRECORD descriptorStructNoGbe4M = generatedDescriptorStruct(ROMSIZE_4MB, WITHOUTGBE); struct DESCRIPTORREGIONRECORD descriptorStructNoGbe8M = generatedDescriptorStruct(ROMSIZE_8MB, WITHOUTGBE); struct DESCRIPTORREGIONRECORD descriptorStructNoGbe16M = generatedDescriptorStruct(ROMSIZE_16MB, WITHOUTGBE); - + /* Only for the compatibility checks */ struct DESCRIPTORREGIONRECORD dummyDescriptorStruct; struct GBEREGIONRECORD_8K dummyGbeStruct8k; - + /* * ------------------------------------------------------------------ * Compatibility checks. This version of ich9deblob is not yet portable. @@ -45,19 +45,19 @@ int main(int argc, char *argv[]) if (systemOrCompilerIncompatible(dummyDescriptorStruct, dummyGbeStruct8k)) return 1; /* If true, fail with error message */ - + /* * ------------------------------------------------------------------ * Arguments given on the terminal * ------------------------------------------------------------------ */ - + if(argc==3) { - + /* If user provides their own MAC address, it will be used. - * Otherwise, ich9gen will simply use the default one. - * + * Otherwise, ich9gen will simply use the default one. + * * However, if the user provides an invalid MAC address, then ich9gen * will exit. */ if(0==strcmp(argv[1],"--macaddress")) { @@ -74,7 +74,7 @@ int main(int argc, char *argv[]) } for(i=0; i<6; i++) { gbeStruct8k.main.macAddress[i] = 0; - + /* Go through each nibble of the byte */ for(j=0; j<2; j++) { if(argv[2][(i*3)+j]>='a' && argv[2][(i*3)+j]<='f') @@ -92,7 +92,7 @@ int main(int argc, char *argv[]) gbeStruct8k.main.checkSum = gbeGetChecksumFrom4kStruct(gbeStruct8k.main, GBECHECKSUMTOTAL); /* Fix the checksum */ memcpy(&gbeStruct8k.backup, &gbeStruct8k.main, GBEREGIONSIZE_4K); /* Copy to the backup */ - + /* Generate ich9gen data (C code for Gbe region): */ /* mkgbe.h */ @@ -102,29 +102,29 @@ int main(int argc, char *argv[]) if (notCreatedCFileFromGbeStruct4k(gbeStruct8k.backup, "mkgbe.c", "mkgbe.h")) { return 1; } - + printf("You selected to change the MAC address in the Gbe section. This has been done.\n\n"); - + printf("The modified gbe region has also been dumped as src files: mkgbe.c, mkgbe.h\n"); printf("To use these in ich9gen, place them in src/ich9gen/ and re-build ich9gen.\n\n"); } - + } - + /* * ------------------------------------------------------------------ * Generate the 12KiB files, ready to be used in a libreboot image * ------------------------------------------------------------------ */ - + if (notCreatedDescriptorGbeFile(descriptorStruct4M, gbeStruct8k, "ich9fdgbe_4m.bin")) { return 1; } - + if (notCreatedDescriptorGbeFile(descriptorStruct8M, gbeStruct8k, "ich9fdgbe_8m.bin")) { return 1; } - + if (notCreatedDescriptorGbeFile(descriptorStruct16M, gbeStruct8k, "ich9fdgbe_16m.bin")) { return 1; } @@ -134,15 +134,15 @@ int main(int argc, char *argv[]) * In these descriptors, the onboard Intel GbE NIC is disabled; a discrete one is used instead * ------------------------------------------------------------------ */ - + if (notCreated4kDescriptorFile(descriptorStructNoGbe4M, "ich9fdnogbe_4m.bin")) { return 1; } - + if (notCreated4kDescriptorFile(descriptorStructNoGbe8M, "ich9fdnogbe_8m.bin")) { return 1; } - + if (notCreated4kDescriptorFile(descriptorStructNoGbe16M, "ich9fdnogbe_16m.bin")) { return 1; } diff --git a/projects/ich9gen/sources/src/ich9gen.h b/projects/ich9gen/sources/src/ich9gen.h index 6b346b06..c558e04a 100644 --- a/projects/ich9gen/sources/src/ich9gen.h +++ b/projects/ich9gen/sources/src/ich9gen.h @@ -14,9 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ - + /* Header file for ich9gen.c */ - + #ifndef ICH9GEN_H #define ICH9GEN_H diff --git a/projects/ich9gen/sources/src/ich9gen/mkdescriptor.c b/projects/ich9gen/sources/src/ich9gen/mkdescriptor.c index 3b97a97b..09669ccf 100644 --- a/projects/ich9gen/sources/src/ich9gen/mkdescriptor.c +++ b/projects/ich9gen/sources/src/ich9gen/mkdescriptor.c @@ -226,4 +226,3 @@ struct DESCRIPTORREGIONRECORD generatedDescriptorStruct(unsigned int romSize, in return descriptorStruct; } - diff --git a/projects/ich9gen/sources/src/ich9gen/mkgbe.c b/projects/ich9gen/sources/src/ich9gen/mkgbe.c index d6865823..099ab5b7 100644 --- a/projects/ich9gen/sources/src/ich9gen/mkgbe.c +++ b/projects/ich9gen/sources/src/ich9gen/mkgbe.c @@ -254,4 +254,3 @@ struct GBEREGIONRECORD_8K generatedGbeStruct8k() memcpy(&gbeStruct8k.backup, &gbeStruct8k.main, GBEREGIONSIZE_4K); return gbeStruct8k; } - |