From 2b2b0c44ec2258609acf5ff6a06027fd890d8b1e Mon Sep 17 00:00:00 2001 From: Nikolai Artemiev Date: Tue, 22 Mar 2022 18:45:14 +1100 Subject: vboot_reference: make flashrom_get_wp() use libflashrom This makes flashrom_get_wp() use the new libflashrom WP interface that was recently added to flashrom and moves it to host/lib/flashrom_drv.c with the other libflashrom wrapper functions. BUG=b:223291615 BRANCH=none TEST=flashrom --wp-disable; futility update -i image.bin \ futility prints: `Write protection: 0 (disabled; HW=0, SW=0).` TEST=flashrom --wp-enable; futility update -i image.bin \ futility prints: `Write protection: 0 (disabled; HW=0, SW=1).` Change-Id: Ib13eeb2f1f718443271b074969ff69e66149f401 Signed-off-by: Nikolai Artemiev Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3540785 Commit-Queue: Edward O'Callaghan Reviewed-by: Edward O'Callaghan Reviewed-by: Hung-Te Lin --- Makefile | 1 - futility/flashrom_wp_drv.c | 50 -------------------------------------------- futility/updater.c | 2 +- futility/updater_utils.c | 2 +- futility/updater_utils.h | 9 -------- host/lib/flashrom_drv.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ host/lib/include/flashrom.h | 16 ++++++++++++++ 7 files changed, 69 insertions(+), 62 deletions(-) delete mode 100644 futility/flashrom_wp_drv.c diff --git a/Makefile b/Makefile index 95d14239..bc55f037 100644 --- a/Makefile +++ b/Makefile @@ -676,7 +676,6 @@ FUTIL_SRCS = \ ifneq ($(filter-out 0,${USE_FLASHROM}),) FUTIL_SRCS += host/lib/flashrom_drv.c \ - futility/flashrom_wp_drv.c \ futility/updater_archive.c \ futility/updater_manifest.c \ futility/updater_quirks.c \ diff --git a/futility/flashrom_wp_drv.c b/futility/flashrom_wp_drv.c deleted file mode 100644 index ff7a8214..00000000 --- a/futility/flashrom_wp_drv.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright 2021 The Chromium OS Authors. All rights reserved. - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - * - * The utility functions for firmware updater. - */ - -#include - -#include "updater.h" - -#define FLASHROM_OUTPUT_WP_PATTERN "write protect is " - -/* System environment values. */ -static const char * const FLASHROM_OUTPUT_WP_ENABLED = - FLASHROM_OUTPUT_WP_PATTERN "enabled", - * const FLASHROM_OUTPUT_WP_DISABLED = - FLASHROM_OUTPUT_WP_PATTERN "disabled"; - - -/* Helper function to return write protection status via given programmer. */ -enum wp_state flashrom_get_wp(const char *programmer) -{ - char *command, *result; - const char *postfix; - int r; - - /* grep is needed because host_shell only returns 1 line. */ - postfix = " 2>/dev/null | grep \"" FLASHROM_OUTPUT_WP_PATTERN "\""; - - - /* TODO(b/203715651): link with flashrom directly. */ - ASPRINTF(&command, "flashrom --wp-status -p %s %s", programmer, postfix); - - /* invokes flashrom(8) with non-zero result if error. */ - result = host_shell(command); - strip_string(result, NULL); - free(command); - VB2_DEBUG("wp-status: %s\n", result); - - if (strstr(result, FLASHROM_OUTPUT_WP_ENABLED)) - r = WP_ENABLED; - else if (strstr(result, FLASHROM_OUTPUT_WP_DISABLED)) - r = WP_DISABLED; - else - r = WP_ERROR; - free(result); - - return r; -} diff --git a/futility/updater.c b/futility/updater.c index 1a5e99d1..6be7238c 100644 --- a/futility/updater.c +++ b/futility/updater.c @@ -393,7 +393,7 @@ static int write_optional_firmware(struct updater_config *cfg, */ if (check_programmer_wp && get_system_property(SYS_PROP_WP_HW, cfg) == WP_ENABLED && - flashrom_get_wp(image->programmer) == WP_ENABLED) { + flashrom_get_wp(image->programmer, -1) == WP_ENABLED) { ERROR("Target %s is write protected, skip updating.\n", image->programmer); return 0; diff --git a/futility/updater_utils.c b/futility/updater_utils.c index d879f783..8a7b6f7b 100644 --- a/futility/updater_utils.c +++ b/futility/updater_utils.c @@ -821,7 +821,7 @@ int write_system_firmware(struct updater_config *cfg, /* Helper function to return host software write protection status. */ static int host_get_wp_sw(void) { - return flashrom_get_wp(PROG_HOST); + return flashrom_get_wp(PROG_HOST, -1); } /* Helper function to configure all properties. */ diff --git a/futility/updater_utils.h b/futility/updater_utils.h index a99c38c4..49b0adf5 100644 --- a/futility/updater_utils.h +++ b/futility/updater_utils.h @@ -181,15 +181,6 @@ int save_file_from_stdin(const char *output); */ char *host_shell(const char *command); -enum wp_state { - WP_ERROR = -1, - WP_DISABLED = 0, - WP_ENABLED, -}; - -/* Helper function to return write protection status via given programmer. */ -enum wp_state flashrom_get_wp(const char *programmer); - /* The environment variable name for setting servod port. */ #define ENV_SERVOD_PORT "SERVOD_PORT" diff --git a/host/lib/flashrom_drv.c b/host/lib/flashrom_drv.c index 19d6384e..2bc0a7be 100644 --- a/host/lib/flashrom_drv.c +++ b/host/lib/flashrom_drv.c @@ -212,3 +212,54 @@ err_init: free(tmp); return r; } + +enum wp_state flashrom_get_wp(const char *programmer, int verbosity) +{ + enum wp_state r = WP_ERROR; + + g_verbose_screen = (verbosity == -1) ? FLASHROM_MSG_INFO : verbosity; + + struct flashrom_programmer *prog = NULL; + struct flashrom_flashctx *flashctx = NULL; + + struct flashrom_wp_cfg *cfg = NULL; + + char *tmp_programmer, *params; + char *tmp = flashrom_extract_params(programmer, &tmp_programmer, + ¶ms); + + flashrom_set_log_callback((flashrom_log_callback *)&flashrom_print_cb); + + if (flashrom_init(1) + || flashrom_programmer_init(&prog, programmer, params)) + goto err_init; + + if (flashrom_flash_probe(&flashctx, prog, NULL)) + goto err_probe; + + if (flashrom_wp_cfg_new(&cfg) != FLASHROM_WP_OK) + goto err_cleanup; + + if (flashrom_wp_read_cfg(cfg, flashctx) != FLASHROM_WP_OK) + goto err_read_cfg; + + if (flashrom_wp_get_mode(cfg) == FLASHROM_WP_MODE_DISABLED) + r = WP_DISABLED; + else + r = WP_ENABLED; + +err_read_cfg: + flashrom_wp_cfg_release(cfg); + +err_cleanup: + flashrom_flash_release(flashctx); + +err_probe: + if (flashrom_programmer_shutdown(prog)) + r = WP_ERROR; + +err_init: + free(tmp); + + return r; +} diff --git a/host/lib/include/flashrom.h b/host/lib/include/flashrom.h index 6058d644..9fae8046 100644 --- a/host/lib/include/flashrom.h +++ b/host/lib/include/flashrom.h @@ -59,3 +59,19 @@ int flashrom_write_image(const struct firmware_image *image, const char * const regions[], const struct firmware_image *diff_image, int do_verify, int verbosity); + +enum wp_state { + WP_ERROR = -1, + WP_DISABLED = 0, + WP_ENABLED, +}; + +/** + * Get wp state using flashrom. + * + * @param programmer The name of the programmer to use for reading the + * writeprotect state. + * + * @return WP_DISABLED, WP_ENABLED, ot a relevant error. + */ +enum wp_state flashrom_get_wp(const char *programmer, int verbosity); -- cgit v1.2.1