| From 1bbbbe779aabe1f0768c2bf8f8c0a5583679b54a Mon Sep 17 00:00:00 2001 |
| From: Jacob Shin <jacob.shin@amd.com> |
| Date: Thu, 20 Oct 2011 16:15:26 -0500 |
| Subject: x86: Exclude E820_RESERVED regions and memory holes above 4 GB from direct mapping. |
| |
| From: Jacob Shin <jacob.shin@amd.com> |
| |
| commit 1bbbbe779aabe1f0768c2bf8f8c0a5583679b54a upstream. |
| |
| On systems with very large memory (1 TB in our case), BIOS may report a |
| reserved region or a hole in the E820 map, even above the 4 GB range. Exclude |
| these from the direct mapping. |
| |
| [ hpa: this should be done not just for > 4 GB but for everything above the legacy |
| region (1 MB), at the very least. That, however, turns out to require significant |
| restructuring. That work is well underway, but is not suitable for rc/stable. ] |
| |
| Signed-off-by: Jacob Shin <jacob.shin@amd.com> |
| Link: http://lkml.kernel.org/r/1319145326-13902-1-git-send-email-jacob.shin@amd.com |
| Signed-off-by: H. Peter Anvin <hpa@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/setup.c | 17 +++++++++++++++-- |
| 1 file changed, 15 insertions(+), 2 deletions(-) |
| |
| --- a/arch/x86/kernel/setup.c |
| +++ b/arch/x86/kernel/setup.c |
| @@ -927,8 +927,21 @@ void __init setup_arch(char **cmdline_p) |
| |
| #ifdef CONFIG_X86_64 |
| 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 ?*/ |
| max_low_pfn = max_pfn; |
| } |