|
@@ -919,8 +919,21 @@ void __init setup_arch(char **cmdline_p)
|
|
|
|
|
|
#ifdef CONFIG_X86_64
|
|
#ifdef CONFIG_X86_64
|
|
if (max_pfn > max_low_pfn) {
|
|
if (max_pfn > max_low_pfn) {
|
|
- max_pfn_mapped = init_memory_mapping(1UL<<32,
|
|
|
|
- max_pfn<<PAGE_SHIFT);
|
|
|
|
|
|
+ int i;
|
|
|
|
+ for (i = 0; i < e820.nr_map; i++) {
|
|
|
|
+ struct e820entry *ei = &e820.map[i];
|
|
|
|
+
|
|
|
|
+ if (ei->addr + ei->size <= 1UL << 32)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ if (ei->type == E820_RESERVED)
|
|
|
|
+ continue;
|
|
|
|
+
|
|
|
|
+ max_pfn_mapped = init_memory_mapping(
|
|
|
|
+ ei->addr < 1UL << 32 ? 1UL << 32 : ei->addr,
|
|
|
|
+ ei->addr + ei->size);
|
|
|
|
+ }
|
|
|
|
+
|
|
/* can we preseve max_low_pfn ?*/
|
|
/* can we preseve max_low_pfn ?*/
|
|
max_low_pfn = max_pfn;
|
|
max_low_pfn = max_pfn;
|
|
}
|
|
}
|