0001
0002
0003 #include <linux/efi.h>
0004 #include <asm/e820/api.h>
0005 #include "fake_mem.h"
0006
0007 void __init efi_fake_memmap_early(void)
0008 {
0009 int i;
0010
0011
0012
0013
0014
0015 if (!efi_soft_reserve_enabled())
0016 return;
0017
0018 if (!efi_enabled(EFI_MEMMAP) || !nr_fake_mem)
0019 return;
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 for (i = 0; i < nr_fake_mem; i++) {
0031 struct efi_mem_range *mem = &efi_fake_mems[i];
0032 efi_memory_desc_t *md;
0033 u64 m_start, m_end;
0034
0035 if ((mem->attribute & EFI_MEMORY_SP) == 0)
0036 continue;
0037
0038 m_start = mem->range.start;
0039 m_end = mem->range.end;
0040 for_each_efi_memory_desc(md) {
0041 u64 start, end, size;
0042
0043 if (md->type != EFI_CONVENTIONAL_MEMORY)
0044 continue;
0045
0046 start = md->phys_addr;
0047 end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1;
0048
0049 if (m_start <= end && m_end >= start)
0050 ;
0051 else
0052 continue;
0053
0054
0055
0056
0057
0058
0059 start = max(start, m_start);
0060 end = min(end, m_end);
0061 size = end - start + 1;
0062
0063 if (end <= start)
0064 continue;
0065
0066
0067
0068
0069
0070 e820__range_remove(start, size, E820_TYPE_RAM, 1);
0071 e820__range_add(start, size, E820_TYPE_SOFT_RESERVED);
0072 e820__update_table(e820_table);
0073 }
0074 }
0075 }