ifdtool: Add locking/unlocking and dumping of access permissions
ifdtool will now dump access permissions of system comonents to certain IFD sections: Found Master Section FLMSTR1: 0xffff0000 (Host CPU/BIOS) Platform Data Region Write Access: enabled GbE Region Write Access: enabled Intel ME Region Write Access: enabled Host CPU/BIOS Region Write Access: enabled Flash Descriptor Write Access: enabled Platform Data Region Read Access: enabled GbE Region Read Access: enabled Intel ME Region Read Access: enabled Host CPU/BIOS Region Read Access: enabled Flash Descriptor Read Access: enabled Requester ID: 0x0000 FLMSTR2: 0x0c0d0000 (Intel ME) Platform Data Region Write Access: disabled GbE Region Write Access: enabled Intel ME Region Write Access: enabled Host CPU/BIOS Region Write Access: disabled Flash Descriptor Write Access: disabled Platform Data Region Read Access: disabled GbE Region Read Access: enabled Intel ME Region Read Access: enabled Host CPU/BIOS Region Read Access: disabled Flash Descriptor Read Access: enabled Requester ID: 0x0000 FLMSTR3: 0x08080118 (GbE) Platform Data Region Write Access: disabled GbE Region Write Access: enabled Intel ME Region Write Access: disabled Host CPU/BIOS Region Write Access: disabled Flash Descriptor Write Access: disabled Platform Data Region Read Access: disabled GbE Region Read Access: enabled Intel ME Region Read Access: disabled Host CPU/BIOS Region Read Access: disabled Flash Descriptor Read Access: disabled Requester ID: 0x0118 Also, ifdtool -u /path/to/image will unlock the host's access to the firmware descriptor and ME region. ifdtool -l /path/to/image will lock down the host's access to the firmware descriptor and ME region. Change-Id: I3e081b80a9bcb398772416f143b794bf307b1c36 Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/1755 Reviewed-by: Ronald G. Minnich <rminnich@gmail.com> Tested-by: build bot (Jenkins)
This commit is contained in:
parent
0e6d0edcce
commit
3c53d33c78
|
@ -200,12 +200,12 @@ static void dump_fcba(fcba_t * fcba)
|
||||||
decode_component_density(fcba->flcomp & 7);
|
decode_component_density(fcba->flcomp & 7);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("FLILL 0x%08x\n", fcba->flill);
|
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)
|
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("PCHSTRP0: 0x%08x\n", fpsba->pchstrp0);
|
||||||
printf("PCHSTRP1: 0x%08x\n", fpsba->pchstrp1);
|
printf("PCHSTRP1: 0x%08x\n", fpsba->pchstrp1);
|
||||||
printf("PCHSTRP2: 0x%08x\n", fpsba->pchstrp2);
|
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("PCHSTRP12: 0x%08x\n", fpsba->pchstrp12);
|
||||||
printf("PCHSTRP13: 0x%08x\n", fpsba->pchstrp13);
|
printf("PCHSTRP13: 0x%08x\n", fpsba->pchstrp13);
|
||||||
printf("PCHSTRP14: 0x%08x\n", fpsba->pchstrp14);
|
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)
|
static void dump_fmba(fmba_t * fmba)
|
||||||
{
|
{
|
||||||
printf("\nFound Master Section\n");
|
printf("Found Master Section\n");
|
||||||
printf("FLMSTR1: 0x%08x\n", fmba->flmstr1);
|
printf("FLMSTR1: 0x%08x (Host CPU/BIOS)\n", fmba->flmstr1);
|
||||||
printf("FLMSTR2: 0x%08x\n", fmba->flmstr2);
|
decode_flmstr(fmba->flmstr1);
|
||||||
printf("FLMSTR3: 0x%08x\n", fmba->flmstr3);
|
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)
|
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[0]);
|
||||||
printf("????: 0x%08x\n", fmsba->data[1]);
|
printf("????: 0x%08x\n", fmsba->data[1]);
|
||||||
printf("????: 0x%08x\n", fmsba->data[2]);
|
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);
|
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,
|
void inject_region(char *filename, char *image, int size, int region_type,
|
||||||
char *region_fname)
|
char *region_fname)
|
||||||
{
|
{
|
||||||
|
@ -442,6 +498,8 @@ static void print_usage(const char *name)
|
||||||
" -s | --spifreq <20|33|50> set the SPI frequency\n"
|
" -s | --spifreq <20|33|50> set the SPI frequency\n"
|
||||||
" -e | --em100 set SPI frequency to 20MHz and disable\n"
|
" -e | --em100 set SPI frequency to 20MHz and disable\n"
|
||||||
" Dual Output Fast Read Support\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"
|
" -v | --version: print the version\n"
|
||||||
" -h | --help: print this help\n\n"
|
" -h | --help: print this help\n\n"
|
||||||
"<region> is one of Descriptor, BIOS, ME, GbE, Platform\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 opt, option_index = 0;
|
||||||
int mode_dump = 0, mode_extract = 0, mode_inject = 0, mode_spifreq = 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;
|
char *region_type_string = NULL, *region_fname = NULL;
|
||||||
int region_type = -1, inputfreq = 0;
|
int region_type = -1, inputfreq = 0;
|
||||||
enum spi_frequency spifreq = SPI_FREQUENCY_20MHZ;
|
enum spi_frequency spifreq = SPI_FREQUENCY_20MHZ;
|
||||||
|
@ -463,12 +521,14 @@ int main(int argc, char *argv[])
|
||||||
{"inject", 1, NULL, 'i'},
|
{"inject", 1, NULL, 'i'},
|
||||||
{"spifreq", 1, NULL, 's'},
|
{"spifreq", 1, NULL, 's'},
|
||||||
{"em100", 0, NULL, 'e'},
|
{"em100", 0, NULL, 'e'},
|
||||||
|
{"lock", 0, NULL, 'l'},
|
||||||
|
{"unlock", 0, NULL, 'u'},
|
||||||
{"version", 0, NULL, 'v'},
|
{"version", 0, NULL, 'v'},
|
||||||
{"help", 0, NULL, 'h'},
|
{"help", 0, NULL, 'h'},
|
||||||
{0, 0, 0, 0}
|
{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) {
|
long_options, &option_index)) != EOF) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'd':
|
case 'd':
|
||||||
|
@ -531,6 +591,20 @@ int main(int argc, char *argv[])
|
||||||
case 'e':
|
case 'e':
|
||||||
mode_em100 = 1;
|
mode_em100 = 1;
|
||||||
break;
|
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':
|
case 'v':
|
||||||
print_version();
|
print_version();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
|
@ -544,14 +618,16 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mode_dump + mode_extract + mode_inject + mode_spifreq) > 1) {
|
if ((mode_dump + mode_extract + mode_inject +
|
||||||
fprintf(stderr, "Only one mode allowed.\n\n");
|
(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]);
|
print_usage(argv[0]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mode_dump + mode_extract + mode_inject + mode_spifreq +
|
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");
|
fprintf(stderr, "You need to specify a mode.\n\n");
|
||||||
print_usage(argv[0]);
|
print_usage(argv[0]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
@ -607,6 +683,12 @@ int main(int argc, char *argv[])
|
||||||
if (mode_em100)
|
if (mode_em100)
|
||||||
set_em100_mode(filename, image, size);
|
set_em100_mode(filename, image, size);
|
||||||
|
|
||||||
|
if(mode_locked)
|
||||||
|
lock_descriptor(filename, image, size);
|
||||||
|
|
||||||
|
if (mode_unlocked)
|
||||||
|
unlock_descriptor(filename, image, size);
|
||||||
|
|
||||||
free(image);
|
free(image);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#define IFDTOOL_VERSION "1.0"
|
#define IFDTOOL_VERSION "1.1"
|
||||||
|
|
||||||
enum spi_frequency {
|
enum spi_frequency {
|
||||||
SPI_FREQUENCY_20MHZ = 0,
|
SPI_FREQUENCY_20MHZ = 0,
|
||||||
|
|
Loading…
Reference in New Issue