diff options
author | Edward O'Callaghan <quasisec@google.com> | 2021-12-30 16:38:04 +1100 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2022-01-04 04:32:51 +0000 |
commit | cdbd5769d3b586042555b6211c5cb5160a4ed565 (patch) | |
tree | 798cfe237449c16109c216187637d4bf4411b62c | |
parent | e4e05a30f88c76e044e5a93955627dcfdcd55974 (diff) | |
download | vboot-cdbd5769d3b586042555b6211c5cb5160a4ed565.tar.gz |
vboot_reference: Allow flashrom_read_image() reading per-regionstabilize-14438.B
BUG=b:207808292
BRANCH=none
TEST=`make`
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Change-Id: I98f1a2566ef50b2c7b1376141bb2f1c096b710a6
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3358664
Tested-by: Edward O'Callaghan <quasisec@chromium.org>
Auto-Submit: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-by: Nikolai Artemiev <nartemiev@google.com>
Commit-Queue: Nikolai Artemiev <nartemiev@google.com>
-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, |