summaryrefslogtreecommitdiffstats
path: root/resources/utilities
diff options
context:
space:
mode:
authorFrancis Rowe <info@gluglug.org.uk>2014-12-28 12:33:50 (EST)
committer Francis Rowe <info@gluglug.org.uk>2014-12-28 12:33:50 (EST)
commit4ff5a94eb974a783081ee358966b2022aaf1fb20 (patch)
tree242d67dcfcf3fb4f1f9f0f06097757ec707a7520 /resources/utilities
parent779f26c4b48b792873438d99526ebe51c9db2565 (diff)
downloadlibreboot-4ff5a94eb974a783081ee358966b2022aaf1fb20.zip
libreboot-4ff5a94eb974a783081ee358966b2022aaf1fb20.tar.gz
libreboot-4ff5a94eb974a783081ee358966b2022aaf1fb20.tar.bz2
ich9deblob: added ich9gen utility
This can generate the descriptor+gbe images from scratch, without the need for a factory.bin dump.
Diffstat (limited to 'resources/utilities')
-rw-r--r--resources/utilities/ich9deblob/Makefile29
-rw-r--r--resources/utilities/ich9deblob/obj/ich9gen/.empty0
-rw-r--r--resources/utilities/ich9deblob/src/common/descriptor_gbe.c2
-rw-r--r--resources/utilities/ich9deblob/src/descriptor/descriptor.c370
-rw-r--r--resources/utilities/ich9deblob/src/descriptor/descriptor.h123
-rw-r--r--resources/utilities/ich9deblob/src/gbe/gbe.c353
-rw-r--r--resources/utilities/ich9deblob/src/gbe/gbe.h16
-rw-r--r--resources/utilities/ich9deblob/src/ich9deblob.c29
-rw-r--r--resources/utilities/ich9deblob/src/ich9gen.c57
-rw-r--r--resources/utilities/ich9deblob/src/ich9gen.h35
-rw-r--r--resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.c238
-rw-r--r--resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.h32
-rw-r--r--resources/utilities/ich9deblob/src/ich9gen/mkgbe.c256
-rw-r--r--resources/utilities/ich9deblob/src/ich9gen/mkgbe.h28
14 files changed, 1514 insertions, 54 deletions
diff --git a/resources/utilities/ich9deblob/Makefile b/resources/utilities/ich9deblob/Makefile
index 87e6da2..aaf1a63 100644
--- a/resources/utilities/ich9deblob/Makefile
+++ b/resources/utilities/ich9deblob/Makefile
@@ -21,7 +21,7 @@ CC=gcc
CFLAGS=-I. -Wall -g
NOLINKER=-c
-all: ich9deblob
+all: ich9deblob ich9gen
ich9deblob: obj/ich9deblob.o obj/common/descriptor_gbe.o \
obj/descriptor/descriptor.o obj/gbe/gbe.o obj/common/x86compatibility.o
@@ -29,10 +29,37 @@ ich9deblob: obj/ich9deblob.o obj/common/descriptor_gbe.o \
$(CC) $(CFLAGS) obj/ich9deblob.o obj/common/descriptor_gbe.o \
obj/common/x86compatibility.o obj/descriptor/descriptor.o obj/gbe/gbe.o \
-o ich9deblob
+
+ich9gen: obj/ich9gen.o obj/ich9gen/mkdescriptor.o obj/ich9gen/mkgbe.o \
+ obj/common/descriptor_gbe.o \
+ obj/descriptor/descriptor.o obj/gbe/gbe.o obj/common/x86compatibility.o
+
+ $(CC) $(CFLAGS) obj/ich9gen.o obj/ich9gen/mkdescriptor.o obj/ich9gen/mkgbe.o \
+ obj/common/descriptor_gbe.o \
+ obj/common/x86compatibility.o obj/descriptor/descriptor.o obj/gbe/gbe.o \
+ -o ich9gen
+
+# for ich9deblob
+# ----------------------------------------------------------------------
obj/ich9deblob.o:
$(CC) $(CFLAGS) $(NOLINKER) src/ich9deblob.c -o obj/ich9deblob.o
+
+# for ich9gen
+# ----------------------------------------------------------------------
+
+obj/ich9gen.o:
+ $(CC) $(CFLAGS) $(NOLINKER) src/ich9gen.c -o obj/ich9gen.o
+obj/ich9gen/mkdescriptor.o:
+ $(CC) $(CFLAGS) $(NOLINKER) src/ich9gen/mkdescriptor.c -o obj/ich9gen/mkdescriptor.o
+
+obj/ich9gen/mkgbe.o:
+ $(CC) $(CFLAGS) $(NOLINKER) src/ich9gen/mkgbe.c -o obj/ich9gen/mkgbe.o
+
+# for ich9deblob and ich9gen:
+# ----------------------------------------------------------------------
+
obj/common/descriptor_gbe.o:
$(CC) $(CFLAGS) $(NOLINKER) src/common/descriptor_gbe.c -o obj/common/descriptor_gbe.o
diff --git a/resources/utilities/ich9deblob/obj/ich9gen/.empty b/resources/utilities/ich9deblob/obj/ich9gen/.empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/resources/utilities/ich9deblob/obj/ich9gen/.empty
diff --git a/resources/utilities/ich9deblob/src/common/descriptor_gbe.c b/resources/utilities/ich9deblob/src/common/descriptor_gbe.c
index fcb80d0..ca50ac0 100644
--- a/resources/utilities/ich9deblob/src/common/descriptor_gbe.c
+++ b/resources/utilities/ich9deblob/src/common/descriptor_gbe.c
@@ -61,7 +61,7 @@ int notCreatedDescriptorGbeFile(struct DESCRIPTORREGIONRECORD descriptorStruct,
fclose(fileStream);
printf("descriptor and gbe successfully written to the file: %s\n", fileName);
- printf("Now do: dd if=deblobbed_descriptor.bin of=libreboot.rom bs=1 count=12k conv=notrunc\n");
+ 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;
diff --git a/resources/utilities/ich9deblob/src/descriptor/descriptor.c b/resources/utilities/ich9deblob/src/descriptor/descriptor.c
index 92456ef..1e434be 100644
--- a/resources/utilities/ich9deblob/src/descriptor/descriptor.c
+++ b/resources/utilities/ich9deblob/src/descriptor/descriptor.c
@@ -115,6 +115,376 @@ struct DESCRIPTORREGIONRECORD deblobbedDescriptorStructFromFactory(struct DESCRI
/*
* ---------------------------------------------------------------------
+ * C code generator (self-writing code)
+ * ---------------------------------------------------------------------
+ */
+
+/*
+ * 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)
+{
+ 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, "/* ROM image sizes in bytes */\n");
+ fprintf(fp, "#define ROMSIZE_4MB 0x400000\n");
+ fprintf(fp, "#define ROMSIZE_8MB 0x800000\n\n");
+
+ fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStruct(unsigned int romSize);\n");
+ fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom4M();\n");
+ fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom8M();\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)\n");
+ fprintf(fp, "{\n");
+ fprintf(fp, " int i;\n");
+ fprintf(fp, " struct DESCRIPTORREGIONRECORD descriptorStruct;\n");
+ fprintf(fp, "\n");
+ /* Flash Valid Signature Register */
+ fprintf(fp, " /* Flash Valid Signature Register */\n");
+ fprintf(fp, " descriptorStruct.flValSig.signature = 0x%08x;\n", descriptorStruct.flValSig.signature);
+ fprintf(fp, "\n");
+ /* Flash Map Registers */
+ fprintf(fp, " /* Flash Map Registers */\n");
+ fprintf(fp, " /* FLMAP0 */\n");
+ fprintf(fp, " descriptorStruct.flMaps.flMap0.FCBA = 0x%02x;\n", descriptorStruct.flMaps.flMap0.FCBA);
+ fprintf(fp, " descriptorStruct.flMaps.flMap0.NC = 0x%01x;\n", descriptorStruct.flMaps.flMap0.NC);
+ fprintf(fp, " descriptorStruct.flMaps.flMap0.reserved1 = 0x%02x;\n", descriptorStruct.flMaps.flMap0.reserved1);
+ fprintf(fp, " descriptorStruct.flMaps.flMap0.FRBA = 0x%02x;\n", descriptorStruct.flMaps.flMap0.FRBA);
+ fprintf(fp, " descriptorStruct.flMaps.flMap0.NR = 0x%01x;\n", descriptorStruct.flMaps.flMap0.NR);
+ fprintf(fp, " descriptorStruct.flMaps.flMap0.reserved2 = 0x%02x;\n", descriptorStruct.flMaps.flMap0.reserved2);
+ fprintf(fp, " /* FLMAP1 */\n");
+ fprintf(fp, " descriptorStruct.flMaps.flMap1.FMBA = 0x%02x;\n", descriptorStruct.flMaps.flMap1.FMBA);
+ fprintf(fp, " descriptorStruct.flMaps.flMap1.NM = 0x%01x;\n", descriptorStruct.flMaps.flMap1.NM);
+ fprintf(fp, " descriptorStruct.flMaps.flMap1.reserved = 0x%02x;\n", descriptorStruct.flMaps.flMap1.reserved);
+ fprintf(fp, " descriptorStruct.flMaps.flMap1.FISBA = 0x%02x;\n", descriptorStruct.flMaps.flMap1.FISBA);
+ fprintf(fp, " descriptorStruct.flMaps.flMap1.ISL = 0x%02x;\n", descriptorStruct.flMaps.flMap1.ISL);
+ fprintf(fp, " /* FLMAP2 */\n");
+ fprintf(fp, " descriptorStruct.flMaps.flMap2.FMSBA = 0x%02x;\n", descriptorStruct.flMaps.flMap2.FMSBA);
+ fprintf(fp, " descriptorStruct.flMaps.flMap2.MSL = 0x%02x;\n", descriptorStruct.flMaps.flMap2.MSL);
+ fprintf(fp, " descriptorStruct.flMaps.flMap2.reserved = 0x%04x;\n", descriptorStruct.flMaps.flMap2.reserved);
+ fprintf(fp, "\n");
+ /* Component Section Record */
+ fprintf(fp, " /* Component Section Record */\n");
+ fprintf(fp, " /* FLCOMP */\n");
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.component1Density = 0x%01x;\n", descriptorStruct.componentSection.flcomp.component1Density);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.component2Density = 0x%01x;\n", descriptorStruct.componentSection.flcomp.component2Density);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.reserved1 = 0x%01x;\n", descriptorStruct.componentSection.flcomp.reserved1);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.reserved2 = 0x%02x;\n", descriptorStruct.componentSection.flcomp.reserved2);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.reserved3 = 0x%01x;\n", descriptorStruct.componentSection.flcomp.reserved3);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.readClockFrequency = 0x%01x;\n", descriptorStruct.componentSection.flcomp.readClockFrequency);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.fastReadSupport = 0x%01x;\n", descriptorStruct.componentSection.flcomp.fastReadSupport);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.fastreadClockFrequency = 0x%01x;\n", descriptorStruct.componentSection.flcomp.fastreadClockFrequency);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.writeEraseClockFrequency = 0x%01x;\n", descriptorStruct.componentSection.flcomp.writeEraseClockFrequency);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.readStatusClockFrequency = 0x%01x;\n", descriptorStruct.componentSection.flcomp.readStatusClockFrequency);
+ fprintf(fp, " descriptorStruct.componentSection.flcomp.reserved4 = 0x%01x;\n", descriptorStruct.componentSection.flcomp.reserved4);
+ fprintf(fp, " /* FLILL */\n");
+ fprintf(fp, " descriptorStruct.componentSection.flill = 0x%08x;\n", descriptorStruct.componentSection.flill);
+ fprintf(fp, " /* FLPB */\n");
+ fprintf(fp, " descriptorStruct.componentSection.flpb = 0x%08x;\n", descriptorStruct.componentSection.flpb);
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 36; i++) {
+ if (descriptorStruct.componentSection.padding[i] != 0xFF) {
+ for (j = 0; j < 36; j++) {
+ fprintf(fp, " descriptorStruct.componentSection.padding[%d] = 0x%02x;\n", j, descriptorStruct.componentSection.padding[j]);
+ }
+ break;
+ } else if (i == 35) {
+ fprintf(fp, " for (i = 0; i < 36; i++) {\n");
+ fprintf(fp, " descriptorStruct.componentSection.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ /* Flash Descriptor Region Section */
+ fprintf(fp, " /* Flash Descriptor Region Section */\n");
+ fprintf(fp, " /* FLREG0 (Descriptor) */\n");
+ fprintf(fp, " descriptorStruct.regionSection.flReg0.BASE = 0x%04x;\n", descriptorStruct.regionSection.flReg0.BASE);
+ fprintf(fp, " descriptorStruct.regionSection.flReg0.reserved1 = 0x%01x;\n", descriptorStruct.regionSection.flReg0.reserved1);
+ fprintf(fp, " descriptorStruct.regionSection.flReg0.LIMIT = 0x%04x;\n", descriptorStruct.regionSection.flReg0.LIMIT);
+ fprintf(fp, " descriptorStruct.regionSection.flReg0.reserved2 = 0x%01x;\n", descriptorStruct.regionSection.flReg0.reserved2);
+ fprintf(fp, " /* FLREG1 (BIOS) */\n");
+ fprintf(fp, " descriptorStruct.regionSection.flReg1.BASE = 0x%04x;\n", descriptorStruct.regionSection.flReg1.BASE);
+ fprintf(fp, " descriptorStruct.regionSection.flReg1.reserved1 = 0x%01x;\n", descriptorStruct.regionSection.flReg1.reserved1);
+ fprintf(fp, " descriptorStruct.regionSection.flReg1.LIMIT = ((romSize >> FLREGIONBITSHIFT) - 1);\n");
+ fprintf(fp, " descriptorStruct.regionSection.flReg1.reserved2 = 0x%01x;\n", descriptorStruct.regionSection.flReg1.reserved2);
+ fprintf(fp, " /* FLREG2 (ME) */\n");
+ fprintf(fp, " descriptorStruct.regionSection.flReg2.BASE = 0x%04x; /* 0x1FFF to disable */\n", descriptorStruct.regionSection.flReg2.BASE);
+ fprintf(fp, " descriptorStruct.regionSection.flReg2.reserved1 = 0x%01x;\n", descriptorStruct.regionSection.flReg2.reserved1);
+ fprintf(fp, " descriptorStruct.regionSection.flReg2.LIMIT = 0x%04x; /* 0x0000 to disable */\n", descriptorStruct.regionSection.flReg2.LIMIT);
+ fprintf(fp, " descriptorStruct.regionSection.flReg2.reserved2 = 0x%01x;\n", descriptorStruct.regionSection.flReg2.reserved2);
+ fprintf(fp, " /* FLREG3 (Gbe) */\n");
+ fprintf(fp, " descriptorStruct.regionSection.flReg3.BASE = 0x%04x;\n", descriptorStruct.regionSection.flReg3.BASE);
+ fprintf(fp, " descriptorStruct.regionSection.flReg3.reserved1 = 0x%01x;\n", descriptorStruct.regionSection.flReg3.reserved1);
+ fprintf(fp, " descriptorStruct.regionSection.flReg3.LIMIT = 0x%04x;\n", descriptorStruct.regionSection.flReg3.LIMIT);
+ fprintf(fp, " descriptorStruct.regionSection.flReg3.reserved2 = 0x%01x;\n", descriptorStruct.regionSection.flReg3.reserved2);
+ fprintf(fp, " /* FLREG4 (Platform) */\n");
+ fprintf(fp, " descriptorStruct.regionSection.flReg4.BASE = 0x%04x; /* 0x1FFF to disable */\n", descriptorStruct.regionSection.flReg4.BASE);
+ fprintf(fp, " descriptorStruct.regionSection.flReg4.reserved1 = 0x%01x;\n", descriptorStruct.regionSection.flReg4.reserved1);
+ fprintf(fp, " descriptorStruct.regionSection.flReg4.LIMIT = 0x%04x; /* 0x0000 to disable */\n", descriptorStruct.regionSection.flReg4.LIMIT);
+ fprintf(fp, " descriptorStruct.regionSection.flReg4.reserved2 = 0x%01x;\n", descriptorStruct.regionSection.flReg4.reserved2);
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 12; i++) {
+ if (descriptorStruct.regionSection.padding[i] != 0xFF) {
+ for (j = 0; j < 12; j++) {
+ fprintf(fp, " descriptorStruct.regionSection.padding[%d] = 0x%02x;\n", j, descriptorStruct.regionSection.padding[j]);
+ }
+ break;
+ } else if (i == 11) {
+ fprintf(fp, " for (i = 0; i < 12; i++) {\n");
+ fprintf(fp, " descriptorStruct.regionSection.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ /* Master Access Section */
+ fprintf(fp, " /* Master Access Section */\n");
+ fprintf(fp, " /* FLMSTR1 (Host CPU / BIOS) */\n");
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.requesterId = 0x%04x;\n", descriptorStruct.masterAccessSection.flMstr1.requesterId);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.fdRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.fdRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.biosRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.biosRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.meRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.meRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.gbeRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.gbeRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.pdRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.pdRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.reserved1 = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.reserved1);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.fdRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.fdRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.biosRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.biosRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.meRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.meRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.gbeRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.gbeRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.pdRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.pdRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr1.reserved2 = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr1.reserved2);
+ fprintf(fp, " /* FLMSTR2 (ME) */\n");
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.requesterId = 0x%04x;\n", descriptorStruct.masterAccessSection.flMstr2.requesterId);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.fdRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.fdRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.biosRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.biosRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.meRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.meRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.gbeRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.gbeRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.pdRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.pdRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.reserved1 = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.reserved1);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.fdRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.fdRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.biosRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.biosRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.meRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.meRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.gbeRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.gbeRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.pdRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.pdRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr2.reserved2 = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr2.reserved2);
+ fprintf(fp, " /* FLMSTR3 (Gbe) */\n");
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.requesterId = 0x%04x;\n", descriptorStruct.masterAccessSection.flMstr3.requesterId);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.fdRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.fdRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.biosRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.biosRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.meRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.meRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.gbeRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.gbeRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.pdRegionReadAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.pdRegionReadAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.reserved1 = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.reserved1);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.fdRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.fdRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.biosRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.biosRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.meRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.meRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.gbeRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.gbeRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.pdRegionWriteAccess = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.pdRegionWriteAccess);
+ fprintf(fp, " descriptorStruct.masterAccessSection.flMstr3.reserved2 = 0x%01x;\n", descriptorStruct.masterAccessSection.flMstr3.reserved2);
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 148; i++) {
+ if (descriptorStruct.masterAccessSection.padding[i] != 0xFF) {
+ for (j = 0; j < 148; j++) {
+ fprintf(fp, " descriptorStruct.masterAccessSection.padding[%d] = 0x%02x;\n", j, descriptorStruct.masterAccessSection.padding[j]);
+ }
+ break;
+ } else if (i == 147) {
+ fprintf(fp, " for (i = 0; i < 148; i++) {\n");
+ fprintf(fp, " descriptorStruct.masterAccessSection.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ /* ICH straps */
+ fprintf(fp, " /* ICH straps */\n");
+ fprintf(fp, " /* ICHSTRAP0 */\n");
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.meDisable = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.meDisable);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.reserved1 = 0x%02x;\n", descriptorStruct.ichStraps.ichStrap0.reserved1);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.tcoMode = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.tcoMode);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.smBusAddress = 0x%02x;\n", descriptorStruct.ichStraps.ichStrap0.smBusAddress);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.bmcMode = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.bmcMode);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.tripPointSelect = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.tripPointSelect);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.reserved2 = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.reserved2);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.integratedGbe = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.integratedGbe);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.lanPhy = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.lanPhy);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.reserved3 = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.reserved3);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.dmiRequesterId = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap0.dmiRequesterId);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap0.smBus2Address = 0x%02x;\n", descriptorStruct.ichStraps.ichStrap0.smBus2Address);
+ fprintf(fp, " /* ICHSTRAP1 */\n");
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.northMlink = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap1.northMlink);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.southMlink = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap1.southMlink);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.meSmbus = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap1.meSmbus);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.sstDynamic = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap1.sstDynamic);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.reserved1 = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap1.reserved1);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.northMlink2 = 0x%01x;\n", descriptorStruct.ichStraps.ichStrap1.northMlink2);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.reserved2 = 0x%02x;\n", descriptorStruct.ichStraps.ichStrap1.reserved2);
+ fprintf(fp, " descriptorStruct.ichStraps.ichStrap1.reserved3 = 0x%04x;\n", descriptorStruct.ichStraps.ichStrap1.reserved3);
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 248; i++) {
+ if (descriptorStruct.ichStraps.padding[i] != 0xFF) {
+ for (j = 0; j < 248; j++) {
+ fprintf(fp, " descriptorStruct.ichStraps.padding[%d] = 0x%02x;\n", j, descriptorStruct.ichStraps.padding[j]);
+ }
+ break;
+ } else if (i == 247) {
+ fprintf(fp, " for (i = 0; i < 248; i++) {\n");
+ fprintf(fp, " descriptorStruct.ichStraps.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ /* MCH straps */
+ fprintf(fp, " /* MCH straps */\n");
+ fprintf(fp, " /* MCHSTRAP0 */\n");
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.meDisable = 0x%01x;\n", descriptorStruct.mchStraps.mchStrap0.meDisable);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.meBootFromFlash = 0x%01x;\n", descriptorStruct.mchStraps.mchStrap0.meBootFromFlash);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.tpmDisable = 0x%01x;\n", descriptorStruct.mchStraps.mchStrap0.tpmDisable);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.reserved1 = 0x%01x;\n", descriptorStruct.mchStraps.mchStrap0.reserved1);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.spiFingerprint = 0x%01x;\n", descriptorStruct.mchStraps.mchStrap0.spiFingerprint);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.meAlternateDisable = 0x%01x;\n", descriptorStruct.mchStraps.mchStrap0.meAlternateDisable);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.reserved2 = 0x%02x;\n", descriptorStruct.mchStraps.mchStrap0.reserved2);
+ fprintf(fp, " descriptorStruct.mchStraps.mchStrap0.reserved3 = 0x%04x;\n", descriptorStruct.mchStraps.mchStrap0.reserved3);
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 3292; i++) {
+ if (descriptorStruct.mchStraps.padding[i] != 0xFF) {
+ for (j = 0; j < 3292; j++) {
+ fprintf(fp, " descriptorStruct.mchStraps.padding[%d] = 0x%02x;\n", j, descriptorStruct.mchStraps.padding[j]);
+ }
+ break;
+ } else if (i == 3291) {
+ fprintf(fp, " for (i = 0; i < 3292; i++) {\n");
+ fprintf(fp, " descriptorStruct.mchStraps.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ /* ME VSCC Table */
+ fprintf(fp, " /* ME VSCC Table */\n");
+ fprintf(fp, " descriptorStruct.meVsccTable.jid0 = 0x%08x;\n", descriptorStruct.meVsccTable.jid0);
+ fprintf(fp, " descriptorStruct.meVsccTable.vscc0 = 0x%08x;\n", descriptorStruct.meVsccTable.vscc0);
+ fprintf(fp, " descriptorStruct.meVsccTable.jid1 = 0x%08x;\n", descriptorStruct.meVsccTable.jid1);
+ fprintf(fp, " descriptorStruct.meVsccTable.vscc1 = 0x%08x;\n", descriptorStruct.meVsccTable.vscc1);
+ fprintf(fp, " descriptorStruct.meVsccTable.jid2 = 0x%08x;\n", descriptorStruct.meVsccTable.jid2);
+ fprintf(fp, " descriptorStruct.meVsccTable.vscc2 = 0x%08x;\n", descriptorStruct.meVsccTable.vscc2);
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 4; i++) {
+ if (descriptorStruct.meVsccTable.padding[i] != 0xFF) {
+ for (j = 0; j < 4; j++) {
+ fprintf(fp, " descriptorStruct.meVsccTable.padding[%d] = 0x%02x;\n", j, descriptorStruct.meVsccTable.padding[j]);
+ }
+ break;
+ } else if (i == 3) {
+ fprintf(fp, " for (i = 0; i < 4; i++) {\n");
+ fprintf(fp, " descriptorStruct.meVsccTable.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ /* Descriptor Map 2 Record */
+ fprintf(fp, " /* Descriptor Map 2 Record */\n");
+ fprintf(fp, " descriptorStruct.descriptor2Map.meVsccTableBaseAddress = 0x%02x;\n", descriptorStruct.descriptor2Map.meVsccTableBaseAddress);
+ fprintf(fp, " descriptorStruct.descriptor2Map.meVsccTableLength = 0x%02x;\n", descriptorStruct.descriptor2Map.meVsccTableLength);
+ fprintf(fp, " descriptorStruct.descriptor2Map.reserved = 0x%04x;\n", descriptorStruct.descriptor2Map.reserved);
+ fprintf(fp, "\n");
+ /* OEM section */
+ fprintf(fp, " /* OEM section */\n");
+ fprintf(fp, " /* Magic String (ascii characters) */\n");
+ for(i = 0; i < 8; i++) {
+ fprintf(fp, " descriptorStruct.oemSection.magicString[%d] = 0x%02x;\n", i, descriptorStruct.oemSection.magicString[i]);
+ }
+ fprintf(fp, " /* Padding */\n");
+ for (i = 0; i < 248; i++) {
+ if (descriptorStruct.oemSection.padding[i] != 0xFF) {
+ for (j = 0; j < 248; j++) {
+ fprintf(fp, " descriptorStruct.oemSection.padding[%d] = 0x%02x;\n", j, descriptorStruct.oemSection.padding[j]);
+ }
+ break;
+ } else if (i == 247) {
+ fprintf(fp, " for (i = 0; i < 248; i++) {\n");
+ fprintf(fp, " descriptorStruct.oemSection.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ break;
+ }
+ }
+ fprintf(fp, "\n");
+ fprintf(fp, " return descriptorStruct;\n");
+ fprintf(fp, "}\n\n");
+
+ fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom4M()\n");
+ fprintf(fp, "{\n");
+ fprintf(fp, " return generatedDescriptorStruct(ROMSIZE_4MB);\n");
+ fprintf(fp, "}\n\n");
+
+ fprintf(fp, "struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom8M()\n");
+ fprintf(fp, "{\n");
+ fprintf(fp, " return generatedDescriptorStruct(ROMSIZE_8MB);\n");
+ fprintf(fp, "}\n\n");
+
+ /* ------------------------------ */
+
+ fclose(fp); /* Always close the file when done. */
+
+ return 0;
+}
+
+/*
+ * ---------------------------------------------------------------------
* Debugging functions:
* ---------------------------------------------------------------------
*/
diff --git a/resources/utilities/ich9deblob/src/descriptor/descriptor.h b/resources/utilities/ich9deblob/src/descriptor/descriptor.h
index ecef537..8648c98 100644
--- a/resources/utilities/ich9deblob/src/descriptor/descriptor.h
+++ b/resources/utilities/ich9deblob/src/descriptor/descriptor.h
@@ -31,7 +31,7 @@
/*
* See docs/hcl/x200_remove_me.html for info plus links to datasheet (also linked below)
*
- * Info about flash descriptor (read page 850 onwards):
+ * Info about flash descriptor (read page 845 onwards):
* http://www.intel.co.uk/content/dam/doc/datasheet/io-controller-hub-9-datasheet.pdf
*/
@@ -58,52 +58,51 @@
* ---------------------------------------------------------------------
*/
+/* Flash Valid Signature Register */
struct FLVALSIG
{
- unsigned int signature;
+ /*
+ * 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 machine in non-descriptor mode.
+ */
+ unsigned int signature; /* Put 0x0FF0A55A here. confirmed in deblobbed_descriptor.bin */
};
-struct FLMAP0
+/* */
+struct FLMAP0
{
/* least signicant bits */
unsigned char FCBA : 8;
unsigned char NC : 2;
unsigned char reserved1 : 6;
- /*
- * ^^^^ unnamed members like these represent unused bits (per datasheet).
- * the same applies for all structs in this file.
- */
unsigned char FRBA : 8;
unsigned char NR : 3;
unsigned char reserved2 : 5;
/* most significant bits. */
-
- /*
- * the datasheet lists msb's first and lsb's last, in each table.
- * meanwhile, x86 gcc treats the members at the top of the struct as lsb's
- * and at the bottom of the struct, the members there are msb's. The same
- * fact applies to all the other structs below.
- *
- * non-x86 (and/or non-gcc) is untested. little endian assumed.
- */
};
struct FLMAP1
{
+ /* least significant bits */
unsigned char FMBA : 8;
unsigned char NM : 3;
unsigned char reserved : 5;
unsigned char FISBA : 8;
unsigned char ISL : 8;
+ /* most significant bits */
};
struct FLMAP2
{
+ /* least significant bits */
unsigned char FMSBA : 8;
unsigned char MSL : 8;
unsigned short reserved : 16;
+ /* most significant bits */
};
+/* Flash Map Registers */
struct FLMAPS
{
struct FLMAP0 flMap0;
@@ -111,8 +110,10 @@ struct FLMAPS
struct FLMAP2 flMap2;
};
+/* Flash Components Register */
struct FLCOMP
{
+ /* least significant bits */
unsigned char component1Density : 3;
unsigned char component2Density : 3;
unsigned char reserved1 : 2;
@@ -124,6 +125,7 @@ struct FLCOMP
unsigned char writeEraseClockFrequency : 3;
unsigned char readStatusClockFrequency : 3;
unsigned char reserved4 : 2;
+ /* most significant bits */
};
struct COMPONENTSECTIONRECORD
@@ -136,12 +138,19 @@ struct COMPONENTSECTIONRECORD
struct FLREG
{
+ /* least significant bits */
unsigned short BASE : 13;
unsigned short reserved1 : 3;
unsigned short LIMIT : 13;
unsigned short reserved2 : 3;
+ /* most significant bits */
};
+/* Flash Descriptor Region Section */
+/*
+ * Defines where all the regions begin/end.
+ * This is very important for disabling ME/AMT
+ */
struct REGIONSECTIONRECORD
{
struct FLREG flReg0; /* Descriptor */
@@ -152,8 +161,10 @@ struct REGIONSECTIONRECORD
unsigned char padding[12];
};
-struct FLMSTR {
- unsigned short requesterId : 16;
+struct FLMSTR
+{
+ /* least significant bits */
+ unsigned short requesterId : 16;
unsigned char fdRegionReadAccess : 1;
unsigned char biosRegionReadAccess : 1;
unsigned char meRegionReadAccess : 1;
@@ -166,17 +177,21 @@ struct FLMSTR {
unsigned char gbeRegionWriteAccess : 1;
unsigned char pdRegionWriteAccess : 1;
unsigned char reserved2 : 3; /* Must be zero, according to datasheet */
+ /* most significant bits */
};
-
-struct MASTERACCESSSECTIONRECORD {
- struct FLMSTR flMstr1;
- struct FLMSTR flMstr2;
- struct FLMSTR flMstr3;
+/* Master Access Section */
+struct MASTERACCESSSECTIONRECORD
+{
+ struct FLMSTR flMstr1; /* Flash Master 1 (Host CPU / BIOS) */
+ struct FLMSTR flMstr2; /* Flash Master 2 (ME) */
+ struct FLMSTR flMstr3; /* Flash Master 3 (Gbe) */
unsigned char padding[148];
};
-struct ICHSTRAP0 {
+struct ICHSTRAP0
+{
+ /* least significant bits */
/* todo: add MeSmBus2Sel (boring setting) */
unsigned char meDisable : 1; /* If true, ME is disabled. */
unsigned char reserved1 : 6;
@@ -190,9 +205,12 @@ struct ICHSTRAP0 {
unsigned char reserved3 : 3;
unsigned char dmiRequesterId : 1; /* DMI requestor ID security check disable: The primary purpose of this strap is to support server environments with multiple CPUs that each have a different RequesterID that can access the Flash. */
unsigned char smBus2Address : 7; /* The ME SmBus 2 7-bit address. */
+ /* most significant bits */
};
-struct ICHSTRAP1 {
+struct ICHSTRAP1
+{
+ /* least significant bits */
unsigned char northMlink : 1; /* North MLink Dynamic Clock Gate Disable : Sets the default value for the South MLink Dynamic Clock Gate Enable registers. */
unsigned char southMlink : 1; /* South MLink Dynamic Clock Gate Enable : Sets the default value for the South MLink Dynamic Clock Gate Enable registers. */
unsigned char meSmbus : 1; /* ME SmBus Dynamic Clock Gate Enable : Sets the default value for the ME SMBus Dynamic Clock Gate Enable for both the ME SmBus controllers. */
@@ -201,16 +219,20 @@ struct ICHSTRAP1 {
unsigned char northMlink2 : 1; /* North MLink 2 Non-Posted Enable : 'true':North MLink supports two downstream non-posted requests. 'false':North MLink supports one downstream non-posted requests. */
unsigned char reserved2 : 7;
unsigned short reserved3 : 16;
+ /* most significant bits */
};
-
-struct ICHSTRAPSRECORD {
+/* ICH straps */
+struct ICHSTRAPSRECORD
+{
struct ICHSTRAP0 ichStrap0;
struct ICHSTRAP1 ichStrap1;
unsigned char padding[248];
};
-struct MCHSTRAP0 {
+struct MCHSTRAP0
+{
+ /* least significant bits */
unsigned char meDisable : 1; /* If true, ME is disabled. */
unsigned char meBootFromFlash : 1; /* ME boot from Flash - guessed location */
unsigned char tpmDisable : 1; /* iTPM Disable : When set true, iTPM Host Interface is disabled. When set false (default), iTPM is enabled. */
@@ -219,14 +241,19 @@ struct MCHSTRAP0 {
unsigned char meAlternateDisable : 1; /* ME Alternate Disable: Setting this bit allows ME to perform critical chipset functions but prevents loading of any ME FW applications. */
unsigned char reserved2 : 8;
unsigned short reserved3 : 16;
+ /* most significant bits */
};
-struct MCHSTRAPSRECORD {
+/* MCH straps */
+struct MCHSTRAPSRECORD
+{
struct MCHSTRAP0 mchStrap0;
unsigned char padding[3292];
};
-struct MEVSCCTABLERECORD {
+/* ME VSCC Table */
+struct MEVSCCTABLERECORD
+{
unsigned int jid0;
unsigned int vscc0;
unsigned int jid1;
@@ -236,28 +263,36 @@ struct MEVSCCTABLERECORD {
unsigned char padding[4];
};
-struct DESCRIPTORMAP2RECORD {
+/* Descriptor Map 2 Record */
+struct DESCRIPTORMAP2RECORD
+{
+ /* least significant bits */
unsigned char meVsccTableBaseAddress : 8;
unsigned char meVsccTableLength : 8;
unsigned short reserved : 16;
+ /* most significant bits */
};
-struct OEMSECTIONRECORD {
+/* OEM section */
+struct OEMSECTIONRECORD
+{
unsigned char magicString[8];
unsigned char padding[248];
};
-struct DESCRIPTORREGIONRECORD {
- struct FLVALSIG flValSig;
- struct FLMAPS flMaps;
- struct COMPONENTSECTIONRECORD componentSection;
- struct REGIONSECTIONRECORD regionSection;
- struct MASTERACCESSSECTIONRECORD masterAccessSection;
- struct ICHSTRAPSRECORD ichStraps;
- struct MCHSTRAPSRECORD mchStraps;
- struct MEVSCCTABLERECORD meVsccTable;
- struct DESCRIPTORMAP2RECORD descriptor2Map;
- struct OEMSECTIONRECORD oemSection;
+/* 4KiB descriptor region, goes at the beginning of the ROM image */
+struct DESCRIPTORREGIONRECORD
+{
+ struct FLVALSIG flValSig; /* Flash Valid Signature Register */
+ struct FLMAPS flMaps; /* Flash Map Registers */
+ struct COMPONENTSECTIONRECORD componentSection; /* Component Section Record */
+ struct REGIONSECTIONRECORD regionSection; /* Flash Descriptor Region Section */
+ struct MASTERACCESSSECTIONRECORD masterAccessSection; /* Master Access Section */
+ struct ICHSTRAPSRECORD ichStraps; /* ICH straps */
+ struct MCHSTRAPSRECORD mchStraps; /* MCH straps */
+ struct MEVSCCTABLERECORD meVsccTable; /* ME VSCC Table */
+ struct DESCRIPTORMAP2RECORD descriptor2Map; /* Descriptor Map 2 Record */
+ struct OEMSECTIONRECORD oemSection; /* OEM section */
};
/*
@@ -267,6 +302,8 @@ struct DESCRIPTORREGIONRECORD {
*/
struct DESCRIPTORREGIONRECORD deblobbedDescriptorStructFromFactory(struct DESCRIPTORREGIONRECORD factoryDescriptorStruct, unsigned int factoryRomSize);
+int notCreatedHFileForDescriptorCFile(char* outFileName, char* cFileName);
+int notCreatedCFileFromDescriptorStruct(struct DESCRIPTORREGIONRECORD descriptorStruct, char* outFileName, char* headerFileName);
void printDescriptorRegionLocations(struct DESCRIPTORREGIONRECORD descriptorStruct, char* romName);
#endif
diff --git a/resources/utilities/ich9deblob/src/gbe/gbe.c b/resources/utilities/ich9deblob/src/gbe/gbe.c
index b41b0db..12b8d99 100644
--- a/resources/utilities/ich9deblob/src/gbe/gbe.c
+++ b/resources/utilities/ich9deblob/src/gbe/gbe.c
@@ -94,12 +94,19 @@ struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8
* (for later chipsets) do. Maybe these are "reserved". Or maybe they are just junk.
*
* We really don't know. Blanking them with 0xFF seems harmless, though (nothing important seems broken).
+ *
+ * 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.
+ * Since libreboot disables and removes ME/AMT, it makes sense that blanking out words 40h to 53h
+ * has no effect on functionality, since ME/AMT is already removed (assuming that 40-53 is really for AMT).
*/
for(i = 0; i < sizeof(deblobbedGbeStruct8k.backup.padding); i++) {
deblobbedGbeStruct8k.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 */
deblobbedGbeStruct8k.backup.checkSum = gbeGetChecksumFrom4kStruct(deblobbedGbeStruct8k.backup, GBECHECKSUMTOTAL);
+ /* Main Gbe region on X200 (as shipped by Lenovo) is broken. Fix it by over-writing it with the contents of Gbe/Backup */
memcpy(&deblobbedGbeStruct8k.main, &deblobbedGbeStruct8k.backup, GBEREGIONSIZE_4K);
return deblobbedGbeStruct8k;
@@ -107,6 +114,350 @@ struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8
/*
* ---------------------------------------------------------------------
+ * C code generator (self-writing code)
+ * ---------------------------------------------------------------------
+ */
+
+/*
+ * 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)
+{
+ 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)
+{
+ 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");
+ fprintf(fp, " struct GBEREGIONRECORD_4K gbeStruct4k;\n");
+ fprintf(fp, "\n");
+ /* Words 00h to 02h: MAC Address */
+ fprintf(fp, " /* MAC address (words 00h to 02h) */\n");
+ for (i = 0; i < 6; i++) {
+ fprintf(fp, " gbeStruct4k.macAddress[%d] = 0x%02x;\n", i, gbeStruct4k.macAddress[i]);
+ }
+ fprintf(fp, "\n");
+ /* Word 03h (Reserved) */
+ fprintf(fp, " /* Word 03h (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord03h.reserved1_0 = 0x%02x;\n", gbeStruct4k.reservedWord03h.reserved1_0);
+ fprintf(fp, " gbeStruct4k.reservedWord03h.reserved1_1 = 0x%01x;\n", gbeStruct4k.reservedWord03h.reserved1_1);
+ fprintf(fp, " gbeStruct4k.reservedWord03h.ibaLom = 0x%01x;\n", gbeStruct4k.reservedWord03h.ibaLom);
+ fprintf(fp, " gbeStruct4k.reservedWord03h.reserved2 = 0x%01x;\n", gbeStruct4k.reservedWord03h.reserved2);
+ fprintf(fp, "\n");
+ /* Word 04h (Reserved) */
+ fprintf(fp, " /* Word 04h (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord04h = 0x%04x;\n", gbeStruct4k.reservedWord04h);
+ fprintf(fp, "\n");
+ /* Word 05h (Image Version Information) */
+ fprintf(fp, " /* Word 05h (Image Version Information) */\n");
+ fprintf(fp, " gbeStruct4k.imageVersionInformation = 0x%04x;\n", gbeStruct4k.imageVersionInformation);
+ fprintf(fp, "\n");
+ /* Words 06h and 07h (Reserved) */
+ fprintf(fp, " /* Words 06h and 07h (Reserved) */\n");
+ for (i = 0; i < 2; i++) {
+ fprintf(fp, " gbeStruct4k.reservedWords06h07h[%d] = 0x%04x;\n", i, gbeStruct4k.reservedWords06h07h[i]);
+ }
+ fprintf(fp, "\n");
+ /* Words 08h and 09h (PBA Low and PBA High) */
+ fprintf(fp, " /* Word 08h and 09h (PBA Low and PBA High) */\n");
+ fprintf(fp, " gbeStruct4k.pbaLow = 0x%04x;\n", gbeStruct4k.pbaLow);
+ fprintf(fp, " gbeStruct4k.pbaHigh = 0x%04x;\n", gbeStruct4k.pbaHigh);
+ fprintf(fp, "\n");
+ /* Word 0Ah (PCI Initialization Control Word) */
+ fprintf(fp, " /* Word 0Ah (PCI Initialization Control Word) */\n");
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.loadVendorDeviceId = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.loadVendorDeviceId);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.loadSubsystemId = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.loadSubsystemId);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.reserved1 = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.reserved1);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.reserved2 = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.reserved2);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.pmEnable = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.pmEnable);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.auxPwr = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.auxPwr);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.reserved3 = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.reserved3);
+ fprintf(fp, " gbeStruct4k.pciInitializationControlWord.reserved4 = 0x%01x;\n", gbeStruct4k.pciInitializationControlWord.reserved4);
+ fprintf(fp, "\n");
+ /* Word 0Bh (Subsystem ID) */
+ fprintf(fp, " /* Word 0Bh (Subsystem ID) */\n");
+ fprintf(fp, " gbeStruct4k.subsystemId = 0x%04x;\n", gbeStruct4k.subsystemId);
+ fprintf(fp, "\n");
+ /* Word 0Ch (Subsystem Vendor ID) */
+ fprintf(fp, " /* Word 0Ch (Subsystem Vendor ID) */\n");
+ fprintf(fp, " gbeStruct4k.subsystemVendorId = 0x%04x;\n", gbeStruct4k.subsystemVendorId);
+ fprintf(fp, "\n");
+ /* Word 0Dh (Device ID) */
+ fprintf(fp, " /* Word 0Dh (Device ID) */\n");
+ fprintf(fp, " gbeStruct4k.deviceId = 0x%04x;\n", gbeStruct4k.deviceId);
+ fprintf(fp, "\n");
+ /* Word 0Eh (Vendor ID) */
+ fprintf(fp, " /* Word 0Eh (Vendor ID) */\n");
+ fprintf(fp, " gbeStruct4k.vendorId = 0x%04x;\n", gbeStruct4k.vendorId);
+ fprintf(fp, "\n");
+ /* Word 0Fh (Device Revision ID) */
+ fprintf(fp, " /* Word 0Fh (Device Revision ID) */\n");
+ fprintf(fp, " gbeStruct4k.deviceRevId = 0x%04x;\n", gbeStruct4k.deviceRevId);
+ fprintf(fp, "\n");
+ /* Word 10h (LAN Power Consumption) */
+ fprintf(fp, " /* Word 10h (LAN Power Consumption) */\n");
+ fprintf(fp, " gbeStruct4k.lanPowerConsumption.lanD3Power = 0x%02x;\n", gbeStruct4k.lanPowerConsumption.lanD3Power);
+ fprintf(fp, " gbeStruct4k.lanPowerConsumption.reserved = 0x%01x;\n", gbeStruct4k.lanPowerConsumption.reserved);
+ fprintf(fp, " gbeStruct4k.lanPowerConsumption.lanD0Power = 0x%02x;\n", gbeStruct4k.lanPowerConsumption.lanD0Power);
+ fprintf(fp, "\n");
+ /* Words 11h and 12h (Reserved) */
+ fprintf(fp, " /* Words 11h and 12h (Reserved) */\n");
+ for (i = 0; i < 2; i++) {
+ fprintf(fp, " gbeStruct4k.reservedWords11h12h[%d] = 0x%04x;\n", i, gbeStruct4k.reservedWords11h12h[i]);
+ }
+ fprintf(fp, "\n");
+ /* Word 13h (Shared Initialization Control Word) */
+ fprintf(fp, " /* Word 13h (Shared Initialization Control Word) */\n");
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.reserved1 = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.reserved1);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.forceDuplex = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.forceDuplex);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.forceSpeedEnable = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.forceSpeedEnable);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.reserved2_0 = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.reserved2_0);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.reserved2_1 = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.reserved2_1);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.phyPowerDownEnable = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.phyPowerDownEnable);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.reserved3 = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.reserved3);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.reserved4 = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.reserved4);
+ fprintf(fp, " gbeStruct4k.sharedInitializationControlWord.sign = 0x%01x;\n", gbeStruct4k.sharedInitializationControlWord.sign);
+ fprintf(fp, "\n");
+ /* Word 14h (Extended Configuration Control Word 1) */
+ fprintf(fp, " /* Word 14h (Extended Configuration Control Word 1) */\n");
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord1.extendedConfigurationPointer = 0x%03x;\n", gbeStruct4k.extendedConfigurationControlWord1.extendedConfigurationPointer);
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord1.oemWriteEnable = 0x%01x;\n", gbeStruct4k.extendedConfigurationControlWord1.oemWriteEnable);
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord1.reserved1 = 0x%01x;\n", gbeStruct4k.extendedConfigurationControlWord1.reserved1);
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord1.reserved2 = 0x%01x;\n", gbeStruct4k.extendedConfigurationControlWord1.reserved2);
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord1.reserved3 = 0x%01x;\n", gbeStruct4k.extendedConfigurationControlWord1.reserved3);
+ fprintf(fp, "\n");
+ /* Word 15h (Extended Configuration Control Word 2) */
+ fprintf(fp, " /* Word 15h (Extended Configuration Control Word 2) */\n");
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord2.reserved = 0x%02x;\n", gbeStruct4k.extendedConfigurationControlWord2.reserved);
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord2.extendedPhyLength = 0x%02x;\n", gbeStruct4k.extendedConfigurationControlWord2.extendedPhyLength);
+ fprintf(fp, "\n");
+ /* Word 16h (Extended Configuration Control Word 3) */
+ fprintf(fp, " /* Word 16h (Extended Configuration Control Word 3) */\n");
+ fprintf(fp, " gbeStruct4k.extendedConfigurationControlWord3 = 0x%04x;\n", gbeStruct4k.extendedConfigurationControlWord3);
+ fprintf(fp, "\n");
+ /* Word 17h (LED 1 Configuration and Power Management) */
+ fprintf(fp, " /* Word 17h (LED 1 Configuration and Power Management) */\n");
+ fprintf(fp, " gbeStruct4k.ledCtl1.led1Mode = 0x%01x;\n", gbeStruct4k.ledCtl1.led1Mode);
+ fprintf(fp, " gbeStruct4k.ledCtl1.reserved1 = 0x%01x;\n", gbeStruct4k.ledCtl1.reserved1);
+ fprintf(fp, " gbeStruct4k.ledCtl1.led1BlinkMode = 0x%01x;\n", gbeStruct4k.ledCtl1.led1BlinkMode);
+ fprintf(fp, " gbeStruct4k.ledCtl1.led1Invert = 0x%01x;\n", gbeStruct4k.ledCtl1.led1Invert);
+ fprintf(fp, " gbeStruct4k.ledCtl1.led1Blink = 0x%01x;\n", gbeStruct4k.ledCtl1.led1Blink);
+ fprintf(fp, " gbeStruct4k.ledCtl1.reserved2 = 0x%01x;\n", gbeStruct4k.ledCtl1.reserved2);
+ fprintf(fp, " gbeStruct4k.ledCtl1.lpluEnable = 0x%01x;\n", gbeStruct4k.ledCtl1.lpluEnable);
+ fprintf(fp, " gbeStruct4k.ledCtl1.lpluEnableNonD0a = 0x%01x;\n", gbeStruct4k.ledCtl1.lpluEnableNonD0a);
+ fprintf(fp, " gbeStruct4k.ledCtl1.gbeDisableNonD0a = 0x%01x;\n", gbeStruct4k.ledCtl1.gbeDisableNonD0a);
+ fprintf(fp, " gbeStruct4k.ledCtl1.reserved3 = 0x%01x;\n", gbeStruct4k.ledCtl1.reserved3);
+ fprintf(fp, " gbeStruct4k.ledCtl1.gbeDisable = 0x%01x;\n", gbeStruct4k.ledCtl1.gbeDisable);
+ fprintf(fp, " gbeStruct4k.ledCtl1.reserved4 = 0x%01x;\n", gbeStruct4k.ledCtl1.reserved4);
+ fprintf(fp, "\n");
+ /* Word 18h (LED 0 and 2 Configuration Defaults) */
+ fprintf(fp, " /* Word 18h (LED 0 and 2 Configuration Defaults) */\n");
+ fprintf(fp, " gbeStruct4k.ledCtl02.led0Mode = 0x%01x;\n", gbeStruct4k.ledCtl02.led0Mode);
+ fprintf(fp, " gbeStruct4k.ledCtl02.reserved1 = 0x%01x;\n", gbeStruct4k.ledCtl02.reserved1);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led0BlinkMode = 0x%01x;\n", gbeStruct4k.ledCtl02.led0BlinkMode);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led0Invert = 0x%01x;\n", gbeStruct4k.ledCtl02.led0Invert);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led0Blink = 0x%01x;\n", gbeStruct4k.ledCtl02.led0Blink);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led2Mode = 0x%01x;\n", gbeStruct4k.ledCtl02.led2Mode);
+ fprintf(fp, " gbeStruct4k.ledCtl02.reserved2 = 0x%01x;\n", gbeStruct4k.ledCtl02.reserved2);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led2BlinkMode = 0x%01x;\n", gbeStruct4k.ledCtl02.led2BlinkMode);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led2Invert = 0x%01x;\n", gbeStruct4k.ledCtl02.led2Invert);
+ fprintf(fp, " gbeStruct4k.ledCtl02.led2Blink = 0x%01x;\n", gbeStruct4k.ledCtl02.led2Blink);
+ fprintf(fp, "\n");
+ /* Word 19h (Reserved) */
+ fprintf(fp, " /* Word 19h (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord19h = 0x%04x;\n", gbeStruct4k.reservedWord19h);
+ fprintf(fp, "\n");
+ /* Word 1Ah (Reserved) */
+ fprintf(fp, " /* Word 1Ah (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord1Ah = 0x%04x;\n", gbeStruct4k.reservedWord1Ah);
+ fprintf(fp, "\n");
+ /* Word 1Bh (Reserved) */
+ fprintf(fp, " /* Word 1Bh (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord1Bh = 0x%04x;\n", gbeStruct4k.reservedWord1Bh);
+ fprintf(fp, "\n");
+ /* Word 1Ch (Reserved) */
+ fprintf(fp, " /* Word 1Ch (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord1Ch = 0x%04x;\n", gbeStruct4k.reservedWord1Ch);
+ fprintf(fp, "\n");
+ /* Word 1Dh (Reserved) */
+ fprintf(fp, " /* Word 1Dh (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord1Dh = 0x%04x;\n", gbeStruct4k.reservedWord1Dh);
+ fprintf(fp, "\n");
+ /* Word 1Eh (Device ID for Intel 82567LM gigabit ethernet controller) */
+ fprintf(fp, " /* Word 1Eh (Device ID for Intel 82567LM gigabit ethernet controller) */\n");
+ fprintf(fp, " gbeStruct4k._82567lmDeviceId = 0x%04x;\n", gbeStruct4k._82567lmDeviceId);
+ fprintf(fp, "\n");
+ /* Word 1Fh (Device ID for Intel 82567LF gigabit ethernet controller) */
+ fprintf(fp, " /* Word 1Fh (Device ID for Intel 82567LF gigabit ethernet controller) */\n");
+ fprintf(fp, " gbeStruct4k._82567lfDeviceId = 0x%04x;\n", gbeStruct4k._82567lfDeviceId);
+ fprintf(fp, "\n");
+ /* Word 20h (Reserved) */
+ fprintf(fp, " /* Word 20h (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord20h = 0x%04x;\n", gbeStruct4k.reservedWord20h);
+ fprintf(fp, "\n");
+ /* Word 21h (Device ID for Intel 82567V gigabit ethernet controller) */
+ fprintf(fp, " /* Word 21h (Device ID for Intel 82567V gigabit ethernet controller) */\n");
+ fprintf(fp, " gbeStruct4k._82567vDeviceId = 0x%04x;\n", gbeStruct4k._82567vDeviceId);
+ fprintf(fp, "\n");
+ /* Word 22h (Reserved) */
+ fprintf(fp, " /* Word 22h (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord22h = 0x%04x;\n", gbeStruct4k.reservedWord22h);
+ fprintf(fp, "\n");
+ /* Word 23h (Reserved) */
+ fprintf(fp, " /* Word 23h (Reserved) */\n");
+ fprintf(fp, " gbeStruct4k.reservedWord23h = 0x%04x;\n", gbeStruct4k.reservedWord23h);
+ fprintf(fp, "\n");
+ /* Words 24h to 2Fh (Reserved) */
+ fprintf(fp, " /* Words 24h to 2Fh (Reserved) */\n");
+ for (i = 0; i < 12; i++) {
+ fprintf(fp, " gbeStruct4k.reservedWords24to2Fh[%d] = 0x%04x;\n", i, gbeStruct4k.reservedWords24to2Fh[i]);
+ }
+ fprintf(fp, "\n");
+ /* Words 30h to 3Eh (PXE Software Region) */
+ fprintf(fp, " /* Words 30h to 3Eh (PXE Software Region) */\n");
+ fprintf(fp, " /* Boot Agent Main Setup Options (Word 30h) */\n");
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.protocolSelect = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.protocolSelect);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved1 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved1);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.defaultBootSelection = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.defaultBootSelection);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved2 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved2);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.promptTime = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.promptTime);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.displaySetupMessage = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.displaySetupMessage);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved3 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved3);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.forceSpeed = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.forceSpeed);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.forceFullDuplex = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.forceFullDuplex);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved4 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved4);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.efiPresence = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.efiPresence);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.pxePresence = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.pxePresence);
+ fprintf(fp, " /* Boot Agent Configuration Customization Options (Word 31h) */\n");
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableSetupMenu = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableSetupMenu);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableTitleMessage = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableTitleMessage);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableProtocolSelect = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableProtocolSelect);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableBootSelection = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableBootSelection);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableLegacyWakeupSupport = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableLegacyWakeupSupport);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableFlashUpdate = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableFlashUpdate);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.reserved1 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.reserved1);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.ibaBootOrderSetupMode = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.ibaBootOrderSetupMode);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.reserved2 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.reserved2);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.signature = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.signature);
+ fprintf(fp, " /* Boot Agent Configuration Customization Options (Word 32h) */\n");
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.buildNumber = 0x%02x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.buildNumber);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.minorVersionNumber = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.minorVersionNumber);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.majorVersionNumber = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.majorVersionNumber);
+ fprintf(fp, " /* IBA Capabilities (Word 33h) */\n");
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.baseCodePresent = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.baseCodePresent);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.undiCapabilityPresent = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.undiCapabilityPresent);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved1 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved1);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.efiUndiCapabilityPresent = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.efiUndiCapabilityPresent);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved2_0 = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved2_0);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved2_1 = 0x%02x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved2_1);
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.signature = 0x%01x;\n", gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.signature);
+ fprintf(fp, " /* Padding (Words 34h to 3Eh) */\n");
+ for (i = 0; i < 11; i++) {
+ fprintf(fp, " gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[%d] = 0x%04x;\n", i, gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[i]);
+ }
+ fprintf(fp, "\n");
+ /* Word 3Fh (Checksum) */
+ fprintf(fp, " /* Word 3Fh (Checksum) */\n");
+ fprintf(fp, " gbeStruct4k.checkSum = 0x%04x;\n", gbeStruct4k.checkSum);
+ fprintf(fp, "\n");
+ /* The rest of Gbe is just padding */
+ paddingSize = sizeof(gbeStruct4k.padding);
+ paddingIdentical = 1; /* Assume that it's all 0xFF, then try to disprove it */
+ for (i = 0; i < paddingSize; i++) { /* check whether contents differ */
+ if (gbeStruct4k.padding[i] != 0xFF) {
+ paddingIdentical = 0;
+ break;
+ }
+ }
+ if (!paddingIdentical) {
+ fprintf(fp, " /* The rest of Gbe (word 40h or byte 80h onwards) is just padding */\n");
+ for (i = 0; i < paddingSize; i++) { /* contents are not all 0xFF, just spit them all out one by one */
+ fprintf(fp, " gbeStruct4k.padding[%d] = 0x%02x;\n", i, gbeStruct4k.padding[i]);
+ }
+ } else { /* contents are all 0xFF. Generate a small for loop that sets them all to 0xFF */
+ fprintf(fp, " /* The rest of Gbe (word 40h or byte 80h onwards) is just padding (0xFF) */\n");
+ fprintf(fp, " for (i = 0; i < %d; i++) {\n", paddingSize);
+ fprintf(fp, " gbeStruct4k.padding[i] = 0xFF;\n");
+ fprintf(fp, " }\n");
+ }
+ 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");
+ fprintf(fp, " gbeStruct8k.main = generatedGbeStruct4k();\n");
+ 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;
+}
+
+/*
+ * ---------------------------------------------------------------------
* Debugging functions:
* ---------------------------------------------------------------------
*/
diff --git a/resources/utilities/ich9deblob/src/gbe/gbe.h b/resources/utilities/ich9deblob/src/gbe/gbe.h
index 5422374..7ba59e2 100644
--- a/resources/utilities/ich9deblob/src/gbe/gbe.h
+++ b/resources/utilities/ich9deblob/src/gbe/gbe.h
@@ -164,8 +164,8 @@ struct LED_CTL_1 {
unsigned char led1Invert : 1; /* initial value of LED1_IVRT field. 0 = led1 has active low output, 1 is high active output. Default is 0 according to datasheet and deblobbed_descriptor.bin */
unsigned char led1Blink : 1; /* 1 = led1 blinks, 0 = it does not. default 0 according to datasheet, but it's 1 in deblobbed_descriptor.bin */
unsigned char reserved2 : 1; /* Reserved. should be 1 according to datasheet and deblobbed_descriptor.bin */
- unsigned char lpluEnable : 1; /* Low Power Link Up. Enable links at lowest supported speed by both link partners in all power states. 1=enabled(all power states), 0=disabled. Default is 0 according to datasheet and 1 according to deblobbed_descriptor.bin */
- unsigned char lpluEnableNonD0a : 1; /* Low Power Link up (non-D0a states). Same as above but only for non-D0a states. default is 1 according to datasheet but 0 in deblobbed_descriptor.bin */
+ unsigned char lpluEnable : 1; /* Low Power Link Up. Enable links at lowest supported speed by both link partners in all power states. 1=enabled(all power states), 0=disabled. Default is 0 according to datasheet and deblobbed_descriptor.bin */
+ unsigned char lpluEnableNonD0a : 1; /* Low Power Link up (non-D0a states). Same as above but only for non-D0a states. default is 1 according to and deblobbed_descriptor.bin */
unsigned char gbeDisableNonD0a : 1; /* If set to 1, disable gigabit speeds in non-D0a power states. Must be 1 (according to datasheet) because GbE is not supported in Sx mode. It's also set to 1 in deblobbed_descriptor.bin */
unsigned char reserved3 : 2; /* Reserved. Datasheet says both bits should be 0 (confirmed in deblobbed_descriptor.bin) */
unsigned char gbeDisable : 1; /* When 1, gigabit speeds are disabled in all power states including D0a. Default is 0 according to datasheet and deblobbed_descriptor.bin */
@@ -250,7 +250,7 @@ struct GBE_PXE_BOOT_AGENT_CONFIGURATION_CUSTOMIZATION_OPTIONS_32H {
/* least significant bits */
unsigned char buildNumber : 8; /* PXE boot agent build number. default is 28 (hex). deblobbed_descriptor.bin says 18 (hex) */
unsigned char minorVersionNumber : 4; /* PXE boot agent minor number. default is 2 (hex). deblobbed_descriptor.bin says 3 (hex) */
- unsigned char majorVersionNumber : 4; /* PXE boot agent makor number. default is F (hex). deblobbed_descriptor.bin says 1 (hex) */
+ unsigned char 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)
@@ -293,9 +293,9 @@ struct GBE_PXE_SOFTWARE_REGION {
struct GBEREGIONRECORD_4K {
unsigned char macAddress[6]; /* Word 00 to 02 */
struct GBE_RESERVED_WORD_03H reservedWord03h; /* Reserved word 03. */
- unsigned short reservedWord04h; /* Reserved word 04: set it to 0xFFFF (according to datasheet) */
+ unsigned short reservedWord04h; /* Reserved word 04: set it to 0xFFFF (according to datasheet and deblobbed_descriptor.bin) */
unsigned short imageVersionInformation; /* Reserved word 05: 83 10 (little endian) in my deblobbed_descriptor.bin. Set this to 0x1083 (in C, assuming little endian byte order). "cannot be changed" according to datasheet */
- unsigned short reservedWords06h07h[2]; /* Reserved words 06-07: set both to 0xFFFF (according to datasheet) */
+ unsigned short reservedWords06h07h[2]; /* Reserved words 06-07: set both to 0xFFFF (according to datasheet and deblobbed_descriptor.bin) */
/*
* Word 08 and 09 (pba low and pba high):
@@ -312,8 +312,8 @@ struct GBEREGIONRECORD_4K {
*
* Setting it to FF FF FF FF should be fine, according to the datasheet.
*/
- unsigned short pbaLow; /* Word 08. Set it to 0x1008. */
- unsigned short pbaHigh; /* Word 09. Set it to 0xFFFF. */
+ unsigned short pbaLow; /* Word 08. Set it to 0x1008 (according to deblobbed_descriptor.bin). */
+ unsigned short pbaHigh; /* Word 09. Set it to 0xFFFF (according to deblobbed_descriptor.bin). */
/* Word 0A */
struct GBE_PCI_INITIALIZATION_CONTROL_WORD pciInitializationControlWord;
@@ -426,6 +426,8 @@ unsigned short gbeGetRegionWordFrom8kBuffer(int index, char* regionData);
unsigned short gbeGetChecksumFrom8kBuffer(char* regionData, unsigned short desiredValue, int byteOffset);
unsigned short gbeGetChecksumFrom4kStruct(struct GBEREGIONRECORD_4K gbeStruct4k, unsigned short desiredValue);
struct GBEREGIONRECORD_8K deblobbedGbeStructFromFactory(struct GBEREGIONRECORD_8K factoryGbeStruct8k);
+int notCreatedHFileForGbeCFile(char* outFileName, char* cFileName);
+int notCreatedCFileFromGbeStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* outFileName, char* headerFileName);
void printGbeChecksumDataFromStruct4k(struct GBEREGIONRECORD_4K gbeStruct4k, char* romName, char* regionName);
void printGbeChecksumDataFromStruct8k(struct GBEREGIONRECORD_8K gbeStruct8k, char* romName);
diff --git a/resources/utilities/ich9deblob/src/ich9deblob.c b/resources/utilities/ich9deblob/src/ich9deblob.c
index 313416c..b7bbf88 100644
--- a/resources/utilities/ich9deblob/src/ich9deblob.c
+++ b/resources/utilities/ich9deblob/src/ich9deblob.c
@@ -36,7 +36,7 @@
/*
* See docs/hcl/x200_remove_me.html for info plus links to datasheet (also linked below)
*
- * Info about flash descriptor (read page 850 onwards):
+ * 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):
@@ -221,6 +221,33 @@ int main(int argc, char *argv[])
if (notCreatedDescriptorGbeFile(deblobbedDescriptorStruct, deblobbedGbeStruct8k, deblobbedDescriptorFilename)) {
return 1;
}
+
+ /*
+ * ------------------------------------------------------------------
+ * 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")) {
+ 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("To use these in ich9gen, place them in src/ich9gen/ and re-build ich9gen.\n\n");
return 0;
}
diff --git a/resources/utilities/ich9deblob/src/ich9gen.c b/resources/utilities/ich9deblob/src/ich9gen.c
new file mode 100644
index 0000000..583957e
--- /dev/null
+++ b/resources/utilities/ich9deblob/src/ich9gen.c
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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[])
+{
+ struct GBEREGIONRECORD_8K gbeStruct8k = generatedGbeStruct8k();
+ struct DESCRIPTORREGIONRECORD descriptorStruct4M = generatedDescriptorStructRom4M();
+ struct DESCRIPTORREGIONRECORD descriptorStruct8M = generatedDescriptorStructRom8M();
+
+ /* Only for the compatibility checks */
+ struct DESCRIPTORREGIONRECORD dummyDescriptorStruct;
+ struct GBEREGIONRECORD_8K dummyGbeStruct8k;
+
+ /*
+ * ------------------------------------------------------------------
+ * Compatibility checks. This version of ich9deblob is not yet portable.
+ * ------------------------------------------------------------------
+ */
+
+ if (systemOrCompilerIncompatible(dummyDescriptorStruct, dummyGbeStruct8k)) return 1;
+ /* If true, fail with error message */
+
+ /*
+ * ------------------------------------------------------------------
+ * Down to business
+ * ------------------------------------------------------------------
+ */
+
+ if (notCreatedDescriptorGbeFile(descriptorStruct4M, gbeStruct8k, "ich9fdgbe_4m.bin")) {
+ return 1;
+ }
+
+ if (notCreatedDescriptorGbeFile(descriptorStruct8M, gbeStruct8k, "ich9fdgbe_8m.bin")) {
+ return 1;
+ }
+
+ return 0;
+}
diff --git a/resources/utilities/ich9deblob/src/ich9gen.h b/resources/utilities/ich9deblob/src/ich9gen.h
new file mode 100644
index 0000000..287a66e
--- /dev/null
+++ b/resources/utilities/ich9deblob/src/ich9gen.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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
+
+#include <stdio.h>
+#include <string.h>
+
+#include "ich9gen/mkdescriptor.h"
+#include "ich9gen/mkgbe.h"
+#include "common/descriptor_gbe.h" /* common descriptor/gbe functions used by ich9deblob */
+#include "common/x86compatibility.h" /* system/compiler compatibility checks. This code is not portable. */
+#include "descriptor/descriptor.h" /* structs describing what's in the descriptor region */
+#include "gbe/gbe.h" /* structs describing what's in the gbe region */
+
+int main(int argc, char *argv[]);
+
+#endif
diff --git a/resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.c b/resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.c
new file mode 100644
index 0000000..b9ad4f2
--- /dev/null
+++ b/resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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 "mkdescriptor.h"
+
+/* Generate a 4KiB Descriptor struct, with default values. */
+/* Read ../descriptor/descriptor.h for an explanation of the default values used here */
+
+struct DESCRIPTORREGIONRECORD generatedDescriptorStruct(unsigned int romSize)
+{
+ int i;
+ struct DESCRIPTORREGIONRECORD descriptorStruct;
+
+ /* Flash Valid Signature Register */
+ descriptorStruct.flValSig.signature = 0x0ff0a55a;
+
+ /* Flash Map Registers */
+ /* FLMAP0 */
+ descriptorStruct.flMaps.flMap0.FCBA = 0x01;
+ descriptorStruct.flMaps.flMap0.NC = 0x0;
+ descriptorStruct.flMaps.flMap0.reserved1 = 0x00;
+ descriptorStruct.flMaps.flMap0.FRBA = 0x04;
+ descriptorStruct.flMaps.flMap0.NR = 0x2;
+ descriptorStruct.flMaps.flMap0.reserved2 = 0x00;
+ /* FLMAP1 */
+ descriptorStruct.flMaps.flMap1.FMBA = 0x06;
+ descriptorStruct.flMaps.flMap1.NM = 0x2;
+ descriptorStruct.flMaps.flMap1.reserved = 0x00;
+ descriptorStruct.flMaps.flMap1.FISBA = 0x10;
+ descriptorStruct.flMaps.flMap1.ISL = 0x02;
+ /* FLMAP2 */
+ descriptorStruct.flMaps.flMap2.FMSBA = 0x20;
+ descriptorStruct.flMaps.flMap2.MSL = 0x01;
+ descriptorStruct.flMaps.flMap2.reserved = 0x0000;
+
+ /* Component Section Record */
+ /* FLCOMP */
+ descriptorStruct.componentSection.flcomp.component1Density = 0x4;
+ descriptorStruct.componentSection.flcomp.component2Density = 0x2;
+ descriptorStruct.componentSection.flcomp.reserved1 = 0x0;
+ descriptorStruct.componentSection.flcomp.reserved2 = 0x00;
+ descriptorStruct.componentSection.flcomp.reserved3 = 0x0;
+ descriptorStruct.componentSection.flcomp.readClockFrequency = 0x0;
+ descriptorStruct.componentSection.flcomp.fastReadSupport = 0x1;
+ descriptorStruct.componentSection.flcomp.fastreadClockFrequency = 0x1;
+ descriptorStruct.componentSection.flcomp.writeEraseClockFrequency = 0x0;
+ descriptorStruct.componentSection.flcomp.readStatusClockFrequency = 0x0;
+ descriptorStruct.componentSection.flcomp.reserved4 = 0x0;
+ /* FLILL */
+ descriptorStruct.componentSection.flill = 0x00000000;
+ /* FLPB */
+ descriptorStruct.componentSection.flpb = 0x00000000;
+ /* Padding */
+ for (i = 0; i < 36; i++) {
+ descriptorStruct.componentSection.padding[i] = 0xFF;
+ }
+
+ /* Flash Descriptor Region Section */
+ /* FLREG0 (Descriptor) */
+ descriptorStruct.regionSection.flReg0.BASE = 0x0000;
+ descriptorStruct.regionSection.flReg0.reserved1 = 0x0;
+ descriptorStruct.regionSection.flReg0.LIMIT = 0x0000;
+ descriptorStruct.regionSection.flReg0.reserved2 = 0x0;
+ /* FLREG1 (BIOS) */
+ descriptorStruct.regionSection.flReg1.BASE = 0x0003;
+ descriptorStruct.regionSection.flReg1.reserved1 = 0x0;
+ descriptorStruct.regionSection.flReg1.LIMIT = ((romSize >> FLREGIONBITSHIFT) - 1);
+ descriptorStruct.regionSection.flReg1.reserved2 = 0x0;
+ /* FLREG2 (ME) */
+ descriptorStruct.regionSection.flReg2.BASE = 0x1fff; /* 0x1FFF to disable */
+ descriptorStruct.regionSection.flReg2.reserved1 = 0x0;
+ descriptorStruct.regionSection.flReg2.LIMIT = 0x0000; /* 0x0000 to disable */
+ descriptorStruct.regionSection.flReg2.reserved2 = 0x0;
+ /* FLREG3 (Gbe) */
+ descriptorStruct.regionSection.flReg3.BASE = 0x0001;
+ descriptorStruct.regionSection.flReg3.reserved1 = 0x0;
+ descriptorStruct.regionSection.flReg3.LIMIT = 0x0002;
+ descriptorStruct.regionSection.flReg3.reserved2 = 0x0;
+ /* FLREG4 (Platform) */
+ descriptorStruct.regionSection.flReg4.BASE = 0x1fff; /* 0x1FFF to disable */
+ descriptorStruct.regionSection.flReg4.reserved1 = 0x0;
+ descriptorStruct.regionSection.flReg4.LIMIT = 0x0000; /* 0x0000 to disable */
+ descriptorStruct.regionSection.flReg4.reserved2 = 0x0;
+ /* Padding */
+ for (i = 0; i < 12; i++) {
+ descriptorStruct.regionSection.padding[i] = 0xFF;
+ }
+
+ /* Master Access Section */
+ /* FLMSTR1 (Host CPU / BIOS) */
+ descriptorStruct.masterAccessSection.flMstr1.requesterId = 0x0000;
+ descriptorStruct.masterAccessSection.flMstr1.fdRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.biosRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.meRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr1.gbeRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.pdRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.reserved1 = 0x0;
+ descriptorStruct.masterAccessSection.flMstr1.fdRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.biosRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.meRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr1.gbeRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.pdRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr1.reserved2 = 0x0;
+ /* FLMSTR2 (ME) */
+ descriptorStruct.masterAccessSection.flMstr2.requesterId = 0x0000;
+ descriptorStruct.masterAccessSection.flMstr2.fdRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr2.biosRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr2.meRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr2.gbeRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr2.pdRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr2.reserved1 = 0x0;
+ descriptorStruct.masterAccessSection.flMstr2.fdRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr2.biosRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr2.meRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr2.gbeRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr2.pdRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr2.reserved2 = 0x0;
+ /* FLMSTR3 (Gbe) */
+ descriptorStruct.masterAccessSection.flMstr3.requesterId = 0x0218;
+ descriptorStruct.masterAccessSection.flMstr3.fdRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.biosRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.meRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.gbeRegionReadAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr3.pdRegionReadAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.reserved1 = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.fdRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.biosRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.meRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.gbeRegionWriteAccess = 0x1;
+ descriptorStruct.masterAccessSection.flMstr3.pdRegionWriteAccess = 0x0;
+ descriptorStruct.masterAccessSection.flMstr3.reserved2 = 0x0;
+ /* Padding */
+ for (i = 0; i < 148; i++) {
+ descriptorStruct.masterAccessSection.padding[i] = 0xFF;
+ }
+
+ /* ICH straps */
+ /* ICHSTRAP0 */
+ descriptorStruct.ichStraps.ichStrap0.meDisable = 0x1;
+ descriptorStruct.ichStraps.ichStrap0.reserved1 = 0x04;
+ descriptorStruct.ichStraps.ichStrap0.tcoMode = 0x1;
+ descriptorStruct.ichStraps.ichStrap0.smBusAddress = 0x64;
+ descriptorStruct.ichStraps.ichStrap0.bmcMode = 0x0;
+ descriptorStruct.ichStraps.ichStrap0.tripPointSelect = 0x0;
+ descriptorStruct.ichStraps.ichStrap0.reserved2 = 0x0;
+ descriptorStruct.ichStraps.ichStrap0.integratedGbe = 0x1;
+ descriptorStruct.ichStraps.ichStrap0.lanPhy = 0x1;
+ descriptorStruct.ichStraps.ichStrap0.reserved3 = 0x0;
+ descriptorStruct.ichStraps.ichStrap0.dmiRequesterId = 0x0;
+ descriptorStruct.ichStraps.ichStrap0.smBus2Address = 0x00;
+ /* ICHSTRAP1 */
+ descriptorStruct.ichStraps.ichStrap1.northMlink = 0x1;
+ descriptorStruct.ichStraps.ichStrap1.southMlink = 0x1;
+ descriptorStruct.ichStraps.ichStrap1.meSmbus = 0x1;
+ descriptorStruct.ichStraps.ichStrap1.sstDynamic = 0x1;
+ descriptorStruct.ichStraps.ichStrap1.reserved1 = 0x0;
+ descriptorStruct.ichStraps.ichStrap1.northMlink2 = 0x1;
+ descriptorStruct.ichStraps.ichStrap1.reserved2 = 0x00;
+ descriptorStruct.ichStraps.ichStrap1.reserved3 = 0x0000;
+ /* Padding */
+ for (i = 0; i < 248; i++) {
+ descriptorStruct.ichStraps.padding[i] = 0xFF;
+ }
+
+ /* MCH straps */
+ /* MCHSTRAP0 */
+ descriptorStruct.mchStraps.mchStrap0.meDisable = 0x1;
+ descriptorStruct.mchStraps.mchStrap0.meBootFromFlash = 0x0;
+ descriptorStruct.mchStraps.mchStrap0.tpmDisable = 0x1;
+ descriptorStruct.mchStraps.mchStrap0.reserved1 = 0x7;
+ descriptorStruct.mchStraps.mchStrap0.spiFingerprint = 0x1;
+ descriptorStruct.mchStraps.mchStrap0.meAlternateDisable = 0x0;
+ descriptorStruct.mchStraps.mchStrap0.reserved2 = 0xff;
+ descriptorStruct.mchStraps.mchStrap0.reserved3 = 0xffff;
+ /* Padding */
+ for (i = 0; i < 3292; i++) {
+ descriptorStruct.mchStraps.padding[i] = 0xFF;
+ }
+
+ /* ME VSCC Table */
+ descriptorStruct.meVsccTable.jid0 = 0x001720c2;
+ descriptorStruct.meVsccTable.vscc0 = 0x20052005;
+ descriptorStruct.meVsccTable.jid1 = 0x001730ef;
+ descriptorStruct.meVsccTable.vscc1 = 0x20052005;
+ descriptorStruct.meVsccTable.jid2 = 0x0000481f;
+ descriptorStruct.meVsccTable.vscc2 = 0x20152015;
+ /* Padding */
+ for (i = 0; i < 4; i++) {
+ descriptorStruct.meVsccTable.padding[i] = 0xFF;
+ }
+
+ /* Descriptor Map 2 Record */
+ descriptorStruct.descriptor2Map.meVsccTableBaseAddress = 0xee;
+ descriptorStruct.descriptor2Map.meVsccTableLength = 0x06;
+ descriptorStruct.descriptor2Map.reserved = 0x0000;
+
+ /* OEM section */
+ /* Magic String (ascii characters) */
+ descriptorStruct.oemSection.magicString[0] = 0x37;
+ descriptorStruct.oemSection.magicString[1] = 0x55;
+ descriptorStruct.oemSection.magicString[2] = 0x52;
+ descriptorStruct.oemSection.magicString[3] = 0x35;
+ descriptorStruct.oemSection.magicString[4] = 0x31;
+ descriptorStruct.oemSection.magicString[5] = 0x32;
+ descriptorStruct.oemSection.magicString[6] = 0x57;
+ descriptorStruct.oemSection.magicString[7] = 0x57;
+ /* Padding */
+ for (i = 0; i < 248; i++) {
+ descriptorStruct.oemSection.padding[i] = 0xFF;
+ }
+
+ return descriptorStruct;
+}
+
+struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom4M()
+{
+ return generatedDescriptorStruct(ROMSIZE_4MB);
+}
+
+struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom8M()
+{
+ return generatedDescriptorStruct(ROMSIZE_8MB);
+}
+
diff --git a/resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.h b/resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.h
new file mode 100644
index 0000000..c4bbe69
--- /dev/null
+++ b/resources/utilities/ich9deblob/src/ich9gen/mkdescriptor.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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 ICH9GEN_MKDESCRIPTOR_H
+#define ICH9GEN_MKDESCRIPTOR_H
+
+#include <stdio.h>
+#include <string.h>
+#include "../descriptor/descriptor.h"
+
+/* ROM image sizes in bytes */
+#define ROMSIZE_4MB 0x400000
+#define ROMSIZE_8MB 0x800000
+
+struct DESCRIPTORREGIONRECORD generatedDescriptorStruct(unsigned int romSize);
+struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom4M();
+struct DESCRIPTORREGIONRECORD generatedDescriptorStructRom8M();
+#endif
diff --git a/resources/utilities/ich9deblob/src/ich9gen/mkgbe.c b/resources/utilities/ich9deblob/src/ich9gen/mkgbe.c
new file mode 100644
index 0000000..2765048
--- /dev/null
+++ b/resources/utilities/ich9deblob/src/ich9gen/mkgbe.c
@@ -0,0 +1,256 @@
+/*
+ * Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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 "mkgbe.h"
+
+/* Generate a 4KiB Gbe struct, with default values. */
+/* Read ../gbe/gbe.h for an explanation of the default values used here */
+
+struct GBEREGIONRECORD_4K generatedGbeStruct4k()
+{
+ int i;
+ struct GBEREGIONRECORD_4K gbeStruct4k;
+
+ /* MAC address (words 00h to 02h) */
+ gbeStruct4k.macAddress[0] = 0x00;
+ gbeStruct4k.macAddress[1] = 0x1f;
+ gbeStruct4k.macAddress[2] = 0x16;
+ gbeStruct4k.macAddress[3] = 0x32;
+ gbeStruct4k.macAddress[4] = 0x50;
+ gbeStruct4k.macAddress[5] = 0xe5;
+
+ /* Word 03h (Reserved) */
+ gbeStruct4k.reservedWord03h.reserved1_0 = 0x00;
+ gbeStruct4k.reservedWord03h.reserved1_1 = 0x0;
+ gbeStruct4k.reservedWord03h.ibaLom = 0x1;
+ gbeStruct4k.reservedWord03h.reserved2 = 0x0;
+
+ /* Word 04h (Reserved) */
+ gbeStruct4k.reservedWord04h = 0xffff;
+
+ /* Word 05h (Image Version Information) */
+ gbeStruct4k.imageVersionInformation = 0x1083;
+
+ /* Words 06h and 07h (Reserved) */
+ gbeStruct4k.reservedWords06h07h[0] = 0xffff;
+ gbeStruct4k.reservedWords06h07h[1] = 0xffff;
+
+ /* Word 08h and 09h (PBA Low and PBA High) */
+ gbeStruct4k.pbaLow = 0x1008;
+ gbeStruct4k.pbaHigh = 0xffff;
+
+ /* Word 0Ah (PCI Initialization Control Word) */
+ gbeStruct4k.pciInitializationControlWord.loadVendorDeviceId = 0x1;
+ gbeStruct4k.pciInitializationControlWord.loadSubsystemId = 0x1;
+ gbeStruct4k.pciInitializationControlWord.reserved1 = 0x0;
+ gbeStruct4k.pciInitializationControlWord.reserved2 = 0x0;
+ gbeStruct4k.pciInitializationControlWord.pmEnable = 0x1;
+ gbeStruct4k.pciInitializationControlWord.auxPwr = 0x1;
+ gbeStruct4k.pciInitializationControlWord.reserved3 = 0x0;
+ gbeStruct4k.pciInitializationControlWord.reserved4 = 0x1;
+
+ /* Word 0Bh (Subsystem ID) */
+ gbeStruct4k.subsystemId = 0x20ee;
+
+ /* Word 0Ch (Subsystem Vendor ID) */
+ gbeStruct4k.subsystemVendorId = 0x17aa;
+
+ /* Word 0Dh (Device ID) */
+ gbeStruct4k.deviceId = 0x10f5;
+
+ /* Word 0Eh (Vendor ID) */
+ gbeStruct4k.vendorId = 0x8086;
+
+ /* Word 0Fh (Device Revision ID) */
+ gbeStruct4k.deviceRevId = 0x0000;
+
+ /* Word 10h (LAN Power Consumption) */
+ gbeStruct4k.lanPowerConsumption.lanD3Power = 0x01;
+ gbeStruct4k.lanPowerConsumption.reserved = 0x0;
+ gbeStruct4k.lanPowerConsumption.lanD0Power = 0x0d;
+
+ /* Words 11h and 12h (Reserved) */
+ gbeStruct4k.reservedWords11h12h[0] = 0x0000;
+ gbeStruct4k.reservedWords11h12h[1] = 0x0000;
+
+ /* Word 13h (Shared Initialization Control Word) */
+ gbeStruct4k.sharedInitializationControlWord.reserved1 = 0x5;
+ gbeStruct4k.sharedInitializationControlWord.forceDuplex = 0x0;
+ gbeStruct4k.sharedInitializationControlWord.forceSpeedEnable = 0x0;
+ gbeStruct4k.sharedInitializationControlWord.reserved2_0 = 0x0;
+ gbeStruct4k.sharedInitializationControlWord.reserved2_1 = 0x0;
+ gbeStruct4k.sharedInitializationControlWord.phyPowerDownEnable = 0x1;
+ gbeStruct4k.sharedInitializationControlWord.reserved3 = 0x1;
+ gbeStruct4k.sharedInitializationControlWord.reserved4 = 0x0;
+ gbeStruct4k.sharedInitializationControlWord.sign = 0x2;
+
+ /* Word 14h (Extended Configuration Control Word 1) */
+ gbeStruct4k.extendedConfigurationControlWord1.extendedConfigurationPointer = 0x020;
+ gbeStruct4k.extendedConfigurationControlWord1.oemWriteEnable = 0x1;
+ gbeStruct4k.extendedConfigurationControlWord1.reserved1 = 0x1;
+ gbeStruct4k.extendedConfigurationControlWord1.reserved2 = 0x0;
+ gbeStruct4k.extendedConfigurationControlWord1.reserved3 = 0x0;
+
+ /* Word 15h (Extended Configuration Control Word 2) */
+ gbeStruct4k.extendedConfigurationControlWord2.reserved = 0x00;
+ gbeStruct4k.extendedConfigurationControlWord2.extendedPhyLength = 0x0a;
+
+ /* Word 16h (Extended Configuration Control Word 3) */
+ gbeStruct4k.extendedConfigurationControlWord3 = 0x0000;
+
+ /* Word 17h (LED 1 Configuration and Power Management) */
+ gbeStruct4k.ledCtl1.led1Mode = 0xb;
+ gbeStruct4k.ledCtl1.reserved1 = 0x0;
+ gbeStruct4k.ledCtl1.led1BlinkMode = 0x0;
+ gbeStruct4k.ledCtl1.led1Invert = 0x0;
+ gbeStruct4k.ledCtl1.led1Blink = 0x1;
+ gbeStruct4k.ledCtl1.reserved2 = 0x1;
+ gbeStruct4k.ledCtl1.lpluEnable = 0x0;
+ gbeStruct4k.ledCtl1.lpluEnableNonD0a = 0x1;
+ gbeStruct4k.ledCtl1.gbeDisableNonD0a = 0x1;
+ gbeStruct4k.ledCtl1.reserved3 = 0x0;
+ gbeStruct4k.ledCtl1.gbeDisable = 0x0;
+ gbeStruct4k.ledCtl1.reserved4 = 0x1;
+
+ /* Word 18h (LED 0 and 2 Configuration Defaults) */
+ gbeStruct4k.ledCtl02.led0Mode = 0x2;
+ gbeStruct4k.ledCtl02.reserved1 = 0x0;
+ gbeStruct4k.ledCtl02.led0BlinkMode = 0x0;
+ gbeStruct4k.ledCtl02.led0Invert = 0x0;
+ gbeStruct4k.ledCtl02.led0Blink = 0x0;
+ gbeStruct4k.ledCtl02.led2Mode = 0x6;
+ gbeStruct4k.ledCtl02.reserved2 = 0x0;
+ gbeStruct4k.ledCtl02.led2BlinkMode = 0x0;
+ gbeStruct4k.ledCtl02.led2Invert = 0x0;
+ gbeStruct4k.ledCtl02.led2Blink = 0x0;
+
+ /* Word 19h (Reserved) */
+ gbeStruct4k.reservedWord19h = 0x2b40;
+
+ /* Word 1Ah (Reserved) */
+ gbeStruct4k.reservedWord1Ah = 0x0043;
+
+ /* Word 1Bh (Reserved) */
+ gbeStruct4k.reservedWord1Bh = 0x0000;
+
+ /* Word 1Ch (Reserved) */
+ gbeStruct4k.reservedWord1Ch = 0x10f5;
+
+ /* Word 1Dh (Reserved) */
+ gbeStruct4k.reservedWord1Dh = 0xbaad;
+
+ /* Word 1Eh (Device ID for Intel 82567LM gigabit ethernet controller) */
+ gbeStruct4k._82567lmDeviceId = 0x10f5;
+
+ /* Word 1Fh (Device ID for Intel 82567LF gigabit ethernet controller) */
+ gbeStruct4k._82567lfDeviceId = 0x10bf;
+
+ /* Word 20h (Reserved) */
+ gbeStruct4k.reservedWord20h = 0xbaad;
+
+ /* Word 21h (Device ID for Intel 82567V gigabit ethernet controller) */
+ gbeStruct4k._82567vDeviceId = 0x10cb;
+
+ /* Word 22h (Reserved) */
+ gbeStruct4k.reservedWord22h = 0xbaad;
+
+ /* Word 23h (Reserved) */
+ gbeStruct4k.reservedWord23h = 0xbaad;
+
+ /* Words 24h to 2Fh (Reserved) */
+ gbeStruct4k.reservedWords24to2Fh[0] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[1] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[2] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[3] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[4] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[5] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[6] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[7] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[8] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[9] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[10] = 0x0000;
+ gbeStruct4k.reservedWords24to2Fh[11] = 0x0000;
+
+ /* Words 30h to 3Eh (PXE Software Region) */
+ /* Boot Agent Main Setup Options (Word 30h) */
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.protocolSelect = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved1 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.defaultBootSelection = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved2 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.promptTime = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.displaySetupMessage = 0x1;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved3 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.forceSpeed = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.forceFullDuplex = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.reserved4 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.efiPresence = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentMainSetupOptions.pxePresence = 0x0;
+ /* Boot Agent Configuration Customization Options (Word 31h) */
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableSetupMenu = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableTitleMessage = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableProtocolSelect = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableBootSelection = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableLegacyWakeupSupport = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.disableFlashUpdate = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.reserved1 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.ibaBootOrderSetupMode = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.reserved2 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions31h.signature = 0x1;
+ /* Boot Agent Configuration Customization Options (Word 32h) */
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.buildNumber = 0x18;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.minorVersionNumber = 0x3;
+ gbeStruct4k.pxeSoftwareRegion.bootAgentConfigurationCustomizationOptions32h.majorVersionNumber = 0x1;
+ /* IBA Capabilities (Word 33h) */
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.baseCodePresent = 0x1;
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.undiCapabilityPresent = 0x1;
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved1 = 0x1;
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.efiUndiCapabilityPresent = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved2_0 = 0x0;
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.reserved2_1 = 0x00;
+ gbeStruct4k.pxeSoftwareRegion.ibaCapabilities.signature = 0x1;
+ /* Padding (Words 34h to 3Eh) */
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[0] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[1] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[2] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[3] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[4] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[5] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[6] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[7] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[8] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[9] = 0xffff;
+ gbeStruct4k.pxeSoftwareRegion.paddingWords34hTo3Eh[10] = 0xffff;
+
+ /* Word 3Fh (Checksum) */
+ gbeStruct4k.checkSum = 0x3285;
+
+ /* The rest of Gbe (word 40h or byte 80h onwards) is just padding (0xFF) */
+ for (i = 0; i < 3968; i++) {
+ gbeStruct4k.padding[i] = 0xFF;
+ }
+
+ return gbeStruct4k;
+}
+
+struct GBEREGIONRECORD_8K generatedGbeStruct8k()
+{
+ struct GBEREGIONRECORD_8K gbeStruct8k;
+ gbeStruct8k.main = generatedGbeStruct4k();
+ memcpy(&gbeStruct8k.backup, &gbeStruct8k.main, GBEREGIONSIZE_4K);
+ return gbeStruct8k;
+}
+
diff --git a/resources/utilities/ich9deblob/src/ich9gen/mkgbe.h b/resources/utilities/ich9deblob/src/ich9gen/mkgbe.h
new file mode 100644
index 0000000..5c67d83
--- /dev/null
+++ b/resources/utilities/ich9deblob/src/ich9gen/mkgbe.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2014 Francis Rowe <info@gluglug.org.uk>
+ *
+ * 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
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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 ICH9GEN_MKGBE_H
+#define ICH9GEN_MKGBE_H
+
+#include <stdio.h>
+#include <string.h>
+#include "../gbe/gbe.h"
+
+struct GBEREGIONRECORD_4K generatedGbeStruct4k();
+struct GBEREGIONRECORD_8K generatedGbeStruct8k();
+
+#endif