summaryrefslogtreecommitdiffstats
path: root/cli_classic.c
diff options
context:
space:
mode:
authorDaniel Campello <campello@chromium.org>2021-04-16 15:26:42 -0600
committerEdward O'Callaghan <quasisec@chromium.org>2021-05-02 23:45:43 +0000
commitce983bccaab450d358854494f15c2d8a1846d56b (patch)
tree79d41a980587c2a1ebe40b65f837edd16232d387 /cli_classic.c
parent0969e43b3fae48c90aaf1df284560f6b76f84efd (diff)
downloadflashrom-ce983bccaab450d358854494f15c2d8a1846d56b.tar.gz
flashrom-ce983bccaab450d358854494f15c2d8a1846d56b.tar.bz2
flashrom-ce983bccaab450d358854494f15c2d8a1846d56b.zip
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 Reviewed-on: https://review.coreboot.org/c/flashrom/+/52450 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Edward O'Callaghan <quasisec@chromium.org>
Diffstat (limited to 'cli_classic.c')
-rw-r--r--cli_classic.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/cli_classic.c b/cli_classic.c
index 7d4dee053..57f8dfba0 100644
--- a/cli_classic.c
+++ b/cli_classic.c
@@ -40,7 +40,7 @@ static void cli_classic_usage(const char *name)
#endif
"\n\t-p <programmername>[:<parameters>] [-c <chipname>]\n"
"\t\t(--flash-name|--flash-size|\n"
- "\t\t [-E|(-r|-w|-v) <file>]\n"
+ "\t\t [-E|-x|(-r|-w|-v) <file>]\n"
"\t\t [(-l <layoutfile>|--ifd| --fmap|--fmap-file <file>) [-i <region>[:<file>]]...]\n"
"\t\t [-n] [-N] [-f])]\n"
"\t[-V[V[V]]] [-o <logfile>]\n\n", name);
@@ -58,6 +58,7 @@ static void cli_classic_usage(const char *name)
" -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"
@@ -167,7 +168,7 @@ int main(int argc, char *argv[])
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;
@@ -188,7 +189,7 @@ int main(int argc, char *argv[])
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", 1, NULL, 'r'},
{"write", 1, NULL, 'w'},
@@ -196,6 +197,7 @@ int main(int argc, char *argv[])
{"verify", 1, 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'},
@@ -287,6 +289,10 @@ int main(int argc, char *argv[])
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;
@@ -658,7 +664,7 @@ int main(int argc, char *argv[])
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;
}
@@ -813,6 +819,8 @@ int main(int argc, char *argv[])
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)