summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward O'Callaghan <quasisec@google.com>2021-12-30 16:38:04 +1100
committerCommit Bot <commit-bot@chromium.org>2022-01-04 04:32:51 +0000
commitcdbd5769d3b586042555b6211c5cb5160a4ed565 (patch)
tree798cfe237449c16109c216187637d4bf4411b62c
parente4e05a30f88c76e044e5a93955627dcfdcd55974 (diff)
downloadvboot-stabilize-14438.B.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.c32
-rw-r--r--futility/updater_utils.c2
-rw-r--r--futility/updater_utils.h3
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,