]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
efi: Deduplicate configuration table search function
authorVladimir Serbinenko <phcoder@gmail.com>
Sun, 13 Aug 2023 07:15:02 +0000 (09:15 +0200)
committerVladimir Serbinenko <phcoder@gmail.com>
Mon, 6 Nov 2023 21:47:16 +0000 (22:47 +0100)
We do table search in many places doing exactly the same algorithm.
The only minor variance in users is which table is used if several entries
are present. As specification mandates uniqueness and even if it ever isn't,
first entry is good enough, unify this code and always use the first entry.

Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/commands/efi/loadbios.c
grub-core/commands/efi/lssal.c
grub-core/commands/efi/smbios.c
grub-core/kern/efi/acpi.c
grub-core/kern/efi/efi.c
grub-core/kern/efi/fdt.c
include/grub/efi/efi.h

index 8f6b0ecfcb7b30561847b6ba3f49e230cd181c23..8e042095ad0c72ffc59c028076c837302e6646e0 100644 (file)
@@ -92,7 +92,6 @@ lock_rom_area (void)
 static void
 fake_bios_data (int use_rom)
 {
-  unsigned i;
   void *acpi, *smbios;
   grub_uint16_t *ebda_seg_ptr, *low_mem_ptr;
 
@@ -101,33 +100,15 @@ fake_bios_data (int use_rom)
   if ((*ebda_seg_ptr) || (*low_mem_ptr))
     return;
 
-  acpi = 0;
-  smbios = 0;
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    {
-      grub_guid_t *guid =
-       &grub_efi_system_table->configuration_table[i].vendor_guid;
-
-      if (! grub_memcmp (guid, &acpi2_guid, sizeof (grub_guid_t)))
-       {
-         acpi = grub_efi_system_table->configuration_table[i].vendor_table;
-         grub_dprintf ("efi", "ACPI2: %p\n", acpi);
-       }
-      else if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_guid_t)))
-       {
-         void *t;
-
-         t = grub_efi_system_table->configuration_table[i].vendor_table;
-         if (! acpi)
-           acpi = t;
-         grub_dprintf ("efi", "ACPI: %p\n", t);
-       }
-      else if (! grub_memcmp (guid, &smbios_guid, sizeof (grub_guid_t)))
-       {
-         smbios = grub_efi_system_table->configuration_table[i].vendor_table;
-         grub_dprintf ("efi", "SMBIOS: %p\n", smbios);
-       }
-    }
+  acpi = grub_efi_find_configuration_table (&acpi2_guid);
+  grub_dprintf ("efi", "ACPI2: %p\n", acpi);
+  if (!acpi) {
+    acpi = grub_efi_find_configuration_table (&acpi_guid);
+    grub_dprintf ("efi", "ACPI: %p\n", acpi);
+  }
+
+  smbios = grub_efi_find_configuration_table (&smbios_guid);
+  grub_dprintf ("efi", "SMBIOS: %p\n", smbios);
 
   *ebda_seg_ptr = FAKE_EBDA_SEG;
   *low_mem_ptr = (FAKE_EBDA_SEG >> 6);
index fd6085f1bbabca1d310f194774e7f467dea9b63f..7248bdc29da8757ae7c47768df8c7cdba8f8ec25 100644 (file)
@@ -136,22 +136,16 @@ grub_cmd_lssal (struct grub_command *cmd __attribute__ ((unused)),
                int argc __attribute__ ((unused)),
                char **args __attribute__ ((unused)))
 {
-  const grub_efi_system_table_t *st = grub_efi_system_table;
-  grub_efi_configuration_table_t *t = st->configuration_table;
-  unsigned int i;
   static grub_guid_t guid = GRUB_EFI_SAL_TABLE_GUID;
+  void *table = grub_efi_find_configuration_table (&guid);
 
-  for (i = 0; i < st->num_table_entries; i++)
+  if (table == NULL)
     {
-      if (grub_memcmp (&guid, &t->vendor_guid,
-                      sizeof (grub_guid_t)) == 0)
-       {
-         disp_sal (t->vendor_table);
-         return GRUB_ERR_NONE;
-       }
-      t++;
+      grub_printf ("SAL not found\n");
+      return GRUB_ERR_NONE;
     }
-  grub_printf ("SAL not found\n");
+
+  disp_sal (table);
   return GRUB_ERR_NONE;
 }
 
index d772397322e7e68604ecde8d5cd7faa5f3562796..717e5fc1d5bacddf8bc5487eefcdd1ffa407e4fb 100644 (file)
  */
 
 #include <grub/smbios.h>
-#include <grub/misc.h>
 #include <grub/efi/efi.h>
-#include <grub/efi/api.h>
 
 struct grub_smbios_eps *
 grub_machine_smbios_get_eps (void)
 {
-  unsigned i;
   static grub_guid_t smbios_guid = GRUB_EFI_SMBIOS_TABLE_GUID;
 
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    {
-      grub_guid_t *guid =
-       &grub_efi_system_table->configuration_table[i].vendor_guid;
-
-      if (! grub_memcmp (guid, &smbios_guid, sizeof (grub_guid_t)))
-       return (struct grub_smbios_eps *)
-         grub_efi_system_table->configuration_table[i].vendor_table;
-    }
-
-  return 0;
+  return (struct grub_smbios_eps *) grub_efi_find_configuration_table (&smbios_guid);
 }
 
 struct grub_smbios_eps3 *
 grub_machine_smbios_get_eps3 (void)
 {
-  unsigned i;
   static grub_guid_t smbios3_guid = GRUB_EFI_SMBIOS3_TABLE_GUID;
 
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    {
-      grub_guid_t *guid =
-       &grub_efi_system_table->configuration_table[i].vendor_guid;
-
-      if (! grub_memcmp (guid, &smbios3_guid, sizeof (grub_guid_t)))
-       return (struct grub_smbios_eps3 *)
-         grub_efi_system_table->configuration_table[i].vendor_table;
-    }
-
-  return 0;
+  return (struct grub_smbios_eps3 *) grub_efi_find_configuration_table (&smbios3_guid);
 }
index 461c77c33450169a15d4c85260dbd667ec4ab441..828e6dbb2ade8de1bec601b6cfa430c235ec84fd 100644 (file)
  */
 
 #include <grub/acpi.h>
-#include <grub/misc.h>
 #include <grub/efi/efi.h>
-#include <grub/efi/api.h>
 
 struct grub_acpi_rsdp_v10 *
 grub_machine_acpi_get_rsdpv1 (void)
 {
-  unsigned i;
   static grub_guid_t acpi_guid = GRUB_EFI_ACPI_TABLE_GUID;
 
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    {
-      grub_guid_t *guid =
-       &grub_efi_system_table->configuration_table[i].vendor_guid;
-
-      if (! grub_memcmp (guid, &acpi_guid, sizeof (grub_guid_t)))
-       return (struct grub_acpi_rsdp_v10 *)
-         grub_efi_system_table->configuration_table[i].vendor_table;
-    }
-  return 0;
+  return (struct grub_acpi_rsdp_v10 *) grub_efi_find_configuration_table (&acpi_guid);
 }
 
 struct grub_acpi_rsdp_v20 *
 grub_machine_acpi_get_rsdpv2 (void)
 {
-  unsigned i;
   static grub_guid_t acpi20_guid = GRUB_EFI_ACPI_20_TABLE_GUID;
 
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    {
-      grub_guid_t *guid =
-       &grub_efi_system_table->configuration_table[i].vendor_guid;
-
-      if (! grub_memcmp (guid, &acpi20_guid, sizeof (grub_guid_t)))
-       return (struct grub_acpi_rsdp_v20 *)
-         grub_efi_system_table->configuration_table[i].vendor_table;
-    }
-  return 0;
+  return (struct grub_acpi_rsdp_v20 *) grub_efi_find_configuration_table (&acpi20_guid);
 }
index a2afd8de990abd2be96082d8eb51feb2d304ab77..e53808307249a1e37982a59046d4acea80a4c404 100644 (file)
@@ -1031,3 +1031,21 @@ grub_efi_compare_device_paths (const grub_efi_device_path_t *dp1,
 
   return 0;
 }
+
+void *
+grub_efi_find_configuration_table (const grub_guid_t *target_guid)
+{
+  unsigned i;
+
+  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
+    {
+      grub_guid_t *guid =
+       &grub_efi_system_table->configuration_table[i].vendor_guid;
+
+      if (! grub_memcmp (guid, target_guid, sizeof (grub_guid_t)))
+       return (void *)
+         grub_efi_system_table->configuration_table[i].vendor_table;
+    }
+
+  return 0;
+}
index 8fcf43f1b36301e598a9b9159d9b3280fb3d0ad2..15a495a34b775cf460023af9551aab6ca1ed873f 100644 (file)
 void *
 grub_efi_get_firmware_fdt (void)
 {
-  grub_efi_configuration_table_t *tables;
   static grub_guid_t fdt_guid = GRUB_EFI_DEVICE_TREE_GUID;
-  void *firmware_fdt = NULL;
-  unsigned int i;
-
-  /* Look for FDT in UEFI config tables. */
-  tables = grub_efi_system_table->configuration_table;
-
-  for (i = 0; i < grub_efi_system_table->num_table_entries; i++)
-    if (grub_memcmp (&tables[i].vendor_guid, &fdt_guid, sizeof (fdt_guid)) == 0)
-      {
-       firmware_fdt = tables[i].vendor_table;
-       grub_dprintf ("linux", "found registered FDT @ %p\n", firmware_fdt);
-       break;
-      }
+  void *firmware_fdt = grub_efi_find_configuration_table (&fdt_guid);
 
+  if (firmware_fdt) {
+    grub_dprintf ("linux", "found registered FDT @ %p\n", firmware_fdt);
+  } else {
+    grub_dprintf ("linux", "not found registered FDT\n");
+  }
   return firmware_fdt;
 }
index 572f7135f1c2775519e96197d31b81785d214c3a..a5cd99e5afa931d981c99881644ebc5f4142d27c 100644 (file)
@@ -119,6 +119,9 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd,
                                                char **device,
                                                char **path);
 
+void *
+EXPORT_FUNC (grub_efi_find_configuration_table) (const grub_guid_t *target_guid);
+
 #if defined(__arm__) || defined(__aarch64__) || defined(__riscv) || defined(__loongarch__)
 void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void);
 grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *);