Add broken screen

In the new recovery process, a user will see 'broken' screen
instead of 'remove' screen, where usb stick presence is no longer
detected. A user instead has to hit esc+refresh+power to proceed
to recovery mode.

BUG=chromium:501060
BRANCH=tot
TEST=make runtests

Change-Id: Icd511c1ca892628b96befbb0a34c2c84b881c857
Reviewed-on: https://chromium-review.googlesource.com/304404
Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org>
Tested-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
This commit is contained in:
Daisuke Nojiri
2015-04-30 12:41:24 -07:00
committed by chrome-bot
parent f29dbbcbd5
commit 73a6372d22
6 changed files with 28 additions and 87 deletions

View File

@@ -93,6 +93,7 @@ typedef enum ScreenIndex {
SCREEN_DEVELOPER_TO_NORM, SCREEN_DEVELOPER_TO_NORM,
SCREEN_WAIT, SCREEN_WAIT,
SCREEN_TO_NORM_CONFIRMED, SCREEN_TO_NORM_CONFIRMED,
SCREEN_OS_BROKEN,
MAX_VALID_SCREEN_INDEX, MAX_VALID_SCREEN_INDEX,
SCREEN_BLANK = ~0UL, SCREEN_BLANK = ~0UL,
} ScreenIndex; } ScreenIndex;

View File

@@ -735,6 +735,8 @@ enum VbScreenType_t {
VB_SCREEN_WAIT = 0x206, VB_SCREEN_WAIT = 0x206,
/* Confirm after DEVELOPER_TO_NORM */ /* Confirm after DEVELOPER_TO_NORM */
VB_SCREEN_TO_NORM_CONFIRMED = 0x207, VB_SCREEN_TO_NORM_CONFIRMED = 0x207,
/* Broken screen shown after verification failure */
VB_SCREEN_OS_BROKEN = 0x208,
}; };
/** /**

View File

@@ -464,63 +464,24 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
/* /*
* If the dev-mode switch is off and the user didn't press the recovery * If the dev-mode switch is off and the user didn't press the recovery
* button, require removal of all external media. * button (recovery was triggerred automatically), show 'broken' screen.
* The user can either only shutdown to abort or hit esc+refresh+power
* to initiate recovery as instructed on the screen.
*/ */
if (!(shared->flags & VBSD_BOOT_DEV_SWITCH_ON) && if (!(shared->flags & VBSD_BOOT_DEV_SWITCH_ON) &&
!(shared->flags & VBSD_BOOT_REC_SWITCH_ON)) { !(shared->flags & VBSD_BOOT_REC_SWITCH_ON)) {
VbDiskInfo *disk_info = NULL; VBDEBUG(("VbBootRecovery() waiting for manual recovery\n"));
uint32_t disk_count = 0; VbDisplayScreen(cparams, VB_SCREEN_OS_BROKEN, 0, &vnc);
VBDEBUG(("VbBootRecovery() forcing device removal\n"));
/* If no media is detected initially, delay and make one extra
* attempt, in case devices appear later than expected. */
if (VBERROR_SUCCESS != VbExDiskGetInfo(&disk_info, &disk_count,
VB_DISK_FLAG_REMOVABLE))
disk_count = 0;
VbExDiskFreeInfo(disk_info, NULL);
if (0 == disk_count)
VbExSleepMs(REC_MEDIA_INIT_DELAY);
while (1) { while (1) {
disk_info = NULL; VbCheckDisplayKey(cparams, VbExKeyboardRead(), &vnc);
disk_count = 0; if (VbWantShutdown(cparams->gbb->flags))
if (VBERROR_SUCCESS != return VBERROR_SHUTDOWN_REQUESTED;
VbExDiskGetInfo(&disk_info, &disk_count, VbExSleepMs(REC_KEY_DELAY);
VB_DISK_FLAG_REMOVABLE))
disk_count = 0;
VbExDiskFreeInfo(disk_info, NULL);
if (0 == disk_count) {
VbDisplayScreen(cparams, VB_SCREEN_BLANK,
0, &vnc);
break;
}
VBDEBUG(("VbBootRecovery() "
"waiting for %d disks to be removed\n",
(int)disk_count));
VbDisplayScreen(cparams, VB_SCREEN_RECOVERY_REMOVE,
0, &vnc);
/*
* Scan keyboard more frequently than media, since x86
* platforms don't like to scan USB too rapidly.
*/
for (i = 0; i < REC_DISK_DELAY; i += REC_KEY_DELAY) {
VbCheckDisplayKey(cparams, VbExKeyboardRead(),
&vnc);
if (VbWantShutdown(cparams->gbb->flags))
return VBERROR_SHUTDOWN_REQUESTED;
VbExSleepMs(REC_KEY_DELAY);
}
} }
} }
/* Loop and wait for a recovery image */ /* Loop and wait for a recovery image */
VBDEBUG(("VbBootRecovery() waiting for a recovery image\n"));
while (1) { while (1) {
VBDEBUG(("VbBootRecovery() attempting to load kernel2\n")); VBDEBUG(("VbBootRecovery() attempting to load kernel2\n"));
retval = VbTryLoadKernel(cparams, p, VB_DISK_FLAG_REMOVABLE); retval = VbTryLoadKernel(cparams, p, VB_DISK_FLAG_REMOVABLE);

View File

@@ -188,6 +188,9 @@ VbError_t VbDisplayScreenFromGBB(VbCommonParams *cparams, uint32_t screen,
case VB_SCREEN_TO_NORM_CONFIRMED: case VB_SCREEN_TO_NORM_CONFIRMED:
screen_index = SCREEN_TO_NORM_CONFIRMED; screen_index = SCREEN_TO_NORM_CONFIRMED;
break; break;
case VB_SCREEN_OS_BROKEN:
screen_index = SCREEN_OS_BROKEN;
break;
case VB_SCREEN_BLANK: case VB_SCREEN_BLANK:
case VB_SCREEN_DEVELOPER_EGG: case VB_SCREEN_DEVELOPER_EGG:
default: default:

View File

@@ -285,6 +285,9 @@ VbError_t VbExDisplayScreen(uint32_t screen_type) {
case VB_SCREEN_RECOVERY_NO_GOOD: case VB_SCREEN_RECOVERY_NO_GOOD:
VBDEBUG(("VbExDisplayScreen(NO_GOOD)\n")); VBDEBUG(("VbExDisplayScreen(NO_GOOD)\n"));
break; break;
case VB_SCREEN_OS_BROKEN:
VBDEBUG(("VbExDisplayScreen(BROKEN)\n"));
break;
default: default:
VBDEBUG(("VbExDisplayScreen(%d)\n", screen_type)); VBDEBUG(("VbExDisplayScreen(%d)\n", screen_type));
} }

View File

@@ -462,26 +462,8 @@ static void VbBootRecTest(void)
VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u); VbNvGet(VbApiKernelGetVnc(), VBNV_RECOVERY_REQUEST, &u);
TEST_EQ(u, 0, " recovery reason"); TEST_EQ(u, 0, " recovery reason");
TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK, TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
" blank screen"); " broken screen");
TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_NO_GOOD,
" no good screen");
/* Disk inserted after start */
ResetMocks();
vbtlk_retval = VBERROR_SUCCESS - VB_DISK_FLAG_REMOVABLE;
TEST_EQ(VbBootRecovery(&cparams, &lkp), 0, "Good");
/* No disk inserted */
ResetMocks();
vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
shutdown_request_calls_left = 10;
TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
"Bad disk");
TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK,
" blank screen");
TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_INSERT,
" insert screen");
/* Remove disks */ /* Remove disks */
ResetMocks(); ResetMocks();
@@ -492,14 +474,8 @@ static void VbBootRecTest(void)
vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE; vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED, TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
"Remove"); "Remove");
TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_REMOVE, TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
" remove screen"); " broken screen");
TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_REMOVE,
" remove screen");
TEST_EQ(screens_displayed[2], VB_SCREEN_BLANK,
" blank screen");
TEST_EQ(screens_displayed[3], VB_SCREEN_RECOVERY_INSERT,
" insert screen");
/* No removal if dev switch is on */ /* No removal if dev switch is on */
ResetMocks(); ResetMocks();
@@ -533,24 +509,19 @@ static void VbBootRecTest(void)
vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE; vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED, TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
"Remove"); "Remove");
TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_REMOVE, TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
" remove screen"); " broken screen");
TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK,
" blank screen");
TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT,
" insert screen");
/* Bad disk count doesn't require removal */ /* Bad disk count doesn't require removal */
ResetMocks(); ResetMocks();
shutdown_request_calls_left = 100;
mock_num_disks[0] = -1; mock_num_disks[0] = -1;
vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE; vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE;
shutdown_request_calls_left = 10; shutdown_request_calls_left = 10;
TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED, TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED,
"Bad disk count"); "Bad disk count");
TEST_EQ(screens_displayed[0], VB_SCREEN_BLANK, TEST_EQ(screens_displayed[0], VB_SCREEN_OS_BROKEN,
" blank screen"); " broken screen");
TEST_EQ(screens_displayed[1], VB_SCREEN_RECOVERY_INSERT,
" insert screen");
/* Ctrl+D ignored for many reasons... */ /* Ctrl+D ignored for many reasons... */
ResetMocks(); ResetMocks();