Daniel Campello has uploaded this change for review.
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__ */
To view, visit change 52450. To unsubscribe, or for help writing mail filters, visit settings.