bed495948c
Resolves: RHEL-1086,RHEL-16952
324 lines
16 KiB
Diff
324 lines
16 KiB
Diff
From 013b84264db5b2062840f0ff04df776fa144c586 Mon Sep 17 00:00:00 2001
|
|
From: Jan Janssen <medhefgo@web.de>
|
|
Date: Tue, 23 Aug 2022 10:51:36 +0200
|
|
Subject: [PATCH] boot: Drop use of Print
|
|
|
|
The custom print helpers have been replaced with explicit checks at the
|
|
call site to keep this in line with the way it is done in userspace. Any
|
|
calls where the check has been ommited should not need them as the value
|
|
is expected to alawys be around.
|
|
|
|
(cherry picked from commit 9220b2c46bfbdf759b5a777a8bb3109a4d873039)
|
|
|
|
Related: RHEL-16952
|
|
---
|
|
src/boot/efi/boot.c | 176 ++++++++++++++++++++-----------------
|
|
src/boot/efi/secure-boot.c | 6 +-
|
|
src/boot/efi/stub.c | 2 +-
|
|
src/boot/efi/util.h | 2 +-
|
|
4 files changed, 102 insertions(+), 84 deletions(-)
|
|
|
|
diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c
|
|
index 64a9eda24e..cb237675ec 100644
|
|
--- a/src/boot/efi/boot.c
|
|
+++ b/src/boot/efi/boot.c
|
|
@@ -433,22 +433,9 @@ static bool unicode_supported(void) {
|
|
return cache;
|
|
}
|
|
|
|
-static void ps_string(const char16_t *fmt, const void *value) {
|
|
- assert(fmt);
|
|
- if (value)
|
|
- Print(fmt, value);
|
|
-}
|
|
-
|
|
-static void ps_bool(const char16_t *fmt, bool value) {
|
|
- assert(fmt);
|
|
- Print(fmt, yes_no(value));
|
|
-}
|
|
-
|
|
static bool ps_continue(void) {
|
|
- if (unicode_supported())
|
|
- Print(L"\n─── Press any key to continue, ESC or q to quit. ───\n\n");
|
|
- else
|
|
- Print(L"\n--- Press any key to continue, ESC or q to quit. ---\n\n");
|
|
+ const char16_t *sep = unicode_supported() ? u"───" : u"---";
|
|
+ printf("\n%ls Press any key to continue, ESC or q to quit. %ls\n\n", sep, sep);
|
|
|
|
uint64_t key;
|
|
return console_key_read(&key, UINT64_MAX) == EFI_SUCCESS &&
|
|
@@ -470,112 +457,143 @@ static void print_status(Config *config, char16_t *loaded_image_path) {
|
|
secure = secure_boot_mode();
|
|
(void) efivar_get(LOADER_GUID, L"LoaderDevicePartUUID", &device_part_uuid);
|
|
|
|
- /* We employ some unusual indentation here for readability. */
|
|
-
|
|
- ps_string(L" systemd-boot version: %a\n", GIT_VERSION);
|
|
- ps_string(L" loaded image: %s\n", loaded_image_path);
|
|
- ps_string(L" loader partition UUID: %s\n", device_part_uuid);
|
|
- ps_string(L" architecture: %a\n", EFI_MACHINE_TYPE_NAME);
|
|
- Print(L" UEFI specification: %u.%02u\n", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
|
|
- ps_string(L" firmware vendor: %s\n", ST->FirmwareVendor);
|
|
- Print(L" firmware version: %u.%02u\n", ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
|
|
- Print(L" OS indications: %lu\n", get_os_indications_supported());
|
|
- Print(L" secure boot: %s (%s)\n", yes_no(IN_SET(secure, SECURE_BOOT_USER, SECURE_BOOT_DEPLOYED)), secure_boot_mode_to_string(secure));
|
|
- ps_bool(L" shim: %s\n", shim_loaded());
|
|
- ps_bool(L" TPM: %s\n", tpm_present());
|
|
- Print(L" console mode: %d/%ld (%" PRIuN L"x%" PRIuN L" @%ux%u)\n", ST->ConOut->Mode->Mode, ST->ConOut->Mode->MaxMode - INT64_C(1), x_max, y_max, screen_width, screen_height);
|
|
+ printf(" systemd-boot version: " GIT_VERSION "\n");
|
|
+ if (loaded_image_path)
|
|
+ printf(" loaded image: %ls\n", loaded_image_path);
|
|
+ if (device_part_uuid)
|
|
+ printf(" loader partition UUID: %ls\n", device_part_uuid);
|
|
+ printf(" architecture: " EFI_MACHINE_TYPE_NAME "\n");
|
|
+ printf(" UEFI specification: %u.%02u\n", ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
|
|
+ printf(" firmware vendor: %ls\n", ST->FirmwareVendor);
|
|
+ printf(" firmware version: %u.%02u\n", ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
|
|
+ printf(" OS indications: %#" PRIx64 "\n", get_os_indications_supported());
|
|
+ printf(" secure boot: %ls (%ls)\n",
|
|
+ yes_no(IN_SET(secure, SECURE_BOOT_USER, SECURE_BOOT_DEPLOYED)),
|
|
+ secure_boot_mode_to_string(secure));
|
|
+ printf(" shim: %ls\n", yes_no(shim_loaded()));
|
|
+ printf(" TPM: %ls\n", yes_no(tpm_present()));
|
|
+ printf(" console mode: %i/%" PRIi64 " (%zux%zu @%ux%u)\n",
|
|
+ ST->ConOut->Mode->Mode, ST->ConOut->Mode->MaxMode - INT64_C(1),
|
|
+ x_max, y_max, screen_width, screen_height);
|
|
|
|
if (!ps_continue())
|
|
return;
|
|
|
|
switch (config->timeout_sec_config) {
|
|
case TIMEOUT_UNSET:
|
|
- break;
|
|
+ break;
|
|
case TIMEOUT_MENU_FORCE:
|
|
- Print(L" timeout (config): menu-force\n"); break;
|
|
+ printf(" timeout (config): menu-force\n");
|
|
+ break;
|
|
case TIMEOUT_MENU_HIDDEN:
|
|
- Print(L" timeout (config): menu-hidden\n"); break;
|
|
+ printf(" timeout (config): menu-hidden\n");
|
|
+ break;
|
|
default:
|
|
- Print(L" timeout (config): %u s\n", config->timeout_sec_config);
|
|
+ printf(" timeout (config): %u s\n", config->timeout_sec_config);
|
|
}
|
|
|
|
switch (config->timeout_sec_efivar) {
|
|
case TIMEOUT_UNSET:
|
|
- break;
|
|
+ break;
|
|
case TIMEOUT_MENU_FORCE:
|
|
- Print(L" timeout (EFI var): menu-force\n"); break;
|
|
+ printf(" timeout (EFI var): menu-force\n");
|
|
+ break;
|
|
case TIMEOUT_MENU_HIDDEN:
|
|
- Print(L" timeout (EFI var): menu-hidden\n"); break;
|
|
+ printf(" timeout (EFI var): menu-hidden\n");
|
|
+ break;
|
|
default:
|
|
- Print(L" timeout (EFI var): %u s\n", config->timeout_sec_efivar);
|
|
+ printf(" timeout (EFI var): %u s\n", config->timeout_sec_efivar);
|
|
}
|
|
|
|
- ps_string(L" default (config): %s\n", config->entry_default_config);
|
|
- ps_string(L" default (EFI var): %s\n", config->entry_default_efivar);
|
|
- ps_string(L" default (one-shot): %s\n", config->entry_oneshot);
|
|
- ps_string(L" saved entry: %s\n", config->entry_saved);
|
|
- ps_bool(L" editor: %s\n", config->editor);
|
|
- ps_bool(L" auto-entries: %s\n", config->auto_entries);
|
|
- ps_bool(L" auto-firmware: %s\n", config->auto_firmware);
|
|
- ps_bool(L" beep: %s\n", config->beep);
|
|
- ps_bool(L" reboot-for-bitlocker: %s\n", config->reboot_for_bitlocker);
|
|
+ if (config->entry_default_config)
|
|
+ printf(" default (config): %ls\n", config->entry_default_config);
|
|
+ if (config->entry_default_efivar)
|
|
+ printf(" default (EFI var): %ls\n", config->entry_default_efivar);
|
|
+ if (config->entry_oneshot)
|
|
+ printf(" default (one-shot): %ls\n", config->entry_oneshot);
|
|
+ if (config->entry_saved)
|
|
+ printf(" saved entry: %ls\n", config->entry_saved);
|
|
+ printf(" editor: %ls\n", yes_no(config->editor));
|
|
+ printf(" auto-entries: %ls\n", yes_no(config->auto_entries));
|
|
+ printf(" auto-firmware: %ls\n", yes_no(config->auto_firmware));
|
|
+ printf(" beep: %ls\n", yes_no(config->beep));
|
|
+ printf(" reboot-for-bitlocker: %ls\n", yes_no(config->reboot_for_bitlocker));
|
|
|
|
switch (config->secure_boot_enroll) {
|
|
case ENROLL_OFF:
|
|
- Print(L" secure-boot-enroll: off\n"); break;
|
|
+ printf(" secure-boot-enroll: off\n");
|
|
+ break;
|
|
case ENROLL_MANUAL:
|
|
- Print(L" secure-boot-enroll: manual\n"); break;
|
|
+ printf(" secure-boot-enroll: manual\n");
|
|
+ break;
|
|
case ENROLL_FORCE:
|
|
- Print(L" secure-boot-enroll: force\n"); break;
|
|
+ printf(" secure-boot-enroll: force\n");
|
|
+ break;
|
|
default:
|
|
assert_not_reached();
|
|
}
|
|
|
|
switch (config->console_mode) {
|
|
case CONSOLE_MODE_AUTO:
|
|
- Print(L" console-mode (config): %s\n", L"auto"); break;
|
|
+ printf(" console-mode (config): auto\n");
|
|
+ break;
|
|
case CONSOLE_MODE_KEEP:
|
|
- Print(L" console-mode (config): %s\n", L"keep"); break;
|
|
+ printf(" console-mode (config): keep\n");
|
|
+ break;
|
|
case CONSOLE_MODE_FIRMWARE_MAX:
|
|
- Print(L" console-mode (config): %s\n", L"max"); break;
|
|
+ printf(" console-mode (config): max\n");
|
|
+ break;
|
|
default:
|
|
- Print(L" console-mode (config): %ld\n", config->console_mode); break;
|
|
+ printf(" console-mode (config): %" PRIi64 "\n", config->console_mode);
|
|
+ break;
|
|
}
|
|
|
|
/* EFI var console mode is always a concrete value or unset. */
|
|
if (config->console_mode_efivar != CONSOLE_MODE_KEEP)
|
|
- Print(L"console-mode (EFI var): %ld\n", config->console_mode_efivar);
|
|
+ printf("console-mode (EFI var): %" PRIi64 "\n", config->console_mode_efivar);
|
|
|
|
if (!ps_continue())
|
|
return;
|
|
|
|
for (size_t i = 0; i < config->entry_count; i++) {
|
|
ConfigEntry *entry = config->entries[i];
|
|
-
|
|
- _cleanup_free_ char16_t *dp = NULL;
|
|
- if (entry->device)
|
|
- (void) device_path_to_str(DevicePathFromHandle(entry->device), &dp);
|
|
-
|
|
- Print(L" config entry: %" PRIuN L"/%" PRIuN L"\n", i + 1, config->entry_count);
|
|
- ps_string(L" id: %s\n", entry->id);
|
|
- ps_string(L" title: %s\n", entry->title);
|
|
- ps_string(L" title show: %s\n", streq16(entry->title, entry->title_show) ? NULL : entry->title_show);
|
|
- ps_string(L" sort key: %s\n", entry->sort_key);
|
|
- ps_string(L" version: %s\n", entry->version);
|
|
- ps_string(L" machine-id: %s\n", entry->machine_id);
|
|
- ps_string(L" device: %s\n", dp);
|
|
- ps_string(L" loader: %s\n", entry->loader);
|
|
+ EFI_DEVICE_PATH *dp = NULL;
|
|
+ _cleanup_free_ char16_t *dp_str = NULL;
|
|
+
|
|
+ if (entry->device &&
|
|
+ BS->HandleProtocol(entry->device, &(EFI_GUID) EFI_DEVICE_PATH_PROTOCOL_GUID, (void **) &dp) ==
|
|
+ EFI_SUCCESS)
|
|
+ (void) device_path_to_str(dp, &dp_str);
|
|
+
|
|
+ printf(" config entry: %zu/%zu\n", i + 1, config->entry_count);
|
|
+ printf(" id: %ls\n", entry->id);
|
|
+ if (entry->title)
|
|
+ printf(" title: %ls\n", entry->title);
|
|
+ if (entry->title_show && !streq16(entry->title, entry->title_show))
|
|
+ printf(" title show: %ls\n", entry->title_show);
|
|
+ if (entry->sort_key)
|
|
+ printf(" sort key: %ls\n", entry->sort_key);
|
|
+ if (entry->version)
|
|
+ printf(" version: %ls\n", entry->version);
|
|
+ if (entry->machine_id)
|
|
+ printf(" machine-id: %ls\n", entry->machine_id);
|
|
+ if (dp_str)
|
|
+ printf(" device: %ls\n", dp_str);
|
|
+ if (entry->loader)
|
|
+ printf(" loader: %ls\n", entry->loader);
|
|
STRV_FOREACH(initrd, entry->initrd)
|
|
- Print(L" initrd: %s\n", *initrd);
|
|
- ps_string(L" devicetree: %s\n", entry->devicetree);
|
|
- ps_string(L" options: %s\n", entry->options);
|
|
- ps_bool(L" internal call: %s\n", !!entry->call);
|
|
-
|
|
- ps_bool(L"counting boots: %s\n", entry->tries_left >= 0);
|
|
+ printf(" initrd: %ls\n", *initrd);
|
|
+ if (entry->devicetree)
|
|
+ printf(" devicetree: %ls\n", entry->devicetree);
|
|
+ if (entry->options)
|
|
+ printf(" options: %ls\n", entry->options);
|
|
+ printf(" internal call: %ls\n", yes_no(!!entry->call));
|
|
+
|
|
+ printf("counting boots: %ls\n", yes_no(entry->tries_left >= 0));
|
|
if (entry->tries_left >= 0) {
|
|
- Print(L" tries: %u left, %u done\n", entry->tries_left, entry->tries_done);
|
|
- Print(L" current path: %s\\%s\n", entry->path, entry->current_name);
|
|
- Print(L" next path: %s\\%s\n", entry->path, entry->next_name);
|
|
+ printf(" tries: %i left, %i done\n", entry->tries_left, entry->tries_done);
|
|
+ printf(" current path: %ls\\%ls\n", entry->path, entry->current_name);
|
|
+ printf(" next path: %ls\\%ls\n", entry->path, entry->next_name);
|
|
}
|
|
|
|
if (!ps_continue())
|
|
@@ -629,7 +647,7 @@ static bool menu_run(
|
|
ST->ConOut->EnableCursor(ST->ConOut, false);
|
|
|
|
/* draw a single character to make ClearScreen work on some firmware */
|
|
- Print(L" ");
|
|
+ ST->ConOut->OutputString(ST->ConOut, (char16_t *) u" ");
|
|
|
|
err = console_set_mode(config->console_mode_efivar != CONSOLE_MODE_KEEP ?
|
|
config->console_mode_efivar : config->console_mode);
|
|
@@ -2715,7 +2733,7 @@ out:
|
|
EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
|
InitializeLib(image, sys_table);
|
|
|
|
- debug_hook(L"systemd-boot");
|
|
+ debug_hook("systemd-boot");
|
|
/* Uncomment the next line if you need to wait for debugger. */
|
|
// debug_break();
|
|
|
|
diff --git a/src/boot/efi/secure-boot.c b/src/boot/efi/secure-boot.c
|
|
index 6b6d48277e..2594c8798f 100644
|
|
--- a/src/boot/efi/secure-boot.c
|
|
+++ b/src/boot/efi/secure-boot.c
|
|
@@ -44,16 +44,16 @@ EFI_STATUS secure_boot_enroll_at(EFI_FILE *root_dir, const char16_t *path) {
|
|
|
|
clear_screen(COLOR_NORMAL);
|
|
|
|
- Print(u"Enrolling secure boot keys from directory: %s\n");
|
|
+ printf("Enrolling secure boot keys from directory: %ls\n", path);
|
|
|
|
/* Enrolling secure boot keys is safe to do in virtualized environments as there is nothing
|
|
* we can brick there. */
|
|
if (!in_hypervisor()) {
|
|
- Print(u"Warning: Enrolling custom Secure Boot keys might soft-brick your machine!\n", path);
|
|
+ printf("Warning: Enrolling custom Secure Boot keys might soft-brick your machine!\n");
|
|
|
|
unsigned timeout_sec = 15;
|
|
for (;;) {
|
|
- Print(u"\rEnrolling in %2u s, press any key to abort.", timeout_sec);
|
|
+ printf("\rEnrolling in %2u s, press any key to abort.", timeout_sec);
|
|
|
|
uint64_t key;
|
|
err = console_key_read(&key, 1000 * 1000);
|
|
diff --git a/src/boot/efi/stub.c b/src/boot/efi/stub.c
|
|
index 552660eb07..69e6a0b07f 100644
|
|
--- a/src/boot/efi/stub.c
|
|
+++ b/src/boot/efi/stub.c
|
|
@@ -425,7 +425,7 @@ static EFI_STATUS real_main(EFI_HANDLE image) {
|
|
EFI_STATUS efi_main(EFI_HANDLE image, EFI_SYSTEM_TABLE *sys_table) {
|
|
InitializeLib(image, sys_table);
|
|
|
|
- debug_hook(L"systemd-stub");
|
|
+ debug_hook("systemd-stub");
|
|
/* Uncomment the next line if you need to wait for debugger. */
|
|
// debug_break();
|
|
|
|
diff --git a/src/boot/efi/util.h b/src/boot/efi/util.h
|
|
index e0c3b408f2..3247694014 100644
|
|
--- a/src/boot/efi/util.h
|
|
+++ b/src/boot/efi/util.h
|
|
@@ -180,7 +180,7 @@ void debug_break(void);
|
|
extern uint8_t _text, _data;
|
|
/* Report the relocated position of text and data sections so that a debugger
|
|
* can attach to us. See debug-sd-boot.sh for how this can be done. */
|
|
-# define debug_hook(identity) Print(identity L"@0x%lx,0x%lx\n", POINTER_TO_PHYSICAL_ADDRESS(&_text), POINTER_TO_PHYSICAL_ADDRESS(&_data))
|
|
+# define debug_hook(identity) printf(identity "@%p,%p\n", &_text, &_data)
|
|
#else
|
|
# define debug_hook(identity)
|
|
#endif
|