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

Commit 7bb68410 authored by Ard Biesheuvel's avatar Ard Biesheuvel
Browse files

efi: split off remapping code from efi_config_init()



Split of the remapping code from efi_config_init() so that the caller
can perform its own remapping. This is necessary to correctly handle
virtually remapped UEFI memory regions under kexec, as efi.systab will
have been updated to a virtual address.

Acked-by: default avatarMatt Fleming <matt.fleming@intel.com>
Tested-by: default avatarLeif Lindholm <leif.lindholm@linaro.org>
Signed-off-by: default avatarArd Biesheuvel <ard.biesheuvel@linaro.org>
parent 8ce837ce
Loading
Loading
Loading
Loading
+32 −24
Original line number Original line Diff line number Diff line
@@ -293,29 +293,15 @@ static __init int match_config_table(efi_guid_t *guid,
	return 0;
	return 0;
}
}


int __init efi_config_init(efi_config_table_type_t *arch_tables)
int __init efi_config_parse_tables(void *config_tables, int count, int sz,
				   efi_config_table_type_t *arch_tables)
{
{
	void *config_tables, *tablep;
	void *tablep;
	int i, sz;
	int i;

	if (efi_enabled(EFI_64BIT))
		sz = sizeof(efi_config_table_64_t);
	else
		sz = sizeof(efi_config_table_32_t);

	/*
	 * Let's see what config tables the firmware passed to us.
	 */
	config_tables = early_memremap(efi.systab->tables,
				       efi.systab->nr_tables * sz);
	if (config_tables == NULL) {
		pr_err("Could not map Configuration table!\n");
		return -ENOMEM;
	}


	tablep = config_tables;
	tablep = config_tables;
	pr_info("");
	pr_info("");
	for (i = 0; i < efi.systab->nr_tables; i++) {
	for (i = 0; i < count; i++) {
		efi_guid_t guid;
		efi_guid_t guid;
		unsigned long table;
		unsigned long table;


@@ -328,8 +314,6 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables)
			if (table64 >> 32) {
			if (table64 >> 32) {
				pr_cont("\n");
				pr_cont("\n");
				pr_err("Table located above 4GB, disabling EFI.\n");
				pr_err("Table located above 4GB, disabling EFI.\n");
				early_memunmap(config_tables,
					       efi.systab->nr_tables * sz);
				return -EINVAL;
				return -EINVAL;
			}
			}
#endif
#endif
@@ -344,13 +328,37 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables)
		tablep += sz;
		tablep += sz;
	}
	}
	pr_cont("\n");
	pr_cont("\n");
	early_memunmap(config_tables, efi.systab->nr_tables * sz);

	set_bit(EFI_CONFIG_TABLES, &efi.flags);
	set_bit(EFI_CONFIG_TABLES, &efi.flags);

	return 0;
	return 0;
}
}


int __init efi_config_init(efi_config_table_type_t *arch_tables)
{
	void *config_tables;
	int sz, ret;

	if (efi_enabled(EFI_64BIT))
		sz = sizeof(efi_config_table_64_t);
	else
		sz = sizeof(efi_config_table_32_t);

	/*
	 * Let's see what config tables the firmware passed to us.
	 */
	config_tables = early_memremap(efi.systab->tables,
				       efi.systab->nr_tables * sz);
	if (config_tables == NULL) {
		pr_err("Could not map Configuration table!\n");
		return -ENOMEM;
	}

	ret = efi_config_parse_tables(config_tables, efi.systab->nr_tables, sz,
				      arch_tables);

	early_memunmap(config_tables, efi.systab->nr_tables * sz);
	return ret;
}

#ifdef CONFIG_EFI_VARS_MODULE
#ifdef CONFIG_EFI_VARS_MODULE
static int __init efi_load_efivars(void)
static int __init efi_load_efivars(void)
{
{
+2 −0
Original line number Original line Diff line number Diff line
@@ -875,6 +875,8 @@ static inline efi_status_t efi_query_variable_store(u32 attributes, unsigned lon
#endif
#endif
extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
extern void __iomem *efi_lookup_mapped_addr(u64 phys_addr);
extern int efi_config_init(efi_config_table_type_t *arch_tables);
extern int efi_config_init(efi_config_table_type_t *arch_tables);
extern int efi_config_parse_tables(void *config_tables, int count, int sz,
				   efi_config_table_type_t *arch_tables);
extern u64 efi_get_iobase (void);
extern u64 efi_get_iobase (void);
extern u32 efi_mem_type (unsigned long phys_addr);
extern u32 efi_mem_type (unsigned long phys_addr);
extern u64 efi_mem_attributes (unsigned long phys_addr);
extern u64 efi_mem_attributes (unsigned long phys_addr);