summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/ifdtool/ifdtool.c140
-rw-r--r--util/ifdtool/ifdtool.h4
2 files changed, 74 insertions, 70 deletions
diff --git a/util/ifdtool/ifdtool.c b/util/ifdtool/ifdtool.c
index 9382bc4714..6a433f94ff 100644
--- a/util/ifdtool/ifdtool.c
+++ b/util/ifdtool/ifdtool.c
@@ -28,7 +28,7 @@
#endif
static int ifd_version;
-static int max_regions = 0;
+static unsigned int max_regions = 0;
static int selected_chip = 0;
static int platform = -1;
@@ -101,12 +101,12 @@ static void check_ifd_version(char *image, int size)
}
}
-static region_t get_region(frba_t *frba, int region_type)
+static region_t get_region(const frba_t *frba, unsigned int region_type)
{
int base_mask;
int limit_mask;
uint32_t flreg;
- void *v;
+ const void *v;
region_t region;
if (ifd_version >= IFD_VERSION_2)
@@ -145,7 +145,7 @@ static region_t get_region(frba_t *frba, int region_type)
v = &frba->flreg8;
break;
default:
- fprintf(stderr, "Invalid region type %d.\n", region_type);
+ fprintf(stderr, "Invalid region type %u.\n", region_type);
exit (EXIT_FAILURE);
}
@@ -160,28 +160,29 @@ static region_t get_region(frba_t *frba, int region_type)
return region;
}
-static void set_region(frba_t *frba, int region_type, region_t region)
+static void set_region(frba_t *frba, unsigned int region_type,
+ const region_t *region)
{
switch (region_type) {
case 0:
- frba->flreg0 = (((region.limit >> 12) & 0x7fff) << 16)
- | ((region.base >> 12) & 0x7fff);
+ frba->flreg0 = (((region->limit >> 12) & 0x7fff) << 16)
+ | ((region->base >> 12) & 0x7fff);
break;
case 1:
- frba->flreg1 = (((region.limit >> 12) & 0x7fff) << 16)
- | ((region.base >> 12) & 0x7fff);
+ frba->flreg1 = (((region->limit >> 12) & 0x7fff) << 16)
+ | ((region->base >> 12) & 0x7fff);
break;
case 2:
- frba->flreg2 = (((region.limit >> 12) & 0x7fff) << 16)
- | ((region.base >> 12) & 0x7fff);
+ frba->flreg2 = (((region->limit >> 12) & 0x7fff) << 16)
+ | ((region->base >> 12) & 0x7fff);
break;
case 3:
- frba->flreg3 = (((region.limit >> 12) & 0x7fff) << 16)
- | ((region.base >> 12) & 0x7fff);
+ frba->flreg3 = (((region->limit >> 12) & 0x7fff) << 16)
+ | ((region->base >> 12) & 0x7fff);
break;
case 4:
- frba->flreg4 = (((region.limit >> 12) & 0x7fff) << 16)
- | ((region.base >> 12) & 0x7fff);
+ frba->flreg4 = (((region->limit >> 12) & 0x7fff) << 16)
+ | ((region->base >> 12) & 0x7fff);
break;
default:
fprintf(stderr, "Invalid region type.\n");
@@ -189,9 +190,9 @@ static void set_region(frba_t *frba, int region_type, region_t region)
}
}
-static const char *region_name(int region_type)
+static const char *region_name(unsigned int region_type)
{
- if (region_type < 0 || region_type >= max_regions) {
+ if (region_type >= max_regions) {
fprintf(stderr, "Invalid region type.\n");
exit (EXIT_FAILURE);
}
@@ -199,9 +200,9 @@ static const char *region_name(int region_type)
return region_names[region_type].pretty;
}
-static const char *region_name_short(int region_type)
+static const char *region_name_short(unsigned int region_type)
{
- if (region_type < 0 || region_type >= max_regions) {
+ if (region_type >= max_regions) {
fprintf(stderr, "Invalid region type.\n");
exit (EXIT_FAILURE);
}
@@ -211,7 +212,7 @@ static const char *region_name_short(int region_type)
static int region_num(const char *name)
{
- int i;
+ unsigned int i;
for (i = 0; i < max_regions; i++) {
if (strcasecmp(name, region_names[i].pretty) == 0)
@@ -223,9 +224,9 @@ static int region_num(const char *name)
return -1;
}
-static const char *region_filename(int region_type)
+static const char *region_filename(unsigned int region_type)
{
- static const char *region_filenames[MAX_REGIONS] = {
+ static const char *const region_filenames[MAX_REGIONS] = {
"flashregion_0_flashdescriptor.bin",
"flashregion_1_bios.bin",
"flashregion_2_intel_me.bin",
@@ -237,7 +238,7 @@ static const char *region_filename(int region_type)
"flashregion_8_ec.bin",
};
- if (region_type < 0 || region_type >= max_regions) {
+ if (region_type >= max_regions) {
fprintf(stderr, "Invalid region type %d.\n", region_type);
exit (EXIT_FAILURE);
}
@@ -245,7 +246,7 @@ static const char *region_filename(int region_type)
return region_filenames[region_type];
}
-static void dump_region(int num, frba_t *frba)
+static void dump_region(unsigned int num, const frba_t *frba)
{
region_t region = get_region(frba, num);
printf(" Flash Region %d (%s): %08x - %08x %s\n",
@@ -253,14 +254,15 @@ static void dump_region(int num, frba_t *frba)
region.size < 1 ? "(unused)" : "");
}
-static void dump_region_layout(char *buf, size_t bufsize, int num, frba_t *frba)
+static void dump_region_layout(char *buf, size_t bufsize, unsigned int num,
+ const frba_t *frba)
{
region_t region = get_region(frba, num);
snprintf(buf, bufsize, "%08x:%08x %s\n",
region.base, region.limit, region_name_short(num));
}
-static void dump_frba(frba_t * frba)
+static void dump_frba(const frba_t *frba)
{
printf("Found Region Section\n");
printf("FLREG0: 0x%08x\n", frba->flreg0);
@@ -286,11 +288,11 @@ static void dump_frba(frba_t * frba)
}
}
-static void dump_frba_layout(frba_t * frba, char *layout_fname)
+static void dump_frba_layout(const frba_t *frba, const char *layout_fname)
{
char buf[LAYOUT_LINELEN];
size_t bufsize = LAYOUT_LINELEN;
- int i;
+ unsigned int i;
int layout_fd = open(layout_fname, O_WRONLY | O_CREAT | O_TRUNC,
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
@@ -380,7 +382,7 @@ static void decode_component_density(unsigned int density)
}
}
-static void dump_fcba(fcba_t * fcba)
+static void dump_fcba(const fcba_t *fcba)
{
printf("\nFound Component Section\n");
printf("FLCOMP 0x%08x\n", fcba->flcomp);
@@ -427,7 +429,7 @@ static void dump_fcba(fcba_t * fcba)
(fcba->flpb & 0xfff) << 12);
}
-static void dump_fpsba(fpsba_t * fpsba)
+static void dump_fpsba(const fpsba_t *fpsba)
{
printf("Found PCH Strap Section\n");
printf("PCHSTRP0: 0x%08x\n", fpsba->pchstrp0);
@@ -498,7 +500,7 @@ static void decode_flmstr(uint32_t flmstr)
flmstr & 0xffff);
}
-static void dump_fmba(fmba_t * fmba)
+static void dump_fmba(const fmba_t *fmba)
{
printf("Found Master Section\n");
printf("FLMSTR1: 0x%08x (Host CPU/BIOS)\n", fmba->flmstr1);
@@ -513,7 +515,7 @@ static void dump_fmba(fmba_t * fmba)
}
}
-static void dump_fmsba(fmsba_t * fmsba)
+static void dump_fmsba(const fmsba_t *fmsba)
{
printf("Found Processor Strap Section\n");
printf("????: 0x%08x\n", fmsba->data[0]);
@@ -583,7 +585,7 @@ static void dump_vscc(uint32_t vscc)
}
}
-static void dump_vtba(vtba_t *vtba, int vtl)
+static void dump_vtba(const vtba_t *vtba, int vtl)
{
int i;
int num = (vtl >> 1) < 8 ? (vtl >> 1) : 8;
@@ -598,7 +600,7 @@ static void dump_vtba(vtba_t *vtba, int vtl)
printf("\n");
}
-static void dump_oem(uint8_t *oem)
+static void dump_oem(const uint8_t *oem)
{
int i, j;
printf("OEM Section:\n");
@@ -651,7 +653,7 @@ static void dump_fd(char *image, int size)
dump_fmsba((fmsba_t *) (image + (((fdb->flmap2) & 0xff) << 4)));
}
-static void dump_layout(char *image, int size, char *layout_fname)
+static void dump_layout(char *image, int size, const char *layout_fname)
{
fdbar_t *fdb = find_fd(image, size);
if (!fdb)
@@ -664,7 +666,7 @@ static void dump_layout(char *image, int size, char *layout_fname)
static void write_regions(char *image, int size)
{
- int i;
+ unsigned int i;
fdbar_t *fdb = find_fd(image, size);
if (!fdb)
@@ -692,7 +694,7 @@ static void write_regions(char *image, int size)
}
}
-static void write_image(char *filename, char *image, int size)
+static void write_image(const char *filename, char *image, int size)
{
char new_filename[FILENAME_MAX]; // allow long file names
int new_fd;
@@ -716,7 +718,7 @@ static void write_image(char *filename, char *image, int size)
close(new_fd);
}
-static void set_spi_frequency(char *filename, char *image, int size,
+static void set_spi_frequency(const char *filename, char *image, int size,
enum spi_frequency freq)
{
fdbar_t *fdb = find_fd(image, size);
@@ -734,7 +736,7 @@ static void set_spi_frequency(char *filename, char *image, int size,
write_image(filename, image, size);
}
-static void set_em100_mode(char *filename, char *image, int size)
+static void set_em100_mode(const char *filename, char *image, int size)
{
fdbar_t *fdb = find_fd(image, size);
fcba_t *fcba = (fcba_t *) (image + (((fdb->flmap0) & 0xff) << 4));
@@ -756,7 +758,7 @@ static void set_em100_mode(char *filename, char *image, int size)
set_spi_frequency(filename, image, size, freq);
}
-static void set_chipdensity(char *filename, char *image, int size,
+static void set_chipdensity(const char *filename, char *image, int size,
unsigned int density)
{
fdbar_t *fdb = find_fd(image, size);
@@ -809,7 +811,7 @@ static void set_chipdensity(char *filename, char *image, int size,
write_image(filename, image, size);
}
-static void lock_descriptor(char *filename, char *image, int size)
+static void lock_descriptor(const char *filename, char *image, int size)
{
int wr_shift, rd_shift;
fdbar_t *fdb = find_fd(image, size);
@@ -866,7 +868,7 @@ static void lock_descriptor(char *filename, char *image, int size)
write_image(filename, image, size);
}
-static void unlock_descriptor(char *filename, char *image, int size)
+static void unlock_descriptor(const char *filename, char *image, int size)
{
fdbar_t *fdb = find_fd(image, size);
fmba_t *fmba = (fmba_t *) (image + (((fdb->flmap1) & 0xff) << 4));
@@ -886,8 +888,8 @@ static void unlock_descriptor(char *filename, char *image, int size)
write_image(filename, image, size);
}
-void inject_region(char *filename, char *image, int size, int region_type,
- char *region_fname)
+void inject_region(const char *filename, char *image, int size,
+ unsigned int region_type, const char *region_fname)
{
fdbar_t *fdb = find_fd(image, size);
if (!fdb)
@@ -972,24 +974,25 @@ unsigned int next_pow2(unsigned int x)
* @return 0 if the two regions are seperate
* @return 1 if the two regions overlap
*/
-static int regions_collide(region_t r1, region_t r2)
+static int regions_collide(const region_t *r1, const region_t *r2)
{
- if ((r1.size == 0) || (r2.size == 0))
+ if ((r1->size == 0) || (r2->size == 0))
return 0;
- if ( ((r1.base >= r2.base) && (r1.base <= r2.limit)) ||
- ((r1.limit >= r2.base) && (r1.limit <= r2.limit)) )
+ if ( ((r1->base >= r2->base) && (r1->base <= r2->limit)) ||
+ ((r1->limit >= r2->base) && (r1->limit <= r2->limit)) )
return 1;
return 0;
}
-void new_layout(char *filename, char *image, int size, char *layout_fname)
+void new_layout(const char *filename, char *image, int size,
+ const char *layout_fname)
{
FILE *romlayout;
char tempstr[256];
char layout_region_name[256];
- int i, j;
+ unsigned int i, j;
int region_number;
region_t current_regions[MAX_REGIONS];
region_t new_regions[MAX_REGIONS];
@@ -1060,7 +1063,7 @@ void new_layout(char *filename, char *image, int size, char *layout_fname)
}
for (j = i + 1; j < max_regions; j++) {
- if (regions_collide(new_regions[i], new_regions[j])) {
+ if (regions_collide(&new_regions[i], &new_regions[j])) {
fprintf(stderr, "Regions would overlap.\n");
exit(EXIT_FAILURE);
}
@@ -1084,32 +1087,32 @@ void new_layout(char *filename, char *image, int size, char *layout_fname)
for (i = 0; i < max_regions; i++) {
int copy_size = new_regions[i].size;
int offset_current = 0, offset_new = 0;
- region_t current = current_regions[i];
- region_t new = new_regions[i];
+ const region_t *current = &current_regions[i];
+ const region_t *new = &new_regions[i];
- if (new.size == 0)
+ if (new->size == 0)
continue;
- if (new.size > current.size) {
+ if (new->size > current->size) {
/* copy from the end of the current region */
- copy_size = current.size;
- offset_new = new.size - current.size;
+ copy_size = current->size;
+ offset_new = new->size - current->size;
}
- if (new.size < current.size) {
+ if (new->size < current->size) {
/* copy to the end of the new region */
- offset_current = current.size - new.size;
+ offset_current = current->size - new->size;
}
printf("Copy Descriptor %d (%s) (%d bytes)\n", i,
region_name(i), copy_size);
- printf(" from %08x+%08x:%08x (%10d)\n", current.base,
- offset_current, current.limit, current.size);
- printf(" to %08x+%08x:%08x (%10d)\n", new.base,
- offset_new, new.limit, new.size);
+ printf(" from %08x+%08x:%08x (%10d)\n", current->base,
+ offset_current, current->limit, current->size);
+ printf(" to %08x+%08x:%08x (%10d)\n", new->base,
+ offset_new, new->limit, new->size);
- memcpy(new_image + new.base + offset_new,
- image + current.base + offset_current,
+ memcpy(new_image + new->base + offset_new,
+ image + current->base + offset_current,
copy_size);
}
@@ -1120,7 +1123,7 @@ void new_layout(char *filename, char *image, int size, char *layout_fname)
frba = (frba_t *) (new_image + (((fdb->flmap0 >> 16) & 0xff) << 4));
for (i = 1; i < max_regions; i++) {
- set_region(frba, i, new_regions[i]);
+ set_region(frba, i, &new_regions[i]);
}
write_image(filename, new_image, new_extent);
@@ -1173,12 +1176,13 @@ int main(int argc, char *argv[])
int mode_dump = 0, mode_extract = 0, mode_inject = 0, mode_spifreq = 0;
int mode_em100 = 0, mode_locked = 0, mode_unlocked = 0;
int mode_layout = 0, mode_newlayout = 0, mode_density = 0;
- char *region_type_string = NULL, *region_fname = NULL, *layout_fname = NULL;
+ char *region_type_string = NULL, *region_fname = NULL;
+ const char *layout_fname = NULL;
int region_type = -1, inputfreq = 0;
unsigned int new_density = 0;
enum spi_frequency spifreq = SPI_FREQUENCY_20MHZ;
- static struct option long_options[] = {
+ static const struct option long_options[] = {
{"dump", 0, NULL, 'd'},
{"layout", 1, NULL, 'f'},
{"extract", 0, NULL, 'x'},
diff --git a/util/ifdtool/ifdtool.h b/util/ifdtool/ifdtool.h
index fe98d6a856..1ebe629654 100644
--- a/util/ifdtool/ifdtool.h
+++ b/util/ifdtool/ifdtool.h
@@ -140,6 +140,6 @@ typedef struct {
} region_t;
struct region_name {
- char *pretty;
- char *terse;
+ const char *pretty;
+ const char *terse;
};