/* 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; }