diff options
-rw-r--r-- | Makefile | 38 | ||||
-rw-r--r-- | firmware/2lib/include/2api.h | 8 | ||||
-rw-r--r-- | firmware/2lib/include/2return_codes.h | 5 | ||||
-rw-r--r-- | firmware/include/vboot_api.h | 155 | ||||
-rw-r--r-- | firmware/lib/include/vboot_kernel.h | 45 | ||||
-rw-r--r-- | firmware/lib/include/vboot_ui_legacy.h | 86 | ||||
-rw-r--r-- | firmware/lib/include/vboot_ui_legacy_menu_private.h | 93 | ||||
-rw-r--r-- | firmware/lib/include/vboot_ui_legacy_wilco.h | 32 | ||||
-rw-r--r-- | firmware/lib/vboot_api_kernel.c | 31 | ||||
-rw-r--r-- | firmware/lib/vboot_ui_legacy.c | 305 | ||||
-rw-r--r-- | firmware/lib/vboot_ui_legacy_clamshell.c | 545 | ||||
-rw-r--r-- | firmware/lib/vboot_ui_legacy_menu.c | 935 | ||||
-rw-r--r-- | firmware/lib/vboot_ui_legacy_wilco.c | 367 | ||||
-rw-r--r-- | firmware/stub/vboot_api_stub.c | 28 | ||||
-rw-r--r-- | tests/vb2_auxfw_sync_tests.c | 1 | ||||
-rw-r--r-- | tests/vb2_ec_sync_tests.c | 1 | ||||
-rw-r--r-- | tests/vboot_api_kernel4_tests.c | 38 | ||||
-rw-r--r-- | tests/vboot_ui_legacy_clamshell_beep_tests.c | 274 | ||||
-rw-r--r-- | tests/vboot_ui_legacy_clamshell_tests.c | 1655 | ||||
-rw-r--r-- | tests/vboot_ui_legacy_menu_tests.c | 2349 | ||||
-rw-r--r-- | tests/vboot_ui_legacy_tests.c | 124 |
21 files changed, 16 insertions, 7099 deletions
@@ -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; -} |