123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- From 1e634ac65fbdd43f35046e08b302d162e5d964d4 Mon Sep 17 00:00:00 2001
- From: Paul Kocialkowski <contact@paulk.fr>
- 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 <contact@paulk.fr>
- ---
- 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 <sysinfo.h>
- #include <vboot_api.h>
- #include <vboot_struct.h>
- +#include <vboot_nvstorage.h>
-
- #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
|