diff options
Diffstat (limited to 'arch/x86/kernel/setup.c')
-rw-r--r-- | arch/x86/kernel/setup.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index a2bb18e02839..468e98dfd44e 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -920,8 +920,21 @@ void __init setup_arch(char **cmdline_p) | |||
920 | 920 | ||
921 | #ifdef CONFIG_X86_64 | 921 | #ifdef CONFIG_X86_64 |
922 | if (max_pfn > max_low_pfn) { | 922 | if (max_pfn > max_low_pfn) { |
923 | max_pfn_mapped = init_memory_mapping(1UL<<32, | 923 | int i; |
924 | max_pfn<<PAGE_SHIFT); | 924 | for (i = 0; i < e820.nr_map; i++) { |
925 | struct e820entry *ei = &e820.map[i]; | ||
926 | |||
927 | if (ei->addr + ei->size <= 1UL << 32) | ||
928 | continue; | ||
929 | |||
930 | if (ei->type == E820_RESERVED) | ||
931 | continue; | ||
932 | |||
933 | max_pfn_mapped = init_memory_mapping( | ||
934 | ei->addr < 1UL << 32 ? 1UL << 32 : ei->addr, | ||
935 | ei->addr + ei->size); | ||
936 | } | ||
937 | |||
925 | /* can we preseve max_low_pfn ?*/ | 938 | /* can we preseve max_low_pfn ?*/ |
926 | max_low_pfn = max_pfn; | 939 | max_low_pfn = max_pfn; |
927 | } | 940 | } |