diff options
-rw-r--r-- | util/ifdtool/ifdtool.c | 108 | ||||
-rw-r--r-- | util/ifdtool/ifdtool.h | 2 |
2 files changed, 96 insertions, 14 deletions
diff --git a/util/ifdtool/ifdtool.c b/util/ifdtool/ifdtool.c index 1a8bf85059..7655fd4dce 100644 --- a/util/ifdtool/ifdtool.c +++ b/util/ifdtool/ifdtool.c @@ -200,12 +200,12 @@ static void dump_fcba(fcba_t * fcba) decode_component_density(fcba->flcomp & 7); printf("\n"); printf("FLILL 0x%08x\n", fcba->flill); - printf("FLPB 0x%08x\n", fcba->flpb); + printf("FLPB 0x%08x\n\n", fcba->flpb); } static void dump_fpsba(fpsba_t * fpsba) { - printf("\nFound PCH Strap Section\n"); + printf("Found PCH Strap Section\n"); printf("PCHSTRP0: 0x%08x\n", fpsba->pchstrp0); printf("PCHSTRP1: 0x%08x\n", fpsba->pchstrp1); printf("PCHSTRP2: 0x%08x\n", fpsba->pchstrp2); @@ -221,20 +221,51 @@ static void dump_fpsba(fpsba_t * fpsba) printf("PCHSTRP12: 0x%08x\n", fpsba->pchstrp12); printf("PCHSTRP13: 0x%08x\n", fpsba->pchstrp13); printf("PCHSTRP14: 0x%08x\n", fpsba->pchstrp14); - printf("PCHSTRP15: 0x%08x\n", fpsba->pchstrp15); + printf("PCHSTRP15: 0x%08x\n\n", fpsba->pchstrp15); +} + +static void decode_flmstr(uint32_t flmstr) +{ + printf(" Platform Data Region Write Access: %s\n", + (flmstr & (1 << 28)) ? "enabled" : "disabled"); + printf(" GbE Region Write Access: %s\n", + (flmstr & (1 << 27)) ? "enabled" : "disabled"); + printf(" Intel ME Region Write Access: %s\n", + (flmstr & (1 << 26)) ? "enabled" : "disabled"); + printf(" Host CPU/BIOS Region Write Access: %s\n", + (flmstr & (1 << 25)) ? "enabled" : "disabled"); + printf(" Flash Descriptor Write Access: %s\n", + (flmstr & (1 << 24)) ? "enabled" : "disabled"); + + printf(" Platform Data Region Read Access: %s\n", + (flmstr & (1 << 20)) ? "enabled" : "disabled"); + printf(" GbE Region Read Access: %s\n", + (flmstr & (1 << 19)) ? "enabled" : "disabled"); + printf(" Intel ME Region Read Access: %s\n", + (flmstr & (1 << 18)) ? "enabled" : "disabled"); + printf(" Host CPU/BIOS Region Read Access: %s\n", + (flmstr & (1 << 17)) ? "enabled" : "disabled"); + printf(" Flash Descriptor Read Access: %s\n", + (flmstr & (1 << 16)) ? "enabled" : "disabled"); + + printf(" Requester ID: 0x%04x\n\n", + flmstr & 0xffff); } static void dump_fmba(fmba_t * fmba) { - printf("\nFound Master Section\n"); - printf("FLMSTR1: 0x%08x\n", fmba->flmstr1); - printf("FLMSTR2: 0x%08x\n", fmba->flmstr2); - printf("FLMSTR3: 0x%08x\n", fmba->flmstr3); + printf("Found Master Section\n"); + printf("FLMSTR1: 0x%08x (Host CPU/BIOS)\n", fmba->flmstr1); + decode_flmstr(fmba->flmstr1); + printf("FLMSTR2: 0x%08x (Intel ME)\n", fmba->flmstr2); + decode_flmstr(fmba->flmstr2); + printf("FLMSTR3: 0x%08x (GbE)\n", fmba->flmstr3); + decode_flmstr(fmba->flmstr3); } static void dump_fmsba(fmsba_t * fmsba) { - printf("\nFound Processor Strap Section\n"); + printf("Found Processor Strap Section\n"); printf("????: 0x%08x\n", fmsba->data[0]); printf("????: 0x%08x\n", fmsba->data[1]); printf("????: 0x%08x\n", fmsba->data[2]); @@ -348,6 +379,31 @@ static void set_em100_mode(char *filename, char *image, int size) set_spi_frequency(filename, image, size, SPI_FREQUENCY_20MHZ); } +static void lock_descriptor(char *filename, char *image, int size) +{ + fdbar_t *fdb = find_fd(image, size); + fmba_t *fmba = (fmba_t *) (image + (((fdb->flmap1) & 0xff) << 4)); + /* TODO: Dynamically take Platform Data Region and GbE Region + * into regard. + */ + fmba->flmstr1 = 0x0a0b0000; + fmba->flmstr2 = 0x0c0d0000; + fmba->flmstr3 = 0x08080118; + + write_image(filename, image, size); +} + +static void unlock_descriptor(char *filename, char *image, int size) +{ + fdbar_t *fdb = find_fd(image, size); + fmba_t *fmba = (fmba_t *) (image + (((fdb->flmap1) & 0xff) << 4)); + fmba->flmstr1 = 0xffff0000; + fmba->flmstr2 = 0xffff0000; + fmba->flmstr3 = 0x08080118; + + write_image(filename, image, size); +} + void inject_region(char *filename, char *image, int size, int region_type, char *region_fname) { @@ -442,6 +498,8 @@ static void print_usage(const char *name) " -s | --spifreq <20|33|50> set the SPI frequency\n" " -e | --em100 set SPI frequency to 20MHz and disable\n" " Dual Output Fast Read Support\n" + " -l | --lock Lock firmware descriptor and ME region\n" + " -u | --unlock Unlock firmware descriptor and ME region\n" " -v | --version: print the version\n" " -h | --help: print this help\n\n" "<region> is one of Descriptor, BIOS, ME, GbE, Platform\n" @@ -452,7 +510,7 @@ int main(int argc, char *argv[]) { int opt, option_index = 0; int mode_dump = 0, mode_extract = 0, mode_inject = 0, mode_spifreq = 0; - int mode_em100 = 0; + int mode_em100 = 0, mode_locked = 0, mode_unlocked = 0; char *region_type_string = NULL, *region_fname = NULL; int region_type = -1, inputfreq = 0; enum spi_frequency spifreq = SPI_FREQUENCY_20MHZ; @@ -463,12 +521,14 @@ int main(int argc, char *argv[]) {"inject", 1, NULL, 'i'}, {"spifreq", 1, NULL, 's'}, {"em100", 0, NULL, 'e'}, + {"lock", 0, NULL, 'l'}, + {"unlock", 0, NULL, 'u'}, {"version", 0, NULL, 'v'}, {"help", 0, NULL, 'h'}, {0, 0, 0, 0} }; - while ((opt = getopt_long(argc, argv, "dxi:s:evh?", + while ((opt = getopt_long(argc, argv, "dxi:s:eluvh?", long_options, &option_index)) != EOF) { switch (opt) { case 'd': @@ -531,6 +591,20 @@ int main(int argc, char *argv[]) case 'e': mode_em100 = 1; break; + case 'l': + mode_locked = 1; + if (mode_unlocked == 1) { + fprintf(stderr, "Locking/Unlocking FD and ME are mutually exclusive\n"); + exit(EXIT_FAILURE); + } + break; + case 'u': + mode_unlocked = 1; + if (mode_locked == 1) { + fprintf(stderr, "Locking/Unlocking FD and ME are mutually exclusive\n"); + exit(EXIT_FAILURE); + } + break; case 'v': print_version(); exit(EXIT_SUCCESS); @@ -544,14 +618,16 @@ int main(int argc, char *argv[]) } } - if ((mode_dump + mode_extract + mode_inject + mode_spifreq) > 1) { - fprintf(stderr, "Only one mode allowed.\n\n"); + if ((mode_dump + mode_extract + mode_inject + + (mode_spifreq | mode_em100 | mode_unlocked | + mode_locked)) > 1) { + fprintf(stderr, "You may not specify more than one mode.\n\n"); print_usage(argv[0]); exit(EXIT_FAILURE); } if ((mode_dump + mode_extract + mode_inject + mode_spifreq + - mode_em100) == 0) { + mode_em100 + mode_locked + mode_unlocked) == 0) { fprintf(stderr, "You need to specify a mode.\n\n"); print_usage(argv[0]); exit(EXIT_FAILURE); @@ -607,6 +683,12 @@ int main(int argc, char *argv[]) if (mode_em100) set_em100_mode(filename, image, size); + if(mode_locked) + lock_descriptor(filename, image, size); + + if (mode_unlocked) + unlock_descriptor(filename, image, size); + free(image); return 0; diff --git a/util/ifdtool/ifdtool.h b/util/ifdtool/ifdtool.h index 31361df9bf..db237a3bf2 100644 --- a/util/ifdtool/ifdtool.h +++ b/util/ifdtool/ifdtool.h @@ -18,7 +18,7 @@ */ #include <stdint.h> -#define IFDTOOL_VERSION "1.0" +#define IFDTOOL_VERSION "1.1" enum spi_frequency { SPI_FREQUENCY_20MHZ = 0, |