summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward O'Callaghan <quasisec@google.com>2023-01-10 15:47:03 +1100
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-01-21 15:16:28 +0000
commitd79d098356e1d07a46eb3d7a2f3ed9cd64e4576c (patch)
tree9c1ab2438e9acc764104b10d9a01a28be39c4eea
parent4c9fbadcbd95c9d30eecdff43ed4f8d072bb7878 (diff)
downloadvboot-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.c23
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(&section, &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;