diff options
-rw-r--r-- | futility/flashrom_drv.c | 32 | ||||
-rw-r--r-- | futility/updater_utils.c | 2 | ||||
-rw-r--r-- | futility/updater_utils.h | 3 |
3 files changed, 34 insertions, 3 deletions
diff --git a/futility/flashrom_drv.c b/futility/flashrom_drv.c index 5ebe4468..69532f40 100644 --- a/futility/flashrom_drv.c +++ b/futility/flashrom_drv.c @@ -52,7 +52,8 @@ static char *flashrom_extract_params(const char *str, char **prog, char **params return tmp; } -int flashrom_read_image(struct firmware_image *image, int verbosity) +int flashrom_read_image(struct firmware_image *image, const char *region, + int verbosity) { int r = 0; size_t len = 0; @@ -64,6 +65,7 @@ int flashrom_read_image(struct firmware_image *image, int verbosity) struct flashrom_programmer *prog = NULL; struct flashrom_flashctx *flashctx = NULL; + struct flashrom_layout *layout = NULL; flashrom_set_log_callback((flashrom_log_callback *)&flashrom_print_cb); @@ -72,13 +74,41 @@ int flashrom_read_image(struct firmware_image *image, int verbosity) r |= flashrom_flash_probe(&flashctx, prog, NULL); len = flashrom_flash_getsize(flashctx); + + if (region) { + r = flashrom_layout_read_fmap_from_buffer( + &layout, flashctx, (const uint8_t *)image->data, + image->size); + if (r > 0) { + WARN("could not read fmap from image, r=%d, " + "falling back to read from rom\n", r); + r = flashrom_layout_read_fmap_from_rom( + &layout, flashctx, 0, len); + if (r > 0) { + ERROR("could not read fmap from rom, r=%d\n", r); + r = -1; + goto err_cleanup; + } + } + // empty region causes seg fault in API. + r |= flashrom_layout_include_region(layout, region); + if (r > 0) { + ERROR("could not include region = '%s'\n", region); + r = -1; + goto err_cleanup; + } + flashrom_layout_set(flashctx, layout); + } + image->data = calloc(1, len); image->size = len; image->file_name = strdup("<none>"); r |= flashrom_image_read(flashctx, image->data, len); +err_cleanup: r |= flashrom_programmer_shutdown(prog); + flashrom_layout_release(layout); flashrom_flash_release(flashctx); free(tmp); diff --git a/futility/updater_utils.c b/futility/updater_utils.c index 936abaf3..91fd07ed 100644 --- a/futility/updater_utils.c +++ b/futility/updater_utils.c @@ -524,7 +524,7 @@ int load_system_firmware(struct firmware_image *image, { int r; - r = flashrom_read_image(image, (verbosity + 1)); + r = flashrom_read_image(image, NULL, (verbosity + 1)); if (!r) r = parse_firmware_image(image); return r; diff --git a/futility/updater_utils.h b/futility/updater_utils.h index 2d64c295..ca6771e5 100644 --- a/futility/updater_utils.h +++ b/futility/updater_utils.h @@ -228,7 +228,8 @@ void init_system_properties(struct system_property *props, int num); */ const char *get_firmware_rootkey_hash(const struct firmware_image *image); -int flashrom_read_image(struct firmware_image *image, int verbosity); +int flashrom_read_image(struct firmware_image *image, const char *region, + int verbosity); int flashrom_write_image(const struct firmware_image *image, const char *region, const struct firmware_image *diff_image, |