diff options
author | Edward O'Callaghan <quasisec@google.com> | 2023-01-10 15:47:03 +1100 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2023-01-21 15:16:28 +0000 |
commit | d79d098356e1d07a46eb3d7a2f3ed9cd64e4576c (patch) | |
tree | 9c1ab2438e9acc764104b10d9a01a28be39c4eea | |
parent | 4c9fbadcbd95c9d30eecdff43ed4f8d072bb7878 (diff) | |
download | vboot-d79d098356e1d07a46eb3d7a2f3ed9cd64e4576c.tar.gz |
futility/cmd_read.c: Add region support
Allow user to read a specific region from flash via the read
subcommand.
BUG=b:264974346
BRANCH=none
TEST=`futility read /tmp/bios`
TEST=`futility read --region=GBB /tmp/gbb`
Change-Id: Ibd75f8e67d31bab910a61fb5453ca6e90d41fac3
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4151009
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Anastasia Klimchuk <aklm@chromium.org>
Tested-by: Edward O'Callaghan <quasisec@chromium.org>
Auto-Submit: Edward O'Callaghan <quasisec@chromium.org>
Commit-Queue: Edward O'Callaghan <quasisec@chromium.org>
-rw-r--r-- | futility/cmd_read.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/futility/cmd_read.c b/futility/cmd_read.c index e99264ae..1461ba7f 100644 --- a/futility/cmd_read.c +++ b/futility/cmd_read.c @@ -19,6 +19,7 @@ static struct option const long_opts[] = { /* name has_arg *flag val */ {"help", 0, NULL, 'h'}, {"debug", 0, NULL, 'd'}, + {"region", 1, NULL, 'r'}, {"verbose", 0, NULL, 'v'}, {NULL, 0, NULL, 0}, }; @@ -32,6 +33,7 @@ static void print_help(int argc, char *argv[]) "\n" "Reads AP firmware to the FILE\n" "-d, --debug \tPrint debugging messages\n" + "-r, --region \tThe region to read (optional)\n" "-v, --verbose \tPrint verbose messages\n" SHARED_FLASH_ARGS_HELP, argv[0]); @@ -45,6 +47,7 @@ static int do_read(int argc, char *argv[]) const char *prepare_ctrl_name = NULL; char *servo_programmer = NULL; char *output_file_name = NULL; + char *region = NULL; cfg = updater_new_config(); assert(cfg); @@ -62,6 +65,9 @@ static int do_read(int argc, char *argv[]) debugging_enabled = 1; args.verbosity++; break; + case 'r': + region = optarg; + break; case 'v': args.verbosity++; break; @@ -113,12 +119,27 @@ static int do_read(int argc, char *argv[]) errorcnt++; prepare_servo_control(prepare_ctrl_name, 0); } - if (!errorcnt) + if (errorcnt) + goto err; + + if (region) { + struct firmware_section section; + if (find_firmware_section(§ion, &cfg->image_current, + region)) { + ERROR("Region '%s' not found in image.\n", region); + goto err; + } + if (write_to_file("Wrote AP firmware region to", + output_file_name, section.data, section.size)) + errorcnt++; + } else { if (write_to_file("Wrote AP firmware to", output_file_name, cfg->image_current.data, cfg->image_current.size)) errorcnt++; + } +err: free(servo_programmer); updater_delete_config(cfg); return !!errorcnt; |