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 /futility/flashrom_drv.c | |
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>
Diffstat (limited to 'futility/flashrom_drv.c')
-rw-r--r-- | futility/flashrom_drv.c | 32 |
1 files changed, 31 insertions, 1 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); |