From da1b6db1736ace67e1c5c4a28fff9d58e33c1e24 Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Thu, 27 Feb 2025 12:21:13 +0100 Subject: [PATCH 1/2] kernel: Don't truncate 64-bit config table addresses Dboot is 32-bit, so uintptr_t is uint32_t, so despite config entries on efi64 as well as nativeptr_t being both 64-bit we end up truncating addresses. This patch fixes booting on darp10-b Signed-off-by: Vladimir Serbinenko --- usr/src/uts/i86pc/dboot/dboot_startkern.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/usr/src/uts/i86pc/dboot/dboot_startkern.c b/usr/src/uts/i86pc/dboot/dboot_startkern.c index df2b71152c1c..ef838bbf5f82 100644 --- a/usr/src/uts/i86pc/dboot/dboot_startkern.c +++ b/usr/src/uts/i86pc/dboot/dboot_startkern.c @@ -1818,22 +1818,22 @@ process_efi64(EFI_SYSTEM_TABLE64 *efi) (void) memcpy(&VendorGuid, &config[i].VendorGuid, sizeof (VendorGuid)); if (dboot_same_guids(&VendorGuid, &smbios3)) { - bi->bi_smbios = (native_ptr_t)(uintptr_t) + bi->bi_smbios = (native_ptr_t) config[i].VendorTable; } if (bi->bi_smbios == 0 && dboot_same_guids(&VendorGuid, &smbios)) { - bi->bi_smbios = (native_ptr_t)(uintptr_t) + bi->bi_smbios = (native_ptr_t) config[i].VendorTable; } /* Prefer acpi v2+ over v1. */ if (dboot_same_guids(&VendorGuid, &acpi2)) { - bi->bi_acpi_rsdp = (native_ptr_t)(uintptr_t) + bi->bi_acpi_rsdp = (native_ptr_t) config[i].VendorTable; } if (bi->bi_acpi_rsdp == 0 && dboot_same_guids(&VendorGuid, &acpi1)) { - bi->bi_acpi_rsdp = (native_ptr_t)(uintptr_t) + bi->bi_acpi_rsdp = (native_ptr_t) config[i].VendorTable; } } From ba53c7900fcac0c54047de1aa23bad9cda250d6c Mon Sep 17 00:00:00 2001 From: Vladimir Serbinenko Date: Thu, 27 Feb 2025 12:23:59 +0100 Subject: [PATCH 2/2] kernel: Don't attempt to print an unreachable EFI vendor name Dboot is 32-bit, so if vendor name is above 4GiB mark it's difficult to read it. Just skip it instead of attempting to read random garbage Signed-off-by: Vladimir Serbinenko --- usr/src/uts/i86pc/dboot/dboot_startkern.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/usr/src/uts/i86pc/dboot/dboot_startkern.c b/usr/src/uts/i86pc/dboot/dboot_startkern.c index ef838bbf5f82..3b176b1f4524 100644 --- a/usr/src/uts/i86pc/dboot/dboot_startkern.c +++ b/usr/src/uts/i86pc/dboot/dboot_startkern.c @@ -1947,7 +1947,6 @@ print_efi32(EFI_SYSTEM_TABLE32 *efi) static void print_efi64(EFI_SYSTEM_TABLE64 *efi) { - uint16_t *data; EFI_CONFIGURATION_TABLE64 *conf; int i; @@ -1956,9 +1955,13 @@ print_efi64(EFI_SYSTEM_TABLE64 *efi) dboot_printf("EFI system version: "); dboot_print_efi_version(efi->Hdr.Revision); dboot_printf("EFI system vendor: "); - data = (uint16_t *)(uintptr_t)efi->FirmwareVendor; - for (i = 0; data[i] != 0; i++) - dboot_printf("%c", (char)data[i]); + if (efi->FirmwareVendor > ~(uintptr_t)0) { + dboot_printf(""); + } else { + uint16_t *data = (uint16_t *)(uintptr_t)efi->FirmwareVendor; + for (i = 0; data[i] != 0; i++) + dboot_printf("%c", (char)data[i]); + } dboot_printf("\nEFI firmware revision: "); dboot_print_efi_version(efi->FirmwareRevision); dboot_printf("EFI system table number of entries: %" PRIu64 "\n",