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 ---