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

Configure Feed

Select the types of activity you want to include in your feed.

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

* 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
Revert "x86, efi: Calling __pa() with an ioremap()ed address is invalid"
x86, efi: Make efi_call_phys_{prelog,epilog} CONFIG_RELOCATABLE-aware

+37 -94
-8
arch/x86/include/asm/e820.h
··· 53 53 */ 54 54 #define E820_RESERVED_KERN 128 55 55 56 - /* 57 - * Address ranges that need to be mapped by the kernel direct 58 - * mapping. This is used to make sure regions such as 59 - * EFI_RUNTIME_SERVICES_DATA are directly mapped. See setup_arch(). 60 - */ 61 - #define E820_RESERVED_EFI 129 62 - 63 56 #ifndef __ASSEMBLY__ 64 57 #include <linux/types.h> 65 58 struct e820entry { ··· 115 122 } 116 123 #endif 117 124 118 - extern unsigned long e820_end_pfn(unsigned long limit_pfn, unsigned type); 119 125 extern unsigned long e820_end_of_ram_pfn(void); 120 126 extern unsigned long e820_end_of_low_ram_pfn(void); 121 127 extern u64 early_reserve_e820(u64 startt, u64 sizet, u64 align);
+5
arch/x86/include/asm/efi.h
··· 33 33 #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ 34 34 efi_call_virt(f, a1, a2, a3, a4, a5, a6) 35 35 36 + #define efi_ioremap(addr, size, type) ioremap_cache(addr, size) 37 + 36 38 #else /* !CONFIG_X86_32 */ 37 39 38 40 extern u64 efi_call0(void *fp); ··· 83 81 #define efi_call_virt6(f, a1, a2, a3, a4, a5, a6) \ 84 82 efi_call6((void *)(efi.systab->runtime->f), (u64)(a1), (u64)(a2), \ 85 83 (u64)(a3), (u64)(a4), (u64)(a5), (u64)(a6)) 84 + 85 + extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, 86 + u32 type); 86 87 87 88 #endif /* CONFIG_X86_32 */ 88 89
+1 -2
arch/x86/kernel/e820.c
··· 135 135 printk(KERN_CONT "(usable)"); 136 136 break; 137 137 case E820_RESERVED: 138 - case E820_RESERVED_EFI: 139 138 printk(KERN_CONT "(reserved)"); 140 139 break; 141 140 case E820_ACPI: ··· 783 784 /* 784 785 * Find the highest page frame number we have available 785 786 */ 786 - unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type) 787 + static unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type) 787 788 { 788 789 int i; 789 790 unsigned long last_pfn = 0;
+1 -20
arch/x86/kernel/setup.c
··· 691 691 692 692 void __init setup_arch(char **cmdline_p) 693 693 { 694 - unsigned long end_pfn; 695 - 696 694 #ifdef CONFIG_X86_32 697 695 memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data)); 698 696 visws_early_detect(); ··· 932 934 init_gbpages(); 933 935 934 936 /* max_pfn_mapped is updated here */ 935 - end_pfn = max_low_pfn; 936 - 937 - #ifdef CONFIG_X86_64 938 - /* 939 - * There may be regions after the last E820_RAM region that we 940 - * want to include in the kernel direct mapping, such as 941 - * EFI_RUNTIME_SERVICES_DATA. 942 - */ 943 - if (efi_enabled) { 944 - unsigned long efi_end; 945 - 946 - efi_end = e820_end_pfn(MAXMEM>>PAGE_SHIFT, E820_RESERVED_EFI); 947 - if (efi_end > max_low_pfn) 948 - end_pfn = efi_end; 949 - } 950 - #endif 951 - 952 - max_low_pfn_mapped = init_memory_mapping(0, end_pfn << PAGE_SHIFT); 937 + max_low_pfn_mapped = init_memory_mapping(0, max_low_pfn<<PAGE_SHIFT); 953 938 max_pfn_mapped = max_low_pfn_mapped; 954 939 955 940 #ifdef CONFIG_X86_64
+11 -18
arch/x86/platform/efi/efi.c
··· 323 323 case EFI_UNUSABLE_MEMORY: 324 324 e820_type = E820_UNUSABLE; 325 325 break; 326 - case EFI_RUNTIME_SERVICES_DATA: 327 - e820_type = E820_RESERVED_EFI; 328 - break; 329 326 default: 330 327 /* 331 328 * EFI_RESERVED_TYPE EFI_RUNTIME_SERVICES_CODE 332 - * EFI_MEMORY_MAPPED_IO 329 + * EFI_RUNTIME_SERVICES_DATA EFI_MEMORY_MAPPED_IO 333 330 * EFI_MEMORY_MAPPED_IO_PORT_SPACE EFI_PAL_CODE 334 331 */ 335 332 e820_type = E820_RESERVED; ··· 671 674 end_pfn = PFN_UP(end); 672 675 if (end_pfn <= max_low_pfn_mapped 673 676 || (end_pfn > (1UL << (32 - PAGE_SHIFT)) 674 - && end_pfn <= max_pfn_mapped)) { 677 + && end_pfn <= max_pfn_mapped)) 675 678 va = __va(md->phys_addr); 676 - 677 - if (!(md->attribute & EFI_MEMORY_WB)) { 678 - addr = (u64) (unsigned long)va; 679 - npages = md->num_pages; 680 - memrange_efi_to_native(&addr, &npages); 681 - set_memory_uc(addr, npages); 682 - } 683 - } else { 684 - if (!(md->attribute & EFI_MEMORY_WB)) 685 - va = ioremap_nocache(md->phys_addr, size); 686 - else 687 - va = ioremap_cache(md->phys_addr, size); 688 - } 679 + else 680 + va = efi_ioremap(md->phys_addr, size, md->type); 689 681 690 682 md->virt_addr = (u64) (unsigned long) va; 691 683 ··· 682 696 printk(KERN_ERR PFX "ioremap of 0x%llX failed!\n", 683 697 (unsigned long long)md->phys_addr); 684 698 continue; 699 + } 700 + 701 + if (!(md->attribute & EFI_MEMORY_WB)) { 702 + addr = md->virt_addr; 703 + npages = md->num_pages; 704 + memrange_efi_to_native(&addr, &npages); 705 + set_memory_uc(addr, npages); 685 706 } 686 707 687 708 systab = (u64) (unsigned long) efi_phys.systab;
+2 -46
arch/x86/platform/efi/efi_32.c
··· 39 39 */ 40 40 41 41 static unsigned long efi_rt_eflags; 42 - static pgd_t efi_bak_pg_dir_pointer[2]; 43 42 44 43 void efi_call_phys_prelog(void) 45 44 { 46 - unsigned long cr4; 47 - unsigned long temp; 48 45 struct desc_ptr gdt_descr; 49 46 50 47 local_irq_save(efi_rt_eflags); 51 48 52 - /* 53 - * If I don't have PAE, I should just duplicate two entries in page 54 - * directory. If I have PAE, I just need to duplicate one entry in 55 - * page directory. 56 - */ 57 - cr4 = read_cr4_safe(); 58 - 59 - if (cr4 & X86_CR4_PAE) { 60 - efi_bak_pg_dir_pointer[0].pgd = 61 - swapper_pg_dir[pgd_index(0)].pgd; 62 - swapper_pg_dir[0].pgd = 63 - swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd; 64 - } else { 65 - efi_bak_pg_dir_pointer[0].pgd = 66 - swapper_pg_dir[pgd_index(0)].pgd; 67 - efi_bak_pg_dir_pointer[1].pgd = 68 - swapper_pg_dir[pgd_index(0x400000)].pgd; 69 - swapper_pg_dir[pgd_index(0)].pgd = 70 - swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd; 71 - temp = PAGE_OFFSET + 0x400000; 72 - swapper_pg_dir[pgd_index(0x400000)].pgd = 73 - swapper_pg_dir[pgd_index(temp)].pgd; 74 - } 75 - 76 - /* 77 - * After the lock is released, the original page table is restored. 78 - */ 49 + load_cr3(initial_page_table); 79 50 __flush_tlb_all(); 80 51 81 52 gdt_descr.address = __pa(get_cpu_gdt_table(0)); ··· 56 85 57 86 void efi_call_phys_epilog(void) 58 87 { 59 - unsigned long cr4; 60 88 struct desc_ptr gdt_descr; 61 89 62 90 gdt_descr.address = (unsigned long)get_cpu_gdt_table(0); 63 91 gdt_descr.size = GDT_SIZE - 1; 64 92 load_gdt(&gdt_descr); 65 93 66 - cr4 = read_cr4_safe(); 67 - 68 - if (cr4 & X86_CR4_PAE) { 69 - swapper_pg_dir[pgd_index(0)].pgd = 70 - efi_bak_pg_dir_pointer[0].pgd; 71 - } else { 72 - swapper_pg_dir[pgd_index(0)].pgd = 73 - efi_bak_pg_dir_pointer[0].pgd; 74 - swapper_pg_dir[pgd_index(0x400000)].pgd = 75 - efi_bak_pg_dir_pointer[1].pgd; 76 - } 77 - 78 - /* 79 - * After the lock is released, the original page table is restored. 80 - */ 94 + load_cr3(swapper_pg_dir); 81 95 __flush_tlb_all(); 82 96 83 97 local_irq_restore(efi_rt_eflags);
+17
arch/x86/platform/efi/efi_64.c
··· 80 80 local_irq_restore(efi_flags); 81 81 early_code_mapping_set_exec(0); 82 82 } 83 + 84 + void __iomem *__init efi_ioremap(unsigned long phys_addr, unsigned long size, 85 + u32 type) 86 + { 87 + unsigned long last_map_pfn; 88 + 89 + if (type == EFI_MEMORY_MAPPED_IO) 90 + return ioremap(phys_addr, size); 91 + 92 + last_map_pfn = init_memory_mapping(phys_addr, phys_addr + size); 93 + if ((last_map_pfn << PAGE_SHIFT) < phys_addr + size) { 94 + unsigned long top = last_map_pfn << PAGE_SHIFT; 95 + efi_ioremap(top, size - (top - phys_addr), type); 96 + } 97 + 98 + return (void __iomem *)__va(phys_addr); 99 + }