From aecef39cda6a70c99bf0caff0452e47ad43a68d8 Mon Sep 17 00:00:00 2001
From: Paul Kocialkowski <contact@paulk.fr>
Date: Sun, 10 Jul 2016 23:43:16 +0200
Subject: [PATCH 7/7] firmware: Pass VbDisplayInfo information structure to
VbExDisplayScreen
This provides VbExDisplayScreen with an information structure
(VbDisplayInfo) that contains various context information for display.
Change-Id: Id9e07bb418f64e9286f07da11314cd63f925e301
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
---
firmware/include/vboot_api.h | 12 +++++++++-
firmware/lib/include/vboot_display.h | 2 +-
firmware/lib/vboot_api_kernel.c | 44 ++++++++++++++++++++++++------------
firmware/lib/vboot_display.c | 15 ++++++------
firmware/stub/vboot_api_stub.c | 3 ++-
tests/vboot_api_devmode_tests.c | 3 ++-
tests/vboot_api_kernel2_tests.c | 2 +-
tests/vboot_api_kernel3_tests.c | 2 +-
8 files changed, 55 insertions(+), 28 deletions(-)
diff --git a/firmware/include/vboot_api.h b/firmware/include/vboot_api.h
index 950c1e2..ba53101 100644
--- a/firmware/include/vboot_api.h
+++ b/firmware/include/vboot_api.h
@@ -697,6 +697,15 @@ enum VbScreenType_t {
VB_SCREEN_OS_BROKEN = 0x208,
};
+/* Information on display context */
+typedef struct VbDisplayInfo {
+ uint32_t allow_usb;
+ uint32_t allow_legacy;
+ uint32_t use_usb;
+ uint32_t use_legacy;
+ uint32_t signed_only;
+} VbDisplayInfo;
+
/**
* Initialize and clear the display. Set width and height to the screen
* dimensions in pixels.
@@ -725,7 +734,8 @@ VbError_t VbExDisplaySetDimension(uint32_t width, uint32_t height);
* to be simple ASCII text such as "NO GOOD" or "INSERT"; these screens should
* only be seen during development.
*/
-VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale);
+VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
+ VbDisplayInfo *info);
/**
* Write an image to the display, with the upper left corner at the specified
diff --git a/firmware/lib/include/vboot_display.h b/firmware/lib/include/vboot_display.h
index 0ab93f0..0574580 100644
--- a/firmware/lib/include/vboot_display.h
+++ b/firmware/lib/include/vboot_display.h
@@ -15,7 +15,7 @@
VbError_t VbDisplayScreenFromGBB(VbCommonParams *cparams, uint32_t screen,
VbNvContext *vncptr, uint32_t locale);
VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
- VbNvContext *vncptr);
+ VbNvContext *vncptr, VbDisplayInfo *info);
VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr);
VbError_t VbCheckDisplayKey(VbCommonParams *cparams, uint32_t key,
VbNvContext *vncptr);
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c
index e03e042..7dcc754 100644
--- a/firmware/lib/vboot_api_kernel.c
+++ b/firmware/lib/vboot_api_kernel.c
@@ -300,11 +300,13 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
VbSharedDataHeader *shared =
(VbSharedDataHeader *)cparams->shared_data_blob;
+ VbDisplayInfo info;
uint32_t allow_usb = 0;
uint32_t allow_legacy = 0;
uint32_t disable_dev_boot = 0;
uint32_t use_usb = 0;
uint32_t use_legacy = 0;
+ uint32_t signed_only = 0;
uint32_t default_boot = 0;
uint32_t ctrl_d_pressed = 0;
uint32_t hold = 0;
@@ -350,10 +352,22 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
}
}
+ VbNvGet(&vnc, VBNV_DEV_BOOT_SIGNED_ONLY, &signed_only);
+
+ if (fwmp.flags & FWMP_DEV_ENABLE_OFFICIAL_ONLY)
+ signed_only = 1;
+
+ info.allow_usb = allow_usb;
+ info.allow_legacy = allow_legacy;
+ info.use_usb = use_usb;
+ info.use_legacy = use_legacy;
+ info.signed_only = signed_only;
+
/* If dev mode is disabled, only allow TONORM */
while (disable_dev_boot) {
VBDEBUG(("%s() - dev_disable_boot is set.\n", __func__));
- VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_TO_NORM, 0, &vnc);
+ VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_TO_NORM, 0, &vnc,
+ NULL);
VbExDisplayDebugInfo(dev_disable_msg);
/* Ignore space in VbUserConfirms()... */
@@ -363,7 +377,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
VbNvSet(&vnc, VBNV_DISABLE_DEV_REQUEST, 1);
VbDisplayScreen(cparams,
VB_SCREEN_TO_NORM_CONFIRMED,
- 0, &vnc);
+ 0, &vnc, NULL);
VbExSleepMs(5000);
return VBERROR_REBOOT_REQUIRED;
case -1:
@@ -377,7 +391,7 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p)
developer_mode_screen:
/* Show the dev mode warning screen */
- VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_WARNING, 0, &vnc);
+ VbDisplayScreen(cparams, VB_SCREEN_DEVELOPER_WARNING, 0, &vnc, &info);
/* Get audio/delay context */
audio = VbAudioOpen(cparams);
@@ -425,7 +439,7 @@ developer_mode_screen:
}
VbDisplayScreen(cparams,
VB_SCREEN_DEVELOPER_TO_NORM,
- 0, &vnc);
+ 0, &vnc, NULL);
/* Ignore space in VbUserConfirms()... */
switch (VbUserConfirms(cparams, 0)) {
case 1:
@@ -436,7 +450,7 @@ developer_mode_screen:
VbDisplayScreen(
cparams,
VB_SCREEN_TO_NORM_CONFIRMED,
- 0, &vnc);
+ 0, &vnc, NULL);
VbExSleepMs(5000);
return VBERROR_REBOOT_REQUIRED;
case -1:
@@ -450,7 +464,7 @@ developer_mode_screen:
VbDisplayScreen(
cparams,
VB_SCREEN_DEVELOPER_WARNING,
- 0, &vnc);
+ 0, &vnc, &info);
/* Start new countdown */
audio = VbAudioOpen(cparams);
}
@@ -512,7 +526,7 @@ developer_mode_screen:
"USB booting is disabled\n"));
VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1,
- &vnc);
+ &vnc, NULL);
VbExDisplayDebugInfo(
"WARNING: Booting from external media "
@@ -533,7 +547,7 @@ developer_mode_screen:
* key press.
*/
VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0,
- &vnc);
+ &vnc, NULL);
if (VBERROR_SUCCESS == VbTryUsb(cparams, p)) {
VbAudioClose(audio);
return VBERROR_SUCCESS;
@@ -542,7 +556,7 @@ developer_mode_screen:
VbDisplayScreen(
cparams,
VB_SCREEN_DEVELOPER_WARNING,
- 0, &vnc);
+ 0, &vnc, &info);
}
}
break;
@@ -608,7 +622,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
shared->recovery_reason));
VbSetRecoverySubcode(shared->recovery_reason);
VbNvCommit();
- VbDisplayScreen(cparams, VB_SCREEN_OS_BROKEN, 0, &vnc);
+ VbDisplayScreen(cparams, VB_SCREEN_OS_BROKEN, 0, &vnc, NULL);
VBDEBUG(("VbBootRecovery() waiting for manual recovery\n"));
while (1) {
if (VbWantShutdown(cparams->gbb->flags))
@@ -637,7 +651,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
VbDisplayScreen(cparams, VBERROR_NO_DISK_FOUND == retval ?
VB_SCREEN_RECOVERY_INSERT :
VB_SCREEN_RECOVERY_NO_GOOD,
- 0, &vnc);
+ 0, &vnc, NULL);
/*
* Scan keyboard more frequently than media, since x86
@@ -677,7 +691,7 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p)
/* Ask the user to confirm entering dev-mode */
VbDisplayScreen(cparams,
VB_SCREEN_RECOVERY_TO_DEV,
- 0, &vnc);
+ 0, &vnc, NULL);
/* SPACE means no... */
uint32_t vbc_flags =
VB_CONFIRM_SPACE_MEANS_NO |
@@ -839,7 +853,7 @@ static VbError_t EcUpdateImage(int devidx, VbCommonParams *cparams,
return VBERROR_VGA_OPROM_MISMATCH;
}
- VbDisplayScreen(cparams, VB_SCREEN_WAIT, 0, &vnc);
+ VbDisplayScreen(cparams, VB_SCREEN_WAIT, 0, &vnc, NULL);
}
rv = VbExEcUpdateImage(devidx, select, expected, expected_size);
@@ -1250,13 +1264,13 @@ VbError_t VbSelectAndLoadKernel(VbCommonParams *cparams,
p.boot_flags |= BOOT_FLAG_RECOVERY;
retval = VbBootRecovery(cparams, &p);
VbExEcEnteringMode(0, VB_EC_RECOVERY);
- VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc);
+ VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc, NULL);
} else if (p.boot_flags & BOOT_FLAG_DEVELOPER) {
/* Developer boot */
retval = VbBootDeveloper(cparams, &p);
VbExEcEnteringMode(0, VB_EC_DEVELOPER);
- VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc);
+ VbDisplayScreen(cparams, VB_SCREEN_BLANK, 0, &vnc, NULL);
} else {
/* Normal boot */
diff --git a/firmware/lib/vboot_display.c b/firmware/lib/vboot_display.c
index 6d8ed92..84b7961 100644
--- a/firmware/lib/vboot_display.c
+++ b/firmware/lib/vboot_display.c
@@ -321,7 +321,7 @@ VbError_t VbDisplayScreenFromGBB(VbCommonParams *cparams, uint32_t screen,
*/
static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
int force, VbNvContext *vncptr,
- uint32_t locale)
+ uint32_t locale, VbDisplayInfo *info)
{
VbError_t retval;
@@ -336,7 +336,7 @@ static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
VbExDisplayBacklight(VB_SCREEN_BLANK == screen ? 0 : 1);
/* Display default first */
- if (VBERROR_SUCCESS == VbExDisplayScreen(screen, locale))
+ if (VBERROR_SUCCESS == VbExDisplayScreen(screen, locale, info))
return VBERROR_SUCCESS;
/* If default doesn't have anything to show, fall back to GBB bitmaps */
@@ -344,7 +344,7 @@ static VbError_t VbDisplayScreenLegacy(VbCommonParams *cparams, uint32_t screen,
}
VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen,
- int force, VbNvContext *vncptr)
+ int force, VbNvContext *vncptr, VbDisplayInfo *info)
{
uint32_t locale;
VbError_t rv;
@@ -357,7 +357,7 @@ VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen,
VbNvGet(vncptr, VBNV_LOCALIZATION_INDEX, &locale);
rv = VbDisplayScreenLegacy(cparams, screen, force, vncptr,
- locale);
+ locale, info);
if (rv == VBERROR_SUCCESS)
/* Keep track of the currently displayed screen */
@@ -560,7 +560,7 @@ VbError_t VbDisplayDebugInfo(VbCommonParams *cparams, VbNvContext *vncptr)
uint32_t i;
/* Blank screen */
- VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1, vncptr);
+ VbDisplayScreen(cparams, VB_SCREEN_BLANK, 1, vncptr, NULL);
/* Add hardware ID */
VbRegionReadHWID(cparams, hwid, sizeof(hwid));
@@ -725,13 +725,14 @@ VbError_t VbCheckDisplayKey(VbCommonParams *cparams, uint32_t key,
#endif
/* Force redraw of current screen */
- return VbDisplayScreen(cparams, disp_current_screen, 1, vncptr);
+ return VbDisplayScreen(cparams, disp_current_screen, 1, vncptr,
+ NULL);
}
if (0 == memcmp(MagicBuffer, MAGIC_WORD, MAGIC_WORD_LEN)) {
if (VBEASTEREGG)
(void)VbDisplayScreen(cparams, disp_current_screen,
- 1, vncptr);
+ 1, vncptr, NULL);
}
return VBERROR_SUCCESS;
diff --git a/firmware/stub/vboot_api_stub.c b/firmware/stub/vboot_api_stub.c
index 717c0f8..c086195 100644
--- a/firmware/stub/vboot_api_stub.c
+++ b/firmware/stub/vboot_api_stub.c
@@ -41,7 +41,8 @@ VbError_t VbExDisplaySetDimension(uint32_t width, uint32_t height)
return VBERROR_SUCCESS;
}
-VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale)
+VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
+ VbDisplayInfo *info)
{
return VBERROR_SUCCESS;
}
diff --git a/tests/vboot_api_devmode_tests.c b/tests/vboot_api_devmode_tests.c
index abd8e85..6e8afbd 100644
--- a/tests/vboot_api_devmode_tests.c
+++ b/tests/vboot_api_devmode_tests.c
@@ -265,7 +265,8 @@ VbError_t VbExBeep(uint32_t msec, uint32_t frequency) {
return beep_return;
}
-VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale) {
+VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale,
+ VbDisplayInfo *info) {
switch(screen_type) {
case VB_SCREEN_BLANK:
VBDEBUG(("VbExDisplayScreen(BLANK)\n"));
diff --git a/tests/vboot_api_kernel2_tests.c b/tests/vboot_api_kernel2_tests.c
index 433933b..d44fc1e 100644
--- a/tests/vboot_api_kernel2_tests.c
+++ b/tests/vboot_api_kernel2_tests.c
@@ -185,7 +185,7 @@ uint32_t VbTryLoadKernel(VbCommonParams *cparams, LoadKernelParams *p,
}
VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
- VbNvContext *vncptr)
+ VbNvContext *vncptr, VbDisplayInfo *info)
{
if (screens_count < ARRAY_SIZE(screens_displayed))
screens_displayed[screens_count++] = screen;
diff --git a/tests/vboot_api_kernel3_tests.c b/tests/vboot_api_kernel3_tests.c
index 3eddb73..0403c71 100644
--- a/tests/vboot_api_kernel3_tests.c
+++ b/tests/vboot_api_kernel3_tests.c
@@ -195,7 +195,7 @@ VbError_t VbExEcUpdateImage(int devidx, enum VbSelectFirmware_t select,
}
VbError_t VbDisplayScreen(VbCommonParams *cparams, uint32_t screen, int force,
- VbNvContext *vncptr)
+ VbNvContext *vncptr, VbDisplayInfo *info)
{
if (screens_count < ARRAY_SIZE(screens_displayed))
screens_displayed[screens_count++] = screen;
--
2.10.2