summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile1
-rw-r--r--futility/flashrom_wp_drv.c50
-rw-r--r--futility/updater.c2
-rw-r--r--futility/updater_utils.c2
-rw-r--r--futility/updater_utils.h9
-rw-r--r--host/lib/flashrom_drv.c51
-rw-r--r--host/lib/include/flashrom.h16
7 files changed, 69 insertions, 62 deletions
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 <libflashrom.h>
-
-#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,
+ &params);
+
+ 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);