mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-24 18:25:10 +00:00
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:
committed by
chrome-bot
parent
f29dbbcbd5
commit
73a6372d22
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user