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. */

Reply via email to