summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHung-Te Lin <hungte@chromium.org>2018-10-16 12:26:20 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2018-10-24 04:37:56 +0000
commit6fa6315a19ef8eb08b1468ccd92c970040c7f03d (patch)
treea0586836064fb6e6775833852792a3d70570193f
parent9f9df9aae02ba31b0a3c484dca0a8fffd5000893 (diff)
downloadvboot-6fa6315a19ef8eb08b1468ccd92c970040c7f03d.tar.gz
futility: updater: Support --mode=output and --output_dir
For backward compatibility, we need to support the 'output' mode in legacy firmware updater. The output must select right files according to system model, and apply all white label transform if needed. BUG=chromium:875551 TEST=TEST=make futil; tests/futility/run_test_scripts.sh $(pwd)/build/futility BRANCH=None Change-Id: Ib433647317fa97387aa4a7f8f2101b47e6ca2123 Signed-off-by: Hung-Te Lin <hungte@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1282084 Reviewed-on: https://chromium-review.googlesource.com/c/1296945
-rw-r--r--futility/cmd_update.c5
-rw-r--r--futility/updater.c36
-rw-r--r--futility/updater.h1
-rwxr-xr-xtests/futility/test_update.sh13
4 files changed, 55 insertions, 0 deletions
diff --git a/futility/cmd_update.c b/futility/cmd_update.c
index 2ba8a4e8..14b16877 100644
--- a/futility/cmd_update.c
+++ b/futility/cmd_update.c
@@ -34,6 +34,7 @@ static struct option const long_opts[] = {
{"programmer", 1, NULL, 'p'},
{"wp", 1, NULL, 'W'},
{"emulate", 1, NULL, 'E'},
+ {"output_dir", 1, NULL, 'U'},
{"sys_props", 1, NULL, 'S'},
{"debug", 0, NULL, 'd'},
{"verbose", 0, NULL, 'v'},
@@ -62,6 +63,7 @@ static void print_help(int argc, char *argv[])
"-m, --mode=MODE \tRun updater in given mode\n"
" --factory \tAlias for --mode=factory\n"
" --force \tForce update (skip checking contents)\n"
+ " --output_dir=DIR\tSpecify the target for --mode=output\n"
"\n"
"Debugging and testing options:\n"
" --wp=1|0 \tSpecify write protection status\n"
@@ -112,6 +114,9 @@ static int do_update(int argc, char *argv[])
case 'm':
args.mode = optarg;
break;
+ case 'U':
+ args.output_dir = optarg;
+ break;
case 'M':
args.model = optarg;
break;
diff --git a/futility/updater.c b/futility/updater.c
index 0d69641b..6029612d 100644
--- a/futility/updater.c
+++ b/futility/updater.c
@@ -1668,6 +1668,30 @@ static int updater_load_images(struct updater_config *cfg,
}
/*
+ * Writes a firmware image to specified file.
+ * Returns 0 on success, otherwise failure.
+ */
+static int updater_output_image(const struct firmware_image *image,
+ const char *fname, const char *root)
+{
+ int r = 0;
+ char *fpath;
+
+ if (!image->data)
+ return 0;
+
+ ASPRINTF(&fpath, "%s/%s", root, fname);
+ r = vb2_write_file(fpath, image->data, image->size);
+ if (r)
+ ERROR("Failed writing firmware image to: %s", fpath);
+ else
+ printf("Firmware image saved in: %s\n", fpath);
+
+ free(fpath);
+ return !!r;
+}
+
+/*
* Applies white label information to an existing model config.
* Returns 0 on success, otherwise failure.
*/
@@ -1760,6 +1784,7 @@ int updater_setup_config(struct updater_config *cfg,
{
int errorcnt = 0;
int check_single_image = 0, check_wp_disabled = 0;
+ int do_output = 0;
const char *default_quirks = NULL;
const char *archive_path = arg->archive;
@@ -1796,6 +1821,8 @@ int updater_setup_config(struct updater_config *cfg,
} else if (strcmp(arg->mode, "factory") == 0 ||
strcmp(arg->mode, "factory_install") == 0) {
cfg->factory_update = 1;
+ } else if (strcmp(arg->mode, "output") == 0) {
+ do_output = 1;
} else {
errorcnt++;
ERROR("Invalid mode: %s", arg->mode);
@@ -1892,6 +1919,15 @@ int updater_setup_config(struct updater_config *cfg,
errorcnt++;
ERROR("Factory mode needs WP disabled.");
}
+ if (!errorcnt && do_output) {
+ const char *r = arg->output_dir;
+ if (!r)
+ r = ".";
+ errorcnt += updater_output_image(&cfg->image, "bios.bin", r);
+ errorcnt += updater_output_image(&cfg->ec_image, "ec.bin", r);
+ errorcnt += updater_output_image(&cfg->pd_image, "pd.bin", r);
+ *do_update = 0;
+ }
return errorcnt;
}
diff --git a/futility/updater.h b/futility/updater.h
index ae6db16a..26e88dad 100644
--- a/futility/updater.h
+++ b/futility/updater.h
@@ -116,6 +116,7 @@ struct updater_config_arguments {
char *archive, *quirks, *mode;
char *programmer, *model, *signature_id;
char *emulation, *sys_props, *write_protection;
+ char *output_dir;
int is_factory, try_update, force_update, do_manifest;
int verbosity;
};
diff --git a/tests/futility/test_update.sh b/tests/futility/test_update.sh
index 215f9918..3838361c 100755
--- a/tests/futility/test_update.sh
+++ b/tests/futility/test_update.sh
@@ -310,6 +310,11 @@ test_update "Full update (--archive, single package)" \
"${FROM_IMAGE}" "${TMP}.expected.full" \
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3
+echo "TEST: Output (--mode=output)"
+mkdir -p "${TMP}.output"
+${FUTILITY} update -i "${LINK_BIOS}" --mode=output --output_dir="${TMP}.output"
+cmp "${LINK_BIOS}" "${TMP}.output/bios.bin"
+
mkdir -p "${A}/keyset"
cp -f "${LINK_BIOS}" "${A}/bios.bin"
cp -f "${TMP}.to/rootkey" "${A}/keyset/rootkey.WL"
@@ -336,6 +341,14 @@ WL_TAG="WL" PATH="${A}/bin:${PATH}" \
"${A}/bios.bin" "${LINK_BIOS}" \
-a "${A}" --wp=0 --sys_props 0,0x10001,1,3
+echo "TEST: Output (-a, --mode=output)"
+mkdir -p "${TMP}.outa"
+cp -f "${A}/bios.bin" "${TMP}.emu"
+WL_TAG="WL" PATH="${A}/bin:${PATH}" \
+ ${FUTILITY} update -a "${A}" --mode=output --emu="${TMP}.emu" \
+ --output_dir="${TMP}.outa"
+cmp "${LINK_BIOS}" "${TMP}.outa/bios.bin"
+
# Test archive with Unified Build contents.
cp -r "${SCRIPTDIR}/models" "${A}/"
mkdir -p "${A}/images"