diff options
Diffstat (limited to 'firmware/lib/vboot_ui_legacy_clamshell.c')
-rw-r--r-- | firmware/lib/vboot_ui_legacy_clamshell.c | 545 |
1 files changed, 0 insertions, 545 deletions
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; -} |