summaryrefslogtreecommitdiff
path: root/tests/vboot_detach_menu_tests.c
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2018-10-16 19:36:48 -0600
committerchrome-bot <chrome-bot@chromium.org>2018-11-16 05:01:45 -0800
commita0ae31871275b389ea0f8b99ee4de359970b7db6 (patch)
treef8a5a5867dfbe1fa9f1ee5ed21928bd8daa392e9 /tests/vboot_detach_menu_tests.c
parent4586b0c1dea8af8fd603ee7f1a0f6271bdcc1963 (diff)
downloadvboot-a0ae31871275b389ea0f8b99ee4de359970b7db6.tar.gz
Add a screen showing a menu for alternative firmware
At present we allow the user to press a keypad number to boot into another bootloader but there is no indication which one is which. Add a new screen for this. It is entered via Ctrl-L and shows the available bootloaders, along with the number to press for each. The contents of the screen is rendered by the bootloader, as usual. This is supported by two new screens, one for the keyboard UI and one for the menu UI. Also a new function, VbExGetAltFwIdxMask(), is added to find out what bootloaders are available. Note: This CL combines changes for both UIs. The changes may be easier to review separately. CQ-DEPEND=CL:1273269 BUG=chromium:837018 BRANCH=none TEST=FEATURES=test emerge-grunt --nodeps vboot_reference Change-Id: Ib3227545dc677c8f9587944753e32f3b49647360 Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1273268 Reviewed-by: Julius Werner <jwerner@chromium.org>
Diffstat (limited to 'tests/vboot_detach_menu_tests.c')
-rw-r--r--tests/vboot_detach_menu_tests.c97
1 files changed, 70 insertions, 27 deletions
diff --git a/tests/vboot_detach_menu_tests.c b/tests/vboot_detach_menu_tests.c
index 6ec9f334..a9034b33 100644
--- a/tests/vboot_detach_menu_tests.c
+++ b/tests/vboot_detach_menu_tests.c
@@ -56,6 +56,8 @@ 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;
extern enum VbEcBootMode_t VbGetMode(void);
extern struct RollbackSpaceFwmp *VbApiKernelGetFwmp(void);
@@ -107,6 +109,9 @@ static void ResetMocks(void)
memset(mock_switches, 0, sizeof(mock_switches));
mock_switches_count = 0;
mock_switches_are_stuck = 0;
+
+ mock_altfw_mask = 3 << 1; /* This mask selects 1 and 2 */
+ vbexaltfwmask_called = 0;
}
static void ResetMocksForDeveloper(void)
@@ -127,6 +132,13 @@ static void ResetMocksForManualRecovery(void)
/* Mock functions */
+uint32_t VbExGetAltFwIdxMask() {
+
+ vbexaltfwmask_called++;
+
+ return mock_altfw_mask;
+}
+
uint32_t VbExIsShutdownRequested(void)
{
if (shutdown_request_calls_left == 0)
@@ -614,17 +626,18 @@ static void VbBootDevTest(void)
ResetMocksForDeveloper();
sd->gbb_flags |= GBB_FLAG_FORCE_DEV_BOOT_LEGACY;
mock_keypress[0] = 'L' & 0x1f;
+ mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
TEST_EQ(VbBootDeveloperMenu(&ctx), vbtlk_retval_fixed,
"Ctrl+L force legacy");
TEST_EQ(vbexlegacy_called, 1, " try legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
+ 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_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(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");
@@ -632,17 +645,18 @@ static void VbBootDevTest(void)
ResetMocksForDeveloper();
vb2_nv_set(&ctx, VB2_NV_DEV_BOOT_LEGACY, 1);
mock_keypress[0] = 'L' & 0x1f;
+ mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
TEST_EQ(VbBootDeveloperMenu(&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_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(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");
@@ -650,20 +664,23 @@ static void VbBootDevTest(void)
ResetMocksForDeveloper();
VbApiKernelGetFwmp()->flags |= FWMP_DEV_ENABLE_LEGACY;
mock_keypress[0] = 'L' & 0x1f;
+ mock_keypress[1] = VB_BUTTON_POWER_SHORT_PRESS;
TEST_EQ(VbBootDeveloperMenu(&ctx), vbtlk_retval_fixed,
"Ctrl+L fwmp legacy");
TEST_EQ(vbexlegacy_called, 1, " fwmp legacy");
- TEST_EQ(altfw_num, 0, " check altfw_num");
+ 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_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(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] = 'U' & 0x1f;
@@ -908,8 +925,9 @@ static void VbBootDevTest(void)
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;
+ 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_LEGACY);
TEST_EQ(VbBootDeveloperMenu(&ctx), vbtlk_retval_fixed,
@@ -930,13 +948,12 @@ static void VbBootDevTest(void)
" 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_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_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, " two error beeps: legacy BIOS not found");
TEST_EQ(beeps_played[0], 200, " low-frequency error beep");
@@ -1282,6 +1299,7 @@ static void VbBootRecTest(void)
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();
@@ -2192,13 +2210,23 @@ static void VbNavigationTest(void)
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;
+ 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(VbBootDeveloperMenu(&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, 0, " check altfw_num");
+ 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;
@@ -2280,9 +2308,24 @@ static void VbNavigationTest(void)
" dev menu: boot legacy");
TEST_EQ(screens_displayed[i++], VB_SCREEN_DEVELOPER_MENU,
" dev menu: boot legacy");
- TEST_EQ(screens_displayed[i++], VB_SCREEN_BLANK, " blank (flash)");
+ 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");