diff options
-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 f4b9b80e1b95..198e774498ec 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -919,8 +919,21 @@ void __init setup_arch(char **cmdline_p) | |||
919 | 919 | ||
920 | #ifdef CONFIG_X86_64 | 920 | #ifdef CONFIG_X86_64 |
921 | if (max_pfn > max_low_pfn) { | 921 | if (max_pfn > max_low_pfn) { |
922 | max_pfn_mapped = init_memory_mapping(1UL<<32, | 922 | int i; |
923 | max_pfn<<PAGE_SHIFT); | 923 | for (i = 0; i < e820.nr_map; i++) { |
924 | struct e820entry *ei = &e820.map[i]; | ||
925 | |||
926 | if (ei->addr + ei->size <= 1UL << 32) | ||
927 | continue; | ||
928 | |||
929 | if (ei->type == E820_RESERVED) | ||
930 | continue; | ||
931 | |||
932 | max_pfn_mapped = init_memory_mapping( | ||
933 | ei->addr < 1UL << 32 ? 1UL << 32 : ei->addr, | ||
934 | ei->addr + ei->size); | ||
935 | } | ||
936 | |||
924 | /* can we preseve max_low_pfn ?*/ | 937 | /* can we preseve max_low_pfn ?*/ |
925 | max_low_pfn = max_pfn; | 938 | max_low_pfn = max_pfn; |
926 | } | 939 | } |