ifdtool: Const-correct and redesign some functions

Const-correct some functions which do not write back,
and use pointers to access existing region_t variables.

The last changeset is dismantled this time.

This commit is only focused on const-correctness.

Change-Id: I6d05418c8b32fa31dcd038a3e56f9aefe13fa9c4
Signed-off-by: Bill XIE <persmule@gmail.com>
Reviewed-on: https://review.coreboot.org/21288
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Bill XIE 2017-09-12 11:22:29 +08:00 committed by Nico Huber
parent c863be7ba4
commit fa5f99430d
2 changed files with 74 additions and 70 deletions

View File

@ -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'},

View File

@ -140,6 +140,6 @@ typedef struct {
} region_t;
struct region_name {
char *pretty;
char *terse;
const char *pretty;
const char *terse;
};