aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Certner <olce@FreeBSD.org>2025-03-05 10:46:50 +0000
committerOlivier Certner <olce@FreeBSD.org>2025-03-11 13:54:10 +0000
commit96f77576e9ea83b3a5d1a02a24da7d54c06a58a8 (patch)
tree606ae9c49180a3b4a16d518db6daa558e631ec6b
parent1ee8714950b8d07ccd172f2bcbbbaa91f02ef9e7 (diff)
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
-rw-r--r--stand/efi/loader/main.c51
1 files 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. */