Nico Huber has submitted this change. ( https://review.coreboot.org/c/flashrom/+/33543 )
Change subject: layout: Introduce flashrom_layout_new() ......................................................................
layout: Introduce flashrom_layout_new()
It initializes an empty layout. Currently the maximum number of entries has to be specified, which will vanish once we use dynamic allocation per entry.
We replace the two special cases `single_layout` and `ich_layout` with dynamically allocated layouts. As a result, we have to take care to release the `default_layout` in a flashctx once we are done with it.
Change-Id: I2ae7246493ff592e631cce924777925c7825e398 Signed-off-by: Nico Huber nico.h@gmx.de Reviewed-on: https://review.coreboot.org/c/flashrom/+/33543 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Edward O'Callaghan quasisec@chromium.org Reviewed-by: Angel Pons th3fanbus@gmail.com --- M cli_classic.c M flash.h M flashrom.c M ich_descriptors.c M ich_descriptors.h M layout.c M layout.h M libflashrom.c M libflashrom.h 9 files changed, 58 insertions(+), 42 deletions(-)
Approvals: build bot (Jenkins): Verified Angel Pons: Looks good to me, approved Edward O'Callaghan: Looks good to me, approved
diff --git a/cli_classic.c b/cli_classic.c index 158110b..fc91989 100644 --- a/cli_classic.c +++ b/cli_classic.c @@ -854,8 +854,10 @@ out_shutdown: programmer_shutdown(); out: - for (i = 0; i < chipcount; i++) + for (i = 0; i < chipcount; i++) { + flashrom_layout_release(flashes[i].default_layout); free(flashes[i].chip); + }
layout_cleanup(&include_args); free(filename); diff --git a/flash.h b/flash.h index dd8e156..3912e73 100644 --- a/flash.h +++ b/flash.h @@ -265,7 +265,7 @@ chipaddr virtual_registers; struct registered_master *mst; const struct flashrom_layout *layout; - struct single_layout fallback_layout; + struct flashrom_layout *default_layout; struct { bool force; bool force_boardmismatch; diff --git a/flashrom.c b/flashrom.c index ffba5c4..7c91fa1 100644 --- a/flashrom.c +++ b/flashrom.c @@ -822,15 +822,12 @@ if (!flash->chip) return -1;
- /* Fill fallback layout covering the whole chip. */ - struct single_layout *const fallback = &flash->fallback_layout; - fallback->base.entries = &fallback->entry; - fallback->base.capacity = 1; - fallback->base.num_entries = 0; - if (flashrom_layout_add_region(&fallback->base, + /* Fill default layout covering the whole chip. */ + if (flashrom_layout_new(&flash->default_layout, 1) || + flashrom_layout_add_region(flash->default_layout, 0, flash->chip->total_size * 1024 - 1, "complete flash") || - flashrom_layout_include_region(&fallback->base, "complete flash")) - return -1; + flashrom_layout_include_region(flash->default_layout, "complete flash")) + return -1;
tmp = flashbuses_to_text(flash->chip->bustype); msg_cinfo("%s %s flash chip "%s" (%d kB, %s) ", force ? "Assuming" : "Found", diff --git a/ich_descriptors.c b/ich_descriptors.c index ad1a88b..5e6c7fb 100644 --- a/ich_descriptors.c +++ b/ich_descriptors.c @@ -1261,7 +1261,9 @@ * 1 if the descriptor couldn't be parsed, * 2 when out of memory. */ -int layout_from_ich_descriptors(struct ich_layout *const layout, const void *const dump, const size_t len) +int layout_from_ich_descriptors( + struct flashrom_layout **const layout, + const void *const dump, const size_t len) { static const char *const regions[] = { "fd", "bios", "me", "gbe", "pd", "reg5", "bios2", "reg7", "ec", "reg9", "ie", @@ -1277,10 +1279,8 @@ return 1; }
- memset(layout, 0x00, sizeof(*layout)); - layout->base.entries = layout->entries; - layout->base.capacity = ARRAY_SIZE(layout->entries); - layout->base.num_entries = 0; + if (flashrom_layout_new(layout, ARRAY_SIZE(regions))) + return 2;
ssize_t i; const ssize_t nr = MIN(ich_number_of_regions(cs, &desc.content), (ssize_t)ARRAY_SIZE(regions)); @@ -1289,8 +1289,11 @@ const chipoff_t limit = ICH_FREG_LIMIT(desc.region.FLREGs[i]); if (limit <= base) continue; - if (flashrom_layout_add_region(&layout->base, base, limit, regions[i])) + if (flashrom_layout_add_region(*layout, base, limit, regions[i])) { + flashrom_layout_release(*layout); + *layout = NULL; return 2; + } } return 0; } diff --git a/ich_descriptors.h b/ich_descriptors.h index 727a31b..7683ed0 100644 --- a/ich_descriptors.h +++ b/ich_descriptors.h @@ -564,11 +564,6 @@ struct ich_desc_upper_map upper; };
-struct ich_layout { - struct flashrom_layout base; - struct romentry entries[MAX_NUM_FLREGS]; -}; - ssize_t ich_number_of_regions(enum ich_chipset cs, const struct ich_desc_content *content); ssize_t ich_number_of_masters(enum ich_chipset cs, const struct ich_desc_content *content);
@@ -587,6 +582,6 @@ int read_ich_descriptors_via_fdo(enum ich_chipset cs, void *spibar, struct ich_descriptors *desc); int getFCBA_component_density(enum ich_chipset cs, const struct ich_descriptors *desc, uint8_t idx);
-int layout_from_ich_descriptors(struct ich_layout *, const void *dump, size_t len); +int layout_from_ich_descriptors(struct flashrom_layout **, const void *dump, size_t len);
#endif /* __ICH_DESCRIPTORS_H__ */ diff --git a/layout.c b/layout.c index 2f56b27..ede476a 100644 --- a/layout.c +++ b/layout.c @@ -38,7 +38,7 @@ if (flashctx->layout && flashctx->layout->num_entries) return flashctx->layout; else - return &flashctx->fallback_layout.base; + return flashctx->default_layout; }
static struct romentry *mutable_layout_next( @@ -384,6 +384,32 @@ */
/** + * @brief Create a new, empty layout. + * + * @param layout Pointer to returned layout reference. + * @param count Number of layout entries to allocate. + * + * @return 0 on success, + * 1 if out of memory. + */ +int flashrom_layout_new(struct flashrom_layout **const layout, const unsigned int count) +{ + *layout = malloc(sizeof(**layout) + count * sizeof(struct romentry)); + if (!*layout) { + msg_gerr("Error creating layout: %s\n", strerror(errno)); + return 1; + } + + const struct flashrom_layout tmp = { + .entries = (void *)((char *)*layout + sizeof(**layout)), + .capacity = count, + .num_entries = 0, + }; + **layout = tmp; + return 0; +} + +/** * @brief Add another region to an existing layout. * * @param layout The existing layout. diff --git a/layout.h b/layout.h index 2a0f869..c05d1e7 100644 --- a/layout.h +++ b/layout.h @@ -52,11 +52,6 @@ size_t num_entries; };
-struct single_layout { - struct flashrom_layout base; - struct romentry entry; -}; - struct layout_include_args { char *name; char *file; diff --git a/libflashrom.c b/libflashrom.c index c5c4c89..dd5cb00 100644 --- a/libflashrom.c +++ b/libflashrom.c @@ -330,13 +330,14 @@ ret = 0; /* We found one chip, now check that there is no second match. */ if (probe_flash(®istered_masters[i], flash_idx + 1, &second_flashctx, 0) != -1) { + flashrom_layout_release(second_flashctx.default_layout); ret = 3; break; } } } if (ret) { - free(*flashctx); + flashrom_flash_release(*flashctx); *flashctx = NULL; } return ret; @@ -360,6 +361,7 @@ */ void flashrom_flash_release(struct flashrom_flashctx *const flashctx) { + flashrom_layout_release(flashctx->default_layout); free(flashctx); }
@@ -435,16 +437,10 @@ #ifndef __FLASHROM_LITTLE_ENDIAN__ return 6; #else - struct ich_layout dump_layout; + struct flashrom_layout *dump_layout, *chip_layout; int ret = 1;
void *const desc = malloc(0x1000); - struct ich_layout *const chip_layout = malloc(sizeof(*chip_layout)); - if (!desc || !chip_layout) { - msg_gerr("Out of memory!\n"); - goto _free_ret; - } - if (prepare_flash_access(flashctx, true, false, false, false)) goto _free_ret;
@@ -457,7 +453,7 @@ } msg_cinfo("done.\n");
- if (layout_from_ich_descriptors(chip_layout, desc, 0x1000)) { + if (layout_from_ich_descriptors(&chip_layout, desc, 0x1000)) { msg_cerr("Couldn't parse the descriptor!\n"); ret = 3; goto _finalize_ret; @@ -470,12 +466,13 @@ goto _finalize_ret; }
- const struct romentry *chip_entry = layout_next(&chip_layout->base, NULL); - const struct romentry *dump_entry = layout_next(&dump_layout.base, NULL); + const struct romentry *chip_entry = layout_next(chip_layout, NULL); + const struct romentry *dump_entry = layout_next(dump_layout, NULL); while (chip_entry && dump_entry && !memcmp(chip_entry, dump_entry, sizeof(*chip_entry))) { - chip_entry = layout_next(&chip_layout->base, chip_entry); - dump_entry = layout_next(&dump_layout.base, dump_entry); + chip_entry = layout_next(chip_layout, chip_entry); + dump_entry = layout_next(dump_layout, dump_entry); } + flashrom_layout_release(dump_layout); if (chip_entry || dump_entry) { msg_cerr("Descriptors don't match!\n"); ret = 5; @@ -490,7 +487,7 @@ finalize_flash_access(flashctx); _free_ret: if (ret) - free(chip_layout); + flashrom_layout_release(chip_layout); free(desc); return ret; #endif diff --git a/libflashrom.h b/libflashrom.h index d04eeb6..b13b3fb 100644 --- a/libflashrom.h +++ b/libflashrom.h @@ -106,6 +106,7 @@ int flashrom_image_verify(struct flashrom_flashctx *, const void *buffer, size_t buffer_len);
struct flashrom_layout; +int flashrom_layout_new(struct flashrom_layout **, unsigned int count); int flashrom_layout_read_from_ifd(struct flashrom_layout **, struct flashrom_flashctx *, const void *dump, size_t len); int flashrom_layout_read_fmap_from_rom(struct flashrom_layout **, struct flashrom_flashctx *, off_t offset, size_t length);