summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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,