Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86, efi: Consolidate EFI nx control

The core EFI code and 64-bit EFI code currently have independent
implementations of code for setting memory regions as executable or not.
Let's consolidate them.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Link: http://lkml.kernel.org/r/1304623186-18261-2-git-send-email-mjg@redhat.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>

authored by

Matthew Garrett and committed by
H. Peter Anvin
9cd2b07c 2b5e8ef3

+22 -28
+1
arch/x86/include/asm/efi.h
··· 90 90 #endif /* CONFIG_X86_32 */ 91 91 92 92 extern int add_efi_memmap; 93 + extern void efi_set_executable(efi_memory_desc_t *md, bool executable); 93 94 extern void efi_memblock_x86_reserve_range(void); 94 95 extern void efi_call_phys_prelog(void); 95 96 extern void efi_call_phys_epilog(void);
+16 -5
arch/x86/platform/efi/efi.c
··· 457 457 #endif 458 458 } 459 459 460 + void __init efi_set_executable(efi_memory_desc_t *md, bool executable) 461 + { 462 + u64 addr, npages; 463 + 464 + addr = md->virt_addr; 465 + npages = md->num_pages; 466 + 467 + memrange_efi_to_native(&addr, &npages); 468 + 469 + if (executable) 470 + set_memory_x(addr, npages); 471 + else 472 + set_memory_nx(addr, npages); 473 + } 474 + 460 475 static void __init runtime_code_page_mkexec(void) 461 476 { 462 477 efi_memory_desc_t *md; 463 478 void *p; 464 - u64 addr, npages; 465 479 466 480 /* Make EFI runtime service code area executable */ 467 481 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { ··· 484 470 if (md->type != EFI_RUNTIME_SERVICES_CODE) 485 471 continue; 486 472 487 - addr = md->virt_addr; 488 - npages = md->num_pages; 489 - memrange_efi_to_native(&addr, &npages); 490 - set_memory_x(addr, npages); 473 + efi_set_executable(md, true); 491 474 } 492 475 } 493 476
+5 -23
arch/x86/platform/efi/efi_64.c
··· 41 41 static pgd_t save_pgd __initdata; 42 42 static unsigned long efi_flags __initdata; 43 43 44 - static void __init early_mapping_set_exec(unsigned long start, 45 - unsigned long end, 46 - int executable) 47 - { 48 - unsigned long num_pages; 49 - 50 - start &= PMD_MASK; 51 - end = (end + PMD_SIZE - 1) & PMD_MASK; 52 - num_pages = (end - start) >> PAGE_SHIFT; 53 - if (executable) 54 - set_memory_x((unsigned long)__va(start), num_pages); 55 - else 56 - set_memory_nx((unsigned long)__va(start), num_pages); 57 - } 58 - 59 - static void __init early_runtime_code_mapping_set_exec(int executable) 44 + static void __init early_code_mapping_set_exec(int executable) 60 45 { 61 46 efi_memory_desc_t *md; 62 47 void *p; ··· 52 67 /* Make EFI runtime service code area executable */ 53 68 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 54 69 md = p; 55 - if (md->type == EFI_RUNTIME_SERVICES_CODE) { 56 - unsigned long end; 57 - end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT); 58 - early_mapping_set_exec(md->phys_addr, end, executable); 59 - } 70 + if (md->type == EFI_RUNTIME_SERVICES_CODE) 71 + efi_set_executable(md, executable); 60 72 } 61 73 } 62 74 ··· 61 79 { 62 80 unsigned long vaddress; 63 81 64 - early_runtime_code_mapping_set_exec(1); 82 + early_code_mapping_set_exec(1); 65 83 local_irq_save(efi_flags); 66 84 vaddress = (unsigned long)__va(0x0UL); 67 85 save_pgd = *pgd_offset_k(0x0UL); ··· 77 95 set_pgd(pgd_offset_k(0x0UL), save_pgd); 78 96 __flush_tlb_all(); 79 97 local_irq_restore(efi_flags); 80 - early_runtime_code_mapping_set_exec(0); 98 + early_code_mapping_set_exec(0); 81 99 } 82 100 83 101 void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size,