summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Kitching <kitching@google.com>2020-11-02 15:34:21 +0800
committerCommit Bot <commit-bot@chromium.org>2020-12-04 13:13:26 +0000
commit3b4b439b6450ceacd36d91036e4509b8b6f7880c (patch)
tree8325eb39e2f4c2c817ddcf0170966818432021f9
parent03d6cc6106bd72503a669c8640335fe858ebeaf2 (diff)
downloadvboot-3b4b439b6450ceacd36d91036e4509b8b6f7880c.tar.gz
vboot: deprecate and remove legacy UI code
BUG=b:146399181, b:167643628 TEST=make clean && make runtests TEST=Build and flash to device BRANCH=none Cq-Depend: chromium:2512739 Signed-off-by: Joel Kitching <kitching@google.com> Change-Id: Ia8d95451d55142fbe9acaa6e49de9b5abe134083 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2512740 Reviewed-by: Joel Kitching <kitching@chromium.org> Tested-by: Joel Kitching <kitching@chromium.org> Commit-Queue: Yu-Ping Wu <yupingso@chromium.org>
-rw-r--r--Makefile38
-rw-r--r--firmware/2lib/include/2api.h8
-rw-r--r--firmware/2lib/include/2return_codes.h5
-rw-r--r--firmware/include/vboot_api.h155
-rw-r--r--firmware/lib/include/vboot_kernel.h45
-rw-r--r--firmware/lib/include/vboot_ui_legacy.h86
-rw-r--r--firmware/lib/include/vboot_ui_legacy_menu_private.h93
-rw-r--r--firmware/lib/include/vboot_ui_legacy_wilco.h32
-rw-r--r--firmware/lib/vboot_api_kernel.c31
-rw-r--r--firmware/lib/vboot_ui_legacy.c305
-rw-r--r--firmware/lib/vboot_ui_legacy_clamshell.c545
-rw-r--r--firmware/lib/vboot_ui_legacy_menu.c935
-rw-r--r--firmware/lib/vboot_ui_legacy_wilco.c367
-rw-r--r--firmware/stub/vboot_api_stub.c28
-rw-r--r--tests/vb2_auxfw_sync_tests.c1
-rw-r--r--tests/vb2_ec_sync_tests.c1
-rw-r--r--tests/vboot_api_kernel4_tests.c38
-rw-r--r--tests/vboot_ui_legacy_clamshell_beep_tests.c274
-rw-r--r--tests/vboot_ui_legacy_clamshell_tests.c1655
-rw-r--r--tests/vboot_ui_legacy_menu_tests.c2349
-rw-r--r--tests/vboot_ui_legacy_tests.c124
21 files changed, 16 insertions, 7099 deletions
diff --git a/Makefile b/Makefile
index df7e4049..3a72d3d3 100644
--- a/Makefile
+++ b/Makefile
@@ -220,22 +220,6 @@ else
CFLAGS += -DDETACHABLE=0
endif
-# Enable the menu-based user interface.
-ifneq ($(filter-out 0,${MENU_UI}),)
-CFLAGS += -DMENU_UI=1
-else
-CFLAGS += -DMENU_UI=0
-endif
-
-# LEGACY_MENU_UI controls whether to enable legacy menu UI, which is used with
-# devices that don't have a keyboard (detachables).
-# Pass LEGACY_MENU_UI= (or =0) to make to disable feature.
-ifneq ($(filter-out 0,${LEGACY_MENU_UI}),)
-CFLAGS += -DLEGACY_MENU_UI=1
-else
-CFLAGS += -DLEGACY_MENU_UI=0
-endif
-
# pass DIAGNOSTIC_UI= (or =0) to make to disable feature
ifneq ($(filter-out 0,${DIAGNOSTIC_UI}),)
CFLAGS += -DDIAGNOSTIC_UI=1
@@ -424,11 +408,7 @@ FWLIB_SRCS = \
$(if ${FIRMWARE_ARCH},FWLIB_SRCS,TESTLIB_SRCS) += \
firmware/2lib/2ui.c \
firmware/2lib/2ui_screens.c \
- firmware/lib/vboot_audio.c \
- firmware/lib/vboot_ui_legacy.c \
- firmware/lib/vboot_ui_legacy_clamshell.c \
- firmware/lib/vboot_ui_legacy_menu.c \
- firmware/lib/vboot_ui_legacy_wilco.c
+ firmware/lib/vboot_audio.c
# TPM lightweight command library
ifeq (${TPM2_MODE},)
@@ -447,14 +427,6 @@ FWLIB_SRCS += \
firmware/lib/tpm_lite/mocked_tlcl.c
endif
-ifneq (${VENDOR_DATA_LENGTH},)
-CFLAGS += -DVENDOR_DATA_LENGTH=${VENDOR_DATA_LENGTH}
-else ifeq (${FIRMWARE_ARCH},)
-CFLAGS += -DVENDOR_DATA_LENGTH=4
-else
-CFLAGS += -DVENDOR_DATA_LENGTH=0
-endif
-
ifeq (${FIRMWARE_ARCH},)
# Include BIOS stubs in the firmware library when compiling for host
# TODO: split out other stub funcs too
@@ -720,10 +692,6 @@ TEST_NAMES = \
tests/vboot_api_kernel4_tests \
tests/vboot_api_kernel_tests \
tests/vboot_kernel_tests \
- tests/vboot_ui_legacy_clamshell_beep_tests \
- tests/vboot_ui_legacy_clamshell_tests \
- tests/vboot_ui_legacy_menu_tests \
- tests/vboot_ui_legacy_tests \
tests/verify_kernel
ifeq (${MOCK_TPM}${TPM2_MODE},)
@@ -1268,10 +1236,6 @@ endif
${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel4_tests
${RUNTEST} ${BUILD_RUN}/tests/vboot_api_kernel_tests
${RUNTEST} ${BUILD_RUN}/tests/vboot_kernel_tests
- ${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_clamshell_beep_tests
- ${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_clamshell_tests
- ${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_menu_tests
- ${RUNTEST} ${BUILD_RUN}/tests/vboot_ui_legacy_tests
.PHONY: run2tests
run2tests: install_for_test
diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h
index 9448e12a..94f0df5c 100644
--- a/firmware/2lib/include/2api.h
+++ b/firmware/2lib/include/2api.h
@@ -182,8 +182,12 @@ enum vb2_context_flags {
*/
VB2_CONTEXT_NVDATA_V2 = (1 << 18),
- /* Allow vendor data to be set via the vendor data ui. */
- VB2_CONTEXT_VENDOR_DATA_SETTABLE = (1 << 19),
+ /*
+ * Allow vendor data to be set via the vendor data ui.
+ *
+ * Deprecated with CL:2512740.
+ */
+ VB2_CONTEXT_DEPRECATED_VENDOR_DATA_SETTABLE = (1 << 19),
/*
* Caller may set this before running vb2api_fw_phase1. In this case,
diff --git a/firmware/2lib/include/2return_codes.h b/firmware/2lib/include/2return_codes.h
index 4abe16a7..49f99358 100644
--- a/firmware/2lib/include/2return_codes.h
+++ b/firmware/2lib/include/2return_codes.h
@@ -728,8 +728,9 @@ enum vb2_return_code {
/* AUXFW peripheral busy. Cannot upgrade firmware at present. */
VB2_ERROR_EX_AUXFW_PERIPHERAL_BUSY,
- /* Error setting vendor data (see: VbExSetVendorData). */
- VB2_ERROR_EX_SET_VENDOR_DATA,
+ /* Error setting vendor data (see: VbExSetVendorData).
+ * Deprecated: functionality removed with legacy UI (b/167643628) */
+ VB2_ERROR_DEPRECATED_EX_SET_VENDOR_DATA,
/* The memory test is running but the output buffer was unchanged. */
VB2_ERROR_EX_DIAG_TEST_RUNNING,
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index d55fde2a..739019ad 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -252,146 +252,6 @@ vb2_error_t VbExStreamRead(VbExStream_t stream, uint32_t bytes, void *buffer);
*/
void VbExStreamClose(VbExStream_t stream);
-
-/*****************************************************************************/
-/* Display */
-
-/* Predefined (default) screens for VbExDisplayScreen(). */
-enum VbScreenType_t {
- /* Blank (clear) screen */
- VB_SCREEN_BLANK = 0,
- /* Developer - warning */
- VB_SCREEN_DEVELOPER_WARNING = 0x101,
- /* REMOVED: Developer - easter egg (0x102) */
- /* REMOVED: Recovery - remove inserted devices (0x201) */
- /* Recovery - insert recovery image */
- VB_SCREEN_RECOVERY_INSERT = 0x202,
- /* Recovery - inserted image invalid */
- VB_SCREEN_RECOVERY_NO_GOOD = 0x203,
- /* Recovery - confirm dev mode */
- VB_SCREEN_RECOVERY_TO_DEV = 0x204,
- /* Developer - confirm normal mode */
- VB_SCREEN_DEVELOPER_TO_NORM = 0x205,
- /* Please wait - programming EC */
- VB_SCREEN_WAIT = 0x206,
- /* Confirm after DEVELOPER_TO_NORM */
- VB_SCREEN_TO_NORM_CONFIRMED = 0x207,
- /* Broken screen shown after verification failure */
- VB_SCREEN_OS_BROKEN = 0x208,
- /* REMOVED: Display base screen (no icons, no text) (0x209) */
- /* Detachable Menu - Developer Warning */
- VB_SCREEN_DEVELOPER_WARNING_MENU = 0x20a,
- /* Detachable Menu - Developer Boot */
- VB_SCREEN_DEVELOPER_MENU = 0x20b,
- /* REMOVED: Detachable Menu - Recovery (0x20c) */
- /* Detachable Menu - Confirm Dev Mode */
- VB_SCREEN_RECOVERY_TO_DEV_MENU = 0x20d,
- /* Detachable Menu - Confirm Normal Mode */
- VB_SCREEN_DEVELOPER_TO_NORM_MENU = 0x20e,
- /* Detachable Menu - Languages */
- VB_SCREEN_LANGUAGES_MENU = 0x20f,
- /* Detachable Menu - Options */
- VB_SCREEN_OPTIONS_MENU = 0x210,
- /* REMOVED: Alt OS picker screen (0x211) */
- /* Alt firmware picker screen (for keyboard UI) */
- VB_SCREEN_ALT_FW_PICK = 0x212,
- /* Alt firmware menu screen (for detachable UI ) */
- VB_SCREEN_ALT_FW_MENU = 0x213,
- /* 0x300-0x350 reserved for device-specific screens */
- /* Vendor data not set warning screen */
- VB_COMPLETE_VENDOR_DATA = 0x300,
- /* Set vendor data menu screen */
- VB_SCREEN_SET_VENDOR_DATA = 0x301,
- /* Confirm vendor data menu screen */
- VB_SCREEN_CONFIRM_VENDOR_DATA = 0x302,
- /* Confirm reboot for running diagnostics rom */
- VB_SCREEN_CONFIRM_DIAG = 0x303,
-};
-
-/* Flags to control behavior of device-specific screens. */
-enum VbVendorDataFlags_t {
- /* When set display a cursor after the prompt */
- VB_VENDOR_DATA_SHOW_CURSOR = 1 << 0,
- /* When set only redraw the cursor */
- VB_VENDOR_DATA_ONLY_DRAW_CURSOR = 1 << 1,
-};
-
-/**
- * Extra data needed when displaying vendor data screens
- */
-typedef struct VbVendorData
-{
- /* Current state of the the vendor data input */
- const char *input_text;
- /* Flags (See VbVendorDataFlags_t) */
- uint32_t flags;
- /* Current confirmation selection for new vendor data */
- uint32_t selected_index;
-} VbVendorData;
-
-/**
- * Extra data that may be used when displaying a screen
- */
-typedef struct VbScreenData
-{
- union {
- VbVendorData vendor_data;
- };
-} VbScreenData;
-
-/**
- * Display a predefined screen; see VB_SCREEN_* for valid screens.
- *
- * This is a backup method of screen display, intended for use if the GBB does
- * not contain a full set of bitmaps. It is acceptable for the backup screen
- * to be simple ASCII text such as "NO GOOD" or "INSERT"; these screens should
- * only be seen during development.
- */
-vb2_error_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
- const VbScreenData *data);
-
-/**
- * Display a predefined menu screen; see VB_SCREEN_* for valid screens.
- *
- * @param screen_type ID of screen to draw
- * @param locale language to display
- * @param selected_index Index of menu item that is currently selected.
- * @param disabled_idx_mask Bitmap for enabling/disabling certain menu items.
- * each bit corresponds to the menu item's index.
- * @param redraw_base Setting 1 will force a full redraw of the screen
- *
- * @return VB2_SUCCESS or error code on error.
- */
-vb2_error_t VbExDisplayMenu(uint32_t screen_type, uint32_t locale,
- uint32_t selected_index, uint32_t disabled_idx_mask,
- uint32_t redraw_base);
-
-/**
- * Display a string containing debug information on the screen, rendered in a
- * platform-dependent font. Should be able to handle newlines '\n' in the
- * string. Firmware must support displaying at least 20 lines of text, where
- * each line may be at least 80 characters long. If the firmware has its own
- * debug state, it may display it to the screen below this information if the
- * full_info parameter is set.
- *
- * @param info_str The debug string to display
- * @param full_info 1 if firmware should append its own info, 0 if not
- *
- * @return VB2_SUCCESS or error code on error.
- */
-vb2_error_t VbExDisplayDebugInfo(const char *info_str, int full_info);
-
-/**
- * Write vendor data to read-only VPD
- *
- * @param vendor_data_value The value of vendor data to write to VPD. The
- * string length will be exactly VENDOR_DATA_LENGTH
- * characters and null-terminated.
- *
- * @return VB2_SUCCESS or error code on error.
- */
-vb2_error_t VbExSetVendorData(const char *vendor_data_value);
-
/*****************************************************************************/
/* Keyboard and switches */
@@ -522,21 +382,6 @@ enum VbAltFwIndex_t {
*/
vb2_error_t VbExLegacy(enum VbAltFwIndex_t altfw_num);
-enum vb_altfw {
- VB_ALTFW_COUNT = 9, /* We allow 9 bootloaders, numbered 1-9 */
-};
-
-/**
- * Get a mask of available alternative firmware options
- *
- * There are up to 9 bootloaders, numbered 1 to 9, using bits 1 to 9 of this
- * mask. Bit 0 is unused.
- *
- * @return Bit mask indicating which bootloaders are present (bit n indicates
- * bootloader n is present)
- */
-uint32_t VbExGetAltFwIdxMask(void);
-
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/firmware/lib/include/vboot_kernel.h b/firmware/lib/include/vboot_kernel.h
index 81e523d9..661f0c4e 100644
--- a/firmware/lib/include/vboot_kernel.h
+++ b/firmware/lib/include/vboot_kernel.h
@@ -106,49 +106,4 @@ typedef struct VbSharedDataKernelCall {
*/
vb2_error_t VbTryLoadKernel(struct vb2_context *ctx, uint32_t get_info_flags);
-/* Flags for VbUserConfirms() */
-#define VB_CONFIRM_MUST_TRUST_KEYBOARD (1 << 0)
-#define VB_CONFIRM_SPACE_MEANS_NO (1 << 1)
-
-/**
- * Ask the user to confirm something.
- *
- * We should display whatever the question is first, then call this. ESC is
- * always "no", ENTER is always "yes", and we'll specify what SPACE means. We
- * don't return until one of those keys is pressed, or until asked to shut
- * down.
- *
- * Additionally, in some situations we don't accept confirmations from an
- * untrusted keyboard (such as a USB device). In those cases, a recovery
- * button press is needed for confirmation, instead of ENTER.
- *
- * Returns: 1=yes, 0=no, -1 = shutdown.
- */
-int VbUserConfirms(struct vb2_context *ctx, uint32_t confirm_flags);
-
-/**
- * Handle a developer-mode boot using legacy clamshell UI.
- */
-vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *ctx);
-
-/**
- * Handle a diagnostic-mode boot using legacy clamshell UI.
- */
-vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *ctx);
-
-/**
- * Handle a recovery-mode boot using legacy clamshell UI.
- */
-vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *ctx);
-
-/**
- * Handle a developer-mode boot using legacy menu UI.
- */
-vb2_error_t VbBootDeveloperLegacyMenu(struct vb2_context *ctx);
-
-/**
- * Handle a recovery-mode boot using legacy menu UI.
- */
-vb2_error_t VbBootRecoveryLegacyMenu(struct vb2_context *ctx);
-
#endif /* VBOOT_REFERENCE_VBOOT_KERNEL_H_ */
diff --git a/firmware/lib/include/vboot_ui_legacy.h b/firmware/lib/include/vboot_ui_legacy.h
deleted file mode 100644
index a0f6f124..00000000
--- a/firmware/lib/include/vboot_ui_legacy.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Copyright 2018 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.
- *
- * Common code used by both legacy_clamshell_ui and legacy_menu_ui.
- */
-
-#ifndef VBOOT_REFERENCE_VBOOT_UI_LEGACY_H_
-#define VBOOT_REFERENCE_VBOOT_UI_LEGACY_H_
-
-extern const char dev_disable_msg[];
-
-vb2_error_t VbDisplayScreen(struct vb2_context *ctx, uint32_t screen, int force,
- const VbScreenData *data);
-vb2_error_t VbDisplayMenu(struct vb2_context *ctx,
- uint32_t screen, int force, uint32_t selected_index,
- uint32_t disabled_idx_mask);
-vb2_error_t VbDisplayDebugInfo(struct vb2_context *ctx);
-vb2_error_t VbCheckDisplayKey(struct vb2_context *ctx, uint32_t key,
- uint32_t screen, const VbScreenData *data);
-
-#define KEY_DELAY_MS 20 /* Delay between key scans in UI loops */
-
-enum vb2_beep_type {
- VB_BEEP_FAILED, /* Permitted but the operation failed */
- VB_BEEP_NOT_ALLOWED, /* Operation disabled by user setting */
-};
-
-/**
- * Reinitialize global state. This should only need to be called
- * by vboot_ui::vb2_init_ui() for init tests.
- */
-void vb2_reset_power_button(void);
-
-/**
- * Emit beeps to indicate an error
- */
-void vb2_error_beep(enum vb2_beep_type beep);
-
-/**
- * Prints a message to screen, logs a possibly different message to log,
- * and beeps to notify user.
- *
- * @print_msg Display message. NULL message will be ignored.
- * @log_msg Log message. If NULL, uses @print_msg (if that's not NULL).
- * @beep Type of beep sound.
- */
-void vb2_error_notify(const char *print_msg,
- const char *log_msg,
- enum vb2_beep_type beep);
-
-/** Display an error and beep to indicate that altfw is not available */
-void vb2_error_no_altfw(void);
-
-/**
- * Jump to a bootloader if possible
- *
- * This checks if the operation is permitted. If it is, then it jumps to the
- * selected bootloader and execution continues there, never returning.
- *
- * Will beep and return if one of the following is true:
- * - operation is not permitted (allowed == 0)
- * - vboot data fails to commit
- * - secdata_kernel fails to lock
- * - bootloader cannot be found
- * - bootloader fails to start
- *
- * @param ctx Context pointer
- * @param allowed 1 if allowed, 0 if not allowed
- * @param altfw_num Number of bootloader to start (0=any, 1=first, etc.)
- */
-void vb2_try_altfw(struct vb2_context *ctx, int allowed,
- enum VbAltFwIndex_t altfw_num);
-
-/**
- * Checks GBB flags against VbExIsShutdownRequested() shutdown request to
- * determine if a shutdown is required.
- *
- * Returns zero or more of the following flags (if any are set then typically
- * shutdown is required):
- * VB_SHUTDOWN_REQUEST_LID_CLOSED
- * VB_SHUTDOWN_REQUEST_POWER_BUTTON
- */
-int vb2_want_shutdown(struct vb2_context *ctx, uint32_t key);
-
-#endif /* VBOOT_REFERENCE_VBOOT_UI_LEGACY_H_ */
diff --git a/firmware/lib/include/vboot_ui_legacy_menu_private.h b/firmware/lib/include/vboot_ui_legacy_menu_private.h
deleted file mode 100644
index 9c1a6b48..00000000
--- a/firmware/lib/include/vboot_ui_legacy_menu_private.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright 2017 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.
- *
- * Private declarations for vboot_ui_legacy_menu.c. Defined here for easier
- * testing.
- */
-
-#ifndef VBOOT_REFERENCE_VBOOT_UI_LEGACY_MENU_PRIVATE_H_
-#define VBOOT_REFERENCE_VBOOT_UI_LEGACY_MENU_PRIVATE_H_
-
-#include "2api.h"
-
-struct vb2_menu_item {
- const char *text;
- vb2_error_t (*action)(struct vb2_context *ctx);
-};
-
-struct vb2_menu {
- const char *name;
- uint16_t size;
- uint16_t screen;
- struct vb2_menu_item *items;
-};
-
-typedef enum _VB_MENU {
- VB_MENU_DEV_WARNING,
- VB_MENU_DEV,
- VB_MENU_TO_NORM,
- VB_MENU_TO_DEV,
- VB_MENU_LANGUAGES,
- VB_MENU_OPTIONS,
- VB_MENU_RECOVERY_INSERT,
- VB_MENU_RECOVERY_NO_GOOD,
- VB_MENU_RECOVERY_BROKEN,
- VB_MENU_TO_NORM_CONFIRMED,
- VB_MENU_ALT_FW,
- VB_MENU_COUNT,
-} VB_MENU;
-
-typedef enum _VB_DEV_WARNING_MENU {
- VB_WARN_OPTIONS,
- VB_WARN_DBG_INFO,
- VB_WARN_ENABLE_VER,
- VB_WARN_POWER_OFF,
- VB_WARN_LANGUAGE,
- VB_WARN_COUNT,
-} VB_DEV_WARNING_MENU;
-
-typedef enum _VB_DEV_MENU {
- VB_DEV_NETWORK,
- VB_DEV_LEGACY,
- VB_DEV_USB,
- VB_DEV_DISK,
- VB_DEV_CANCEL,
- VB_DEV_POWER_OFF,
- VB_DEV_LANGUAGE,
- VB_DEV_COUNT,
-} VB_DEV_MENU;
-
-typedef enum _VB_TO_NORM_MENU {
- VB_TO_NORM_CONFIRM,
- VB_TO_NORM_CANCEL,
- VB_TO_NORM_POWER_OFF,
- VB_TO_NORM_LANGUAGE,
- VB_TO_NORM_COUNT,
-} VB_TO_NORM_MENU;
-
-typedef enum _VB_TO_DEV_MENU {
- VB_TO_DEV_CONFIRM,
- VB_TO_DEV_CANCEL,
- VB_TO_DEV_POWER_OFF,
- VB_TO_DEV_LANGUAGE,
- VB_TO_DEV_COUNT,
-} VB_TO_DEV_MENU;
-
-// TODO: currently we're only supporting
-// english. Will need to somehow find mapping
-// from language to localization index.
-typedef enum _VB_LANGUAGES_MENU {
- VB_LANGUAGES_EN_US,
- VB_LANGUAGES_COUNT,
-} VB_LANGUAGES_MENU;
-
-typedef enum _VB_OPTIONS_MENU {
- VB_OPTIONS_DBG_INFO,
- VB_OPTIONS_CANCEL,
- VB_OPTIONS_POWER_OFF,
- VB_OPTIONS_LANGUAGE,
- VB_OPTIONS_COUNT,
-} VB_OPTIONS_MENU;
-
-#endif /* VBOOT_REFERENCE_VBOOT_UI_LEGACY_MENU_PRIVATE_H_ */
diff --git a/firmware/lib/include/vboot_ui_legacy_wilco.h b/firmware/lib/include/vboot_ui_legacy_wilco.h
deleted file mode 100644
index 397777e3..00000000
--- a/firmware/lib/include/vboot_ui_legacy_wilco.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright 2020 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.
- *
- * Wilco-specific feature support for vboot_ui
- */
-
-#ifndef VBOOT_REFERENCE_VBOOT_UI_WILCO_H_
-#define VBOOT_REFERENCE_VBOOT_UI_WILCO_H_
-
-#define CURSOR_BLINK_MS 400 /* Speed that the vendor data cursor blinks */
-
-/*
- * User interface for setting the vendor data in VPD
- */
-vb2_error_t vb2_vendor_data_ui(struct vb2_context *ctx);
-
-/*
- * Determine whether the user has pressed the keys to enter diagnostics mode
- */
-vb2_error_t vb2_check_diagnostic_key(struct vb2_context *ctx, uint32_t key);
-
-/*
- * User interface for confirming launch of diagnostics rom
- *
- * This asks the user to confirm the launch of the diagnostics rom. The user
- * can press the power button to confirm or press escape. There is a 30-second
- * timeout which acts the same as escape.
- */
-vb2_error_t vb2_diagnostics_ui(struct vb2_context *ctx);
-
-#endif /* VBOOT_REFERENCE_VBOOT_UI_WILCO_H_ */
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index a910b552..e2d14310 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -230,30 +230,16 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx,
VB2_DEBUG("NO_BOOT in RECOVERY mode\n");
/* Recovery boot. This has UI. */
- if (MENU_UI) {
- if (vb2_allow_recovery(ctx))
- VB2_TRY(vb2_manual_recovery_menu(ctx));
- else
- VB2_TRY(vb2_broken_recovery_menu(ctx));
- } else if (LEGACY_MENU_UI) {
- VB2_TRY(VbBootRecoveryLegacyMenu(ctx));
- } else {
- VB2_TRY(VbBootRecoveryLegacyClamshell(ctx));
- }
+ if (vb2_allow_recovery(ctx))
+ VB2_TRY(vb2_manual_recovery_menu(ctx));
+ else
+ VB2_TRY(vb2_broken_recovery_menu(ctx));
} else if (DIAGNOSTIC_UI && vb2api_diagnostic_ui_enabled(ctx) &&
vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST)) {
vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 0);
/* Diagnostic boot. This has UI. */
- if (MENU_UI)
- VB2_TRY(vb2_diagnostic_menu(ctx));
- else
- /*
- * Only power button is used for input so no
- * detachable-specific UI is needed. This mode is also
- * 1-shot so it's placed before developer mode.
- */
- VB2_TRY(VbBootDiagnosticLegacyClamshell(ctx));
+ VB2_TRY(vb2_diagnostic_menu(ctx));
/*
* The diagnostic menu should either boot a rom, or
* return either of reboot or shutdown.
@@ -261,12 +247,7 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx,
return VB2_REQUEST_REBOOT;
} else if (ctx->flags & VB2_CONTEXT_DEVELOPER_MODE) {
/* Developer boot. This has UI. */
- if (MENU_UI)
- VB2_TRY(vb2_developer_menu(ctx));
- else if (LEGACY_MENU_UI)
- VB2_TRY(VbBootDeveloperLegacyMenu(ctx));
- else
- VB2_TRY(VbBootDeveloperLegacyClamshell(ctx));
+ VB2_TRY(vb2_developer_menu(ctx));
} else {
/* Normal boot */
VB2_TRY(vb2_normal_boot(ctx));
diff --git a/firmware/lib/vboot_ui_legacy.c b/firmware/lib/vboot_ui_legacy.c
deleted file mode 100644
index 5f84716a..00000000
--- a/firmware/lib/vboot_ui_legacy.c
+++ /dev/null
@@ -1,305 +0,0 @@
-/* Copyright 2018 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.
- *
- * High-level firmware wrapper API - user interface for RW firmware
- */
-
-#include "2api.h"
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2sysincludes.h"
-#include "vboot_api.h"
-#include "vboot_kernel.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-
-const char dev_disable_msg[] =
- "Developer mode is disabled on this device by system policy.\n"
- "For more information, see http://dev.chromium.org/chromium-os/fwmp\n"
- "\n";
-
-static void Uint8ToString(char *buf, uint8_t val)
-{
- const char *trans = "0123456789abcdef";
- *buf++ = trans[val >> 4];
- *buf = trans[val & 0xF];
-}
-
-static void FillInSha1Sum(char *outbuf, struct vb2_packed_key *key)
-{
- uint8_t *buf = ((uint8_t *)key) + key->key_offset;
- uint64_t buflen = key->key_size;
- uint8_t digest[VB2_SHA1_DIGEST_SIZE];
- int i;
-
- vb2_digest_buffer(buf, buflen, VB2_HASH_SHA1, digest, sizeof(digest));
- for (i = 0; i < sizeof(digest); i++) {
- Uint8ToString(outbuf, digest[i]);
- outbuf += 2;
- }
- *outbuf = '\0';
-}
-
-#define DEBUG_INFO_SIZE 1024
-#define DEBUG_INFO_APPEND(format, args...) do { \
- if (used < DEBUG_INFO_SIZE) \
- used += snprintf(buf + used, DEBUG_INFO_SIZE - used, format, \
- ## args); \
-} while (0)
-
-vb2_error_t VbDisplayDebugInfo(struct vb2_context *ctx)
-{
- struct vb2_shared_data *sd = vb2_get_sd(ctx);
- struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
- struct vb2_workbuf wb;
- char buf[DEBUG_INFO_SIZE] = "";
- char sha1sum[VB2_SHA1_DIGEST_SIZE * 2 + 1];
- int32_t used = 0;
- vb2_error_t ret;
- uint32_t i;
-
- vb2_workbuf_from_ctx(ctx, &wb);
-
- /* Add hardware ID */
- {
- char hwid[VB2_GBB_HWID_MAX_SIZE];
- uint32_t size = sizeof(hwid);
- ret = vb2api_gbb_read_hwid(ctx, hwid, &size);
- if (ret)
- strcpy(hwid, "{INVALID}");
- DEBUG_INFO_APPEND("HWID: %s", hwid);
- }
-
- /* Add recovery reason and subcode */
- i = vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE);
- DEBUG_INFO_APPEND("\nrecovery_reason: %#.2x / %#.2x %s",
- sd->recovery_reason, i,
- vb2_get_recovery_reason_string(sd->recovery_reason));
-
- /* Add vb2_context and vb2_shared_data flags */
- DEBUG_INFO_APPEND("\ncontext.flags: %#.16" PRIx64, ctx->flags);
- DEBUG_INFO_APPEND("\nshared_data.flags: %#.8x", sd->flags);
- DEBUG_INFO_APPEND("\nshared_data.status: %#.8x", sd->status);
-
- /* Add raw contents of nvdata */
- DEBUG_INFO_APPEND("\nnvdata:");
- if (vb2_nv_get_size(ctx) > 16) /* Multi-line starts on next line */
- DEBUG_INFO_APPEND("\n ");
- for (i = 0; i < vb2_nv_get_size(ctx); i++) {
- /* Split into 16-byte blocks */
- if (i > 0 && i % 16 == 0)
- DEBUG_INFO_APPEND("\n ");
- DEBUG_INFO_APPEND(" %02x", ctx->nvdata[i]);
- }
-
- /* Add dev_boot_usb flag */
- i = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL);
- DEBUG_INFO_APPEND("\ndev_boot_usb: %d", i);
-
- /* Add dev_boot_legacy flag */
- i = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_LEGACY);
- DEBUG_INFO_APPEND("\ndev_boot_legacy: %d", i);
-
- /* Add dev_default_boot flag */
- i = vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT);
- DEBUG_INFO_APPEND("\ndev_default_boot: %d", i);
-
- /* Add dev_boot_signed_only flag */
- i = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_SIGNED_ONLY);
- DEBUG_INFO_APPEND("\ndev_boot_signed_only: %d", i);
-
- /* Add TPM versions */
- DEBUG_INFO_APPEND("\nTPM: fwver=%#.8x kernver=%#.8x",
- sd->fw_version_secdata, sd->kernel_version_secdata);
-
- /* Add GBB flags */
- DEBUG_INFO_APPEND("\ngbb.flags: %#.8x", gbb->flags);
-
- /* Add sha1sum for Root & Recovery keys */
- {
- struct vb2_packed_key *key;
- struct vb2_workbuf wblocal = wb;
- ret = vb2_gbb_read_root_key(ctx, &key, NULL, &wblocal);
- if (!ret) {
- FillInSha1Sum(sha1sum, key);
- DEBUG_INFO_APPEND("\ngbb.rootkey: %s", sha1sum);
- }
- }
-
- {
- struct vb2_packed_key *key;
- struct vb2_workbuf wblocal = wb;
- ret = vb2_gbb_read_recovery_key(ctx, &key, NULL, &wblocal);
- if (!ret) {
- FillInSha1Sum(sha1sum, key);
- DEBUG_INFO_APPEND("\ngbb.recovery_key: %s", sha1sum);
- }
- }
-
- /* If we're in dev-mode, show the kernel subkey that we expect, too. */
- if (!(ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
- sd->kernel_key_offset) {
- struct vb2_packed_key *key =
- vb2_member_of(sd, sd->kernel_key_offset);
- FillInSha1Sum(sha1sum, key);
- DEBUG_INFO_APPEND("\nkernel_subkey: %s", sha1sum);
- }
-
- /* Make sure we finish with a newline */
- DEBUG_INFO_APPEND("\n");
-
- /* TODO: add more interesting data:
- * - Information on current disks */
-
- buf[DEBUG_INFO_SIZE - 1] = '\0';
- VB2_DEBUG("[TAB] Debug Info:\n%s", buf);
- return VbExDisplayDebugInfo(buf, 1);
-}
-
-vb2_error_t VbCheckDisplayKey(struct vb2_context *ctx, uint32_t key,
- uint32_t screen, const VbScreenData *data)
-{
- uint32_t loc = 0;
- uint32_t count = 0;
-
- switch (key) {
- case '\t':
- /* Tab = display debug info */
- return VbDisplayDebugInfo(ctx);
- case VB_KEY_ESC:
- /* Force redraw current screen (to clear Tab debug output) */
- return VbDisplayScreen(ctx, screen, 1, data);
- case VB_KEY_LEFT:
- case VB_KEY_RIGHT:
- case VB_KEY_UP:
- case VB_KEY_DOWN:
- /* Arrow keys = change localization */
- loc = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
- count = vb2ex_get_locale_count();
- if (count == 0)
- loc = 0; /* No localization count (bad GBB?) */
- else if (VB_KEY_RIGHT == key || VB_KEY_UP == key)
- loc = (loc < count - 1 ? loc + 1 : 0);
- else
- loc = (loc > 0 ? loc - 1 : count - 1);
- VB2_DEBUG("VbCheckDisplayKey() - change localization to %d\n",
- (int)loc);
- vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, loc);
- vb2_nv_set(ctx, VB2_NV_BACKUP_NVRAM_REQUEST, 1);
-
- /*
- * Non-manual recovery mode is meant to be left via three-finger
- * salute (into manual recovery mode). Need to commit nvdata
- * changes immediately. Ignore commit errors in recovery mode.
- */
- if ((ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
- !vb2_allow_recovery(ctx))
- vb2ex_commit_data(ctx);
-
- /* Force redraw of current screen */
- return VbDisplayScreen(ctx, screen, 1, data);
- }
-
- return VB2_SUCCESS;
-}
-
-static enum {
- POWER_BUTTON_HELD_SINCE_BOOT = 0,
- POWER_BUTTON_RELEASED,
- POWER_BUTTON_PRESSED, /* Must have been previously released */
-} power_button_state;
-
-void vb2_reset_power_button(void) {
- power_button_state = POWER_BUTTON_HELD_SINCE_BOOT;
-}
-
-void vb2_error_beep(enum vb2_beep_type beep)
-{
- switch (beep) {
- case VB_BEEP_FAILED:
- vb2ex_beep(250, 200);
- break;
- default:
- case VB_BEEP_NOT_ALLOWED:
- vb2ex_beep(120, 400);
- vb2ex_msleep(120);
- vb2ex_beep(120, 400);
- break;
- }
-}
-
-void vb2_error_notify(const char *print_msg,
- const char *log_msg,
- enum vb2_beep_type beep)
-{
- if (print_msg)
- VbExDisplayDebugInfo(print_msg, 0);
- if (!log_msg)
- log_msg = print_msg;
- if (log_msg)
- VB2_DEBUG(log_msg);
- vb2_error_beep(beep);
-}
-
-void vb2_error_no_altfw(void)
-{
- VB2_DEBUG("Legacy boot is disabled\n");
- VbExDisplayDebugInfo("WARNING: Booting legacy BIOS has not been "
- "enabled. Refer to the developer-mode "
- "documentation for details.\n", 0);
- vb2_error_beep(VB_BEEP_NOT_ALLOWED);
-}
-
-void vb2_try_altfw(struct vb2_context *ctx, int allowed,
- enum VbAltFwIndex_t altfw_num)
-{
- if (!allowed) {
- vb2_error_no_altfw();
- return;
- }
-
- if (vb2ex_commit_data(ctx)) {
- vb2_error_notify("Error committing data on legacy boot.\n",
- NULL, VB_BEEP_FAILED);
- return;
- }
-
- /* Will not return if successful */
- VbExLegacy(altfw_num);
-
- vb2_error_notify("Legacy boot failed. Missing BIOS?\n", NULL,
- VB_BEEP_FAILED);
-}
-
-int vb2_want_shutdown(struct vb2_context *ctx, uint32_t key)
-{
- struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
- uint32_t shutdown_request = VbExIsShutdownRequested();
-
- /*
- * Ignore power button push until after we have seen it released.
- * This avoids shutting down immediately if the power button is still
- * being held on startup. After we've recognized a valid power button
- * push then don't report the event until after the button is released.
- */
- if (shutdown_request & VB_SHUTDOWN_REQUEST_POWER_BUTTON) {
- shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- if (power_button_state == POWER_BUTTON_RELEASED)
- power_button_state = POWER_BUTTON_PRESSED;
- } else {
- if (power_button_state == POWER_BUTTON_PRESSED)
- shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- power_button_state = POWER_BUTTON_RELEASED;
- }
-
- if (key == VB_BUTTON_POWER_SHORT_PRESS)
- shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-
- /* If desired, ignore shutdown request due to lid closure. */
- if (gbb->flags & VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN)
- shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED;
-
- return shutdown_request;
-}
diff --git a/firmware/lib/vboot_ui_legacy_clamshell.c b/firmware/lib/vboot_ui_legacy_clamshell.c
deleted file mode 100644
index 027b49ea..00000000
--- a/firmware/lib/vboot_ui_legacy_clamshell.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/* Copyright (c) 2013 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.
- *
- * High-level firmware wrapper API - user interface for RW firmware
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2rsa.h"
-#include "2secdata.h"
-#include "2sysincludes.h"
-#include "load_kernel_fw.h"
-#include "tlcl.h"
-#include "vb2_common.h"
-#include "vboot_api.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_wilco.h"
-
-static uint32_t disp_current_screen = VB_SCREEN_BLANK;
-
-test_mockable
-vb2_error_t VbDisplayScreen(struct vb2_context *ctx, uint32_t screen, int force,
- const VbScreenData *data)
-{
- uint32_t locale;
-
- /* If requested screen is the same as the current one, we're done. */
- if (disp_current_screen == screen && !force)
- return VB2_SUCCESS;
-
- /* Keep track of the currently displayed screen */
- disp_current_screen = screen;
-
- /* Read the locale last saved */
- locale = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-
- return VbExDisplayScreen(screen, locale, data);
-}
-
-static vb2_error_t VbTryUsb(struct vb2_context *ctx)
-{
- int retval = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
- if (VB2_SUCCESS == retval) {
- VB2_DEBUG("developer UI - booting USB\n");
- } else {
- vb2_error_notify("Could not boot from USB\n",
- "developer UI - no kernel found on USB\n",
- VB_BEEP_FAILED);
- }
- return retval;
-}
-
-int VbUserConfirms(struct vb2_context *ctx, uint32_t confirm_flags)
-{
- uint32_t key;
- uint32_t key_flags;
- uint32_t btn;
- int button_pressed = 0;
- int shutdown_requested = 0;
-
- VB2_DEBUG("Entering(%x)\n", confirm_flags);
-
- /* Await further instructions */
- do {
- key = VbExKeyboardReadWithFlags(&key_flags);
- shutdown_requested = vb2_want_shutdown(ctx, key);
- switch (key) {
- case VB_KEY_ENTER:
- /* If we are using a trusted keyboard or a trusted
- * keyboard is not required then return yes, otherwise
- * keep waiting (for instance if the user is using a
- * USB keyboard).
- */
- if (!(confirm_flags & VB_CONFIRM_MUST_TRUST_KEYBOARD) ||
- (key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD)) {
- VB2_DEBUG("Yes (1)\n");
- return 1;
- }
-
- /*
- * If physical presence is confirmed using the keyboard,
- * beep and notify the user when the ENTER key comes
- * from an untrusted keyboard.
- *
- * If physical presence is confirmed using a physical
- * button, the existing message on the screen will
- * instruct the user which button to push. Silently
- * ignore any ENTER presses.
- */
- if (PHYSICAL_PRESENCE_KEYBOARD)
- vb2_error_notify("Please use internal keyboard "
- "to confirm\n",
- "VbUserConfirms() - "
- "Trusted keyboard is required\n",
- VB_BEEP_NOT_ALLOWED);
-
- break;
- case ' ':
- VB2_DEBUG("Space (%d)\n",
- confirm_flags & VB_CONFIRM_SPACE_MEANS_NO);
- if (confirm_flags & VB_CONFIRM_SPACE_MEANS_NO)
- return 0;
- break;
- case VB_KEY_ESC:
- VB2_DEBUG("No (0)\n");
- return 0;
- default:
- /*
- * If the physical presence button is separate from the
- * keyboard, and is pressed, this is also a YES, but
- * must wait for release.
- */
- if (!PHYSICAL_PRESENCE_KEYBOARD) {
- btn = vb2ex_physical_presence_pressed();
- if (btn) {
- VB2_DEBUG("Presence button pressed, "
- "awaiting release\n");
- button_pressed = 1;
- } else if (button_pressed) {
- VB2_DEBUG("Presence button released "
- "(1)\n");
- return 1;
- }
- }
- VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
- }
- vb2ex_msleep(KEY_DELAY_MS);
- } while (!shutdown_requested);
-
- return -1;
-}
-
-/*
- * User interface for selecting alternative firmware
- *
- * This shows the user a list of bootloaders and allows selection of one of
- * them. We loop forever until something is chosen or Escape is pressed.
- */
-static vb2_error_t vb2_altfw_ui(struct vb2_context *ctx)
-{
- int active = 1;
-
- VbDisplayScreen(ctx, VB_SCREEN_ALT_FW_PICK, 0, NULL);
-
- /* We'll loop until the user decides what to do */
- do {
- uint32_t key = VbExKeyboardRead();
-
- if (vb2_want_shutdown(ctx, key)) {
- VB2_DEBUG("developer UI - shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
- }
- switch (key) {
- case 0:
- /* nothing pressed */
- break;
- case VB_KEY_ESC:
- /* Escape pressed - return to developer screen */
- VB2_DEBUG("developer UI - user pressed Esc; "
- "exit to Developer screen\n");
- active = 0;
- break;
- /* We allow selection of the default '0' bootloader here */
- case '0'...'9':
- VB2_DEBUG("developer UI - user pressed key '%c';"
- "Boot alternative firmware\n", key);
- /*
- * This will not return if successful. Drop out to
- * developer mode on failure.
- */
- vb2_try_altfw(ctx, 1, key - '0');
- active = 0;
- break;
- default:
- VB2_DEBUG("developer UI - pressed key %#x\n", key);
- VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
- break;
- }
- vb2ex_msleep(KEY_DELAY_MS);
- } while (active);
-
- /* Back to developer screen */
- VbDisplayScreen(ctx, VB_SCREEN_DEVELOPER_WARNING, 0, NULL);
-
- return 0;
-}
-
-static vb2_error_t vb2_developer_ui(struct vb2_context *ctx)
-{
- struct vb2_shared_data *sd = vb2_get_sd(ctx);
- struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
-
- uint32_t disable_dev_boot = 0;
- uint32_t use_usb = 0;
- uint32_t use_legacy = 0;
- uint32_t ctrl_d_pressed = 0;
-
- VB2_DEBUG("Entering\n");
-
- /* Check if booting from external disk is allowed */
- uint32_t allow_usb = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL);
- uint32_t allow_legacy = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_LEGACY);
-
- /* Check if the default boot target: internal/external disk or legacy */
- uint32_t default_boot = vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT);
-
- if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL)
- use_usb = 1;
- if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY)
- use_legacy = 1;
-
- /* Handle GBB flag override */
- if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_USB)
- allow_usb = 1;
- if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY)
- allow_legacy = 1;
- if (gbb->flags & VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY) {
- use_legacy = 1;
- use_usb = 0;
- }
-
- /* Handle FWMP override */
- if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL))
- allow_usb = 1;
- if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY))
- allow_legacy = 1;
- if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_DISABLE_BOOT)) {
- if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
- VB2_DEBUG("FWMP_DEV_DISABLE_BOOT rejected by "
- "FORCE_DEV_SWITCH_ON\n");
- } else {
- disable_dev_boot = 1;
- }
- }
-
- /* If dev mode is disabled, only allow TONORM */
- while (disable_dev_boot) {
- VB2_DEBUG("dev_disable_boot is set\n");
- VbDisplayScreen(ctx,
- VB_SCREEN_DEVELOPER_TO_NORM, 0, NULL);
- VbExDisplayDebugInfo(dev_disable_msg, 0);
-
- /* Ignore space in VbUserConfirms()... */
- switch (VbUserConfirms(ctx, 0)) {
- case 1:
- VB2_DEBUG("leaving dev-mode\n");
- vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
- VbDisplayScreen(ctx,
- VB_SCREEN_TO_NORM_CONFIRMED, 0, NULL);
- vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
- return VB2_REQUEST_REBOOT;
- case -1:
- VB2_DEBUG("shutdown requested\n");
- return VB2_REQUEST_SHUTDOWN;
- default:
- /* Ignore user attempt to cancel */
- VB2_DEBUG("ignore cancel TONORM\n");
- }
- }
-
- if ((ctx->flags & VB2_CONTEXT_VENDOR_DATA_SETTABLE) &&
- VENDOR_DATA_LENGTH > 0) {
- vb2_error_t ret;
- VB2_DEBUG("developer UI - Vendor data not set\n");
- ret = vb2_vendor_data_ui(ctx);
- if (ret)
- return ret;
- }
-
- /* Show the dev mode warning screen */
- VbDisplayScreen(ctx, VB_SCREEN_DEVELOPER_WARNING, 0, NULL);
-
- /* Initialize audio/delay context */
- vb2_audio_start(ctx);
-
- /* We'll loop until we finish the delay or are interrupted */
- do {
- uint32_t key = VbExKeyboardRead();
- if (vb2_want_shutdown(ctx, key)) {
- VB2_DEBUG("developer UI - shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
- }
-
- switch (key) {
- case 0:
- /* nothing pressed */
- break;
- case VB_KEY_ENTER:
- /* Only disable virtual dev switch if allowed by GBB */
- if (!(gbb->flags & VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM))
- break;
- VBOOT_FALLTHROUGH;
- case ' ':
- /* See if we should disable virtual dev-mode switch. */
- VB2_DEBUG("sd->flags=%#x\n", sd->flags);
-
- /* Validity check, should never fail. */
- VB2_ASSERT(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED);
-
- /* Stop the countdown while we go ask... */
- if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
- /*
- * TONORM won't work (only for
- * non-shipping devices).
- */
- vb2_error_notify(
- "WARNING: TONORM prohibited by "
- "GBB FORCE_DEV_SWITCH_ON.\n",
- NULL, VB_BEEP_NOT_ALLOWED);
- break;
- }
- VbDisplayScreen(ctx, VB_SCREEN_DEVELOPER_TO_NORM,
- 0, NULL);
- /* Ignore space in VbUserConfirms()... */
- switch (VbUserConfirms(ctx, 0)) {
- case 1:
- VB2_DEBUG("leaving dev-mode\n");
- vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
- VbDisplayScreen(ctx,
- VB_SCREEN_TO_NORM_CONFIRMED, 0, NULL);
- vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
- return VB2_REQUEST_REBOOT;
- case -1:
- VB2_DEBUG("shutdown requested\n");
- return VB2_REQUEST_SHUTDOWN;
- default:
- /* Stay in dev-mode */
- VB2_DEBUG("stay in dev-mode\n");
- VbDisplayScreen(ctx,
- VB_SCREEN_DEVELOPER_WARNING, 0, NULL);
- /* Start new countdown */
- vb2_audio_start(ctx);
- }
- break;
- case VB_KEY_CTRL('D'):
- /* Ctrl+D = dismiss warning; advance to timeout */
- VB2_DEBUG("developer UI - user pressed Ctrl+D; "
- "skip delay\n");
- ctrl_d_pressed = 1;
- goto fallout;
- case VB_KEY_CTRL('L'):
- VB2_DEBUG("developer UI - user pressed Ctrl+L; "
- "Try alt firmware\n");
- if (allow_legacy) {
- vb2_error_t ret;
-
- ret = vb2_altfw_ui(ctx);
- if (ret)
- return ret;
- } else {
- vb2_error_no_altfw();
- }
- break;
- case VB_KEY_CTRL_ENTER:
- /*
- * The Ctrl-Enter is special for Lumpy test purpose;
- * fall through to Ctrl+U handler.
- */
- case VB_KEY_CTRL('U'):
- /* Ctrl+U = try USB boot, or beep if failure */
- VB2_DEBUG("developer UI - user pressed Ctrl+U; "
- "try USB\n");
- if (!allow_usb) {
- vb2_error_notify(
- "WARNING: Booting from external media "
- "(USB/SD) has not been enabled. Refer "
- "to the developer-mode documentation "
- "for details.\n",
- "developer UI - "
- "USB booting is disabled\n",
- VB_BEEP_NOT_ALLOWED);
- } else {
- /*
- * Clear the screen to show we get the Ctrl+U
- * key press.
- */
- VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
- if (VB2_SUCCESS == VbTryUsb(ctx)) {
- return VB2_SUCCESS;
- } else {
- /* Show dev mode warning screen again */
- VbDisplayScreen(ctx,
- VB_SCREEN_DEVELOPER_WARNING,
- 0, NULL);
- }
- }
- break;
- /* We allow selection of the default '0' bootloader here */
- case '0'...'9':
- VB2_DEBUG("developer UI - user pressed key '%c'; "
- "Boot alternative firmware\n", key);
- vb2_try_altfw(ctx, allow_legacy, key - '0');
- break;
- default:
- VB2_DEBUG("developer UI - pressed key %#x\n", key);
- VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
- break;
- }
-
- vb2ex_msleep(KEY_DELAY_MS);
- } while(vb2_audio_looping());
-
- fallout:
-
- /* If defaulting to legacy boot, try that unless Ctrl+D was pressed */
- if (use_legacy && !ctrl_d_pressed) {
- VB2_DEBUG("developer UI - defaulting to legacy\n");
- vb2_try_altfw(ctx, allow_legacy, 0);
- }
-
- if ((use_usb && !ctrl_d_pressed) && allow_usb) {
- if (VB2_SUCCESS == VbTryUsb(ctx)) {
- return VB2_SUCCESS;
- }
- }
-
- /* Timeout or Ctrl+D; attempt loading from fixed disk */
- VB2_DEBUG("developer UI - trying fixed disk\n");
- return VbTryLoadKernel(ctx, VB_DISK_FLAG_FIXED);
-}
-
-vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *ctx)
-{
- vb2_reset_power_button();
- vb2_error_t retval = vb2_developer_ui(ctx);
- VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
- return retval;
-}
-
-vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *ctx)
-{
- vb2_reset_power_button();
- vb2_error_t retval = vb2_diagnostics_ui(ctx);
- VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
- return retval;
-}
-
-static vb2_error_t recovery_ui(struct vb2_context *ctx)
-{
- struct vb2_shared_data *sd = vb2_get_sd(ctx);
- uint32_t retval;
- uint32_t key;
- const char release_button_msg[] =
- "Release the recovery button and try again\n";
- const char recovery_pressed_msg[] =
- "^D but recovery switch is pressed\n";
-
- VB2_DEBUG("recovery UI - start\n");
-
- if (!vb2_allow_recovery(ctx)) {
- VbDisplayScreen(ctx, VB_SCREEN_OS_BROKEN, 0, NULL);
- VB2_DEBUG("recovery UI - waiting for manual recovery\n");
- while (1) {
- key = VbExKeyboardRead();
- VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
- if (vb2_want_shutdown(ctx, key))
- return VB2_REQUEST_SHUTDOWN;
- else if ((retval =
- vb2_check_diagnostic_key(ctx, key)) !=
- VB2_SUCCESS)
- return retval;
- vb2ex_msleep(KEY_DELAY_MS);
- }
- }
-
- /* Loop and wait for a recovery image */
- VB2_DEBUG("recovery UI - waiting for a recovery image\n");
- while (1) {
- retval = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
-
- if (VB2_SUCCESS == retval)
- break; /* Found a recovery kernel */
-
- enum VbScreenType_t next_screen =
- retval == VB2_ERROR_LK_NO_DISK_FOUND ?
- VB_SCREEN_RECOVERY_INSERT : VB_SCREEN_RECOVERY_NO_GOOD;
- VbDisplayScreen(ctx, next_screen, 0, NULL);
-
- key = VbExKeyboardRead();
- /*
- * We might want to enter dev-mode from the Insert
- * screen if all of the following are true:
- * - user pressed Ctrl-D
- * - we can honor the virtual dev switch
- * - not already in dev mode
- * - user forced recovery mode
- */
- if (key == VB_KEY_CTRL('D') &&
- !(sd->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) &&
- (sd->flags & VB2_SD_FLAG_MANUAL_RECOVERY)) {
- if (!PHYSICAL_PRESENCE_KEYBOARD &&
- vb2ex_physical_presence_pressed()) {
- /*
- * Is the presence button stuck? In any case
- * we don't like this. Beep and ignore.
- */
- vb2_error_notify(release_button_msg,
- recovery_pressed_msg,
- VB_BEEP_NOT_ALLOWED);
- continue;
- }
-
- /* Ask the user to confirm entering dev-mode */
- VbDisplayScreen(ctx, VB_SCREEN_RECOVERY_TO_DEV,
- 0, NULL);
- /* SPACE means no... */
- uint32_t vbc_flags = VB_CONFIRM_SPACE_MEANS_NO |
- VB_CONFIRM_MUST_TRUST_KEYBOARD;
- switch (VbUserConfirms(ctx, vbc_flags)) {
- case 1:
- vb2_enable_developer_mode(ctx);
- return VB2_REQUEST_REBOOT_EC_TO_RO;
- case -1:
- VB2_DEBUG("Shutdown requested\n");
- return VB2_REQUEST_SHUTDOWN;
- default: /* zero, actually */
- VB2_DEBUG("Not enabling dev-mode\n");
- break;
- }
- } else if ((retval = vb2_check_diagnostic_key(ctx, key)) !=
- VB2_SUCCESS) {
- return retval;
- } else {
- VbCheckDisplayKey(ctx, key, disp_current_screen, NULL);
- }
- if (vb2_want_shutdown(ctx, key))
- return VB2_REQUEST_SHUTDOWN;
- vb2ex_msleep(KEY_DELAY_MS);
- }
-
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *ctx)
-{
- vb2_error_t retval = recovery_ui(ctx);
- VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
- return retval;
-}
diff --git a/firmware/lib/vboot_ui_legacy_menu.c b/firmware/lib/vboot_ui_legacy_menu.c
deleted file mode 100644
index 4bad5648..00000000
--- a/firmware/lib/vboot_ui_legacy_menu.c
+++ /dev/null
@@ -1,935 +0,0 @@
-/* Copyright 2017 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.
- *
- * High-level firmware wrapper API - user interface for RW firmware
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2rsa.h"
-#include "2secdata.h"
-#include "2sysincludes.h"
-#include "load_kernel_fw.h"
-#include "vb2_common.h"
-#include "vboot_api.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_menu_private.h"
-
-static VB_MENU current_menu, prev_menu;
-static int current_menu_idx, cur_disabled_idx_mask, usb_nogood, force_redraw;
-static uint32_t default_boot;
-static uint32_t disable_dev_boot;
-static uint32_t altfw_allowed;
-static struct vb2_menu menus[];
-static const char no_legacy[] = "Legacy boot failed. Missing BIOS?\n";
-
-static uint32_t disp_current_screen = VB_SCREEN_BLANK;
-static uint32_t disp_current_index = 0;
-static uint32_t disp_disabled_idx_mask = 0;
-
-test_mockable
-vb2_error_t VbDisplayMenu(struct vb2_context *ctx, uint32_t screen, int force,
- uint32_t selected_index, uint32_t disabled_idx_mask)
-{
- uint32_t locale;
- uint32_t redraw_base_screen = 0;
-
- /*
- * If requested screen/selected_index is the same as the current one,
- * we're done.
- */
- if (disp_current_screen == screen &&
- disp_current_index == selected_index &&
- !force)
- return VB2_SUCCESS;
-
- /*
- * If current screen is not the same, make sure we redraw the base
- * screen as well to avoid having artifacts from the menu.
- */
- if (disp_current_screen != screen || force)
- redraw_base_screen = 1;
-
- /*
- * Keep track of the currently displayed screen and
- * selected_index
- */
- disp_current_screen = screen;
- disp_current_index = selected_index;
- disp_disabled_idx_mask = disabled_idx_mask;
-
- /* Read the locale last saved */
- locale = vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
-
- return VbExDisplayMenu(screen, locale, selected_index,
- disabled_idx_mask, redraw_base_screen);
-}
-
-/**
- * Checks GBB flags against VbExIsShutdownRequested() shutdown request to
- * determine if a shutdown is required.
- *
- * Returns true if a shutdown is required and false if no shutdown is required.
- */
-static int VbWantShutdownMenu(struct vb2_context *ctx)
-{
- struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
- uint32_t shutdown_request = VbExIsShutdownRequested();
-
- /* If desired, ignore shutdown request due to lid closure. */
- if (gbb->flags & VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN)
- shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED;
-
- /*
- * In detachables, disabling shutdown due to power button.
- * We are using it for selection instead.
- */
- shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON;
-
- return !!shutdown_request;
-}
-
-/* (Re-)Draw the menu identified by current_menu[_idx] to the screen. */
-static vb2_error_t vb2_draw_current_screen(struct vb2_context *ctx) {
- vb2_error_t ret = VbDisplayMenu(ctx, menus[current_menu].screen,
- force_redraw, current_menu_idx, cur_disabled_idx_mask);
- force_redraw = 0;
- return ret;
-}
-
-/* Flash the screen to black to catch user awareness, then redraw menu. */
-static void vb2_flash_screen(struct vb2_context *ctx)
-{
- VbDisplayMenu(ctx, VB_SCREEN_BLANK, 0, 0, 0);
- vb2ex_msleep(50);
- vb2_draw_current_screen(ctx);
-}
-
-static void vb2_log_menu_change(void)
-{
- if (menus[current_menu].size)
- VB2_DEBUG("================ %s Menu ================ [ %s ]\n",
- menus[current_menu].name,
- menus[current_menu].items[current_menu_idx].text);
- else
- VB2_DEBUG("=============== %s Screen ===============\n",
- menus[current_menu].name);
-}
-
-/**
- * Switch to a new menu (but don't draw it yet).
- *
- * @param new_current_menu: new menu to set current_menu to
- * @param new_current_menu_idx: new idx to set current_menu_idx to
- */
-static void vb2_change_menu(VB_MENU new_current_menu,
- int new_current_menu_idx)
-{
- prev_menu = current_menu;
- current_menu = new_current_menu;
-
- /* Reconfigure cur_disabled_idx_mask for the new menu */
- cur_disabled_idx_mask = 0;
- /* Disable Network Boot Option */
- if (current_menu == VB_MENU_DEV)
- cur_disabled_idx_mask |= 1 << VB_DEV_NETWORK;
- /* Disable cancel option if enterprise disabled dev mode */
- if (current_menu == VB_MENU_TO_NORM &&
- disable_dev_boot == 1)
- cur_disabled_idx_mask |= 1 << VB_TO_NORM_CANCEL;
-
- /* Enable menu items for the selected bootloaders */
- if (current_menu == VB_MENU_ALT_FW) {
- cur_disabled_idx_mask = ~(VbExGetAltFwIdxMask() >> 1);
-
- /* Make sure 'cancel' is shown even with an invalid mask */
- cur_disabled_idx_mask &= (1 << VB_ALTFW_COUNT) - 1;
- }
- /* We assume that there is at least one enabled item */
- while ((1 << new_current_menu_idx) & cur_disabled_idx_mask)
- new_current_menu_idx++;
- if (new_current_menu_idx < menus[current_menu].size)
- current_menu_idx = new_current_menu_idx;
-
- vb2_log_menu_change();
-}
-
-/************************
- * Menu Actions *
- ************************/
-
-/* Boot from internal disk if allowed. */
-static vb2_error_t boot_disk_action(struct vb2_context *ctx)
-{
- if (disable_dev_boot) {
- vb2_flash_screen(ctx);
- vb2_error_notify("Developer mode disabled\n", NULL,
- VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
- VB2_DEBUG("trying fixed disk\n");
- return VbTryLoadKernel(ctx, VB_DISK_FLAG_FIXED);
-}
-
-/* Boot legacy BIOS if allowed and available. */
-static vb2_error_t boot_legacy_action(struct vb2_context *ctx)
-{
- if (disable_dev_boot) {
- vb2_flash_screen(ctx);
- vb2_error_notify("Developer mode disabled\n", NULL,
- VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
-
- if (!altfw_allowed) {
- vb2_flash_screen(ctx);
- vb2_error_notify("WARNING: Booting legacy BIOS has not "
- "been enabled. Refer to the developer"
- "-mode documentation for details.\n",
- "Legacy boot is disabled\n",
- VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
-
- vb2_try_altfw(ctx, 1, VB_ALTFW_DEFAULT);
- vb2_flash_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Boot from USB or SD card if allowed and available. */
-static vb2_error_t boot_usb_action(struct vb2_context *ctx)
-{
- const char no_kernel[] = "No bootable kernel found on USB/SD.\n";
-
- if (disable_dev_boot) {
- vb2_flash_screen(ctx);
- vb2_error_notify("Developer mode disabled\n", NULL,
- VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
-
- if (!vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL) &&
- !(vb2_get_gbb(ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_USB) &&
- !vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL)) {
- vb2_flash_screen(ctx);
- vb2_error_notify("WARNING: Booting from external media "
- "(USB/SD) has not been enabled. Refer "
- "to the developer-mode documentation "
- "for details.\n",
- "USB booting is disabled\n",
- VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
-
- if (VB2_SUCCESS == VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE)) {
- VB2_DEBUG("booting USB\n");
- return VB2_SUCCESS;
- }
-
- vb2_flash_screen(ctx);
- vb2_error_notify(no_kernel, NULL, VB_BEEP_FAILED);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_developer_menu(struct vb2_context *ctx)
-{
- int menu_idx;
- switch(default_boot) {
- default:
- case VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL:
- menu_idx = VB_DEV_DISK;
- break;
- case VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL:
- menu_idx = VB_DEV_USB;
- break;
- case VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY:
- menu_idx = VB_DEV_LEGACY;
- break;
- }
- vb2_change_menu(VB_MENU_DEV, menu_idx);
- vb2_draw_current_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_dev_warning_menu(struct vb2_context *ctx)
-{
- vb2_change_menu(VB_MENU_DEV_WARNING, VB_WARN_POWER_OFF);
- vb2_draw_current_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_language_menu(struct vb2_context *ctx)
-{
- vb2_change_menu(VB_MENU_LANGUAGES,
- vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX));
- vb2_draw_current_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_recovery_base_screen(struct vb2_context *ctx)
-{
- if (!vb2_allow_recovery(ctx))
- vb2_change_menu(VB_MENU_RECOVERY_BROKEN, 0);
- else if (usb_nogood)
- vb2_change_menu(VB_MENU_RECOVERY_NO_GOOD, 0);
- else
- vb2_change_menu(VB_MENU_RECOVERY_INSERT, 0);
- vb2_draw_current_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_options_menu(struct vb2_context *ctx)
-{
- vb2_change_menu(VB_MENU_OPTIONS, VB_OPTIONS_CANCEL);
- vb2_draw_current_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_to_dev_menu(struct vb2_context *ctx)
-{
- const char dev_already_on[] =
- "WARNING: TODEV rejected, developer mode is already on.\n";
- if (vb2_get_sd(ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) {
- vb2_flash_screen(ctx);
- vb2_error_notify(dev_already_on, NULL, VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
- vb2_change_menu(VB_MENU_TO_DEV, VB_TO_DEV_CANCEL);
- vb2_draw_current_screen(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t enter_to_norm_menu(struct vb2_context *ctx)
-{
- vb2_change_menu(VB_MENU_TO_NORM, VB_TO_NORM_CONFIRM);
- vb2_draw_current_screen(ctx);
- /* Make sure user knows dev mode disabled */
- if (disable_dev_boot)
- VbExDisplayDebugInfo(dev_disable_msg, 0);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Boot alternative bootloader if allowed and available. */
-static vb2_error_t enter_altfw_menu(struct vb2_context *ctx)
-{
- VB2_DEBUG("enter_altfw_menu()\n");
- if (disable_dev_boot) {
- vb2_flash_screen(ctx);
- vb2_error_beep(VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
- if (!altfw_allowed) {
- vb2_flash_screen(ctx);
- vb2_error_no_altfw();
- return VB2_REQUEST_UI_CONTINUE;
- }
- vb2_change_menu(VB_MENU_ALT_FW, 0);
- vb2_draw_current_screen(ctx);
-
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-static vb2_error_t debug_info_action(struct vb2_context *ctx)
-{
- force_redraw = 1;
- VbDisplayDebugInfo(ctx);
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Action when selecting a language entry in the language menu. */
-static vb2_error_t language_action(struct vb2_context *ctx)
-{
- /* Write selected language ID back to NVRAM. */
- vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, current_menu_idx);
-
- /*
- * Non-manual recovery mode is meant to be left via three-finger
- * salute (into manual recovery mode). Need to commit nvdata
- * changes immediately. Ignore commit errors in recovery mode.
- */
- if ((ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
- !vb2_allow_recovery(ctx))
- vb2ex_commit_data(ctx);
-
- /* Return to previous menu. */
- switch (prev_menu) {
- case VB_MENU_DEV_WARNING:
- return enter_dev_warning_menu(ctx);
- case VB_MENU_DEV:
- return enter_developer_menu(ctx);
- case VB_MENU_TO_NORM:
- return enter_to_norm_menu(ctx);
- case VB_MENU_TO_DEV:
- return enter_to_dev_menu(ctx);
- case VB_MENU_OPTIONS:
- return enter_options_menu(ctx);
- default:
- /* This should never happen. */
- VB2_DEBUG("ERROR: prev_menu state corrupted, force shutdown\n");
- return VB2_REQUEST_SHUTDOWN;
- }
-}
-
-/* Action when selecting a bootloader in the alternative firmware menu. */
-static vb2_error_t altfw_action(struct vb2_context *ctx)
-{
- vb2_try_altfw(ctx, 1, current_menu_idx + 1);
- vb2_flash_screen(ctx);
- VB2_DEBUG(no_legacy);
- VbExDisplayDebugInfo(no_legacy, 0);
-
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Action that enables developer mode and reboots. */
-static vb2_error_t to_dev_action(struct vb2_context *ctx)
-{
- /* Validity check, should never happen. */
- if ((vb2_get_sd(ctx)->flags & VB2_SD_FLAG_DEV_MODE_ENABLED) ||
- !vb2_allow_recovery(ctx))
- return VB2_REQUEST_UI_CONTINUE;
-
- vb2_enable_developer_mode(ctx);
-
- return VB2_REQUEST_REBOOT_EC_TO_RO;
-}
-
-/* Action that disables developer mode, shows TO_NORM_CONFIRMED and reboots. */
-static vb2_error_t to_norm_action(struct vb2_context *ctx)
-{
- if (vb2_get_gbb(ctx)->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
- vb2_flash_screen(ctx);
- vb2_error_notify("WARNING: TONORM prohibited by "
- "GBB FORCE_DEV_SWITCH_ON.\n", NULL,
- VB_BEEP_NOT_ALLOWED);
- return VB2_REQUEST_UI_CONTINUE;
- }
-
- VB2_DEBUG("leaving dev-mode.\n");
- vb2_nv_set(ctx, VB2_NV_DISABLE_DEV_REQUEST, 1);
- vb2_change_menu(VB_MENU_TO_NORM_CONFIRMED, 0);
- vb2_draw_current_screen(ctx);
- vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
- return VB2_REQUEST_REBOOT;
-}
-
-/* Action that will power off the system. */
-static vb2_error_t power_off_action(struct vb2_context *ctx)
-{
- VB2_DEBUG("Power off requested from screen %#x\n",
- menus[current_menu].screen);
- return VB2_REQUEST_SHUTDOWN;
-}
-
-/**
- * Updates current_menu_idx upon an up/down key press, taking into
- * account disabled indices (from cur_disabled_idx_mask). The cursor
- * will not wrap, meaning that we block on the 0 or max index when
- * we hit the ends of the menu.
- *
- * @param key VOL_KEY_UP = increase index selection
- * VOL_KEY_DOWN = decrease index selection.
- * Every other key has no effect now.
- */
-static void vb2_update_selection(uint32_t key) {
- int idx;
-
- switch (key) {
- case VB_BUTTON_VOL_UP_SHORT_PRESS:
- case VB_KEY_UP:
- idx = current_menu_idx - 1;
- while (idx >= 0 &&
- ((1 << idx) & cur_disabled_idx_mask))
- idx--;
- /* Only update if idx is valid */
- if (idx >= 0)
- current_menu_idx = idx;
- break;
- case VB_BUTTON_VOL_DOWN_SHORT_PRESS:
- case VB_KEY_DOWN:
- idx = current_menu_idx + 1;
- while (idx < menus[current_menu].size &&
- ((1 << idx) & cur_disabled_idx_mask))
- idx++;
- /* Only update if idx is valid */
- if (idx < menus[current_menu].size)
- current_menu_idx = idx;
- break;
- default:
- VB2_DEBUG("ERROR: %s called with key %#x!\n", __func__, key);
- break;
- }
-
- vb2_log_menu_change();
-}
-
-static vb2_error_t vb2_handle_menu_input(struct vb2_context *ctx,
- uint32_t key, uint32_t key_flags)
-{
- switch (key) {
- case 0:
- /* nothing pressed */
- break;
- case '\t':
- /* Tab = display debug info */
- return debug_info_action(ctx);
- case VB_KEY_ESC:
- /* Esc = redraw screen (to clear old debug info) */
- vb2_draw_current_screen(ctx);
- break;
- case VB_KEY_UP:
- case VB_KEY_DOWN:
- case VB_BUTTON_VOL_UP_SHORT_PRESS:
- case VB_BUTTON_VOL_DOWN_SHORT_PRESS:
- /* Untrusted (USB keyboard) input disabled for TO_DEV menu. */
- if (current_menu == VB_MENU_TO_DEV &&
- !(key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD)) {
- vb2_flash_screen(ctx);
- vb2_error_notify("Please use the on-device volume "
- "buttons to navigate\n",
- "vb2_handle_menu_input() - Untrusted "
- "(USB keyboard) input disabled\n",
- VB_BEEP_NOT_ALLOWED);
- break;
- }
-
- /* Menuless screens enter OPTIONS on volume button press. */
- if (!menus[current_menu].size) {
- enter_options_menu(ctx);
- break;
- }
-
- vb2_update_selection(key);
- vb2_draw_current_screen(ctx);
- break;
- case VB_BUTTON_POWER_SHORT_PRESS:
- case VB_KEY_ENTER:
- /* Menuless screens shut down on power button press. */
- if (!menus[current_menu].size)
- return VB2_REQUEST_SHUTDOWN;
-
- return menus[current_menu].items[current_menu_idx].action(ctx);
- default:
- VB2_DEBUG("pressed key %#x\n", key);
- break;
- }
-
- if (VbWantShutdownMenu(ctx)) {
- VB2_DEBUG("shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
- }
-
- return VB2_REQUEST_UI_CONTINUE;
-}
-
-/* Master table of all menus. Menus with size == 0 count as menuless screens. */
-static struct vb2_menu menus[VB_MENU_COUNT] = {
- [VB_MENU_DEV_WARNING] = {
- .name = "Developer Warning",
- .size = VB_WARN_COUNT,
- .screen = VB_SCREEN_DEVELOPER_WARNING_MENU,
- .items = (struct vb2_menu_item[]){
- [VB_WARN_OPTIONS] = {
- .text = "Developer Options",
- .action = enter_developer_menu,
- },
- [VB_WARN_DBG_INFO] = {
- .text = "Show Debug Info",
- .action = debug_info_action,
- },
- [VB_WARN_ENABLE_VER] = {
- .text = "Enable OS Verification",
- .action = enter_to_norm_menu,
- },
- [VB_WARN_POWER_OFF] = {
- .text = "Power Off",
- .action = power_off_action,
- },
- [VB_WARN_LANGUAGE] = {
- .text = "Language",
- .action = enter_language_menu,
- },
- },
- },
- [VB_MENU_DEV] = {
- .name = "Developer Boot Options",
- .size = VB_DEV_COUNT,
- .screen = VB_SCREEN_DEVELOPER_MENU,
- .items = (struct vb2_menu_item[]){
- [VB_DEV_NETWORK] = {
- .text = "Boot From Network",
- .action = NULL, /* unimplemented */
- },
- [VB_DEV_LEGACY] = {
- .text = "Boot Legacy BIOS",
- .action = enter_altfw_menu,
- },
- [VB_DEV_USB] = {
- .text = "Boot From USB or SD Card",
- .action = boot_usb_action,
- },
- [VB_DEV_DISK] = {
- .text = "Boot From Internal Disk",
- .action = boot_disk_action,
- },
- [VB_DEV_CANCEL] = {
- .text = "Cancel",
- .action = enter_dev_warning_menu,
- },
- [VB_DEV_POWER_OFF] = {
- .text = "Power Off",
- .action = power_off_action,
- },
- [VB_DEV_LANGUAGE] = {
- .text = "Language",
- .action = enter_language_menu,
- },
- },
- },
- [VB_MENU_TO_NORM] = {
- .name = "TO_NORM Confirmation",
- .size = VB_TO_NORM_COUNT,
- .screen = VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- .items = (struct vb2_menu_item[]){
- [VB_TO_NORM_CONFIRM] = {
- .text = "Confirm Enabling OS Verification",
- .action = to_norm_action,
- },
- [VB_TO_NORM_CANCEL] = {
- .text = "Cancel",
- .action = enter_dev_warning_menu,
- },
- [VB_TO_NORM_POWER_OFF] = {
- .text = "Power Off",
- .action = power_off_action,
- },
- [VB_TO_NORM_LANGUAGE] = {
- .text = "Language",
- .action = enter_language_menu,
- },
- },
- },
- [VB_MENU_TO_DEV] = {
- .name = "TO_DEV Confirmation",
- .size = VB_TO_DEV_COUNT,
- .screen = VB_SCREEN_RECOVERY_TO_DEV_MENU,
- .items = (struct vb2_menu_item[]){
- [VB_TO_DEV_CONFIRM] = {
- .text = "Confirm Disabling OS Verification",
- .action = to_dev_action,
- },
- [VB_TO_DEV_CANCEL] = {
- .text = "Cancel",
- .action = enter_recovery_base_screen,
- },
- [VB_TO_DEV_POWER_OFF] = {
- .text = "Power Off",
- .action = power_off_action,
- },
- [VB_TO_DEV_LANGUAGE] = {
- .text = "Language",
- .action = enter_language_menu,
- },
- },
- },
- [VB_MENU_LANGUAGES] = {
- .name = "Language Selection",
- .screen = VB_SCREEN_LANGUAGES_MENU,
- /* Rest is filled out dynamically by vb2_init_menus() */
- },
- [VB_MENU_OPTIONS] = {
- .name = "Options",
- .size = VB_OPTIONS_COUNT,
- .screen = VB_SCREEN_OPTIONS_MENU,
- .items = (struct vb2_menu_item[]){
- [VB_OPTIONS_DBG_INFO] = {
- .text = "Show Debug Info",
- .action = debug_info_action,
- },
- [VB_OPTIONS_CANCEL] = {
- .text = "Cancel",
- .action = enter_recovery_base_screen,
- },
- [VB_OPTIONS_POWER_OFF] = {
- .text = "Power Off",
- .action = power_off_action,
- },
- [VB_OPTIONS_LANGUAGE] = {
- .text = "Language",
- .action = enter_language_menu,
- },
- },
- },
- [VB_MENU_RECOVERY_INSERT] = {
- .name = "Recovery INSERT",
- .size = 0,
- .screen = VB_SCREEN_RECOVERY_INSERT,
- .items = NULL,
- },
- [VB_MENU_RECOVERY_NO_GOOD] = {
- .name = "Recovery NO_GOOD",
- .size = 0,
- .screen = VB_SCREEN_RECOVERY_NO_GOOD,
- .items = NULL,
- },
- [VB_MENU_RECOVERY_BROKEN] = {
- .name = "Non-manual Recovery (BROKEN)",
- .size = 0,
- .screen = VB_SCREEN_OS_BROKEN,
- .items = NULL,
- },
- [VB_MENU_TO_NORM_CONFIRMED] = {
- .name = "TO_NORM Interstitial",
- .size = 0,
- .screen = VB_SCREEN_TO_NORM_CONFIRMED,
- .items = NULL,
- },
- [VB_MENU_ALT_FW] = {
- .name = "Alternative Firmware Selection",
- .screen = VB_SCREEN_ALT_FW_MENU,
- .size = VB_ALTFW_COUNT + 1,
- .items = (struct vb2_menu_item[]) {{
- .text = "Bootloader 1",
- .action = altfw_action,
- }, {
- .text = "Bootloader 2",
- .action = altfw_action,
- }, {
- .text = "Bootloader 3",
- .action = altfw_action,
- }, {
- .text = "Bootloader 4",
- .action = altfw_action,
- }, {
- .text = "Bootloader 5",
- .action = altfw_action,
- }, {
- .text = "Bootloader 6",
- .action = altfw_action,
- }, {
- .text = "Bootloader 7",
- .action = altfw_action,
- }, {
- .text = "Bootloader 8",
- .action = altfw_action,
- }, {
- .text = "Bootloader 9",
- .action = altfw_action,
- }, {
- .text = "Cancel",
- .action = enter_developer_menu,
- },
- },
- },
-};
-
-/* Initialize menu state. Must be called once before displaying any menus. */
-static vb2_error_t vb2_init_menus(struct vb2_context *ctx)
-{
- struct vb2_menu_item *items;
- uint32_t count;
- int i;
-
- /* Initialize language menu with the correct amount of entries. */
- count = vb2ex_get_locale_count();
- if (count == 0)
- count = 1; /* Fall back to 1 language entry on failure */
-
- items = malloc(count * sizeof(struct vb2_menu_item));
- if (!items)
- return VB2_ERROR_UNKNOWN;
-
- for (i = 0; i < count; i++) {
- /* The actual language is drawn by the bootloader */
- items[i].text = "Some Language";
- items[i].action = language_action;
- }
- menus[VB_MENU_LANGUAGES].size = count;
- menus[VB_MENU_LANGUAGES].items = items;
-
- return VB2_SUCCESS;
-}
-
-/**
- * Main function that handles developer warning menu functionality
- *
- * @param ctx Vboot2 context
- * @return VB2_SUCCESS, or non-zero error code if error.
- */
-static vb2_error_t vb2_developer_legacy_menu(struct vb2_context *ctx)
-{
- struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
- vb2_error_t ret;
-
- /* Check if the default is to boot using disk, usb, or legacy */
- default_boot = vb2_nv_get(ctx, VB2_NV_DEV_DEFAULT_BOOT);
- if (gbb->flags & VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY)
- default_boot = VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY;
-
- /* Check if developer mode is disabled by FWMP */
- disable_dev_boot = 0;
- if (vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_DISABLE_BOOT)) {
- if (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON) {
- VB2_DEBUG("FWMP_DEV_DISABLE_BOOT rejected by"
- "FORCE_DEV_SWITCH_ON\n");
- } else {
- /* If dev mode is disabled, only allow TONORM */
- disable_dev_boot = 1;
- VB2_DEBUG("dev_disable_boot is set.\n");
- }
- }
-
- altfw_allowed = vb2_nv_get(ctx, VB2_NV_DEV_BOOT_LEGACY) ||
- (gbb->flags & VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY) ||
- vb2_secdata_fwmp_get_flag(ctx, VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY);
-
- /* Show appropriate initial menu */
- if (disable_dev_boot)
- enter_to_norm_menu(ctx);
- else
- enter_dev_warning_menu(ctx);
-
- /* Get audio/delay context */
- vb2_audio_start(ctx);
-
- /* We'll loop until we finish the delay or are interrupted */
- do {
- uint32_t key = VbExKeyboardRead();
-
- switch (key) {
- case VB_BUTTON_VOL_DOWN_LONG_PRESS:
- case VB_KEY_CTRL('D'):
- /* Ctrl+D = boot from internal disk */
- ret = boot_disk_action(ctx);
- break;
- case VB_KEY_CTRL('L'):
- /* Ctrl+L = boot alternative bootloader */
- ret = enter_altfw_menu(ctx);
- break;
- case VB_BUTTON_VOL_UP_LONG_PRESS:
- case VB_KEY_CTRL('U'):
- /* Ctrl+U = boot from USB or SD card */
- ret = boot_usb_action(ctx);
- break;
- /* We allow selection of the default '0' bootloader here */
- case '0'...'9':
- VB2_DEBUG("developer UI - "
- "user pressed key '%c': Boot alternative "
- "firmware\n", key);
- vb2_try_altfw(ctx, altfw_allowed, key - '0');
- ret = VB2_REQUEST_UI_CONTINUE;
- break;
- default:
- ret = vb2_handle_menu_input(ctx, key, 0);
- break;
- }
-
- /* We may have loaded a kernel or decided to shut down now. */
- if (ret != VB2_REQUEST_UI_CONTINUE)
- return ret;
-
- /* Reset 30 second timer whenever we see a new key. */
- if (key != 0)
- vb2_audio_start(ctx);
-
- vb2ex_msleep(KEY_DELAY_MS);
-
- /* If dev mode was disabled, loop forever (never timeout) */
- } while (disable_dev_boot ? 1 : vb2_audio_looping());
-
- if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY)
- boot_legacy_action(ctx); /* Doesn't return on success. */
-
- if (default_boot == VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL)
- if (VB2_SUCCESS == boot_usb_action(ctx))
- return VB2_SUCCESS;
-
- return boot_disk_action(ctx);
-}
-
-/* Developer mode entry point. */
-vb2_error_t VbBootDeveloperLegacyMenu(struct vb2_context *ctx)
-{
- vb2_error_t retval = vb2_init_menus(ctx);
- if (VB2_SUCCESS != retval)
- return retval;
- retval = vb2_developer_legacy_menu(ctx);
- VbDisplayMenu(ctx, VB_SCREEN_BLANK, 0, 0, 0);
- return retval;
-}
-
-/* Main function that handles non-manual recovery (BROKEN) menu functionality */
-static vb2_error_t broken_ui(struct vb2_context *ctx)
-{
- enter_recovery_base_screen(ctx);
-
- /* Loop and wait for the user to reset or shut down. */
- VB2_DEBUG("waiting for manual recovery\n");
- while (1) {
- uint32_t key = VbExKeyboardRead();
- vb2_error_t ret = vb2_handle_menu_input(ctx, key, 0);
- if (ret != VB2_REQUEST_UI_CONTINUE)
- return ret;
- }
-}
-
-/**
- * Main function that handles recovery menu functionality
- *
- * @param ctx Vboot2 context
- * @return VB2_SUCCESS, or non-zero error code if error.
- */
-static vb2_error_t recovery_ui(struct vb2_context *ctx)
-{
- uint32_t key;
- uint32_t key_flags;
- vb2_error_t ret;
-
- /* Loop and wait for a recovery image */
- VB2_DEBUG("waiting for a recovery image\n");
- usb_nogood = -1;
- while (1) {
- ret = VbTryLoadKernel(ctx, VB_DISK_FLAG_REMOVABLE);
-
- if (VB2_SUCCESS == ret)
- return ret; /* Found a recovery kernel */
-
- if (usb_nogood != (ret != VB2_ERROR_LK_NO_DISK_FOUND)) {
- /* USB state changed, force back to base screen */
- usb_nogood = ret != VB2_ERROR_LK_NO_DISK_FOUND;
- enter_recovery_base_screen(ctx);
- }
-
- key = VbExKeyboardReadWithFlags(&key_flags);
- if (key == VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS) {
- if (key_flags & VB_KEY_FLAG_TRUSTED_KEYBOARD)
- enter_to_dev_menu(ctx);
- else
- VB2_DEBUG("ERROR: untrusted combo?!\n");
- } else {
- ret = vb2_handle_menu_input(ctx, key, key_flags);
- if (ret != VB2_REQUEST_UI_CONTINUE)
- return ret;
- }
- vb2ex_msleep(KEY_DELAY_MS);
- }
-}
-
-/* Recovery mode entry point. */
-vb2_error_t VbBootRecoveryLegacyMenu(struct vb2_context *ctx)
-{
- vb2_error_t retval = vb2_init_menus(ctx);
- if (VB2_SUCCESS != retval)
- return retval;
- if (vb2_allow_recovery(ctx))
- retval = recovery_ui(ctx);
- else
- retval = broken_ui(ctx);
- VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
- return retval;
-}
diff --git a/firmware/lib/vboot_ui_legacy_wilco.c b/firmware/lib/vboot_ui_legacy_wilco.c
deleted file mode 100644
index 7838bcfe..00000000
--- a/firmware/lib/vboot_ui_legacy_wilco.c
+++ /dev/null
@@ -1,367 +0,0 @@
-/* Copyright 2020 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.
- *
- * Code used by vboot_ui_legacy_clamshell for Wilco-specific features.
- */
-
-#include "2common.h"
-#include "2nvstorage.h"
-#include "2sysincludes.h"
-#include "vboot_api.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_wilco.h"
-
-static inline int is_vowel(uint32_t key)
-{
- return key == 'A' || key == 'E' || key == 'I' ||
- key == 'O' || key == 'U';
-}
-
-static int vendor_data_length(char *data_value)
-{
- for (int len = 0; len <= VENDOR_DATA_LENGTH; len++) {
- if (data_value[len] == '\0')
- return len;
- }
-
- return VENDOR_DATA_LENGTH;
-}
-
-/*
- * Prompt the user to enter the serial number
- */
-static vb2_error_t vb2_enter_vendor_data_ui(struct vb2_context *ctx,
- char *data_value)
-{
- int len = vendor_data_length(data_value);
- int blinks = CURSOR_BLINK_MS / KEY_DELAY_MS;
- int blink_count = 0;
- VbScreenData data = {
- .vendor_data = {
- .input_text = data_value,
- .flags = VB_VENDOR_DATA_SHOW_CURSOR,
- .selected_index = 1,
- }
- };
-
- VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA, 1, &data);
-
- /* We'll loop until the user decides what to do */
- do {
- uint32_t key = VbExKeyboardRead();
-
- if (vb2_want_shutdown(ctx, key)) {
- VB2_DEBUG("Vendor Data UI - shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
- }
- switch (key) {
- case 0:
- /* Nothing pressed */
- break;
- case VB_KEY_ESC:
- /* Escape pressed - return to developer screen */
- VB2_DEBUG("Vendor Data UI - user pressed Esc: "
- "exit to Developer screen\n");
- data_value[0] = '\0';
- return VB2_SUCCESS;
- case 'a'...'z':
- key = toupper(key);
- VBOOT_FALLTHROUGH;
- case '0'...'9':
- case 'A'...'Z':
- if ((len > 0 && is_vowel(key)) ||
- len >= VENDOR_DATA_LENGTH) {
- vb2_error_beep(VB_BEEP_NOT_ALLOWED);
- } else {
- data_value[len++] = key;
- data_value[len] = '\0';
- VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA,
- 1, &data);
- }
-
- VB2_DEBUG("Vendor Data UI - vendor_data: %s\n",
- data_value);
- break;
- case VB_KEY_BACKSPACE:
- if (len > 0) {
- data_value[--len] = '\0';
- VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA,
- 1, &data);
- }
-
- VB2_DEBUG("Vendor Data UI - vendor_data: %s\n",
- data_value);
- break;
- case VB_KEY_ENTER:
- if (len == VENDOR_DATA_LENGTH) {
- /* Enter pressed - confirm input */
- VB2_DEBUG("Vendor Data UI - user pressed "
- "Enter: confirm vendor data\n");
- return VB2_SUCCESS;
- } else {
- vb2_error_beep(VB_BEEP_NOT_ALLOWED);
- }
- break;
- default:
- VB2_DEBUG("Vendor Data UI - pressed key %#x\n", key);
- VbCheckDisplayKey(ctx, key, VB_SCREEN_SET_VENDOR_DATA,
- &data);
- break;
- }
- vb2ex_msleep(KEY_DELAY_MS);
-
- if (++blink_count == blinks) {
- blink_count = 0;
- data.vendor_data.flags ^= VB_VENDOR_DATA_SHOW_CURSOR;
- data.vendor_data.flags |=
- VB_VENDOR_DATA_ONLY_DRAW_CURSOR;
-
- VbDisplayScreen(ctx, VB_SCREEN_SET_VENDOR_DATA,
- 1, &data);
-
- data.vendor_data.flags &=
- ~(VB_VENDOR_DATA_ONLY_DRAW_CURSOR);
- }
- } while (1);
-
- return VB2_SUCCESS;
-}
-
-/*
- * Prompt the user to confirm the serial number and write to memory
- */
-static vb2_error_t vb2_confirm_vendor_data_ui(struct vb2_context *ctx,
- char* data_value, VbScreenData *data)
-{
- VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA, 1, data);
- /* We'll loop until the user decides what to do */
- do {
- uint32_t key_confirm = VbExKeyboardRead();
-
- if (vb2_want_shutdown(ctx, key_confirm)) {
- VB2_DEBUG("Confirm Vendor Data UI "
- "- shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
- }
- switch (key_confirm) {
- case 0:
- /* Nothing pressed */
- break;
- case VB_KEY_ESC:
- /* Escape pressed - return to developer screen */
- VB2_DEBUG("Confirm Vendor Data UI - user "
- "pressed Esc: exit to Developer screen\n");
- return VB2_SUCCESS;
- case VB_KEY_RIGHT:
- case VB_KEY_LEFT:
- data->vendor_data.selected_index =
- data->vendor_data.selected_index ^ 1;
- VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_VENDOR_DATA,
- 1, data);
- VB2_DEBUG("selected_index:%d\n",
- data->vendor_data.selected_index);
- break;
- case VB_KEY_ENTER:
- /* Enter pressed - write vendor data */
- if (data->vendor_data.selected_index == 0) {
- VB2_DEBUG("Confirm Vendor Data UI - user "
- "selected YES: "
- "write vendor data (%s) to VPD\n",
- data_value);
- vb2_error_t ret = VbExSetVendorData(data_value);
-
- if (ret == VB2_SUCCESS) {
- vb2_nv_set(ctx,
- VB2_NV_DISABLE_DEV_REQUEST,
- 1);
- return VB2_REQUEST_REBOOT;
- } else {
- vb2_error_notify(
- "ERROR: Vendor data was not "
- "set.\n"
- "System will now shutdown\n",
- NULL, VB_BEEP_FAILED);
- vb2ex_msleep(5 * VB2_MSEC_PER_SEC);
- return VB2_REQUEST_SHUTDOWN;
- }
- } else {
- VB2_DEBUG("Confirm Vendor Data UI - user "
- "selected NO: "
- "Returning to set screen\n");
- return VB2_SUCCESS;
- }
- default:
- VB2_DEBUG("Confirm Vendor Data UI - pressed "
- "key %#x\n", key_confirm);
- VbCheckDisplayKey(ctx, key_confirm,
- VB_SCREEN_CONFIRM_VENDOR_DATA, data);
- break;
- }
- vb2ex_msleep(KEY_DELAY_MS);
- } while (1);
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2_vendor_data_ui(struct vb2_context *ctx)
-{
- char data_value[VENDOR_DATA_LENGTH + 1];
-
- VbScreenData data = {.vendor_data = {data_value, 0, 0}};
- VbDisplayScreen(ctx, VB_COMPLETE_VENDOR_DATA, 0, NULL);
-
- do {
- uint32_t key_set = VbExKeyboardRead();
-
- if (vb2_want_shutdown(ctx, key_set)) {
- VB2_DEBUG("Vendor Data UI - shutdown requested!\n");
- return VB2_REQUEST_SHUTDOWN;
- }
-
- switch (key_set) {
- case 0:
- /* Nothing pressed - do nothing. */
- break;
- case VB_KEY_ESC:
- /* ESC pressed - boot normally */
- VB2_DEBUG("Vendor Data UI - boot normally\n");
- return VB2_SUCCESS;
- break;
- case VB_KEY_ENTER:
- data_value[0] = '\0';
- do {
- /* ENTER pressed -
- enter vendor data set screen */
- VB2_DEBUG("Vendor Data UI - Enter VD set "
- "screen\n");
- vb2_error_t ret = vb2_enter_vendor_data_ui(
- ctx, data_value);
-
- if (ret)
- return ret;
-
- /* Vendor data was not entered just return */
- if (vendor_data_length(data_value) == 0) {
- return VB2_SUCCESS;
- }
-
- /* Reset confirmation answer to YES */
- data.vendor_data.selected_index = 0;
-
- ret = vb2_confirm_vendor_data_ui(
- ctx, data_value, &data);
-
- if (ret)
- return ret;
-
- /* Break if vendor data confirmed */
- if (data.vendor_data.selected_index == 0)
- return VB2_SUCCESS;
- } while (1);
- break;
- default:
- break;
- }
- } while (1);
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2_check_diagnostic_key(struct vb2_context *ctx, uint32_t key)
-{
- if (DIAGNOSTIC_UI && (key == VB_KEY_CTRL('C') || key == VB_KEY_F(12))) {
- VB2_DEBUG("Diagnostic mode requested, rebooting\n");
- vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 1);
-
- return VB2_REQUEST_REBOOT;
- }
-
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2_diagnostics_ui(struct vb2_context *ctx)
-{
- int active = 1;
- int button_released = 0;
- int button_pressed = 0;
- vb2_error_t result = VB2_REQUEST_REBOOT;
- int action_confirmed = 0;
- uint32_t start_time_ms;
-
- VbDisplayScreen(ctx, VB_SCREEN_CONFIRM_DIAG, 0, NULL);
-
- start_time_ms = vb2ex_mtime();
-
- /* We'll loop until the user decides what to do */
- do {
- uint32_t key = VbExKeyboardRead();
- /* Note that we need to check that the physical presence button
- was pressed *and then* released. */
- if (vb2ex_physical_presence_pressed()) {
- /* Wait for a release before registering a press. */
- if (button_released)
- button_pressed = 1;
- } else {
- button_released = 1;
- if (button_pressed) {
- VB2_DEBUG("vb2_diagnostics_ui() - power released\n");
- action_confirmed = 1;
- active = 0;
- break;
- }
- }
-
- /* Check the lid and ignore the power button. */
- if (vb2_want_shutdown(ctx, 0) & ~VB_SHUTDOWN_REQUEST_POWER_BUTTON) {
- VB2_DEBUG("vb2_diagnostics_ui() - shutdown request\n");
- result = VB2_REQUEST_SHUTDOWN;
- active = 0;
- break;
- }
-
- switch (key) {
- case 0:
- /* Nothing pressed */
- break;
- case VB_KEY_ESC:
- /* Escape pressed - reboot */
- VB2_DEBUG("vb2_diagnostics_ui() - user pressed Esc\n");
- active = 0;
- break;
- default:
- VB2_DEBUG("vb2_diagnostics_ui() - pressed key %#x\n",
- key);
- VbCheckDisplayKey(ctx, key, VB_SCREEN_CONFIRM_DIAG,
- NULL);
- break;
- }
- if (vb2ex_mtime() - start_time_ms >= 30 * VB2_MSEC_PER_SEC) {
- VB2_DEBUG("vb2_diagnostics_ui() - timeout\n");
- break;
- }
- if (active) {
- vb2ex_msleep(KEY_DELAY_MS);
- }
- } while (active);
-
- VbDisplayScreen(ctx, VB_SCREEN_BLANK, 0, NULL);
-
- if (action_confirmed) {
- VB2_DEBUG("Diagnostic requested, running\n");
-
- if (vb2ex_tpm_set_mode(VB2_TPM_MODE_DISABLED) !=
- VB2_SUCCESS) {
- VB2_DEBUG("Failed to disable TPM\n");
- vb2api_fail(ctx, VB2_RECOVERY_TPM_DISABLE_FAILED, 0);
- } else {
- vb2_try_altfw(ctx, 1, VB_ALTFW_DIAGNOSTIC);
- VB2_DEBUG("Diagnostic failed to run\n");
- /*
- * Assuming failure was due to bad hash, though
- * the rom could just be missing or invalid.
- */
- vb2api_fail(ctx, VB2_RECOVERY_ALTFW_HASH_FAILED, 0);
- }
- }
-
- return result;
-}
diff --git a/firmware/stub/vboot_api_stub.c b/firmware/stub/vboot_api_stub.c
index 5678521c..fe1c13d8 100644
--- a/firmware/stub/vboot_api_stub.c
+++ b/firmware/stub/vboot_api_stub.c
@@ -26,24 +26,6 @@ void vb2ex_beep(uint32_t msec, uint32_t frequency)
{
}
-vb2_error_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
- const VbScreenData *data)
-{
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDisplayMenu(uint32_t screen_type, uint32_t locale,
- uint32_t selected_index, uint32_t disabled_idx_mask,
- uint32_t redraw_base)
-{
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDisplayDebugInfo(const char *info_str, int full_info)
-{
- return VB2_SUCCESS;
-}
-
uint32_t vb2ex_get_locale_count(void)
{
return 0;
@@ -54,11 +36,6 @@ uint32_t vb2ex_get_bootloader_count(void)
return 0;
}
-uint32_t VbExGetAltFwIdxMask(void)
-{
- return 0;
-}
-
uint32_t VbExKeyboardRead(void)
{
return 0;
@@ -155,8 +132,3 @@ vb2_error_t VbExLegacy(enum VbAltFwIndex_t altfw_num)
{
return VB2_SUCCESS;
}
-
-vb2_error_t VbExSetVendorData(const char *vendor_data_value)
-{
- return VB2_SUCCESS;
-}
diff --git a/tests/vb2_auxfw_sync_tests.c b/tests/vb2_auxfw_sync_tests.c
index 358f706b..f779ac05 100644
--- a/tests/vb2_auxfw_sync_tests.c
+++ b/tests/vb2_auxfw_sync_tests.c
@@ -19,7 +19,6 @@
#include "vboot_audio.h"
#include "vboot_kernel.h"
#include "vboot_struct.h"
-#include "vboot_ui_legacy.h"
/* Mock data */
static struct vb2_context *ctx;
diff --git a/tests/vb2_ec_sync_tests.c b/tests/vb2_ec_sync_tests.c
index 6c06caf0..be86fbb4 100644
--- a/tests/vb2_ec_sync_tests.c
+++ b/tests/vb2_ec_sync_tests.c
@@ -16,7 +16,6 @@
#include "vboot_audio.h"
#include "vboot_kernel.h"
#include "vboot_struct.h"
-#include "vboot_ui_legacy.h"
/* Mock data */
static int ec_ro_updated;
diff --git a/tests/vboot_api_kernel4_tests.c b/tests/vboot_api_kernel4_tests.c
index 1e687484..5229ee55 100644
--- a/tests/vboot_api_kernel4_tests.c
+++ b/tests/vboot_api_kernel4_tests.c
@@ -144,16 +144,6 @@ vb2_error_t vb2_developer_menu(struct vb2_context *c)
return boot_dev(c);
}
-vb2_error_t VbBootDeveloperLegacyClamshell(struct vb2_context *c)
-{
- return boot_dev(c);
-}
-
-vb2_error_t VbBootDeveloperLegacyMenu(struct vb2_context *c)
-{
- return boot_dev(c);
-}
-
static void rec_check(struct vb2_context *c)
{
TEST_EQ(current_recovery_reason, expected_recovery_reason,
@@ -179,34 +169,6 @@ vb2_error_t vb2_broken_recovery_menu(struct vb2_context *c)
vb2_error_t vb2_diagnostic_menu(struct vb2_context *c)
{
- TEST_TRUE(MENU_UI, "Using menu_ui");
- if (vbboot_retval == -5)
- return VB2_ERROR_MOCK;
-
- return vbboot_retval;
-}
-
-vb2_error_t VbBootRecoveryLegacyClamshell(struct vb2_context *c)
-{
- rec_check(c);
- /* Don't care if it's manual recovery or not */
- if (vbboot_retval == -3 || vbboot_retval == -4)
- return VB2_ERROR_MOCK;
- return vbboot_retval;
-}
-
-vb2_error_t VbBootRecoveryLegacyMenu(struct vb2_context *c)
-{
- rec_check(c);
- /* Don't care if it's manual recovery or not */
- if (vbboot_retval == -3 || vbboot_retval == -4)
- return VB2_ERROR_MOCK;
- return vbboot_retval;
-}
-
-vb2_error_t VbBootDiagnosticLegacyClamshell(struct vb2_context *c)
-{
- TEST_TRUE(!MENU_UI, "Not using menu_ui");
if (vbboot_retval == -5)
return VB2_ERROR_MOCK;
diff --git a/tests/vboot_ui_legacy_clamshell_beep_tests.c b/tests/vboot_ui_legacy_clamshell_beep_tests.c
deleted file mode 100644
index cb0b4765..00000000
--- a/tests/vboot_ui_legacy_clamshell_beep_tests.c
+++ /dev/null
@@ -1,274 +0,0 @@
-/* Copyright (c) 2011 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.
- *
- * Tests for vboot_api_firmware
- */
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2secdata.h"
-#include "2sysincludes.h"
-#include "crc32.h"
-#include "host_common.h"
-#include "load_kernel_fw.h"
-#include "test_common.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-
-/* Expected results */
-
-#define MAX_NOTE_EVENTS 10
-#define TIME_FUZZ 500
-#define KBD_READ_TIME 60
-
-typedef struct {
- uint16_t msec;
- uint16_t freq;
- int time;
-} note_event_t;
-
-typedef struct {
- const char *name;
- uint32_t gbb_flags;
- uint32_t keypress_key;
- int keypress_at_count;
- int num_events;
- note_event_t notes[MAX_NOTE_EVENTS];
-} test_case_t;
-
-test_case_t test[] = {
-
- { "VbBootDeveloperSoundTest( fast )",
- VB2_GBB_FLAG_DEV_SCREEN_SHORT_DELAY, 0, 0,
- 1,
- {
- {0, 0, 2000}, // off and return at 2 seconds
- }},
-
- { "VbBootDeveloperSoundTest( normal )",
- 0, 0, 0,
- 3,
- {
- {250, 400, 20000}, // first beep at 20 seconds
- {250, 400, 20510}, // second beep shortly after
- {0, 0, 30020}, // off and return at 30 seconds
- }},
-
- // Now with some keypresses
-
- { "VbBootDeveloperSoundTest( normal, Ctrl-D )",
- 0, 4, 20400, // Ctrl-D between beeps
- 2,
- {
- {250, 400, 20000}, // first beep at 20 seconds
- {0, 0, 20400}, // sees Ctrl-D, sound off, return
- }},
-
- { "VbBootDeveloperSoundTest( normal, Ctrl-U not allowed )",
- 0, 21, 10000, // Ctrl-U at 10 seconds
- 5,
- {
- {120, 400, 10000}, // complains about Ctrl-U (one beep)
- {120, 400, 10240}, // complains about Ctrl-U (two beeps)
- {250, 400, 20000}, // starts first beep at 20 seconds
- {250, 400, 20510}, // starts second beep
- {0, 0, 30020}, // returns at 30 seconds + 360ms
- }},
-};
-
-/* Mock data */
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
- __attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static struct vb2_gbb_header gbb;
-static uint32_t current_time;
-static uint32_t current_ticks;
-static int current_event;
-static int max_events;
-static int matched_events;
-static int kbd_fire_at;
-static uint32_t kbd_fire_key;
-static note_event_t *expected_event;
-
-/* Audio open count, so we can reset it */
-extern int audio_open_count;
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
- TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
- "vb2api_init failed");
- vb2_nv_init(ctx);
-
- sd = vb2_get_sd(ctx);
-
- ctx->flags |= VB2_CONTEXT_NO_SECDATA_FWMP;
- sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
-
- memset(&gbb, 0, sizeof(gbb));
-
- current_ticks = 0;
- current_time = 0;
-
- current_event = 0;
- kbd_fire_at = 0;
- kbd_fire_key = 0;
- audio_open_count = 0;
-
- matched_events = 0;
- max_events = 0;
-}
-
-/****************************************************************************/
-/* Mocked verification functions */
-struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
-{
- return &gbb;
-}
-
-vb2_error_t vb2ex_commit_data(struct vb2_context *c)
-{
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDiskGetInfo(VbDiskInfo** infos_ptr, uint32_t* count,
- uint32_t disk_flags)
-{
- return VB2_ERROR_UNKNOWN;
-}
-
-vb2_error_t VbExDiskFreeInfo(VbDiskInfo* infos,
- VbExDiskHandle_t preserve_handle)
-{
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDiskRead(VbExDiskHandle_t handle, uint64_t lba_start,
- uint64_t lba_count, void* buffer)
-{
- return VB2_ERROR_UNKNOWN;
-}
-
-vb2_error_t VbExDiskWrite(VbExDiskHandle_t handle, uint64_t lba_start,
- uint64_t lba_count, const void* buffer)
-{
- return VB2_ERROR_UNKNOWN;
-}
-
-uint32_t VbExIsShutdownRequested(void)
-{
- return 0;
-}
-
-uint32_t VbExKeyboardRead(void)
-{
- uint32_t tmp;
- uint32_t now;
-
- vb2ex_msleep(KBD_READ_TIME);
- now = current_time;
-
- if (kbd_fire_key && now >= kbd_fire_at) {
- VB2_DEBUG("returning %d at %d msec\n",
- kbd_fire_key, now);
- tmp = kbd_fire_key;
- kbd_fire_key = 0;
- return tmp;
- }
- VB2_DEBUG("returning %d at %d msec\n", 0, now);
- return 0;
-}
-
-void vb2ex_msleep(uint32_t msec)
-{
- current_ticks += msec;
- current_time = current_ticks;
- VB2_DEBUG("msec=%d at %d msec\n", msec, current_time);
-}
-
-uint32_t vb2ex_mtime(void)
-{
- return current_ticks;
-}
-
-void vb2ex_beep(uint32_t msec, uint32_t frequency)
-{
- VB2_DEBUG("msec=%d, frequency=%d at %d msec\n",
- msec, frequency, current_time);
-
- if (current_event < max_events &&
- msec == expected_event[current_event].msec &&
- frequency == expected_event[current_event].freq &&
- (current_time - expected_event[current_event].time) < TIME_FUZZ)
- matched_events++;
-
- if (msec)
- vb2ex_msleep(msec);
- current_event++;
-}
-
-vb2_error_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
- const VbScreenData *data)
-{
- switch (screen_type) {
- case VB_SCREEN_BLANK:
- VB2_DEBUG("screen_type=BLANK\n");
- break;
- case VB_SCREEN_DEVELOPER_WARNING:
- VB2_DEBUG("screen_type=DEV\n");
- break;
- case VB_SCREEN_RECOVERY_INSERT:
- VB2_DEBUG("screen_type=INSERT\n");
- break;
- case VB_SCREEN_RECOVERY_NO_GOOD:
- VB2_DEBUG("screen_type=NO_GOOD\n");
- break;
- case VB_SCREEN_OS_BROKEN:
- VB2_DEBUG("screen_type=BROKEN\n");
- break;
- default:
- VB2_DEBUG("screen_type=%#x\n", screen_type);
- }
-
- VB2_DEBUG("current_time is %d msec\n", current_time);
-
- return VB2_SUCCESS;
-}
-
-/****************************************************************************/
-
-static void VbBootDeveloperSoundTest(void)
-{
- int i;
- int num_tests = sizeof(test) / sizeof(test_case_t);
-
- for (i = 0; i < num_tests; i++) {
- VB2_DEBUG("STARTING %s ...\n", test[i].name);
- ResetMocks();
- gbb.flags = test[i].gbb_flags;
- kbd_fire_key = test[i].keypress_key;
- kbd_fire_at = test[i].keypress_at_count;
- max_events = test[i].num_events;
- expected_event = test[i].notes;
- VbBootDeveloperLegacyClamshell(ctx);
- vb2ex_beep(0, 0); /* Dummy call to determine end time */
- VB2_DEBUG("INFO: matched %d total %d expected %d\n",
- matched_events, current_event, test[i].num_events);
- TEST_TRUE(matched_events == test[i].num_events &&
- current_event == test[i].num_events, test[i].name);
- }
-}
-
-int main(int argc, char* argv[])
-{
- VbBootDeveloperSoundTest();
- return gTestSuccess ? 0 : 255;
-}
diff --git a/tests/vboot_ui_legacy_clamshell_tests.c b/tests/vboot_ui_legacy_clamshell_tests.c
deleted file mode 100644
index d33cb71e..00000000
--- a/tests/vboot_ui_legacy_clamshell_tests.c
+++ /dev/null
@@ -1,1655 +0,0 @@
-/* Copyright (c) 2013 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.
- *
- * Tests for vboot_api_kernel, part 2
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2secdata.h"
-#include "2secdata_struct.h"
-#include "host_common.h"
-#include "load_kernel_fw.h"
-#include "test_common.h"
-#include "tss_constants.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-
-/* Mock data */
-static LoadKernelParams lkp;
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
- __attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static struct vb2_gbb_header gbb;
-static struct vb2_secdata_fwmp *fwmp;
-
-static int audio_looping_calls_left;
-static uint32_t vbtlk_retval;
-static int vbtlk_expect_fixed;
-static int vbtlk_expect_removable;
-static int vbexlegacy_called;
-static enum VbAltFwIndex_t altfw_num;
-static uint32_t current_ticks;
-static int trust_ec;
-static int virtdev_set;
-static uint32_t virtdev_fail;
-static uint32_t mock_keypress[16];
-static uint32_t mock_keyflags[8];
-static uint32_t mock_keypress_count;
-
-#define GPIO_SHUTDOWN 1
-#define GPIO_PRESENCE 2
-#define GPIO_LID_CLOSED 4
-typedef struct GpioState {
- uint32_t gpio_flags;
- uint32_t count;
-} GpioState;
-struct GpioState mock_gpio[8];
-static uint32_t mock_gpio_count;
-
-static uint32_t screens_displayed[8];
-static uint32_t screens_count = 0;
-static uint32_t mock_num_disks[8];
-static uint32_t mock_num_disks_count;
-static int tpm_set_mode_called;
-static enum vb2_tpm_mode tpm_mode;
-
-/* Extra character to guarantee null termination. */
-static char set_vendor_data[VENDOR_DATA_LENGTH + 2];
-static int set_vendor_data_called;
-
-/*
- * Mocks the assertion of 1 or more gpios in |gpio_flags| for 100 ticks after
- * an optional |ticks| delay.
- */
-static void MockGpioAfter(uint32_t ticks, uint32_t gpio_flags)
-{
- uint32_t index = 0;
- if (ticks > 0)
- mock_gpio[index++].count = ticks - 1;
-
- mock_gpio[index].gpio_flags = gpio_flags;
- mock_gpio[index].count = 100;
-}
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
- vb2_reset_power_button();
-
- memset(&lkp, 0, sizeof(lkp));
-
- TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
- "vb2api_init failed");
- vb2_nv_init(ctx);
-
- sd = vb2_get_sd(ctx);
- sd->flags |= VB2_SD_FLAG_DISPLAY_AVAILABLE;
-
- /* CRC will be invalid after here, but nobody's checking */
- sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
- fwmp = (struct vb2_secdata_fwmp *)ctx->secdata_fwmp;
-
- memset(&gbb, 0, sizeof(gbb));
-
- audio_looping_calls_left = 30;
- vbtlk_retval = VB2_ERROR_MOCK;
- vbtlk_expect_fixed = 0;
- vbtlk_expect_removable = 0;
- vbexlegacy_called = 0;
- altfw_num = -100;
- current_ticks = 0;
- trust_ec = 0;
- virtdev_set = 0;
- virtdev_fail = 0;
- set_vendor_data_called = 0;
-
- memset(screens_displayed, 0, sizeof(screens_displayed));
- screens_count = 0;
-
- memset(mock_keypress, 0, sizeof(mock_keypress));
- memset(mock_keyflags, 0, sizeof(mock_keyflags));
- mock_keypress_count = 0;
- memset(mock_gpio, 0, sizeof(mock_gpio));
- mock_gpio_count = 0;
- memset(mock_num_disks, 0, sizeof(mock_num_disks));
- mock_num_disks_count = 0;
-
- tpm_set_mode_called = 0;
- tpm_mode = VB2_TPM_MODE_ENABLED_TENTATIVE;
-}
-
-/* Mock functions */
-
-struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
-{
- return &gbb;
-}
-
-uint32_t VbExIsShutdownRequested(void)
-{
- uint32_t result = 0;
- if (mock_gpio_count >= ARRAY_SIZE(mock_gpio))
- return 0;
- if (mock_gpio[mock_gpio_count].gpio_flags & GPIO_SHUTDOWN)
- result |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
- if (mock_gpio[mock_gpio_count].gpio_flags & GPIO_LID_CLOSED)
- result |= VB_SHUTDOWN_REQUEST_LID_CLOSED;
- if (mock_gpio[mock_gpio_count].count > 0) {
- --mock_gpio[mock_gpio_count].count;
- } else {
- ++mock_gpio_count;
- }
- return result;
-}
-
-uint32_t VbExKeyboardRead(void)
-{
- return VbExKeyboardReadWithFlags(NULL);
-}
-
-uint32_t VbExKeyboardReadWithFlags(uint32_t *key_flags)
-{
- if (mock_keypress_count < ARRAY_SIZE(mock_keypress)) {
- if (key_flags != NULL &&
- mock_keypress_count < ARRAY_SIZE(mock_keyflags))
- *key_flags = mock_keyflags[mock_keypress_count];
- return mock_keypress[mock_keypress_count++];
- } else
- return 0;
-}
-
-int vb2ex_physical_presence_pressed(void)
-{
- uint32_t result = 0;
-
- if (mock_gpio_count >= ARRAY_SIZE(mock_gpio))
- return 0;
-
- if ((mock_gpio[mock_gpio_count].gpio_flags & GPIO_PRESENCE))
- result = 1;
-
- if (mock_gpio[mock_gpio_count].count > 0)
- --mock_gpio[mock_gpio_count].count;
- else
- ++mock_gpio_count;
-
- return result;
-}
-
-vb2_error_t VbExLegacy(enum VbAltFwIndex_t _altfw_num)
-{
- vbexlegacy_called++;
- altfw_num = _altfw_num;
-
- /* VbExLegacy() can only return failure, or not return at all. */
- return VB2_ERROR_UNKNOWN;
-}
-
-void vb2ex_msleep(uint32_t msec)
-{
- current_ticks += msec;
-}
-
-uint32_t vb2ex_mtime(void)
-{
- return current_ticks;
-}
-
-vb2_error_t VbExDiskGetInfo(VbDiskInfo **infos_ptr, uint32_t *count,
- uint32_t disk_flags)
-{
- if (mock_num_disks_count < ARRAY_SIZE(mock_num_disks)) {
- if (mock_num_disks[mock_num_disks_count] == -1)
- return VB2_ERROR_MOCK;
- else
- *count = mock_num_disks[mock_num_disks_count++];
- } else {
- *count = 0;
- }
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbExDiskFreeInfo(VbDiskInfo *infos,
- VbExDiskHandle_t preserve_handle)
-{
- return VB2_SUCCESS;
-}
-
-int vb2ex_ec_trusted(void)
-{
- return trust_ec;
-}
-
-int vb2_audio_looping(void)
-{
- if (audio_looping_calls_left == 0)
- return 0;
- else if (audio_looping_calls_left > 0)
- audio_looping_calls_left--;
-
- return 1;
-}
-
-vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags)
-{
- /*
- * TODO: Currently we don't have a good way of testing for an ordered
- * sequence of VB_DISK_FLAG_FIXED and then VB_DISK_FLAG_REMOVABLE. If
- * both are set, then just assume success.
- */
- if (vbtlk_expect_fixed && vbtlk_expect_removable)
- return vbtlk_retval;
-
- TEST_EQ(!!vbtlk_expect_fixed,
- !!(get_info_flags & VB_DISK_FLAG_FIXED),
- " VbTryLoadKernel unexpected fixed disk call");
- TEST_EQ(!!vbtlk_expect_removable,
- !!(get_info_flags & VB_DISK_FLAG_REMOVABLE),
- " VbTryLoadKernel unexpected removable disk call");
-
- return vbtlk_retval;
-}
-
-vb2_error_t VbDisplayScreen(struct vb2_context *c, uint32_t screen, int force,
- const VbScreenData *data)
-{
- if (screens_count < ARRAY_SIZE(screens_displayed))
- screens_displayed[screens_count++] = screen;
-
- return VB2_SUCCESS;
-}
-
-void vb2_enable_developer_mode(struct vb2_context *c)
-{
- VB2_ASSERT(!virtdev_fail);
- virtdev_set = 1;
-}
-
-vb2_error_t VbExSetVendorData(const char *vendor_data_value)
-{
- set_vendor_data_called = 1;
- /*
- * set_vendor_data is a global variable, so it is automatically
- * initialized to zero, and so the -1 will ensure the string is null
- * terminated.
- */
- strncpy(set_vendor_data, vendor_data_value, sizeof(set_vendor_data) - 1);
-
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2ex_tpm_set_mode(enum vb2_tpm_mode mode_val)
-{
- tpm_set_mode_called = 1;
-
- /* Fail if the TPM is already disabled. */
- if (tpm_mode == VB2_TPM_MODE_DISABLED)
- return VB2_ERROR_UNKNOWN;
-
- tpm_mode = mode_val;
- return VB2_SUCCESS;
-}
-
-/* Tests */
-
-/*
- * Helper function to test VbUserConfirms against a sequence of gpio events.
- * caller specifies a sequence of gpio events and the expected confirm vs.
- * reboot result.
- *
- * Non-asserted gpios are used for 5 events, then 'first' for 5 events,
- * 'second' for 5 events, and 'third' for 5 events.
- * Typically most tests want 5 events of each type (so they'll specify 0 for
- * 'first' and use 'second' through 'fourth'), but a few tests want the
- * shutdown event to be seen once.
- */
-static void VbUserConfirmsTestGpio(uint32_t first, uint32_t second,
- uint32_t third, uint32_t confirm,
- const char *msg)
-{
- ResetMocks();
- mock_gpio[0].gpio_flags = 0;
- mock_gpio[0].count = 4;
- mock_gpio[1].gpio_flags = first;
- mock_gpio[1].count = 4;
- mock_gpio[2].gpio_flags = second;
- mock_gpio[2].count = 4;
- mock_gpio[3].gpio_flags = third;
- mock_gpio[3].count = 4;
- if (confirm) {
- TEST_EQ(VbUserConfirms(ctx,
- VB_CONFIRM_SPACE_MEANS_NO |
- VB_CONFIRM_MUST_TRUST_KEYBOARD),
- 1, msg);
- } else {
- TEST_EQ(VbUserConfirms(ctx,
- VB_CONFIRM_SPACE_MEANS_NO |
- VB_CONFIRM_MUST_TRUST_KEYBOARD),
- -1, msg);
- }
-}
-
-static void VbUserConfirmsKeyboardTest(void)
-{
- VB2_DEBUG("Testing VbUserConfirms()...\n");
-
- ResetMocks();
- MockGpioAfter(1, GPIO_SHUTDOWN);
- TEST_EQ(VbUserConfirms(ctx, 0), -1, "Shutdown requested");
-
- ResetMocks();
- mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbUserConfirms(ctx, 0), -1, "Shutdown requested");
-
- ResetMocks();
- mock_keypress[0] = VB_KEY_ENTER;
- TEST_EQ(VbUserConfirms(ctx, 0), 1, "Enter");
-
- ResetMocks();
- mock_keypress[0] = VB_KEY_ESC;
- TEST_EQ(VbUserConfirms(ctx, 0), 0, "Esc");
-
- ResetMocks();
- mock_keypress[0] = ' ';
- MockGpioAfter(1, GPIO_SHUTDOWN);
- TEST_EQ(VbUserConfirms(ctx, VB_CONFIRM_SPACE_MEANS_NO), 0,
- "Space means no");
-
- ResetMocks();
- mock_keypress[0] = ' ';
- MockGpioAfter(1, GPIO_SHUTDOWN);
- TEST_EQ(VbUserConfirms(ctx, 0), -1, "Space ignored");
-
- ResetMocks();
- mock_keypress[0] = VB_KEY_ENTER;
- mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- TEST_EQ(VbUserConfirms(ctx, VB_CONFIRM_MUST_TRUST_KEYBOARD),
- 1, "Enter with trusted keyboard");
-
- ResetMocks();
- mock_keypress[0] = VB_KEY_ENTER; /* untrusted */
- mock_keypress[1] = ' ';
- TEST_EQ(VbUserConfirms(ctx,
- VB_CONFIRM_SPACE_MEANS_NO |
- VB_CONFIRM_MUST_TRUST_KEYBOARD),
- 0, "Untrusted keyboard");
-
- ResetMocks();
- mock_keypress[0] = VB_KEY_ENTER;
- mock_keypress[1] = 'y';
- mock_keypress[2] = 'z';
- mock_keypress[3] = ' ';
- mock_gpio[0].gpio_flags = GPIO_PRESENCE;
- mock_gpio[0].count = ~0;
- TEST_EQ(VbUserConfirms(ctx,
- VB_CONFIRM_SPACE_MEANS_NO |
- VB_CONFIRM_MUST_TRUST_KEYBOARD),
- 0, "Recovery button stuck");
-
- VB2_DEBUG("...done.\n");
-}
-
-static void VbUserConfirmsPhysicalPresenceTest(void)
-{
- ResetMocks();
- MockGpioAfter(0, GPIO_PRESENCE);
- TEST_EQ(VbUserConfirms(ctx,
- VB_CONFIRM_SPACE_MEANS_NO |
- VB_CONFIRM_MUST_TRUST_KEYBOARD),
- 1, "Presence button");
-
- /*
- * List of possiblities for shutdown and physical presence events that
- * occur over time. Time advanced from left to right (where each
- * represents the gpio[s] that are seen during a given iteration of
- * the loop). The meaning of the characters:
- *
- * _ means no gpio
- * s means shutdown gpio
- * p means presence gpio
- * B means both shutdown and presence gpio
- *
- * 1: ______ppp______ -> confirm
- * 2: ______sss______ -> shutdown
- * 3: ___pppsss______ -> confirm
- * 4: ___sssppp______ -> shutdown
- * 5: ___pppBBB______ -> confirm
- * 6: ___pppBBBppp___ -> shutdown
- * 7: ___pppBBBsss___ -> confirm
- * 8: ___sssBBB______ -> confirm
- * 9: ___sssBBBppp___ -> shutdown
- * 10: ___sssBBBsss___ -> confirm
- * 11: ______BBB______ -> confirm
- * 12: ______BBBsss___ -> confirm
- * 13: ______BBBppp___ -> shutdown
- */
-
- /* 1: presence means confirm */
- VbUserConfirmsTestGpio(GPIO_PRESENCE, 0, 0, 1, "presence");
-
- /* 2: shutdown means shutdown */
- VbUserConfirmsTestGpio(GPIO_SHUTDOWN, 0, 0, 0, "shutdown");
-
- /* 3: presence then shutdown means confirm */
- VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_SHUTDOWN, 0, 1,
- "presence then shutdown");
-
- /* 4: shutdown then presence means shutdown */
- VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE, 0, 0,
- "shutdown then presence");
-
- /* 5: presence then shutdown+presence then none mean confirm */
- VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
- 0, 1, "presence, both, none");
-
- /* 6: presence then shutdown+presence then presence means shutdown */
- VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_PRESENCE, 0, "presence, both, presence");
-
- /* 7: presence then shutdown+presence then shutdown means confirm */
- VbUserConfirmsTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_SHUTDOWN, 1, "presence, both, shutdown");
-
- /* 8: shutdown then shutdown+presence then none means confirm */
- VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
- 0, 1, "shutdown, both, none");
-
- /* 9: shutdown then shutdown+presence then presence means shutdown */
- VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_PRESENCE, 0, "shutdown, both, presence");
-
- /* 10: shutdown then shutdown+presence then shutdown means confirm */
- VbUserConfirmsTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_SHUTDOWN, 1, "shutdown, both, shutdown");
-
- /* 11: shutdown+presence then none means confirm */
- VbUserConfirmsTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 0, 1,
- "both");
-
- /* 12: shutdown+presence then shutdown means confirm */
- VbUserConfirmsTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_SHUTDOWN, 0, 1, "both, shutdown");
-
- /* 13: shutdown+presence then presence means shutdown */
- VbUserConfirmsTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_PRESENCE, 0, 0, "both, presence");
-
-}
-
-static void VbBootDevTest(void)
-{
- int key;
-
- VB2_DEBUG("Testing VbBootDeveloperLegacyClamshell()...\n");
-
- /* Proceed after timeout */
- ResetMocks();
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
- " warning screen");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
-
- /* Proceed to legacy after timeout if GBB flag set */
- ResetMocks();
- gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY |
- VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
-
- /* Proceed to legacy after timeout if GBB flag set */
- ResetMocks();
- gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY |
- VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
-
- /* Proceed to legacy after timeout if boot legacy and default boot
- legacy are set */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
-
- /* Proceed to legacy boot mode only if enabled */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Proceed to external disk after timeout if boot external and default
- * boot external are set */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- vbtlk_retval = VB2_SUCCESS;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U external");
-
- /* Proceed to external boot mode only if enabled */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Timeout");
-
- /* If no external tries fixed disk */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- vbtlk_expect_fixed = 1;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+U enabled");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Up arrow is uninteresting / passed to VbCheckDisplayKey() */
- ResetMocks();
- mock_keypress[0] = VB_KEY_UP;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Up arrow");
-
- /* Shutdown requested in loop */
- ResetMocks();
- mock_gpio[0].gpio_flags = 0;
- mock_gpio[0].count = 2;
- mock_gpio[1].gpio_flags = GPIO_SHUTDOWN;
- mock_gpio[1].count = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
-
- /* Shutdown requested by keyboard in loop */
- ResetMocks();
- mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested by keyboard");
-
- /* Space asks to disable virtual dev switch */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = ' ';
- mock_keypress[1] = VB_KEY_ENTER;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Space = tonorm");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
- " tonorm screen");
- TEST_EQ(screens_displayed[2], VB_SCREEN_TO_NORM_CONFIRMED,
- " confirm screen");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
- " disable dev request");
-
- /* Space-space doesn't disable it */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = ' ';
- mock_keypress[1] = ' ';
- mock_keypress[2] = VB_KEY_ESC;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Space-space");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
- " tonorm screen");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING,
- " warning screen");
-
- /* Enter doesn't by default */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = VB_KEY_ENTER;
- mock_keypress[1] = VB_KEY_ENTER;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter ignored");
-
- /* Enter does if GBB flag set */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- gbb.flags |= VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM;
- mock_keypress[0] = VB_KEY_ENTER;
- mock_keypress[1] = VB_KEY_ENTER;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter = tonorm");
-
- /* Tonorm ignored if GBB forces dev switch on */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
- mock_keypress[0] = ' ';
- mock_keypress[1] = VB_KEY_ENTER;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Can't tonorm gbb-dev");
-
- /* Shutdown requested at tonorm screen */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = ' ';
- MockGpioAfter(3, GPIO_SHUTDOWN);
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested at tonorm");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
- " tonorm screen");
-
- /* Shutdown requested by keyboard at tonorm screen */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested by keyboard at nonorm");
-
- /* Ctrl+D dismisses warning */
- ResetMocks();
- mock_keypress[0] = VB_KEY_CTRL('D');
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Ctrl+D");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Ctrl+D doesn't boot legacy even if GBB flag is set */
- ResetMocks();
- mock_keypress[0] = VB_KEY_CTRL('D');
- gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK, "Ctrl+D");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Ctrl+L tries legacy boot mode only if enabled */
- ResetMocks();
- mock_keypress[0] = VB_KEY_CTRL('L');
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L normal");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Enter altfw menu and time out */
- ResetMocks();
- MockGpioAfter(1000, GPIO_SHUTDOWN);
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- mock_keypress[0] = VB_KEY_CTRL('L');
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_SHUTDOWN,
- "Ctrl+L force legacy");
- TEST_EQ(vbexlegacy_called, 0, " try legacy");
-
- /* Enter altfw menu and select firmware 0 */
- ResetMocks();
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = '0';
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L force legacy");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
-
- /* Enter altfw menu and then exit it */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = VB_KEY_ESC;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L nv legacy");
- TEST_EQ(vbexlegacy_called, 0, " try legacy");
-
- /* Enter altfw menu and select firmware 0 */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = '0';
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L nv legacy");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
-
- /* Enter altfw menu and select firmware 0 */
- ResetMocks();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY;
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = '0';
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L fwmp legacy");
- TEST_EQ(vbexlegacy_called, 1, " fwmp legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
-
- /* Pressing 1-9 boots alternative firmware only if enabled */
- for (key = '1'; key <= '9'; key++) {
- ResetMocks();
- mock_keypress[0] = key;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "'1' normal");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- ResetMocks();
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- mock_keypress[0] = key;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L force legacy");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, key - '0', " check altfw_num");
-
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- mock_keypress[0] = key;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L nv legacy");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, key - '0', " check altfw_num");
-
- ResetMocks();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY;
- mock_keypress[0] = key;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+L fwmp legacy");
- TEST_EQ(vbexlegacy_called, 1, " fwmp legacy");
- TEST_EQ(altfw_num, key - '0', " check altfw_num");
- }
-
- /* Ctrl+U boots external only if enabled */
- ResetMocks();
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+U normal");
-
- /* Ctrl+U enabled, with good external boot */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_retval = VB2_SUCCESS;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U external");
-
- /* Ctrl+U enabled via GBB */
- ResetMocks();
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_USB;
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_retval = VB2_SUCCESS;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U force external");
-
- /* Ctrl+U enabled via FWMP */
- ResetMocks();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL;
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_retval = VB2_SUCCESS;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), 0, "Ctrl+U force external");
-
- /* If no external disk, eventually times out and tries internal disk */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_KEY_CTRL('U');
- /* TODO: Currently the test suite has no way of specifying the order in
- which the expected VbTryLoadKernel calls occur. */
- vbtlk_expect_fixed = 1;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Ctrl+U enabled");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
-
- /* If dev mode is disabled, goes to TONORM screen repeatedly */
- ResetMocks();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
- mock_keypress[0] = VB_KEY_ESC; /* Just causes TONORM again */
- mock_keypress[1] = VB_KEY_ENTER;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "FWMP dev disabled");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_TO_NORM,
- " tonorm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_TO_NORM,
- " tonorm screen");
- TEST_EQ(screens_displayed[2], VB_SCREEN_TO_NORM_CONFIRMED,
- " confirm screen");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
- " disable dev request");
-
- /* Shutdown requested when dev disabled */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
- MockGpioAfter(1, GPIO_SHUTDOWN);
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested when dev disabled");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_TO_NORM,
- " tonorm screen");
-
- /* Shutdown requested by keyboard when dev disabled */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_DEV_MODE_ENABLED;
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
- mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested by keyboard when dev disabled");
-
- VB2_DEBUG("...done.\n");
-}
-
-static void VbBootDevVendorDataTest(void)
-{
- /* Enter set vendor data and reboot */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '3';
- mock_keypress[3] = '2';
- mock_keypress[4] = '1';
- mock_keypress[5] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[6] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data, don't confirm, esc");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
-
- /* Enter set vendor data; don't confirm and esc */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '3';
- mock_keypress[3] = '2';
- mock_keypress[4] = '1';
- mock_keypress[5] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[6] = VB_KEY_RIGHT; /* Select NO */
- mock_keypress[7] = VB_KEY_ENTER; /* Do not confirm vendor data */
- mock_keypress[8] = VB_KEY_ESC; /* Escape to boot */
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter set vendor data, don't confirm, esc");
- TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
-
- /* Enter set vendor data; esc, don't confirm, and change last character */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '3';
- mock_keypress[3] = '2';
- mock_keypress[4] = '1';
- mock_keypress[5] = VB_KEY_ENTER;
- mock_keypress[6] = VB_KEY_RIGHT; /* Select NO */
- mock_keypress[7] = VB_KEY_ENTER; /* Do not confirm vendor data */
- mock_keypress[8] = VB_KEY_BACKSPACE; /* Remove last character */
- mock_keypress[9] = 'B';
- mock_keypress[10] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[11] = VB_KEY_ENTER; /* Confirm vendor data */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data esc, don't confirm, change last character");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "432B", " Vendor data correct");
-
- /* Enter set vendor data; extra keys ignored */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '3';
- mock_keypress[3] = '2';
- mock_keypress[4] = '1';
- mock_keypress[5] = '5';
- mock_keypress[6] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[7] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data extra keys ignored");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
-
- /* Enter set vendor data; converts case */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = 'a';
- mock_keypress[2] = 'B';
- mock_keypress[3] = 'Y';
- mock_keypress[4] = 'z';
- mock_keypress[5] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[6] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data converts case");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "ABYZ", " Vendor data correct");
-
- /* Enter set vendor data; backspace works */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = 'A';
- mock_keypress[2] = 'B';
- mock_keypress[3] = 'C';
- mock_keypress[4] = VB_KEY_BACKSPACE;
- mock_keypress[5] = VB_KEY_BACKSPACE;
- mock_keypress[6] = '3';
- mock_keypress[7] = '2';
- mock_keypress[8] = '1';
- mock_keypress[9] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[10] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data backspace works");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "A321", " Vendor data correct");
-
- /* Enter set vendor data; invalid chars don't print */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '-';
- mock_keypress[3] = '^';
- mock_keypress[4] = '&';
- mock_keypress[5] = '$';
- mock_keypress[6] = '.';
- mock_keypress[7] = '3';
- mock_keypress[8] = '2';
- mock_keypress[9] = '1';
- mock_keypress[10] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[11] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data invalid chars don't print");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
-
- /* Enter set vendor data; invalid chars don't print with backspace */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '-';
- mock_keypress[3] = VB_KEY_BACKSPACE; /* Should delete 4 */
- mock_keypress[4] = '3';
- mock_keypress[5] = '2';
- mock_keypress[6] = '1';
- mock_keypress[7] = '0';
- mock_keypress[8] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[9] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data invalid chars don't print with backspace");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "3210", " Vendor data correct");
-
- /* Enter set vendor data; backspace only doesn't underrun */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = 'A';
- mock_keypress[2] = VB_KEY_BACKSPACE;
- mock_keypress[3] = VB_KEY_BACKSPACE;
- mock_keypress[4] = '4';
- mock_keypress[5] = '3';
- mock_keypress[6] = '2';
- mock_keypress[7] = '1';
- mock_keypress[8] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[9] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data backspace only doesn't underrun");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "4321", " Vendor data correct");
-
- /* Enter set vendor data; vowels not allowed after first char */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = 'A';
- mock_keypress[2] = 'A';
- mock_keypress[3] = 'B';
- mock_keypress[4] = 'E';
- mock_keypress[5] = 'i';
- mock_keypress[6] = 'C';
- mock_keypress[7] = 'O';
- mock_keypress[8] = 'u';
- mock_keypress[9] = 'D';
- mock_keypress[10] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[11] = VB_KEY_ENTER; /* Confirm vendor data (Default YES) */
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Enter set vendor data vowels not allowed after first char");
- TEST_EQ(set_vendor_data_called, 1, " VbExSetVendorData() called");
- TEST_STR_EQ(set_vendor_data, "ABCD", " Vendor data correct");
-
- /* Enter set vendor data; too short */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '1';
- mock_keypress[2] = '2';
- mock_keypress[3] = '3';
- /* Set vendor data (nothing happens) */
- mock_keypress[4] = VB_KEY_ENTER;
- /* Confirm vendor data (nothing happens) */
- mock_keypress[5] = VB_KEY_ENTER;
- mock_keypress[6] = VB_KEY_ESC;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter set vendor data too short");
- TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
-
- /* Enter set vendor data; esc from set screen */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = VB_KEY_ESC;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter set vendor data esc from set screen");
- TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
-
- /* Enter set vendor data; esc from set screen with tag */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '3';
- mock_keypress[3] = '2';
- mock_keypress[4] = '1';
- mock_keypress[5] = VB_KEY_ESC;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter set vendor data esc from set screen with tag");
- TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
-
- /* Enter set vendor data; esc from confirm screen */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ENTER; /* Enter vendor data setting */
- mock_keypress[1] = '4';
- mock_keypress[2] = '3';
- mock_keypress[3] = '2';
- mock_keypress[4] = '1';
- mock_keypress[5] = VB_KEY_ENTER; /* Set vendor data */
- mock_keypress[6] = VB_KEY_ESC;
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter set vendor data esc from set screen");
- TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
-
- /* Escape from vendor data warning screen */
- ResetMocks();
- ctx->flags |= VB2_CONTEXT_VENDOR_DATA_SETTABLE;
- mock_keypress[0] = VB_KEY_ESC; /* Enter vendor data setting */
- vbtlk_expect_fixed = 1;
- TEST_EQ(VbBootDeveloperLegacyClamshell(ctx), VB2_ERROR_MOCK,
- "Enter set vendor data esc, don't confirm, change last character");
- TEST_EQ(set_vendor_data_called, 0, " VbExSetVendorData() not called");
-
- VB2_DEBUG("...done.\n");
-}
-
-/*
- * Helper function to test VbBootRecovery against a sequence of gpio events.
- * caller specifies a sequence of gpio events and the expected confirm vs.
- * reboot result.
- *
- * Non-asserted gpios are used for 5 events, then 'first' for 5 events,
- * 'second' for 5 events, and 'third' for 5 events.
- */
-static void VbBootRecTestGpio(uint32_t first, uint32_t second, uint32_t third,
- uint32_t confirm, const char *msg)
-{
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- trust_ec = 1;
- mock_keypress[0] = VB_KEY_CTRL('D');
- mock_gpio[0].gpio_flags = 0;
- mock_gpio[0].count = 4;
- mock_gpio[1].gpio_flags = first;
- mock_gpio[1].count = 4;
- mock_gpio[2].gpio_flags = second;
- mock_gpio[2].count = 4;
- mock_gpio[3].gpio_flags = third;
- mock_gpio[3].count = 4;
- vbtlk_expect_removable = 1;
-
- if (confirm) {
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_REBOOT_EC_TO_RO, msg);
- TEST_EQ(virtdev_set, 1, " virtual dev mode on");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DEV_BOOT_EXTERNAL),
- !!BOOT_EXTERNAL_ON_DEV,
- " NV_DEV_BOOT_EXTERNAL enabled");
- } else {
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN, msg);
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- }
-}
-
-static void VbBootRecTest(void)
-{
- VB2_DEBUG("Testing VbBootRecoveryLegacyClamshell()...\n");
-
- /* Shutdown requested in loop */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested");
-
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
-
- /* Shutdown requested by keyboard */
- ResetMocks();
- mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Shutdown requested by keyboard");
-
- /* Ignore power button held on boot */
- ResetMocks();
- mock_gpio[0].gpio_flags = GPIO_SHUTDOWN;
- mock_gpio[0].count = 10;
- mock_gpio[1].gpio_flags = 0;
- mock_gpio[1].count = 10;
- mock_gpio[2].gpio_flags = GPIO_SHUTDOWN;
- mock_gpio[2].count = 10;
- mock_gpio[3].gpio_flags = 0;
- mock_gpio[3].count = 100;
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- trust_ec = 1;
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ignore power button held on boot");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- /* Shutdown should happen while we're sending the 2nd block of events */
-
- /* Broken screen */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_num_disks[0] = 1;
- mock_num_disks[1] = 1;
- mock_num_disks[2] = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Broken");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
-
- /* Broken screen even if dev switch is on */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_num_disks[0] = 1;
- mock_num_disks[1] = 1;
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Broken (dev)");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
-
- /* Force insert screen with GBB flag */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- gbb.flags |= VB2_GBB_FLAG_FORCE_MANUAL_RECOVERY;
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Insert (forced by GBB)");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
-
- /* No removal if recovery button physically pressed */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_num_disks[0] = 1;
- mock_num_disks[1] = 1;
- sd->flags |= VB2_SD_FLAG_MANUAL_RECOVERY;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "No remove in rec");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
-
- /* Removal if no disk initially found, but found on second attempt */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_num_disks[0] = 0;
- mock_num_disks[1] = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Remove");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
-
- /* Bad disk count doesn't require removal */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_num_disks[0] = -1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Bad disk count");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
-
- /* Ctrl+D ignored for many reasons... */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_keypress[0] = VB_KEY_CTRL('D');
- trust_ec = 0;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+D ignored if EC not trusted");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
- " todev screen");
-
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY | VB2_SD_FLAG_DEV_MODE_ENABLED;
- trust_ec = 1;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_keypress[0] = VB_KEY_CTRL('D');
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+D ignored if already in dev mode");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
- " todev screen");
-
- ResetMocks();
- trust_ec = 1;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_keypress[0] = VB_KEY_CTRL('D');
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+D ignored if recovery not manually triggered");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
- " todev screen");
-
- /* Ctrl+D then space means don't enable */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- MockGpioAfter(2, GPIO_SHUTDOWN);
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- trust_ec = 1;
- mock_keypress[0] = VB_KEY_CTRL('D');
- mock_keypress[1] = ' ';
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+D todev abort");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
- " todev screen");
- TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
-
- /* Ctrl+D then enter means enable */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- trust_ec = 1;
- mock_keypress[0] = VB_KEY_CTRL('D');
- mock_keypress[1] = VB_KEY_ENTER;
- mock_keyflags[1] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_REBOOT_EC_TO_RO,
- "Ctrl+D todev confirm via enter");
- TEST_EQ(virtdev_set, 1, " virtual dev mode on");
-
- /* Don't handle TPM error in enabling dev mode */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- trust_ec = 1;
- mock_keypress[0] = VB_KEY_CTRL('D');
- mock_keypress[1] = VB_KEY_ENTER;
- mock_keyflags[1] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- virtdev_fail = 1;
- vbtlk_expect_removable = 1;
- TEST_ABORT(VbBootRecoveryLegacyClamshell(ctx),
- "Ctrl+D todev failure");
- TEST_EQ(virtdev_set, 0, " virtual dev mode still off");
-
- /* Test Diagnostic Mode via Ctrl-C - display available */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- trust_ec = 1;
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_keypress[0] = VB_KEY_CTRL('C');
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
- "todiag is zero");
- vbtlk_expect_removable = 1;
- if (DIAGNOSTIC_UI)
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_REBOOT,
- "Ctrl+C todiag - enabled");
- else
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+C todiag - disabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), DIAGNOSTIC_UI,
- " todiag is updated for Ctrl-C");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
- " todiag doesn't set unneeded DISPLAY_REQUEST");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
-
- /* Test Diagnostic Mode via F12 - display disabled */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- sd->flags &= ~VB2_SD_FLAG_DISPLAY_AVAILABLE;
- trust_ec = 1;
- vbtlk_retval = VB2_ERROR_LK_NO_DISK_FOUND;
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_keypress[0] = VB_KEY_F(12);
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
- "todiag is zero");
- vbtlk_expect_removable = 1;
- if (DIAGNOSTIC_UI)
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_REBOOT,
- "F12 todiag - enabled");
- else
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "F12 todiag - disabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), DIAGNOSTIC_UI,
- " todiag is updated for F12");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
- " todiag doesn't set unneeded DISPLAY_REQUEST");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
-
- /* Test Diagnostic Mode via Ctrl-C OS broken - display available */
- ResetMocks();
- MockGpioAfter(10, GPIO_SHUTDOWN);
- mock_keypress[0] = VB_KEY_CTRL('C');
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), 0,
- "todiag is zero");
- if (DIAGNOSTIC_UI)
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_REBOOT,
- "Ctrl+C todiag os broken - enabled");
- else
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+C todiag os broken - disabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST), DIAGNOSTIC_UI,
- " todiag is updated for Ctrl-C");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISPLAY_REQUEST), 0,
- " todiag doesn't set unneeded DISPLAY_REQUEST");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " os broken screen");
-
- VB2_DEBUG("...done.\n");
-}
-
-static void VbBootRecPhysicalPresenceTest(void)
-{
-
- /* Ctrl+D ignored because the physical presence switch is still pressed
- and we don't like that. */
- ResetMocks();
- sd->flags = VB2_SD_FLAG_MANUAL_RECOVERY;
- trust_ec = 1;
- mock_keypress[0] = VB_KEY_CTRL('D');
- mock_gpio[0].gpio_flags = GPIO_PRESENCE;
- mock_gpio[0].count = 100;
- mock_gpio[1].gpio_flags = GPIO_PRESENCE | GPIO_SHUTDOWN;
- mock_gpio[1].count = 100;
- vbtlk_expect_removable = 1;
- TEST_EQ(VbBootRecoveryLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN,
- "Ctrl+D ignored if phys pres button is still pressed");
- TEST_NEQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV,
- " todev screen");
-
- /*
- * List of possiblities for shutdown and physical presence events that
- * occur over time. Time advanced from left to right (where each
- * represents the gpio[s] that are seen during a given iteration of
- * the loop). The meaning of the characters:
- *
- * _ means no gpio
- * s means shutdown gpio
- * p means presence gpio
- * B means both shutdown and presence gpio
- *
- * 1: ______ppp______ -> confirm
- * 2: ______sss______ -> shutdown
- * 3: ___pppsss______ -> confirm
- * 4: ___sssppp______ -> shutdown
- * 5: ___pppBBB______ -> confirm
- * 6: ___pppBBBppp___ -> shutdown
- * 7: ___pppBBBsss___ -> confirm
- * 8: ___sssBBB______ -> confirm
- * 9: ___sssBBBppp___ -> shutdown
- * 10: ___sssBBBsss___ -> confirm
- * 11: ______BBB______ -> confirm
- * 12: ______BBBsss___ -> confirm
- * 13: ______BBBppp___ -> shutdown
- */
-
- /* 1: Ctrl+D then presence means enable */
- VbBootRecTestGpio(GPIO_PRESENCE, 0, 0, 1,
- "Ctrl+D todev confirm via presence");
-
- /* 2: Ctrl+D then shutdown means shutdown */
- VbBootRecTestGpio(GPIO_SHUTDOWN, 0, 0, 0,
- "Ctrl+D todev then shutdown");
-
- /* 3: Ctrl+D then presence then shutdown means confirm */
- VbBootRecTestGpio(GPIO_PRESENCE, GPIO_SHUTDOWN, 0, 1,
- "Ctrl+D todev confirm via presence then shutdown");
-
- /* 4: Ctrl+D then 2+ instance shutdown then presence means shutdown */
- VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE, 0, 0,
- "Ctrl+D todev then 2+ shutdown then presence");
-
- /* 5: Ctrl+D then presence then shutdown+presence then none */
- VbBootRecTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 1,
- "Ctrl+D todev confirm via presence, both, none");
-
- /* 6: Ctrl+D then presence then shutdown+presence then presence */
- VbBootRecTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_PRESENCE, 0,
- "Ctrl+D todev confirm via presence, both, presence");
-
- /* 7: Ctrl+D then presence then shutdown+presence then shutdown */
- VbBootRecTestGpio(GPIO_PRESENCE, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_SHUTDOWN, 1,
- "Ctrl+D todev confirm via presence, both, shutdown");
-
- /* 8: Ctrl+D then shutdown then shutdown+presence then none */
- VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 1,
- "Ctrl+D todev then 2+ shutdown, both, none");
-
- /* 9: Ctrl+D then shutdown then shutdown+presence then presence */
- VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_PRESENCE, 0,
- "Ctrl+D todev then 2+ shutdown, both, presence");
-
- /* 10: Ctrl+D then shutdown then shutdown+presence then shutdown */
- VbBootRecTestGpio(GPIO_SHUTDOWN, GPIO_PRESENCE | GPIO_SHUTDOWN,
- GPIO_SHUTDOWN, 1,
- "Ctrl+D todev then 2+ shutdown, both, shutdown");
-
- /* 11: Ctrl+D then shutdown+presence then none */
- VbBootRecTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, 0, 0, 1,
- "Ctrl+D todev confirm via both then none");
-
- /* 12: Ctrl+D then shutdown+presence then shutdown */
- VbBootRecTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, GPIO_SHUTDOWN, 0, 1,
- "Ctrl+D todev confirm via both then shutdown");
-
- /* 13: Ctrl+D then shutdown+presence then presence */
- VbBootRecTestGpio(GPIO_PRESENCE | GPIO_SHUTDOWN, GPIO_PRESENCE, 0, 0,
- "Ctrl+D todev confirm via both then presence");
-}
-
-static void VbBootDiagTest(void)
-{
- VB2_DEBUG("Testing VbBootDiagnosticLegacyClamshell()...\n");
-
- /* No key pressed - timeout. */
- ResetMocks();
- TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Timeout");
- TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
- " confirm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
- " blank screen");
- TEST_EQ(tpm_set_mode_called, 0, " no tpm call");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(current_ticks, 30 * VB2_MSEC_PER_SEC,
- " waited for 30 seconds");
-
- /* Esc key pressed. */
- ResetMocks();
- mock_keypress[0] = VB_KEY_ESC;
- TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Esc key");
- TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
- " confirm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
- " blank screen");
- TEST_EQ(tpm_set_mode_called, 0, " no tpm call");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(current_ticks, 0, " didn't wait at all");
-
- /* Shutdown requested via lid close */
- ResetMocks();
- MockGpioAfter(10, GPIO_LID_CLOSED);
- TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx),
- VB2_REQUEST_SHUTDOWN, "Shutdown");
- TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
- " confirm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
- " blank screen");
- TEST_EQ(tpm_set_mode_called, 0, " no tpm call");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_TRUE(current_ticks < VB2_MSEC_PER_SEC, " didn't wait long");
-
- /* Power button pressed but not released. */
- ResetMocks();
- mock_gpio[0].gpio_flags = GPIO_PRESENCE;
- mock_gpio[0].count = ~0;
- TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Power held");
- TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
- " confirm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
- " blank screen");
- TEST_EQ(tpm_set_mode_called, 0, " no tpm call");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Power button is pressed and released. */
- ResetMocks();
- MockGpioAfter(3, GPIO_PRESENCE);
- TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Confirm");
- TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
- " confirm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
- " blank screen");
- TEST_EQ(tpm_set_mode_called, 1, " tpm call");
- TEST_EQ(tpm_mode, VB2_TPM_MODE_DISABLED, " tpm disabled");
- TEST_EQ(vbexlegacy_called, 1, " legacy");
- TEST_EQ(altfw_num, VB_ALTFW_DIAGNOSTIC, " check altfw_num");
- /*
- * Ideally we'd that no recovery request was recorded, but
- * VbExLegacy() can only fail or crash the tests.
- */
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
- VB2_RECOVERY_ALTFW_HASH_FAILED,
- " recovery request");
-
- /* Power button confirm, but now with a TPM failure. */
- ResetMocks();
- tpm_mode = VB2_TPM_MODE_DISABLED;
- mock_gpio[0].gpio_flags = 0;
- mock_gpio[0].count = 2;
- mock_gpio[1].gpio_flags = GPIO_PRESENCE;
- mock_gpio[1].count = 2;
- TEST_EQ(VbBootDiagnosticLegacyClamshell(ctx), VB2_REQUEST_REBOOT,
- "Confirm but tpm fail");
- TEST_EQ(screens_displayed[0], VB_SCREEN_CONFIRM_DIAG,
- " confirm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
- " blank screen");
- TEST_EQ(tpm_set_mode_called, 1, " tpm call");
- TEST_EQ(tpm_mode, VB2_TPM_MODE_DISABLED, " tpm disabled");
- TEST_EQ(vbexlegacy_called, 0, " legacy not called");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
- VB2_RECOVERY_TPM_DISABLE_FAILED,
- " recovery request");
-
- VB2_DEBUG("...done.\n");
-}
-
-
-int main(void)
-{
- VbUserConfirmsKeyboardTest();
- if (!PHYSICAL_PRESENCE_KEYBOARD)
- VbUserConfirmsPhysicalPresenceTest();
- VbBootDevTest();
- VbBootDevVendorDataTest();
- VbBootRecTest();
- if (!PHYSICAL_PRESENCE_KEYBOARD)
- VbBootRecPhysicalPresenceTest();
- if (DIAGNOSTIC_UI)
- VbBootDiagTest();
-
- return gTestSuccess ? 0 : 255;
-}
diff --git a/tests/vboot_ui_legacy_menu_tests.c b/tests/vboot_ui_legacy_menu_tests.c
deleted file mode 100644
index 1dc92535..00000000
--- a/tests/vboot_ui_legacy_menu_tests.c
+++ /dev/null
@@ -1,2349 +0,0 @@
-/* Copyright 2017 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.
- *
- * Tests legacy menu UI
- */
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2secdata.h"
-#include "2secdata_struct.h"
-#include "host_common.h"
-#include "load_kernel_fw.h"
-#include "test_common.h"
-#include "tss_constants.h"
-#include "vboot_api.h"
-#include "vboot_audio.h"
-#include "vboot_kernel.h"
-#include "vboot_struct.h"
-#include "vboot_test.h"
-#include "vboot_ui_legacy.h"
-#include "vboot_ui_legacy_menu_private.h"
-
-/* Mock data */
-static LoadKernelParams lkp;
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
- __attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static struct vb2_gbb_header gbb;
-static struct vb2_secdata_fwmp *fwmp;
-
-static int shutdown_request_calls_left;
-static int audio_looping_calls_left;
-static vb2_error_t vbtlk_retval[5];
-static vb2_error_t vbtlk_last_retval;
-static int vbtlk_retval_count;
-static const vb2_error_t vbtlk_retval_fixed = 1002;
-static int vbexlegacy_called;
-static enum VbAltFwIndex_t altfw_num;
-static int debug_info_displayed;
-static int trust_ec;
-static int virtdev_set;
-static uint32_t virtdev_fail;
-static uint32_t mock_keypress[64];
-static uint32_t mock_keyflags[64];
-static uint32_t mock_keypress_count;
-static uint32_t screens_displayed[64];
-static uint32_t screens_count = 0;
-static uint32_t beeps_played[64];
-static uint32_t beeps_count = 0;
-static uint32_t mock_altfw_mask;
-static int vbexaltfwmask_called;
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
- memset(&lkp, 0, sizeof(lkp));
-
- TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
- "vb2api_init failed");
- vb2_nv_init(ctx);
-
- sd = vb2_get_sd(ctx);
-
- /* CRC will be invalid after here, but nobody's checking */
- sd->status |= VB2_SD_STATUS_SECDATA_FWMP_INIT;
- fwmp = (struct vb2_secdata_fwmp *)ctx->secdata_fwmp;
-
- memset(&gbb, 0, sizeof(gbb));
-
- /* In recovery we have 50 keyscans per disk scan, this must be high. */
- shutdown_request_calls_left = 301;
- audio_looping_calls_left = 60;
- vbexlegacy_called = 0;
- altfw_num = -100;
- debug_info_displayed = 0;
- trust_ec = 0;
- virtdev_set = 0;
- virtdev_fail = 0;
-
- vbtlk_last_retval = vbtlk_retval_fixed - VB_DISK_FLAG_FIXED;
- memset(vbtlk_retval, 0, sizeof(vbtlk_retval));
- vbtlk_retval_count = 0;
-
- memset(screens_displayed, 0, sizeof(screens_displayed));
- screens_count = 0;
- memset(beeps_played, 0, sizeof(beeps_played));
- beeps_count = 0;
-
- memset(mock_keypress, 0, sizeof(mock_keypress));
- memset(mock_keyflags, 0, sizeof(mock_keyflags));
- mock_keypress_count = 0;
-
- mock_altfw_mask = 3 << 1; /* This mask selects 1 and 2 */
- vbexaltfwmask_called = 0;
-}
-
-static void ResetMocksForDeveloper(void)
-{
- ResetMocks();
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- shutdown_request_calls_left = -1;
-}
-
-static void ResetMocksForManualRecovery(void)
-{
- ResetMocks();
- sd->flags |= VB2_SD_FLAG_MANUAL_RECOVERY;
- trust_ec = 1;
-}
-
-/* Mock functions */
-
-struct vb2_gbb_header *vb2_get_gbb(struct vb2_context *c)
-{
- return &gbb;
-}
-
-uint32_t vb2ex_get_locale_count(void) {
- return 1;
-}
-
-uint32_t VbExGetAltFwIdxMask() {
-
- vbexaltfwmask_called++;
-
- return mock_altfw_mask;
-}
-
-uint32_t VbExIsShutdownRequested(void)
-{
- if (shutdown_request_calls_left == 0)
- return 1;
- else if (shutdown_request_calls_left > 0)
- shutdown_request_calls_left--;
-
- return 0;
-}
-
-uint32_t VbExKeyboardRead(void)
-{
- return VbExKeyboardReadWithFlags(NULL);
-}
-
-uint32_t VbExKeyboardReadWithFlags(uint32_t *key_flags)
-{
- if (mock_keypress_count < ARRAY_SIZE(mock_keypress)) {
- if (key_flags != NULL)
- *key_flags = mock_keyflags[mock_keypress_count];
- return mock_keypress[mock_keypress_count++];
- } else
- return 0;
-}
-
-vb2_error_t VbExLegacy(enum VbAltFwIndex_t _altfw_num)
-{
- vbexlegacy_called++;
- altfw_num = _altfw_num;
-
- return 0;
-}
-
-int vb2ex_ec_trusted(void)
-{
- return trust_ec;
-}
-
-int vb2_audio_looping(void)
-{
- if (audio_looping_calls_left == 0)
- return 0;
- else if (audio_looping_calls_left > 0)
- audio_looping_calls_left--;
-
- return 1;
-}
-
-vb2_error_t VbTryLoadKernel(struct vb2_context *c, uint32_t get_info_flags)
-{
- if (vbtlk_retval_count < ARRAY_SIZE(vbtlk_retval) &&
- vbtlk_retval[vbtlk_retval_count] != 0)
- vbtlk_last_retval = vbtlk_retval[vbtlk_retval_count++];
- return vbtlk_last_retval + get_info_flags;
-}
-
-vb2_error_t VbDisplayScreen(struct vb2_context *c, uint32_t screen, int force,
- const VbScreenData *data)
-{
- if (screens_count < ARRAY_SIZE(screens_displayed))
- screens_displayed[screens_count++] = screen;
- VB2_DEBUG("screens_displayed[%d] = %#x\n",
- screens_count - 1, screen);
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbDisplayMenu(struct vb2_context *c, uint32_t screen, int force,
- uint32_t selected_index, uint32_t disabled_idx_mask)
-{
- if (screens_count < ARRAY_SIZE(screens_displayed))
- screens_displayed[screens_count++] = screen;
- else
- VB2_DEBUG("Ran out of screens_displayed entries!\n");
- VB2_DEBUG("screens_displayed[%d] = %#x,"
- " selected_index = %u, disabled_idx_mask = %#x\n",
- screens_count - 1, screen,
- selected_index, disabled_idx_mask);
-
- return VB2_SUCCESS;
-}
-
-vb2_error_t VbDisplayDebugInfo(struct vb2_context *c)
-{
- debug_info_displayed = 1;
- return VB2_SUCCESS;
-}
-
-void vb2ex_beep(uint32_t msec, uint32_t frequency)
-{
- if (beeps_count < ARRAY_SIZE(beeps_played))
- beeps_played[beeps_count++] = frequency;
- VB2_DEBUG("beeps_played[%d] = %dHz for %dms\n",
- beeps_count - 1, frequency, msec);
-}
-
-void vb2_enable_developer_mode(struct vb2_context *c)
-{
- VB2_ASSERT(!virtdev_fail);
- virtdev_set = 1;
-}
-
-/* Tests */
-
-static void VbBootDevTest(void)
-{
- int i;
-
- VB2_DEBUG("Testing VbBootDeveloperLegacyMenu()...\n");
-
- /* Proceed after timeout */
- ResetMocksForDeveloper();
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed, "Timeout");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 0, " no beeps on normal boot");
-
- /* Proceed to legacy after timeout if GBB flag set */
- ResetMocksForDeveloper();
- gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY |
- VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "default legacy GBB");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 1, " error beep: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Proceed to legacy after timeout if boot legacy and default boot
- * legacy are set */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "default legacy NV");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 1, " error beep: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Proceed to legacy boot mode only if enabled */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "default legacy not enabled");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 2, " error beeps: legacy boot not enabled");
- TEST_EQ(beeps_played[0], 400, " first error beep");
- TEST_EQ(beeps_played[1], 400, " second error beep");
-
- /* Proceed to usb after timeout if boot usb and default boot
- * usb are set */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), 0, "Ctrl+U USB");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* Proceed to usb boot mode only if enabled */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "default USB not enabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 2, " error beeps: USB boot not enabled");
- TEST_EQ(beeps_played[0], 400, " first error beep");
- TEST_EQ(beeps_played[1], 400, " second error beep");
-
- /* If no USB tries fixed disk */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "default USB with no disk");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 1, " error beep: USB not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Shutdown requested in loop */
- ResetMocksForDeveloper();
- shutdown_request_calls_left = 2;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /*
- * Pushing power should shut down the DUT because default
- * selection is power off
- */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "dev warning menu: default to power off");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Selecting Power Off in developer options. */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Power Off in DEVELOPER");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* Pressing ENTER is equivalent to power button. */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_KEY_ENTER;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "dev warning menu: ENTER is power button");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* ENTER functionality is unaffected by GBB flag in detachable UI. */
- ResetMocksForDeveloper();
- gbb.flags |= VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM;
- mock_keypress[0] = VB_KEY_ENTER;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "dev warning menu: ENTER unaffected by GBB");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Pressing SPACE or VolUp+Down combo has no effect in dev mode */
- ResetMocksForDeveloper();
- mock_keypress[0] = ' ';
- mock_keypress[1] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS;
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS; // select Power Off
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "SPACE or VolUp+Down have no effect");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Disable developer mode */
- ResetMocksForDeveloper();
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS;
- mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_REBOOT,
- "disable developer mode");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_TO_NORM_CONFIRMED,
- " confirm screen");
- TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 5, " no extra screens");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
- " disable dev request");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on reboot");
-
- /* Tonorm ignored if GBB forces dev switch on */
- ResetMocksForDeveloper();
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON;
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS;
- mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Can't tonorm gbb-dev");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: power off");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " wanring screen: enable verification");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen: confirm");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK,
- " blank (error flash)");
- TEST_EQ(screens_displayed[4], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen: confirm");
- TEST_EQ(screens_displayed[5], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 6, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " audio timeout");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Shutdown requested at tonorm screen */
- ResetMocksForDeveloper();
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS;
- mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
- shutdown_request_calls_left = 2;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested at tonorm");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " developer warning screen: power off");
- TEST_EQ(screens_displayed[1], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " developer warning screen: enable root verification");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " developer warning screen: power off");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on shutdown");
-
- /* Ctrl+D dismisses warning */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_KEY_CTRL('D');
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed, "Ctrl+D");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on normal boot");
-
- /* Ctrl+D doesn't boot legacy even if GBB flag is set */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_KEY_CTRL('D');
- gbb.flags |= VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed, "Ctrl+D");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
-
- /* Volume-down long press shortcut acts like Ctrl+D */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_BUTTON_VOL_DOWN_LONG_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "VolDown long press");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0,
- " recovery reason");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on normal boot");
-
- /* Ctrl+L tries legacy boot mode only if enabled */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_KEY_CTRL('L');
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+L normal");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(audio_looping_calls_left, 0, " audio timed out");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Ctrl+L boots legacy if enabled by GBB flag */
- ResetMocksForDeveloper();
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+L force legacy");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 1, " check altfw_num");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[3], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_count, 5, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Ctrl+L boots legacy if enabled by NVRAM */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+L nv legacy");
- TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[3], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_count, 5, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Ctrl+L boots legacy if enabled by FWMP */
- ResetMocksForDeveloper();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_LEGACY;
- mock_keypress[0] = VB_KEY_CTRL('L');
- mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+L fwmp legacy");
- TEST_EQ(vbexlegacy_called, 1, " fwmp legacy");
- TEST_EQ(altfw_num, 1, " check altfw_num");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[3], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[4], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 5, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* TODO(sjg@chromium.org): Add a test for there being no bootloaders */
-
- /* Ctrl+U boots USB only if enabled */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_KEY_CTRL('U');
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+U not enabled");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(audio_looping_calls_left, 0, " audio timed out");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Ctrl+U enabled, with good USB boot */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS, "Ctrl+U USB");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* Ctrl+U enabled, without valid USB */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_KEY_CTRL('U');
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+U without valid USB");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 1, " error beep: USB not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Ctrl+U enabled via GBB */
- ResetMocksForDeveloper();
- gbb.flags |= VB2_GBB_FLAG_FORCE_DEV_BOOT_USB;
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
- "Ctrl+U force USB");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* Ctrl+U enabled via FWMP */
- ResetMocksForDeveloper();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_ENABLE_EXTERNAL;
- mock_keypress[0] = VB_KEY_CTRL('U');
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
- "Ctrl+U force USB");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* If no valid USB, eventually times out and tries fixed disk */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_KEY_CTRL('U');
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Ctrl+U failed - no USB");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: USB not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Now go to USB boot through menus */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
- "Menu selected USB boot");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* If default USB, the option is preselected */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL);
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
- "Menu selected USB default boot");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* If invalid USB, we still timeout after selecting it in menu */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Menu selected invalid USB boot");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: USB not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* If USB is disabled, we error flash/beep from the menu option */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Menu selected disabled USB boot");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Boot Legacy via menu and default */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Enter altfw menu
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select first option
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // and again
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- vb2_nv_set(ctx, VB2_NV_DEV_DEFAULT_BOOT,
- VB2_DEV_DEFAULT_BOOT_TARGET_LEGACY);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Menu selected legacy boot");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vbexlegacy_called, 2, " tried legacy boot twice");
- TEST_EQ(altfw_num, 0, " check altfw_num");
- TEST_EQ(audio_looping_calls_left, 0, " audio timeout");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: legacy boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 2, " two error beeps: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
- TEST_EQ(beeps_played[1], 200, " low-frequency error beep");
-
- /* Refuse to boot legacy via menu if not enabled */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy BIOS
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Menu selected legacy boot when not enabled");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vbexlegacy_called, 0, " did not attempt legacy boot");
- TEST_EQ(audio_looping_calls_left, 0, " audio timeout");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: legacy boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: legacy boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Use volume-up long press shortcut to boot USB */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS, "VolUp USB");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* Can boot a valid USB image after failing to boot invalid image */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
- mock_keypress[1] = VB_BUTTON_VOL_UP_LONG_PRESS;
- vbtlk_retval[0] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
- "VolUp USB valid after invalid");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: first USB invalid");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Volume-up long press only works if USB is enabled */
- ResetMocksForDeveloper();
- mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "VolUp not enabled");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(audio_looping_calls_left, 0, " audio timed out");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Volume-up long press without valid USB will still time out */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- mock_keypress[0] = VB_BUTTON_VOL_UP_LONG_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "VolUp without valid USB");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " blank (error flash)");
- TEST_EQ(screens_displayed[2], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(audio_looping_calls_left, 0, " used up audio");
- TEST_EQ(beeps_count, 1, " error beep: USB not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-
- /* Volume-up long press works from other menus, like LANGUAGE */
- ResetMocksForDeveloper();
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_EXTERNAL, 1);
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_SUCCESS,
- "VolUp USB from LANGUAGE");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on USB boot");
-
- /* Can disable developer mode through TONORM screen */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enable os verification
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // confirm is the default
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_REBOOT,
- "TONORM via menu");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
- " disable dev request");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning: enable os verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm: confirm");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_TO_NORM_CONFIRMED,
- " confirm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps on reboot");
-
- /* If dev mode is disabled, goes to TONORM screen repeatedly */
- ResetMocksForDeveloper();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
- audio_looping_calls_left = 1; /* Confirm audio doesn't tick down. */
- i = 0;
- mock_keypress[i++] = VB_KEY_CTRL('D'); /* Just stays on TONORM and flashes */
- mock_keypress[i++] = VB_KEY_CTRL('U'); /* same */
- mock_keypress[i++] = VB_KEY_CTRL('L'); /* same */
- mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS; /* same */
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_LONG_PRESS; /* same */
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; /* noop */
- mock_keypress[i++] = VB_KEY_ENTER;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_REBOOT,
- "FWMP dev disabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 1,
- " disable dev request");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_TO_NORM_CONFIRMED,
- " confirm screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 10, " 5 * 2 error beeps: booting not allowed");
- TEST_EQ(beeps_played[0], 400, " first error beep");
- TEST_EQ(beeps_played[1], 400, " second error beep");
- TEST_EQ(beeps_played[2], 400, " first error beep");
- TEST_EQ(beeps_played[3], 400, " second error beep");
- TEST_EQ(beeps_played[4], 400, " first error beep");
- TEST_EQ(beeps_played[5], 400, " second error beep");
- TEST_EQ(beeps_played[6], 400, " first error beep");
- TEST_EQ(beeps_played[7], 400, " second error beep");
- TEST_EQ(beeps_played[8], 400, " first error beep");
- TEST_EQ(beeps_played[9], 400, " second error beep");
-
- /* Shutdown requested when dev disabled */
- ResetMocksForDeveloper();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
- shutdown_request_calls_left = 1;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested when dev disabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 0,
- " did not exit dev mode");
- TEST_EQ(screens_displayed[0], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Explicit Power Off when dev disabled */
- ResetMocksForDeveloper();
- fwmp->flags |= VB2_SECDATA_FWMP_DEV_DISABLE_BOOT;
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Power Off when dev disabled");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_DISABLE_DEV_REQUEST), 0,
- " did not exit dev mode");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(audio_looping_calls_left, 0, " aborts audio");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen: confirm enabling OS verification");
- /* Cancel option is removed with dev_disable_boot! */
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " tonorm screen: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps for power off");
-
- /* Show Debug Info displays debug info, then times out to boot */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS Verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Show Debug Info");
- TEST_EQ(debug_info_displayed, 1, " debug info displayed");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(audio_looping_calls_left, 0, " audio timed out");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps for debug info");
-
- /* Pressing Tab displays debug info, then times out to boot */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = '\t';
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "Show Debug Info (Tab shortcut)");
- TEST_EQ(debug_info_displayed, 1, " debug info displayed");
- TEST_EQ(vbexlegacy_called, 0, " not legacy");
- TEST_EQ(audio_looping_calls_left, 0, " audio timed out");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps for debug info");
-
-
- VB2_DEBUG("...done.\n");
-}
-
-static void VbBootRecTest(void)
-{
- int i;
-
- VB2_DEBUG("Testing VbBootRecoveryLegacyMenu()...\n");
-
- /* Shutdown requested in BROKEN */
- ResetMocks();
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested in BROKEN");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
- TEST_EQ(vbexaltfwmask_called, 0, " VbExGetAltFwIdxMask not called");
-
- /* BROKEN screen with disks inserted */
- ResetMocks();
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[2] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested in BROKEN with disks");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* BROKEN screen with disks on second attempt */
- ResetMocks();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested in BROKEN with later disk");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* BROKEN screen even if dev switch is on */
- ResetMocks();
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[2] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested in BROKEN with dev switch");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* go to INSERT if recovery button physically pressed and EC trusted */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested in INSERT with manual rec");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* go to INSERT if forced by GBB flag */
- ResetMocks();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- gbb.flags |= VB2_GBB_FLAG_FORCE_MANUAL_RECOVERY;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shutdown requested in INSERT forced by GBB flag");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Stay at BROKEN if recovery button not physically pressed */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- sd->flags &= ~VB2_SD_FLAG_MANUAL_RECOVERY;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Go to BROKEN if recovery not manually requested");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Stay at BROKEN if EC is untrusted */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- trust_ec = 0;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Go to BROKEN if EC is not trusted");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* INSERT boots without screens if we have a valid image on first try */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
- "INSERT boots without screens if valid on first try");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 1, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* INSERT boots eventually if we get a valid image later */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[2] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[4] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
- "INSERT boots after valid image appears");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* invalid image, then remove, then valid image */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[2] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[4] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
- "INSERT boots after valid image appears");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 3, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep on shutdown");
-
- /* Shortcuts that are always ignored in BROKEN for detachables. */
- ResetMocks();
- i = 0;
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_KEY_CTRL('D');
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_KEY_CTRL('U');
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_KEY_CTRL('L');
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS;
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_LONG_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shortcuts ignored in BROKEN");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from invalid keys");
-
- /* Shortcuts that are always ignored in INSERT for detachables. */
- ResetMocksForManualRecovery();
- i = 0;
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_KEY_CTRL('D');
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_KEY_CTRL('U');
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_KEY_CTRL('L');
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_LONG_PRESS;
- mock_keypress[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_LONG_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Shortcuts ignored in INSERT");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from invalid keys");
-
- /* Power Off BROKEN through OPTIONS menu */
- ResetMocks();
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter options
- mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Power Off BROKEN through OPTIONS");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
- " options: cancel");
- TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
- " options: power off");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from power off");
-
- /* Power Off NOGOOD through OPTIONS menu */
- ResetMocksForManualRecovery();
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter options
- mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Power Off NOGOOD through OPTIONS");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
- " options: cancel");
- TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
- " options: power off");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from power off");
-
- /* Power Off INSERT through TO_DEV menu */
- ResetMocksForManualRecovery();
- mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[0] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
- mock_keyflags[1] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Power Off INSERT through TO_DEV");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to_dev: cancel");
- TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to_dev: power off");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from power off");
-
- /* Show Debug Info from BROKEN through OPTIONS menu */
- ResetMocks();
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter options
- mock_keypress[1] = VB_BUTTON_VOL_UP_SHORT_PRESS; // show debug info
- mock_keypress[2] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Show Debug info from BROKEN through OPTIONS");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 1, " no debug info");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
- " options: cancel");
- TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
- " options: show debug info");
- TEST_EQ(screens_displayed[3], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 4, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from power off");
-
- /* Show Debug Info on NOGOOD with Tab */
- ResetMocksForManualRecovery();
- mock_keypress[0] = '\t';
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Show Debug info on NOGOOD with Tab");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 1, " no debug info");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 2, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beep from power off");
-
- /* Navigate to confirm dev mode selection and then cancel */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- i = 0;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm disabling
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // power off
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "go to TO_DEV screen and cancel");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: confirm disabling");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
- " back to insert screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Navigate to confirm dev mode selection and then confirm */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- i = 0;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_REBOOT_EC_TO_RO,
- "go to TO_DEV screen and confirm");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(virtdev_set, 1, " virtual dev mode on");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: confirm disabling os verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Untrusted keyboard cannot enter TO_DEV (must be malicious anyway) */
- ResetMocksForManualRecovery();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // try to_dev
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // try confirm
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Untrusted keyboard cannot enter TO_DEV");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Untrusted keyboard cannot navigate in TO_DEV menu if already there */
- ResetMocksForManualRecovery();
- i = 0;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // try to confirm...
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Untrusted keyboard cannot navigate in TO_DEV");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Don't handle TPM error in enabling dev mode */
- ResetMocksForManualRecovery();
- i = 0;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm enabling
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- virtdev_fail = 1;
- TEST_ABORT(VbBootRecoveryLegacyMenu(ctx), "todev TPM failure");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " aborted explicitly");
- TEST_EQ(virtdev_set, 0, " virtual dev mode still off");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " recovery to_dev menu: confirm disabling os verification");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Cannot enable dev mode if already enabled. */
- ResetMocksForManualRecovery();
- sd->flags |= VB2_SD_FLAG_DEV_MODE_ENABLED;
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- i = 0;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter to_dev
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Ctrl+D ignored if already in dev mode");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- TEST_EQ(virtdev_set, 0, " virtual dev mode wasn't enabled again");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 2, " played error beeps");
- TEST_EQ(beeps_played[0], 400, " first beep");
- TEST_EQ(beeps_played[1], 400, " second beep");
-
- /* Removing invalid USB drops back to INSERT from TO_DEV menu. */
- ResetMocksForManualRecovery();
- mock_keyflags[0] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[0] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
- /* asynchronous transition to INSERT before keypress[50] */
- mock_keypress[55] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- mock_keypress[56] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[57] = VB_BUTTON_POWER_SHORT_PRESS;
- vbtlk_retval[0] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Drop back to INSERT from TO_DEV when removing invalid USB");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev menu");
- TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[3], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[4], VB_SCREEN_OPTIONS_MENU,
- " options menu: power off");
- TEST_EQ(screens_displayed[5], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 6, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Plugging in invalid USB drops back to NOGOOD from LANGUAGE. */
- ResetMocksForManualRecovery();
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- mock_keypress[1] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[2] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[3] = VB_BUTTON_POWER_SHORT_PRESS;
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[2] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[3] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[4] = VB2_ERROR_MOCK - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "Drop back to NOGOOD from LANGUAGE when inserting invalid USB");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[2], VB_SCREEN_OPTIONS_MENU,
- " options menu: power off");
- TEST_EQ(screens_displayed[3], VB_SCREEN_OPTIONS_MENU,
- " options menu: language");
- TEST_EQ(screens_displayed[4], VB_SCREEN_LANGUAGES_MENU,
- " languages menu");
- TEST_EQ(screens_displayed[5], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[6], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 7, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Plugging in valid USB boots straight from OPTIONS menu. */
- ResetMocksForManualRecovery();
- mock_keypress[0] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- vbtlk_retval[1] = VB2_SUCCESS - VB_DISK_FLAG_REMOVABLE;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_SUCCESS,
- "Boot by plugging in USB straight from OPTIONS menu");
- TEST_NEQ(shutdown_request_calls_left, 0, " booted explicitly");
- TEST_EQ(virtdev_set, 0, " virtual dev mode off");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[1], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, 3, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- VB2_DEBUG("...done.\n");
-}
-
-static void VbTestLanguageMenu(void)
-{
- int i;
-
- VB2_DEBUG("Testing VbTestLanguageMenu()...\n");
-
- /* Navigate to language menu from BROKEN */
- ResetMocks();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // languages
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // enter languages
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // cancel -> BROKEN
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // power off
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "go to language menu from BROKEN");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OS_BROKEN,
- " broken screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Navigate to all language menus from recovery */
- ResetMocksForManualRecovery();
- vbtlk_retval[0] = VB2_ERROR_LK_NO_DISK_FOUND -
- VB_DISK_FLAG_REMOVABLE;
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // languages
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm disabling
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "go to language menus from INSERT");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_INSERT,
- " insert screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: confirm disabling os verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: power_off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " to dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* Navigate to all language menus from developer menu */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enable OS verif
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // return to dev_warn
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enable OS verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // show debug info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // developer options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- " scroll through all language menus in developer options");
- TEST_EQ(debug_info_displayed, 0, " no debug info");
- TEST_NEQ(shutdown_request_calls_left, 0, " powered down explicitly");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu: select current language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: cancel ");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to norm screen: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to norm screen: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to norm screen: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to norm screen: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu: select current language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to norm screen: confirm enabling os verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to norm screen: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " warning screen: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " select developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: boot developer image");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " language menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: boot from disk");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " developer menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- VB2_DEBUG("...done.\n");
-}
-
-static void VbNavigationTest(void)
-{
- int i;
-
- VB2_DEBUG("Testing long navigation sequences...");
-
- /*
- * NOGOOD, OPTIONS, LANGUAGE, TODEV, LANGUAGE, TODEV,
- * LANGUAGE, select, Cancel, OPTIONS, LANGUAGE
- */
- ResetMocksForManualRecovery();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // confirm enabling
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_DOWN_COMBO_PRESS; // enter TO_DEV
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // select current lang
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // power off
- mock_keyflags[i] = VB_KEY_FLAG_TRUSTED_KEYBOARD;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // enter OPTIONS
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // show debug info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // power off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // language
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- TEST_EQ(VbBootRecoveryLegacyMenu(ctx), VB2_REQUEST_SHUTDOWN,
- "recovery mode long navigation");
- TEST_EQ(debug_info_displayed, 1, " showed debug info");
- TEST_EQ(shutdown_request_calls_left, 0, " timed out");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " languages menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: confirm enabling");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: confirm enabling");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " languages menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " languages menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_TO_DEV_MENU,
- " todev: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_RECOVERY_NO_GOOD,
- " nogood screen");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_OPTIONS_MENU,
- " options: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_LANGUAGES_MENU,
- " languages menu");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 0, " no beeps");
-
- /* DEVELOPER, Cancel, Show Debug, TO_NORM, Cancel, Boot Legacy */
- ResetMocksForDeveloper();
- i = 0;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Boot From Disk
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Enable OS verif
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Language
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Enable OS verif
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Show Debug Info
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Developer Options
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS;
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Language
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Power Off
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From Disk
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select altfw menu
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Second altfw
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Cancel
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // (end of menu)
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Back to dev options
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From Disk
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot From USB
- mock_keypress[i++] = VB_BUTTON_VOL_UP_SHORT_PRESS; // Boot Legacy
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select altfw menu
- mock_keypress[i++] = VB_BUTTON_VOL_DOWN_SHORT_PRESS; // Second altfw
- mock_keypress[i++] = VB_BUTTON_POWER_SHORT_PRESS; // Select 2nd altfw
- vb2_nv_set(ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
- TEST_EQ(VbBootDeveloperLegacyMenu(ctx), vbtlk_retval_fixed,
- "developer mode long navigation");
- TEST_EQ(debug_info_displayed, 1, " showed debug info");
- TEST_EQ(vbexlegacy_called, 1, " tried legacy");
- TEST_EQ(altfw_num, 2, " check altfw_num");
- TEST_EQ(audio_looping_calls_left, 0, " audio timeout");
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST), 0, " no recovery");
- i = 0;
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: Legacy boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: Legacy boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: USB boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: disk boot");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: confirm enabling");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_TO_NORM_MENU,
- " to dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: enable root verification");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: show debug info");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_WARNING_MENU,
- " dev warning menu: developer options");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot from disk");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: language");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: power off");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot from disk");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot from USB");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot legacy");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot legacy");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw 1");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw 2");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU,
- " altfw cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU,
- " altfw end");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: cancel");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot from disk");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot from USB");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
- " dev menu: boot legacy");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_ALT_FW_MENU, " altfw");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK," final blank screen");
- TEST_EQ(screens_count, i, " no extra screens");
- TEST_EQ(beeps_count, 1, " error beep: legacy BIOS not found");
- TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
-}
-
-int main(void)
-{
- VbBootDevTest();
- VbBootRecTest();
- VbTestLanguageMenu();
- VbNavigationTest();
-
- return gTestSuccess ? 0 : 255;
-}
diff --git a/tests/vboot_ui_legacy_tests.c b/tests/vboot_ui_legacy_tests.c
deleted file mode 100644
index 04da02e5..00000000
--- a/tests/vboot_ui_legacy_tests.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Copyright (c) 2013 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.
- *
- * Tests for firmware display library.
- */
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "2common.h"
-#include "2misc.h"
-#include "2nvstorage.h"
-#include "2struct.h"
-#include "2sysincludes.h"
-#include "host_common.h"
-#include "test_common.h"
-#include "vboot_kernel.h"
-#include "vboot_ui_legacy.h"
-
-/* Mock data */
-static char debug_info[4096];
-static struct vb2_context *ctx;
-static struct vb2_shared_data *sd;
-static uint8_t workbuf[VB2_KERNEL_WORKBUF_RECOMMENDED_SIZE]
- __attribute__((aligned(VB2_WORKBUF_ALIGN)));
-static uint32_t mock_localization_count;
-static uint32_t mock_altfw_mask;
-
-/* Reset mock data (for use before each test) */
-static void ResetMocks(void)
-{
- mock_localization_count = 3;
- mock_altfw_mask = 3 << 1; /* This mask selects 1 and 2 */
-
- TEST_SUCC(vb2api_init(workbuf, sizeof(workbuf), &ctx),
- "vb2api_init failed");
- vb2_nv_init(ctx);
-
- sd = vb2_get_sd(ctx);
-
- *debug_info = 0;
-}
-
-/* Mocks */
-uint32_t vb2ex_get_locale_count(void) {
-
- return mock_localization_count;
-}
-
-uint32_t VbExGetAltFwIdxMask() {
- return mock_altfw_mask;
-}
-
-vb2_error_t VbExDisplayDebugInfo(const char *info_str, int full_info)
-{
- strncpy(debug_info, info_str, sizeof(debug_info));
- debug_info[sizeof(debug_info) - 1] = '\0';
- return VB2_SUCCESS;
-}
-
-vb2_error_t vb2ex_commit_data(struct vb2_context *c)
-{
- return VB2_SUCCESS;
-}
-
-/* Test displaying debug info */
-static void DebugInfoTest(void)
-{
- /* Display debug info */
- ResetMocks();
- TEST_SUCC(VbDisplayDebugInfo(ctx),
- "Display debug info");
- TEST_NEQ(*debug_info, '\0', " Some debug info was displayed");
-}
-
-/* Test display key checking */
-static void DisplayKeyTest(void)
-{
- ResetMocks();
- VbCheckDisplayKey(ctx, 'q', 0, NULL);
- TEST_EQ(*debug_info, '\0', "DisplayKey q = does nothing");
-
- ResetMocks();
- VbCheckDisplayKey(ctx, '\t', 0, NULL);
- TEST_NEQ(*debug_info, '\0', "DisplayKey tab = display");
-
- /* Toggle localization */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, 0);
- VbCheckDisplayKey(ctx, VB_KEY_DOWN, 0, NULL);
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 2,
- "DisplayKey up");
- VbCheckDisplayKey(ctx, VB_KEY_LEFT, 0, NULL);
- vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 1,
- "DisplayKey left");
- VbCheckDisplayKey(ctx, VB_KEY_RIGHT, 0, NULL);
- vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 2,
- "DisplayKey right");
- VbCheckDisplayKey(ctx, VB_KEY_UP, 0, NULL);
- vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX);
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 0,
- "DisplayKey up");
-
- /* Reset localization if localization count is invalid */
- ResetMocks();
- vb2_nv_set(ctx, VB2_NV_LOCALIZATION_INDEX, 1);
- mock_localization_count = 0;
- VbCheckDisplayKey(ctx, VB_KEY_UP, 0, NULL);
- TEST_EQ(vb2_nv_get(ctx, VB2_NV_LOCALIZATION_INDEX), 0,
- "DisplayKey invalid");
-}
-
-int main(void)
-{
- DebugInfoTest();
- DisplayKeyTest();
-
- return gTestSuccess ? 0 : 255;
-}