x86/efi changes for v2.6.40
Linus,
Please pull the latest x86-efi-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git x86-efi-for-linus
Thanks,
Ingo
------------------>
Matthew Garrett (5):
x86, efi: Remove virtual-mode SetVirtualAddressMap call x86, efi: Consolidate EFI nx control
x86, efi: Merge contiguous memory regions of the same type and attribute x86, efi: Pass a minimal map to SetVirtualAddressMap()
x86, efi: Ensure that the entirity of a region is mapped
arch/x86/include/asm/efi.h | 1 + arch/x86/platform/efi/efi.c | 78 +++++++++++++++++++++++++++++----------- arch/x86/platform/efi/efi_64.c | 34 +++++------------- 3 files changed, 67 insertions(+), 46 deletions(-)
arch/x86/include/asm/efi.h +1 -0
@@ -90,6 +90,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size,#endif /* CONFIG_X86_32 */ extern int add_efi_memmap; +extern void efi_set_executable (efi_memory_desc_t *md,bool executable);extern void efi_memblock_x86_reserve_range (void );extern void efi_call_phys_prelog (void );extern void efi_call_phys_epilog (void );
arch/x86/platform/efi/efi.c +57 -21
134 lines not on this page · raw message
arch/x86/platform/efi/efi_64.c +9 -25
@@ -41,22 +41,7 @@static pgd_t save_pgd__initdata ;static unsigned long efi_flags__initdata ; -static void __init early_mapping_set_exec (unsigned long start, -unsigned long end, -int executable) -{ -unsigned long num_pages; - - start &=PMD_MASK ; - end = (end +PMD_SIZE -1 ) &PMD_MASK ; - num_pages = (end - start) >>PAGE_SHIFT ; -if (executable) -set_memory_x ((unsigned long )__va (start), num_pages); -else -set_memory_nx ((unsigned long )__va (start), num_pages); -} - -static void __init early_runtime_code_mapping_set_exec (int executable) +static void __init early_code_mapping_set_exec (int executable) {efi_memory_desc_t *md;void *p;
@@ -67,11 +52,8 @@ static void __init early_runtime_code_mapping_set_exec(int executable)/* Make EFI runtime service code area executable */ for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { md = p; -if (md->type ==EFI_RUNTIME_SERVICES_CODE ) { -unsigned long end; - end = md->phys_addr + (md->num_pages <<EFI_PAGE_SHIFT ); -early_mapping_set_exec (md->phys_addr, end, executable); - } +if (md->type ==EFI_RUNTIME_SERVICES_CODE ) +efi_set_executable (md, executable); } }
@@ -79,7 +61,7 @@ void __init efi_call_phys_prelog(void) {unsigned long vaddress; -early_runtime_code_mapping_set_exec (1 ); +early_code_mapping_set_exec (1 );local_irq_save (efi_flags); vaddress = (unsigned long )__va (0x0UL ); save_pgd = *pgd_offset_k (0x0UL );
@@ -95,7 +77,7 @@ void __init efi_call_phys_epilog(void)set_pgd (pgd_offset_k (0x0UL ), save_pgd);__flush_tlb_all ();local_irq_restore (efi_flags); -early_runtime_code_mapping_set_exec (0 ); +early_code_mapping_set_exec (0 ); } void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,
@@ -107,8 +89,10 @@ void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,return ioremap (phys_addr, size); last_map_pfn =init_memory_mapping (phys_addr, phys_addr + size); -if ((last_map_pfn <<PAGE_SHIFT ) < phys_addr + size) -return NULL ; +if ((last_map_pfn <<PAGE_SHIFT ) < phys_addr + size) { +unsigned long top = last_map_pfn <<PAGE_SHIFT ; +efi_ioremap (top, size - (top - phys_addr), type); + }return (void __iomem *)__va (phys_addr); }