From 5feac6eb9d105a1c9526b4dd981dce36ba91d79d Mon Sep 17 00:00:00 2001 From: Hsuan Ting Chen Date: Thu, 5 Mar 2020 14:57:51 +0800 Subject: vboot: Introduce menu UI According to crbug.com/1033815, add files for MENU_UI: - 2ui.{c,h} for entry point functions called by kernel selection. - vb2_ui_tests.c for tests (normal boot included). There are three entry points: vb2_developer_menu(), vb2_broken_recovery_menu(), and vb2_manual_recovery_menu(). Only infinite loop for this CL, others will be added in separate CLs. BRANCH=none BUG=b:146399181,chromium:1033815 TEST=USE="legacy_clamshell_ui" emerge-nami vboot_reference depthcharge TEST=USE="legacy_menu_ui" emerge-nami vboot_reference depthcharge TEST=USE="menu_ui" emerge-nami vboot_reference depthcharge TEST=make runtests Cq-Depend: chromium:2043102 Change-Id: I5a23eb006754b5ff08eb42bcd5021374995eab40 Signed-off-by: Hsuan Ting Chen Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/2087557 Reviewed-by: Joel Kitching Commit-Queue: Yu-Ping Wu --- Makefile | 10 +++++++++ firmware/2lib/2ui.c | 43 +++++++++++++++++++++++++++++++++++++ firmware/2lib/include/2api.h | 18 ++++++++++++++++ firmware/2lib/include/2ui.h | 47 +++++++++++++++++++++++++++++++++++++++++ firmware/lib/vboot_api_kernel.c | 15 ++++++++++--- tests/vb2_ui_tests.c | 34 +++++++++++++++++++++++++++++ 6 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 firmware/2lib/2ui.c create mode 100644 firmware/2lib/include/2ui.h create mode 100644 tests/vb2_ui_tests.c diff --git a/Makefile b/Makefile index 6a610c89..5fd2ec6d 100644 --- a/Makefile +++ b/Makefile @@ -192,6 +192,13 @@ ifneq (${MOCK_TPM},) CFLAGS += -DMOCK_TPM 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. @@ -369,6 +376,7 @@ FWLIB_SRCS = \ firmware/2lib/2sha512.c \ firmware/2lib/2sha_utility.c \ firmware/2lib/2tpm_bootmode.c \ + firmware/2lib/2ui.c \ firmware/lib/cgptlib/cgptlib.c \ firmware/lib/cgptlib/cgptlib_internal.c \ firmware/lib/cgptlib/crc32.c \ @@ -709,6 +717,7 @@ TEST2X_NAMES = \ tests/vb2_secdata_kernel_tests \ tests/vb2_sha_api_tests \ tests/vb2_sha_tests \ + tests/vb2_ui_tests \ tests/hmac_test TEST20_NAMES = \ @@ -1219,6 +1228,7 @@ run2tests: install_for_test ${RUNTEST} ${BUILD_RUN}/tests/vb2_secdata_kernel_tests ${RUNTEST} ${BUILD_RUN}/tests/vb2_sha_api_tests ${RUNTEST} ${BUILD_RUN}/tests/vb2_sha_tests + ${RUNTEST} ${BUILD_RUN}/tests/vb2_ui_tests ${RUNTEST} ${BUILD_RUN}/tests/vb20_api_kernel_tests ${RUNTEST} ${BUILD_RUN}/tests/vb20_kernel_tests ${RUNTEST} ${BUILD_RUN}/tests/vb20_misc_tests diff --git a/firmware/2lib/2ui.c b/firmware/2lib/2ui.c new file mode 100644 index 00000000..b6892cb9 --- /dev/null +++ b/firmware/2lib/2ui.c @@ -0,0 +1,43 @@ +/* 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. + * + * User interfaces for developer and recovery mode menus. + */ + +#include "2api.h" +#include "2common.h" +#include "2ui.h" + +/*****************************************************************************/ +/* Entry points */ + +vb2_error_t vb2_developer_menu(struct vb2_context *ctx) +{ + /* TODO(roccochen): Init, wait for user, and boot. */ + vb2ex_display_ui(VB2_SCREEN_BLANK, 0); + + while (1); + + return VB2_SUCCESS; +} + +vb2_error_t vb2_broken_recovery_menu(struct vb2_context *ctx) +{ + /* TODO(roccochen): Init and wait for user to reset or shutdown. */ + vb2ex_display_ui(VB2_SCREEN_BLANK, 0); + + while (1); + + return VB2_SUCCESS; +} + +vb2_error_t vb2_manual_recovery_menu(struct vb2_context *ctx) +{ + /* TODO(roccochen): Init and wait for user. */ + vb2ex_display_ui(VB2_SCREEN_BLANK, 0); + + while (1); + + return VB2_SUCCESS; +} diff --git a/firmware/2lib/include/2api.h b/firmware/2lib/include/2api.h index e19fcf74..6be8a8d4 100644 --- a/firmware/2lib/include/2api.h +++ b/firmware/2lib/include/2api.h @@ -1106,4 +1106,22 @@ vb2_error_t vb2ex_ec_vboot_done(struct vb2_context *ctx); */ vb2_error_t vb2ex_ec_battery_cutoff(void); +/*****************************************************************************/ +/* Functions for UI display. */ + +/* Screens. */ +enum vb2_screen { + /* Blank screen */ + VB2_SCREEN_BLANK = 0, +}; + +/** + * Display UI screen. + * + * @param screen Screen to display. + * @param locale Locale. + * @return VB2_SUCCESS, or error code on error. + */ +vb2_error_t vb2ex_display_ui(enum vb2_screen screen, uint32_t locale); + #endif /* VBOOT_REFERENCE_2API_H_ */ diff --git a/firmware/2lib/include/2ui.h b/firmware/2lib/include/2ui.h new file mode 100644 index 00000000..c5fdc1c6 --- /dev/null +++ b/firmware/2lib/include/2ui.h @@ -0,0 +1,47 @@ +/* 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. + * + * User interfaces for developer and recovery mode menus. + */ + +#ifndef VBOOT_REFERENCE_2UI_H_ +#define VBOOT_REFERENCE_2UI_H_ + +/** + * UI for a developer-mode boot. + * + * Enter the developer menu, which provides options to switch out of developer + * mode, boot from external media, use legacy bootloader, or boot Chrome OS from + * disk. + * + * If a timeout occurs, take the default boot action. + * + * @param ctx Vboot context + * @returns VB2_SUCCESS, or non-zero error code. + */ +vb2_error_t vb2_developer_menu(struct vb2_context *ctx); + +/** + * UI for a non-manual recovery ("BROKEN"). + * + * Enter the recovery menu, which shows that an unrecoverable error was + * encountered last boot. Wait for the user to physically reset or shut down. + * + * @param ctx Vboot context + * @returns VB2_SUCCESS, or non-zero error code. + */ +vb2_error_t vb2_broken_recovery_menu(struct vb2_context *ctx); + +/** + * UI for a manual recovery-mode boot. + * + * Enter the recovery menu, which prompts the user to insert recovery media, + * navigate the step-by-step recovery, or enter developer mode if allowed. + * + * @param ctx Vboot context + * @returns VB2_SUCCESS, or non-zero error code. + */ +vb2_error_t vb2_manual_recovery_menu(struct vb2_context *ctx); + +#endif /* VBOOT_REFERENCE_2UI_H_ */ diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c index 82b2b033..8b7aab9e 100644 --- a/firmware/lib/vboot_api_kernel.c +++ b/firmware/lib/vboot_api_kernel.c @@ -13,6 +13,7 @@ #include "2rsa.h" #include "2secdata.h" #include "2sysincludes.h" +#include "2ui.h" #include "load_kernel_fw.h" #include "utility.h" #include "vb2_common.h" @@ -241,10 +242,16 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx, VB2_DEBUG("NO_BOOT in RECOVERY mode\n"); /* Recovery boot. This has UI. */ - if (LEGACY_MENU_UI) + if (MENU_UI) { + if (vb2_allow_recovery(ctx)) + rv = vb2_manual_recovery_menu(ctx); + else + rv = vb2_broken_recovery_menu(ctx); + } else if (LEGACY_MENU_UI) { rv = VbBootRecoveryLegacyMenu(ctx); - else + } else { rv = VbBootRecoveryLegacyClamshell(ctx); + } } else if (DIAGNOSTIC_UI && vb2_nv_get(ctx, VB2_NV_DIAG_REQUEST)) { vb2_nv_set(ctx, VB2_NV_DIAG_REQUEST, 0); @@ -264,7 +271,9 @@ vb2_error_t VbSelectAndLoadKernel(struct vb2_context *ctx, rv = VBERROR_REBOOT_REQUIRED; } else if (ctx->flags & VB2_CONTEXT_DEVELOPER_MODE) { /* Developer boot. This has UI. */ - if (LEGACY_MENU_UI) + if (MENU_UI) + rv = vb2_developer_menu(ctx); + else if (LEGACY_MENU_UI) rv = VbBootDeveloperLegacyMenu(ctx); else rv = VbBootDeveloperLegacyClamshell(ctx); diff --git a/tests/vb2_ui_tests.c b/tests/vb2_ui_tests.c new file mode 100644 index 00000000..ffcb7d60 --- /dev/null +++ b/tests/vb2_ui_tests.c @@ -0,0 +1,34 @@ +/* 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. + * + * Tests for developer and recovery mode UIs. + */ + +#include "test_common.h" + +/* Tests */ + +static void developer_tests(void) +{ + /* TODO(roccochen) */ +} + +static void broken_recovery_tests(void) +{ + /* TODO(roccochen) */ +} + +static void manual_recovery_tests(void) +{ + /* TODO(roccochen) */ +} + +int main(void) +{ + developer_tests(); + broken_recovery_tests(); + manual_recovery_tests(); + + return gTestSuccess ? 0 : 255; +} -- cgit v1.2.1