Daniel Campello has uploaded this change for review. ( https://review.coreboot.org/c/flashrom/+/52450 )
Change subject: cli_classic.c: add -x option for do_extract() ......................................................................
cli_classic.c: add -x option for do_extract()
This change introduces a new option to extract all layout regions to files with the name of each region (or with the provided filename via -i region:file). It is implemented by mutating the flash layout to include all regions and backfilling the entry->file with entry->name (replacing spaces with underscores)
Signed-off-by: Daniel Campello campello@chromium.org Change-Id: I8c69223fa92cf5b50abe070f1ab9f19d3b42f6ff --- M cli_classic.c M flash.h M flashrom.c M layout.c M layout.h 5 files changed, 38 insertions(+), 3 deletions(-)
git pull ssh://review.coreboot.org:29418/flashrom refs/changes/50/52450/1
diff --git a/cli_classic.c b/cli_classic.c index 64e358f..398b4c8 100644 --- a/cli_classic.c +++ b/cli_classic.c @@ -58,6 +58,7 @@ " -f | --force force specific operations (see man page)\n" " -n | --noverify don't auto-verify\n" " -N | --noverify-all verify included regions only (cf. -i)\n" + " -x | --extract extract regions to files\n" " -l | --layout <layoutfile> read ROM layout from <layoutfile>\n" " --wp-disable disable write protection\n" " --wp-enable enable write protection\n" @@ -172,7 +173,7 @@ int flash_name = 0, flash_size = 0; int set_wp_enable = 0, set_wp_disable = 0, wp_status = 0; int set_wp_range = 0, set_wp_region = 0, wp_list = 0; - int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0; + int read_it = 0, extract_it = 0, write_it = 0, erase_it = 0, verify_it = 0; int dont_verify_it = 0, dont_verify_all = 0, list_supported = 0, operation_specified = 0; struct flashrom_layout *layout = NULL; enum programmer prog = PROGRAMMER_INVALID; @@ -193,7 +194,7 @@ int ret = 0; unsigned int wp_start = 0, wp_len = 0;
- static const char optstring[] = "r::Rw::v::nNVEfc:l:i:p:Lzho:"; + static const char optstring[] = "r::Rw::v::nNVEfc:l:i:p:Lzho:x"; static const struct option long_options[] = { {"read", 2, NULL, 'r'}, {"write", 2, NULL, 'w'}, @@ -201,6 +202,7 @@ {"verify", 2, NULL, 'v'}, {"noverify", 0, NULL, 'n'}, {"noverify-all", 0, NULL, 'N'}, + {"extract", 0, NULL, 'x'}, {"chip", 1, NULL, 'c'}, {"verbose", 0, NULL, 'V'}, {"force", 0, NULL, 'f'}, @@ -283,6 +285,10 @@ case 'N': dont_verify_all = 1; break; + case 'x': + cli_classic_validate_singleop(&operation_specified); + extract_it = 1; + break; case 'c': chip_to_probe = strdup(optarg); break; @@ -656,7 +662,7 @@
if (!(read_it | write_it | verify_it | erase_it | flash_name | flash_size | set_wp_range | set_wp_region | set_wp_enable | - set_wp_disable | wp_status | wp_list)) { + set_wp_disable | wp_status | wp_list | extract_it)) { msg_ginfo("No operations were specified.\n"); goto out_shutdown; } @@ -857,6 +863,8 @@ programmer_delay(100000); if (read_it) ret = do_read(fill_flash, filename); + else if (extract_it) + ret = do_extract(fill_flash); else if (erase_it) ret = do_erase(fill_flash); else if (write_it) diff --git a/flash.h b/flash.h index c0e5c27..dd8e156 100644 --- a/flash.h +++ b/flash.h @@ -357,6 +357,7 @@ int prepare_flash_access(struct flashctx *, bool read_it, bool write_it, bool erase_it, bool verify_it); void finalize_flash_access(struct flashctx *); int do_read(struct flashctx *, const char *filename); +int do_extract(struct flashctx *); int do_erase(struct flashctx *); int do_write(struct flashctx *, const char *const filename, const char *const referencefile); int do_verify(struct flashctx *, const char *const filename); diff --git a/flashrom.c b/flashrom.c index d048a62..152f30c 100644 --- a/flashrom.c +++ b/flashrom.c @@ -2705,6 +2705,12 @@ return ret; }
+int do_extract(struct flashctx *const flash) +{ + prepare_layout_for_extraction(flash); + return do_read(flash, NULL); +} + int do_erase(struct flashctx *const flash) { const int ret = flashrom_flash_erase(flash); diff --git a/layout.c b/layout.c index c6276a1..acba58f 100644 --- a/layout.c +++ b/layout.c @@ -15,6 +15,7 @@ * GNU General Public License for more details. */
+#include <ctype.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> @@ -314,6 +315,24 @@ return ret; }
+void prepare_layout_for_extraction(struct flashctx *flash) +{ + const struct flashrom_layout *const l = get_layout(flash); + unsigned int i, j; + + for (i = 0; i < l->num_entries; ++i) { + l->entries[i].included = true; + + if (!l->entries[i].file) + l->entries[i].file = strdup(l->entries[i].name); + + for (j = 0; l->entries[i].file[j]; j++) { + if (isspace(l->entries[i].file[j])) + l->entries[i].file[j] = '_'; + } + } +} + const struct romentry *layout_next_included_region( const struct flashrom_layout *const l, const chipoff_t where) { diff --git a/layout.h b/layout.h index b11c432..327f5bf 100644 --- a/layout.h +++ b/layout.h @@ -69,5 +69,6 @@ const struct romentry *layout_next_included_region(const struct flashrom_layout *, chipoff_t); const struct romentry *layout_next_included(const struct flashrom_layout *, const struct romentry *); int included_regions_overlap(const struct flashrom_layout *const flashrom_layout); +void prepare_layout_for_extraction(struct flashrom_flashctx *flash);
#endif /* !__LAYOUT_H__ */