diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 4dc3921990..af05859a7e 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -443,22 +443,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 && @@ -480,112 +467,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 (UINTN i = 0; i < config->entry_count; i++) { ConfigEntry *entry = config->entries[i]; + EFI_DEVICE_PATH *dp = NULL; + _cleanup_free_ char16_t *dp_str = NULL; - _cleanup_free_ char16_t *dp = NULL; - if (entry->device) - (void) device_path_to_str(DevicePathFromHandle(entry->device), &dp); + 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); - 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); + 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); + 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)); - ps_bool(L"counting boots: %s\n", entry->tries_left >= 0); + 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()) @@ -641,7 +659,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); @@ -2729,7 +2747,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 71c3f13161..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", path); + 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"); + 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 675878f478..be186635ba 100644 --- a/src/boot/efi/stub.c +++ b/src/boot/efi/stub.c @@ -420,7 +420,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 a8652e6d8e..bbc772d854 100644 --- a/src/boot/efi/util.h +++ b/src/boot/efi/util.h @@ -11,20 +11,6 @@ #define UINTN_MAX (~(UINTN)0) #define INTN_MAX ((INTN)(UINTN_MAX>>1)) -/* gnu-efi format specifiers for integers are fixed to either 64bit with 'l' and 32bit without a size prefix. - * We rely on %u/%d/%x to format regular ints, so ensure the size is what we expect. At the same time, we also - * need specifiers for (U)INTN which are native (pointer) sized. */ -assert_cc(sizeof(int) == sizeof(uint32_t)); -#if __SIZEOF_POINTER__ == 4 -# define PRIuN L"u" -# define PRIiN L"d" -#elif __SIZEOF_POINTER__ == 8 -# define PRIuN L"lu" -# define PRIiN L"ld" -#else -# error "Unexpected pointer size" -#endif - static inline void free(void *p) { if (!p) return; @@ -180,7 +166,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