Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b61fbc88 authored by Hans de Goede's avatar Hans de Goede Committed by Ard Biesheuvel
Browse files

efi-stub: Fix get_efi_config_table on mixed-mode setups



Fix get_efi_config_table using the wrong structs when booting a
64 bit kernel on 32 bit firmware.

Fixes: 82d736ac ("Abstract out support for locating an EFI config table")
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Acked-By: default avatarMatthew Garrett <mjg59@google.com>
Reviewed-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
Acked-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
parent 5f9e832c
Loading
Loading
Loading
Loading
+27 −11
Original line number Diff line number Diff line
@@ -927,17 +927,33 @@ efi_status_t efi_exit_boot_services(efi_system_table_t *sys_table_arg,
	return status;
}

#define GET_EFI_CONFIG_TABLE(bits)					\
static void *get_efi_config_table##bits(efi_system_table_t *_sys_table,	\
					efi_guid_t guid)		\
{									\
	efi_system_table_##bits##_t *sys_table;				\
	efi_config_table_##bits##_t *tables;				\
	int i;								\
									\
	sys_table = (typeof(sys_table))_sys_table;			\
	tables = (typeof(tables))(unsigned long)sys_table->tables;	\
									\
	for (i = 0; i < sys_table->nr_tables; i++) {			\
		if (efi_guidcmp(tables[i].guid, guid) != 0)		\
			continue;					\
									\
		return (void *)(unsigned long)tables[i].table;		\
	}								\
									\
	return NULL;							\
}
GET_EFI_CONFIG_TABLE(32)
GET_EFI_CONFIG_TABLE(64)

void *get_efi_config_table(efi_system_table_t *sys_table, efi_guid_t guid)
{
	efi_config_table_t *tables = (efi_config_table_t *)sys_table->tables;
	int i;

	for (i = 0; i < sys_table->nr_tables; i++) {
		if (efi_guidcmp(tables[i].guid, guid) != 0)
			continue;

		return (void *)tables[i].table;
	}

	return NULL;
	if (efi_is_64bit())
		return get_efi_config_table64(sys_table, guid);
	else
		return get_efi_config_table32(sys_table, guid);
}