From 1e634ac65fbdd43f35046e08b302d162e5d964d4 Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Tue, 11 Aug 2015 11:22:54 +0200 Subject: [PATCH 3/4] vboot: Display callbacks for all screens We don't want to use bitmaps stored in GBB since they recommend the use of non- free software (Chrome OS), so this implements a text-based interface instead. Change-Id: I4927846b385b9fdbb8d90b8dc1cd159472363baa Signed-off-by: Paul Kocialkowski --- src/vboot/callbacks/display.c | 182 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 166 insertions(+), 16 deletions(-) diff --git a/src/vboot/callbacks/display.c b/src/vboot/callbacks/display.c index bae8043..b4e9958 100644 --- a/src/vboot/callbacks/display.c +++ b/src/vboot/callbacks/display.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "base/cleanup_funcs.h" #include "drivers/video/coreboot_fb.h" @@ -81,13 +82,15 @@ void print_on_center(const char *msg) print_string(msg); } -VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale) +VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale, + VbDisplayInfo *info) { - const char *msg = NULL; - - if (vboot_draw_screen(screen_type, locale) == CBGFX_SUCCESS) - return VBERROR_SUCCESS; - + unsigned int rows, cols; + const char *fw_id; + int fw_index; + void *blob = NULL; + int size = 0; + char *msg; /* * Show the debug messages for development. It is a backup method * when GBB does not contain a full set of bitmaps. @@ -98,31 +101,178 @@ VbError_t VbExDisplayScreen(uint32_t screen_type, uint32_t locale) video_console_clear(); break; case VB_SCREEN_DEVELOPER_WARNING: - msg = "developer mode warning"; + video_console_clear(); + video_console_set_cursor(0, 0); + + if (info == NULL) + return VBERROR_SUCCESS; + + print_string( + "Welcome to developer mode!\n\n" + "Useful key combinations:\n" + "- Ctrl + H: Hold developer mode\n" + "- Ctrl + D: Boot from default medium\n"); + + if (info->allow_usb) + print_string("- Ctrl + U: Boot from external medium\n"); + + if (info->allow_legacy) + print_string("- Ctrl + L: Boot from legacy payload\n"); + + print_string( + "- Ctrl + I: Show device information\n" + "- Space: Disable developer mode\n\n" + "This screen is shown for 3 seconds (if not held)." + "\n\n"); + + if (!info->signed_only) + print_string( + "Warning: this device will boot kernels" + " without verifying their signature!" + "\n"); + + if (info->allow_usb) + print_string( + "Warning: this device will boot from " + "external media!\n"); + + if (info->allow_legacy) + print_string( + "Warning: this device will boot legacy " + "payloads!\n"); + + if (!info->signed_only || info->allow_usb || + info->allow_legacy) + print_string("\n"); + + print_string("Default boot medium: "); + + if (info->use_legacy) + print_string("legacy payload"); + else if (info->use_usb) + print_string("external"); + else + print_string("internal"); + + print_string("\n"); + + find_common_params(&blob, &size); + + if (blob != NULL) { + VbSharedDataHeader *vdat = (VbSharedDataHeader *) blob; + fw_index = get_active_fw_index(vdat); + fw_id = get_fw_id(fw_index); + + if (fw_id == NULL) + fw_id = "NOT FOUND"; + + print_string("Active firmware id: "); + print_string(fw_id); + + switch (fw_index) { + case VDAT_RW_A: + print_string(" (RW A)\n"); + break; + case VDAT_RW_B: + print_string(" (RW A)\n"); + break; + case VDAT_RO: + print_string(" (RO)\n"); + break; + default: + print_string(" (UNKNOWN)\n"); + break; + } + } break; case VB_SCREEN_DEVELOPER_EGG: - msg = "easter egg"; + video_console_clear(); + print_on_center("Free as in Freedom!"); break; case VB_SCREEN_RECOVERY_REMOVE: - msg = "remove inserted devices"; + video_console_clear(); + print_on_center( + "Please remove any external media before accessing " + "recovery screen."); break; case VB_SCREEN_RECOVERY_INSERT: - msg = "insert recovery image"; - break; case VB_SCREEN_RECOVERY_NO_GOOD: - msg = "insert image invalid"; + video_console_clear(); + print_string( + "Welcome to recovery mode!\n\n" + "Useful key combinations:\n" + "- Ctrl + D: Enable developer mode (if possible)\n\n"); + + if (screen_type == VB_SCREEN_RECOVERY_NO_GOOD) + print_on_center( + "Invalid recovery media, please instert a " + "valid one."); + else + print_on_center( + "Please insert an external recovery media."); + break; + case VB_SCREEN_RECOVERY_TO_DEV: + video_console_clear(); + video_get_rows_cols(&rows, &cols); + + video_console_set_cursor(0, 0); + + print_string( + "Enabling developer mode will allow booting unsigned " + "kernels and booting from external media (when enabled " + "with crossystem).\n\n" + "Developer mode can be disabled via the developer mode " + "screen."); + + msg = "Developer mode will be enabled."; + video_console_set_cursor((cols - strlen(msg)) / 2, rows / 2); + print_string(msg); + + msg = "Press enter to confirm or escape to go back."; + video_console_set_cursor((cols - strlen(msg)) / 2, + rows / 2 + 2); + print_string(msg); + break; + case VB_SCREEN_DEVELOPER_TO_NORM: + video_console_clear(); + video_get_rows_cols(&rows, &cols); + + video_console_set_cursor(0, 0); + + print_string( + "Disabling developer mode will restrict boot to signed " + "kernels stored on internal memory only.\n\n" + "Developer mode can be enabled again via the recovery " + "mode screen."); + + msg = "Developer mode will be disabled."; + video_console_set_cursor((cols - strlen(msg)) / 2, rows / 2); + print_string(msg); + + msg = "Press enter to confirm or escape to go back."; + video_console_set_cursor((cols - strlen(msg)) / 2, + rows / 2 + 2); + print_string(msg); break; case VB_SCREEN_WAIT: - msg = "wait for ec update"; + video_console_clear(); + print_on_center("Waiting for EC update..."); + break; + case VB_SCREEN_TO_NORM_CONFIRMED: + video_console_clear(); + print_on_center("Disabling developer mode."); + break; + case VB_SCREEN_OS_BROKEN: + video_console_clear(); + print_on_center( + "Something went wrong and the device cannot boot.\n" + "Press Escape + Refresh + Power to access recovery."); break; default: printf("Not a valid screen type: %d.\n", screen_type); return VBERROR_INVALID_SCREEN_INDEX; } - if (msg) - print_on_center(msg); - return VBERROR_SUCCESS; } -- 2.10.2