| /* 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 "2common.h" |
| #include "2misc.h" |
| #include "2sysincludes.h" |
| #include "vboot_api.h" |
| #include "vboot_kernel.h" |
| #include "vboot_test.h" |
| #include "vboot_ui_legacy_common.h" |
| |
| 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: |
| VbExBeep(250, 200); |
| break; |
| default: |
| case VB_BEEP_NOT_ALLOWED: |
| VbExBeep(120, 400); |
| VbExSleepMs(120); |
| VbExBeep(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; |
| } |