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

Commit af042452 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull EFI fixes from Ingo Molnar:
 "Two EFI fixes: a quirk for weird systabs, plus add more robust error
  handling in the old 1:1 mapping code"

* 'efi-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  efi: Allow the number of EFI configuration tables entries to be zero
  efi/x86/Add missing error handling to old_memmap 1:1 mapping code
parents 4fb5741c 88447c5b
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -85,6 +85,8 @@ static efi_status_t __init phys_efi_set_virtual_address_map(
	pgd_t *save_pgd;
	pgd_t *save_pgd;


	save_pgd = efi_call_phys_prolog();
	save_pgd = efi_call_phys_prolog();
	if (!save_pgd)
		return EFI_ABORTED;


	/* Disable interrupts around EFI calls: */
	/* Disable interrupts around EFI calls: */
	local_irq_save(flags);
	local_irq_save(flags);
+6 −3
Original line number Original line Diff line number Diff line
@@ -84,13 +84,15 @@ pgd_t * __init efi_call_phys_prolog(void)


	if (!efi_enabled(EFI_OLD_MEMMAP)) {
	if (!efi_enabled(EFI_OLD_MEMMAP)) {
		efi_switch_mm(&efi_mm);
		efi_switch_mm(&efi_mm);
		return NULL;
		return efi_mm.pgd;
	}
	}


	early_code_mapping_set_exec(1);
	early_code_mapping_set_exec(1);


	n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE);
	n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE);
	save_pgd = kmalloc_array(n_pgds, sizeof(*save_pgd), GFP_KERNEL);
	save_pgd = kmalloc_array(n_pgds, sizeof(*save_pgd), GFP_KERNEL);
	if (!save_pgd)
		return NULL;


	/*
	/*
	 * Build 1:1 identity mapping for efi=old_map usage. Note that
	 * Build 1:1 identity mapping for efi=old_map usage. Note that
@@ -138,10 +140,11 @@ pgd_t * __init efi_call_phys_prolog(void)
		pgd_offset_k(pgd * PGDIR_SIZE)->pgd &= ~_PAGE_NX;
		pgd_offset_k(pgd * PGDIR_SIZE)->pgd &= ~_PAGE_NX;
	}
	}


out:
	__flush_tlb_all();
	__flush_tlb_all();

	return save_pgd;
	return save_pgd;
out:
	efi_call_phys_epilog(save_pgd);
	return NULL;
}
}


void __init efi_call_phys_epilog(pgd_t *save_pgd)
void __init efi_call_phys_epilog(pgd_t *save_pgd)
+3 −0
Original line number Original line Diff line number Diff line
@@ -513,6 +513,9 @@ int __init efi_reuse_config(u64 tables, int nr_tables)
	void *p, *tablep;
	void *p, *tablep;
	struct efi_setup_data *data;
	struct efi_setup_data *data;


	if (nr_tables == 0)
		return 0;

	if (!efi_setup)
	if (!efi_setup)
		return 0;
		return 0;


+3 −0
Original line number Original line Diff line number Diff line
@@ -636,6 +636,9 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables)
	void *config_tables;
	void *config_tables;
	int sz, ret;
	int sz, ret;


	if (efi.systab->nr_tables == 0)
		return 0;

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