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>
static void
fake_bios_data (int use_rom)
{
- unsigned i;
void *acpi, *smbios;
grub_uint16_t *ebda_seg_ptr, *low_mem_ptr;
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);
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;
}
*/
#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);
}
*/
#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);
}
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;
+}
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;
}
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 *);