diff options
| author | Leah Rowe <leah@libreboot.org> | 2023-04-08 03:14:48 +0100 | 
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2023-04-08 18:36:50 +0100 | 
| commit | eb9d06304049ca03e4d00c81b43fb996d8424a1f (patch) | |
| tree | 367193972648607d31f502a5be7b2047ae6fc5e0 /util/ich9utils/src/demefactory.c | |
| parent | 58e12063c72b7b2a7f4bb2c0c9e71b467d41d2c1 (diff) | |
add ich9utils back to utils
don't download it. keep it in lbmk.
libreboot moved to codeberg for git hosting,
and i didn't want to keep lugging around an
extra git repo just for one tiny project.
Diffstat (limited to 'util/ich9utils/src/demefactory.c')
| -rw-r--r-- | util/ich9utils/src/demefactory.c | 141 | 
1 files changed, 141 insertions, 0 deletions
| diff --git a/util/ich9utils/src/demefactory.c b/util/ich9utils/src/demefactory.c new file mode 100644 index 00000000..596118cf --- /dev/null +++ b/util/ich9utils/src/demefactory.c @@ -0,0 +1,141 @@ +/* + *  demefactory.c + *  This file is part of the demefactory utility from the libreboot project + *  + * Purpose: disable ME on GM45 factory firmware, but leave region intact + * 			enable read-write on all regions + * + *	 Copyright (C) 2014, 2015 Leah Rowe <info@minifree.org> + *  Copyright (C) 2014 Steve Shenton <sgsit@libreboot.org>    + * + *  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/>. + */ +  +/*  + * demfactory utility - main + */ + +#include "demefactory.h" + +int main() +{ +	struct DESCRIPTORREGIONRECORD descriptorStruct; +	uint8_t* descriptorBuffer = (uint8_t*)&descriptorStruct; +	 +	struct GBEREGIONRECORD_8K gbeStruct8k; /* not needed, except for compatibility checking */ +	 +	char* romFilename = "factory.rom"; +	char* descriptorFilename = "demefactory_4kdescriptor.bin"; +	 +	unsigned int bufferLength; +	unsigned int romSize; +	 +	/* +	 * ------------------------------------------------------------------ +	 * Compatibility checks. This version of ich9deblob is not yet portable. +	 * ------------------------------------------------------------------ +	 */ + +	if (systemOrCompilerIncompatible(descriptorStruct, gbeStruct8k)) return 1; +	/* If true, fail with error message */ +	 +	/* +	 * ------------------------------------------------------------------ +	 * Extract the descriptor region from the factory.rom dump +	 * ------------------------------------------------------------------ +	 */ +	FILE* fp = NULL; +	fp = fopen(romFilename, "rb"); /* open factory.rom */ +	if (NULL == fp) +	{ +		printf("\nerror: could not open %s\n", romFilename); +		fclose(fp); +		return 1; +	} +	printf("\n%s opened successfully\n", romFilename); +	 +	/*  +	 * Get the descriptor region dump from the factory.rom +	 * (goes in factoryDescriptorBuffer variable) +	 */ +	bufferLength = fread(descriptorBuffer, 1, DESCRIPTORREGIONSIZE, fp); +	if (DESCRIPTORREGIONSIZE != bufferLength) //  +	{ +		printf("\nerror: could not read descriptor from %s (%i) bytes read\n", romFilename, bufferLength); +		fclose(fp); +		return 1; +	} +	printf("\ndescriptor region read successfully\n"); +	 +	/* ------------------------------------------------- */ + +	fseek(fp, 0L, SEEK_END); +	romSize = ftell(fp); +	printf("\n%s size: [%i] bytes\n", romFilename, romSize); +	 +	/* -------------------------------------------------- */ + +	fclose(fp); +	 +	/* Debugging (before modification) */ +	printDescriptorRegionLocations(descriptorStruct, "Original"); +	 +	/* +	 * ------------------------------------------------------------------ +	 * Modify the descriptor region, ready to go in the modified factory.rom +	 * ------------------------------------------------------------------ +	 */ + +	// Disable the ME/TPM: +	descriptorStruct = descriptorDisableMe(descriptorStruct); +	descriptorStruct = descriptorDisableTpm(descriptorStruct); +	 +	/* Host/CPU is allowed to read/write all regions. */ +	descriptorStruct = descriptorHostRegionsUnlocked(descriptorStruct); +	/* The ME is disallowed read-write access to all regions +	 * (this is probably redundant, since the ME is already removed from libreboot) */ +	descriptorStruct = descriptorMeRegionsForbidden(descriptorStruct); + +	/* Debugging (after modifying the descriptor region) */ +	printDescriptorRegionLocations(descriptorStruct, "Modified"); + +	/* +	 * ------------------------------------------------------------------ +	 * Create the file with the modified descriptor inside +	 * ------------------------------------------------------------------ +	 */ + +	printf("\n"); +	if (notCreated4kDescriptorFile(descriptorStruct, descriptorFilename)) { +		return 1; +	} +	 +	/* +	 * ------------------------------------------------------------------ +	 * Generate ich9gen data (C code that will recreate the deactivatedME descriptor from scratch) +	 * ------------------------------------------------------------------ +	 */ +	/* Code for generating the Descriptor struct */ +	/* mkdescriptor.h */ +	if (notCreatedHFileForDescriptorCFile("mkdescriptor.h", "mkdescriptor.c")) { +		return 1; +	} /* and now mkdescriptor.c */ +	if (notCreatedCFileFromDescriptorStruct(descriptorStruct, "mkdescriptor.c", "mkdescriptor.h")) { +		return 1; +	} +	 +	printf("The modified descriptor region has also been dumped as src files: mkdescriptor.c, mkdescriptor.h\n\n"); + +	return 0; +} | 
