efi.c (c5b591e96db9d99d0126acf93f24e1fb8b368343) | efi.c (78ce248faa3c46e24e9bd42db3ab3650659f16dd) |
---|---|
1/* 2 * Common EFI (Extensible Firmware Interface) support functions 3 * Based on Extensible Firmware Interface Specification version 1.0 4 * 5 * Copyright (C) 1999 VA Linux Systems 6 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> 7 * Copyright (C) 1999-2002 Hewlett-Packard Co. 8 * David Mosberger-Tang <davidm@hpl.hp.com> --- 105 unchanged lines hidden (view full) --- 114 115 now->tv_sec = mktime(eft.year, eft.month, eft.day, eft.hour, 116 eft.minute, eft.second); 117 now->tv_nsec = 0; 118} 119 120void __init efi_find_mirror(void) 121{ | 1/* 2 * Common EFI (Extensible Firmware Interface) support functions 3 * Based on Extensible Firmware Interface Specification version 1.0 4 * 5 * Copyright (C) 1999 VA Linux Systems 6 * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> 7 * Copyright (C) 1999-2002 Hewlett-Packard Co. 8 * David Mosberger-Tang <davidm@hpl.hp.com> --- 105 unchanged lines hidden (view full) --- 114 115 now->tv_sec = mktime(eft.year, eft.month, eft.day, eft.hour, 116 eft.minute, eft.second); 117 now->tv_nsec = 0; 118} 119 120void __init efi_find_mirror(void) 121{ |
122 void *p; | 122 efi_memory_desc_t *md; |
123 u64 mirror_size = 0, total_size = 0; 124 | 123 u64 mirror_size = 0, total_size = 0; 124 |
125 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 126 efi_memory_desc_t *md = p; | 125 for_each_efi_memory_desc(md) { |
127 unsigned long long start = md->phys_addr; 128 unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; 129 130 total_size += size; 131 if (md->attribute & EFI_MEMORY_MORE_RELIABLE) { 132 memblock_mark_mirror(start, size); 133 mirror_size += size; 134 } --- 6 unchanged lines hidden (view full) --- 141/* 142 * Tell the kernel about the EFI memory map. This might include 143 * more than the max 128 entries that can fit in the e820 legacy 144 * (zeropage) memory map. 145 */ 146 147static void __init do_add_efi_memmap(void) 148{ | 126 unsigned long long start = md->phys_addr; 127 unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; 128 129 total_size += size; 130 if (md->attribute & EFI_MEMORY_MORE_RELIABLE) { 131 memblock_mark_mirror(start, size); 132 mirror_size += size; 133 } --- 6 unchanged lines hidden (view full) --- 140/* 141 * Tell the kernel about the EFI memory map. This might include 142 * more than the max 128 entries that can fit in the e820 legacy 143 * (zeropage) memory map. 144 */ 145 146static void __init do_add_efi_memmap(void) 147{ |
149 void *p; | 148 efi_memory_desc_t *md; |
150 | 149 |
151 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 152 efi_memory_desc_t *md = p; | 150 for_each_efi_memory_desc(md) { |
153 unsigned long long start = md->phys_addr; 154 unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; 155 int e820_type; 156 157 switch (md->type) { 158 case EFI_LOADER_CODE: 159 case EFI_LOADER_DATA: 160 case EFI_BOOT_SERVICES_CODE: --- 60 unchanged lines hidden (view full) --- 221 222 return 0; 223} 224 225void __init efi_print_memmap(void) 226{ 227#ifdef EFI_DEBUG 228 efi_memory_desc_t *md; | 151 unsigned long long start = md->phys_addr; 152 unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; 153 int e820_type; 154 155 switch (md->type) { 156 case EFI_LOADER_CODE: 157 case EFI_LOADER_DATA: 158 case EFI_BOOT_SERVICES_CODE: --- 60 unchanged lines hidden (view full) --- 219 220 return 0; 221} 222 223void __init efi_print_memmap(void) 224{ 225#ifdef EFI_DEBUG 226 efi_memory_desc_t *md; |
229 void *p; 230 int i; | 227 int i = 0; |
231 | 228 |
232 for (p = memmap.map, i = 0; 233 p < memmap.map_end; 234 p += memmap.desc_size, i++) { | 229 for_each_efi_memory_desc(md) { |
235 char buf[64]; 236 | 230 char buf[64]; 231 |
237 md = p; | |
238 pr_info("mem%02u: %s range=[0x%016llx-0x%016llx] (%lluMB)\n", | 232 pr_info("mem%02u: %s range=[0x%016llx-0x%016llx] (%lluMB)\n", |
239 i, efi_md_typeattr_format(buf, sizeof(buf), md), | 233 i++, efi_md_typeattr_format(buf, sizeof(buf), md), |
240 md->phys_addr, 241 md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1, 242 (md->num_pages >> (20 - EFI_PAGE_SHIFT))); 243 } 244#endif /* EFI_DEBUG */ 245} 246 247void __init efi_unmap_memmap(void) --- 297 unchanged lines hidden (view full) --- 545 set_memory_x(addr, npages); 546 else 547 set_memory_nx(addr, npages); 548} 549 550void __init runtime_code_page_mkexec(void) 551{ 552 efi_memory_desc_t *md; | 234 md->phys_addr, 235 md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1, 236 (md->num_pages >> (20 - EFI_PAGE_SHIFT))); 237 } 238#endif /* EFI_DEBUG */ 239} 240 241void __init efi_unmap_memmap(void) --- 297 unchanged lines hidden (view full) --- 539 set_memory_x(addr, npages); 540 else 541 set_memory_nx(addr, npages); 542} 543 544void __init runtime_code_page_mkexec(void) 545{ 546 efi_memory_desc_t *md; |
553 void *p; | |
554 555 /* Make EFI runtime service code area executable */ | 547 548 /* Make EFI runtime service code area executable */ |
556 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 557 md = p; 558 | 549 for_each_efi_memory_desc(md) { |
559 if (md->type != EFI_RUNTIME_SERVICES_CODE) 560 continue; 561 562 efi_set_executable(md, true); 563 } 564} 565 566void __init efi_memory_uc(u64 addr, unsigned long size) --- 30 unchanged lines hidden (view full) --- 597 if (!va) 598 pr_err("ioremap of 0x%llX failed!\n", 599 (unsigned long long)md->phys_addr); 600} 601 602/* Merge contiguous regions of the same type and attribute */ 603static void __init efi_merge_regions(void) 604{ | 550 if (md->type != EFI_RUNTIME_SERVICES_CODE) 551 continue; 552 553 efi_set_executable(md, true); 554 } 555} 556 557void __init efi_memory_uc(u64 addr, unsigned long size) --- 30 unchanged lines hidden (view full) --- 588 if (!va) 589 pr_err("ioremap of 0x%llX failed!\n", 590 (unsigned long long)md->phys_addr); 591} 592 593/* Merge contiguous regions of the same type and attribute */ 594static void __init efi_merge_regions(void) 595{ |
605 void *p; | |
606 efi_memory_desc_t *md, *prev_md = NULL; 607 | 596 efi_memory_desc_t *md, *prev_md = NULL; 597 |
608 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | 598 for_each_efi_memory_desc(md) { |
609 u64 prev_size; | 599 u64 prev_size; |
610 md = p; | |
611 612 if (!prev_md) { 613 prev_md = md; 614 continue; 615 } 616 617 if (prev_md->type != md->type || 618 prev_md->attribute != md->attribute) { --- 26 unchanged lines hidden (view full) --- 645 efi.systab = (efi_system_table_t *)(unsigned long)systab; 646 } 647} 648 649static void __init save_runtime_map(void) 650{ 651#ifdef CONFIG_KEXEC_CORE 652 efi_memory_desc_t *md; | 600 601 if (!prev_md) { 602 prev_md = md; 603 continue; 604 } 605 606 if (prev_md->type != md->type || 607 prev_md->attribute != md->attribute) { --- 26 unchanged lines hidden (view full) --- 634 efi.systab = (efi_system_table_t *)(unsigned long)systab; 635 } 636} 637 638static void __init save_runtime_map(void) 639{ 640#ifdef CONFIG_KEXEC_CORE 641 efi_memory_desc_t *md; |
653 void *tmp, *p, *q = NULL; | 642 void *tmp, *q = NULL; |
654 int count = 0; 655 656 if (efi_enabled(EFI_OLD_MEMMAP)) 657 return; 658 | 643 int count = 0; 644 645 if (efi_enabled(EFI_OLD_MEMMAP)) 646 return; 647 |
659 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 660 md = p; 661 | 648 for_each_efi_memory_desc(md) { |
662 if (!(md->attribute & EFI_MEMORY_RUNTIME) || 663 (md->type == EFI_BOOT_SERVICES_CODE) || 664 (md->type == EFI_BOOT_SERVICES_DATA)) 665 continue; 666 tmp = krealloc(q, (count + 1) * memmap.desc_size, GFP_KERNEL); 667 if (!tmp) 668 goto out; 669 q = tmp; --- 139 unchanged lines hidden (view full) --- 809 return new_memmap; 810} 811 812static void __init kexec_enter_virtual_mode(void) 813{ 814#ifdef CONFIG_KEXEC_CORE 815 efi_memory_desc_t *md; 816 unsigned int num_pages; | 649 if (!(md->attribute & EFI_MEMORY_RUNTIME) || 650 (md->type == EFI_BOOT_SERVICES_CODE) || 651 (md->type == EFI_BOOT_SERVICES_DATA)) 652 continue; 653 tmp = krealloc(q, (count + 1) * memmap.desc_size, GFP_KERNEL); 654 if (!tmp) 655 goto out; 656 q = tmp; --- 139 unchanged lines hidden (view full) --- 796 return new_memmap; 797} 798 799static void __init kexec_enter_virtual_mode(void) 800{ 801#ifdef CONFIG_KEXEC_CORE 802 efi_memory_desc_t *md; 803 unsigned int num_pages; |
817 void *p; | |
818 819 efi.systab = NULL; 820 821 /* 822 * We don't do virtual mode, since we don't do runtime services, on 823 * non-native EFI 824 */ 825 if (!efi_is_native()) { --- 7 unchanged lines hidden (view full) --- 833 clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); 834 return; 835 } 836 837 /* 838 * Map efi regions which were passed via setup_data. The virt_addr is a 839 * fixed addr which was used in first kernel of a kexec boot. 840 */ | 804 805 efi.systab = NULL; 806 807 /* 808 * We don't do virtual mode, since we don't do runtime services, on 809 * non-native EFI 810 */ 811 if (!efi_is_native()) { --- 7 unchanged lines hidden (view full) --- 819 clear_bit(EFI_RUNTIME_SERVICES, &efi.flags); 820 return; 821 } 822 823 /* 824 * Map efi regions which were passed via setup_data. The virt_addr is a 825 * fixed addr which was used in first kernel of a kexec boot. 826 */ |
841 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 842 md = p; | 827 for_each_efi_memory_desc(md) { |
843 efi_map_region_fixed(md); /* FIXME: add error handling */ 844 get_systab_virt_addr(md); 845 } 846 847 save_runtime_map(); 848 849 BUG_ON(!efi.systab); 850 --- 153 unchanged lines hidden (view full) --- 1004} 1005 1006/* 1007 * Convenience functions to obtain memory types and attributes 1008 */ 1009u32 efi_mem_type(unsigned long phys_addr) 1010{ 1011 efi_memory_desc_t *md; | 828 efi_map_region_fixed(md); /* FIXME: add error handling */ 829 get_systab_virt_addr(md); 830 } 831 832 save_runtime_map(); 833 834 BUG_ON(!efi.systab); 835 --- 153 unchanged lines hidden (view full) --- 989} 990 991/* 992 * Convenience functions to obtain memory types and attributes 993 */ 994u32 efi_mem_type(unsigned long phys_addr) 995{ 996 efi_memory_desc_t *md; |
1012 void *p; | |
1013 1014 if (!efi_enabled(EFI_MEMMAP)) 1015 return 0; 1016 | 997 998 if (!efi_enabled(EFI_MEMMAP)) 999 return 0; 1000 |
1017 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { 1018 md = p; | 1001 for_each_efi_memory_desc(md) { |
1019 if ((md->phys_addr <= phys_addr) && 1020 (phys_addr < (md->phys_addr + 1021 (md->num_pages << EFI_PAGE_SHIFT)))) 1022 return md->type; 1023 } 1024 return 0; 1025} 1026 --- 13 unchanged lines hidden --- | 1002 if ((md->phys_addr <= phys_addr) && 1003 (phys_addr < (md->phys_addr + 1004 (md->num_pages << EFI_PAGE_SHIFT)))) 1005 return md->type; 1006 } 1007 return 0; 1008} 1009 --- 13 unchanged lines hidden --- |