diff options
author | Francis Rowe <info@gluglug.org.uk> | 2014-12-22 16:24:17 +0000 |
---|---|---|
committer | Francis Rowe <info@gluglug.org.uk> | 2014-12-22 16:41:29 +0000 |
commit | ec0b97bbb605897087f1307245bf3531e64c4fbd (patch) | |
tree | 8afbb357540fec1a502f492029f6c10025139476 | |
parent | a41aaa796f0116f478a016f375d69ff64de6814c (diff) | |
download | librebootfr-ec0b97bbb605897087f1307245bf3531e64c4fbd.tar.gz librebootfr-ec0b97bbb605897087f1307245bf3531e64c4fbd.zip |
ich9deblob: check that bitfields are stored in the correct order
-rw-r--r-- | resources/utilities/ich9deblob/ich9deblob.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/resources/utilities/ich9deblob/ich9deblob.c b/resources/utilities/ich9deblob/ich9deblob.c index c3145d5b..d65fa317 100644 --- a/resources/utilities/ich9deblob/ich9deblob.c +++ b/resources/utilities/ich9deblob/ich9deblob.c @@ -62,6 +62,7 @@ unsigned short gbeGetRegionWordFrom8kBuffer(int i, char* buffer); // used for ge struct DESCRIPTORREGIONRECORD deblobbedFromFactory(struct DESCRIPTORREGIONRECORD factoryDescriptorStruct, int romSize); int structSizesIncorrect(struct DESCRIPTORREGIONRECORD descriptorDummy, struct GBEREGIONRECORD_8K gbe8kDummy); int systemIsBigEndian(); +int structBitfieldWrongOrder(); int main(int argc, char *argv[]) { @@ -77,6 +78,7 @@ int main(int argc, char *argv[]) // Compatibility checks. This version of ich9deblob is not yet porable. if (structSizesIncorrect(factoryDescriptorStruct, factoryGbeStruct8k)) return 1; if (systemIsBigEndian()) return 1; + if (structBitfieldWrongOrder()) return 1; // ----------------------------------------------------------------------------------------------- @@ -293,6 +295,44 @@ int systemIsBigEndian() { return 0; } +// fail if bit fields are presented in the wrong order +int structBitfieldWrongOrder() { + struct DESCRIPTORREGIONRECORD descriptorDummy; + + 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 + + unsigned char *flMap0Ptr = (unsigned char*)&descriptorDummy.flMaps.flMap0; + + printf("Bitfield order check (descriptorDummy.flMaps.flMaps0):"); + printf("\nShould be: a2 e2 d2 e5 "); + printf("\nAnd it is: "); + int i; + for (i = 0; i < 4; i++) { + printf("%x ", *(flMap0Ptr + i)); + } + printf("\n"); + + if (!(*flMap0Ptr == 0xA2 && *(flMap0Ptr+1) == 0xE2 && *(flMap0Ptr+2) == 0xD2 && *(flMap0Ptr+3) == 0xE5)) { + printf("Incorrect order.\n"); + return 1; + } + printf("Correct order.\n"); + return 0; +} + // Modify the flash descriptor, to remove the ME/AMT, and disable all other regions // Only Flash Descriptor, Gbe and BIOS regions (BIOS region fills romSize-12k) are left. // Tested on ThinkPad X200 and X200S. X200T and other GM45 targets may also work. |