The branch main has been updated by olce: URL: https://cgit.FreeBSD.org/src/commit/?id=96f77576e9ea83b3a5d1a02a24da7d54c06a58a8
commit 96f77576e9ea83b3a5d1a02a24da7d54c06a58a8 Author: Olivier Certner <o...@freebsd.org> AuthorDate: 2025-03-05 10:46:50 +0000 Commit: Olivier Certner <o...@freebsd.org> CommitDate: 2025-03-11 13:54:10 +0000 loader.efi: smbios: Favor the v3 (64-bit) entry point Be consistent with what we are now doing with non-EFI boot (but with the difference that EFI runs in 64-bit mode on 64-bit platforms, so there is no restriction that the v3 entry point should be below 4GB). While here, move out the EFI smbios detection code in a separate sub-routine. Reviewed by: imp, markj MFC after: 2 weeks Relnotes: yes Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D49292 --- stand/efi/loader/main.c | 51 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/stand/efi/loader/main.c b/stand/efi/loader/main.c index 76e02e461aa8..f592f8ecf495 100644 --- a/stand/efi/loader/main.c +++ b/stand/efi/loader/main.c @@ -1152,12 +1152,45 @@ acpi_detect(void) } } +static void +efi_smbios_detect(void) +{ + VOID *smbios_v2_ptr = NULL; + UINTN k; + + for (k = 0; k < ST->NumberOfTableEntries; k++) { + EFI_GUID *guid; + VOID *const VT = ST->ConfigurationTable[k].VendorTable; + char buf[40]; + bool is_smbios_v2, is_smbios_v3; + + guid = &ST->ConfigurationTable[k].VendorGuid; + is_smbios_v2 = memcmp(guid, &smbios, sizeof(*guid)) == 0; + is_smbios_v3 = memcmp(guid, &smbios3, sizeof(*guid)) == 0; + + if (!is_smbios_v2 && !is_smbios_v3) + continue; + + snprintf(buf, sizeof(buf), "%p", VT); + setenv("hint.smbios.0.mem", buf, 1); + if (is_smbios_v2) + /* + * We will parse a v2 table only if we don't find a v3 + * table. In the meantime, store the address. + */ + smbios_v2_ptr = VT; + else if (smbios_detect(VT) != NULL) + /* v3 parsing succeeded, we are done. */ + return; + } + if (smbios_v2_ptr != NULL) + (void)smbios_detect(smbios_v2_ptr); +} + EFI_STATUS main(int argc, CHAR16 *argv[]) { - EFI_GUID *guid; int howto, i, uhowto; - UINTN k; bool has_kbd, is_last; char *s; EFI_DEVICE_PATH *imgpath; @@ -1180,19 +1213,7 @@ main(int argc, CHAR16 *argv[]) archsw.arch_zfs_probe = efi_zfs_probe; #if !defined(__arm__) - for (k = 0; k < ST->NumberOfTableEntries; k++) { - guid = &ST->ConfigurationTable[k].VendorGuid; - if (!memcmp(guid, &smbios, sizeof(EFI_GUID)) || - !memcmp(guid, &smbios3, sizeof(EFI_GUID))) { - char buf[40]; - - snprintf(buf, sizeof(buf), "%p", - ST->ConfigurationTable[k].VendorTable); - setenv("hint.smbios.0.mem", buf, 1); - smbios_detect(ST->ConfigurationTable[k].VendorTable); - break; - } - } + efi_smbios_detect(); #endif /* Get our loaded image protocol interface structure. */