Skip to content

Commit

Permalink
x86: Exclude E820_RESERVED regions and memory holes above 4 GB from d…
Browse files Browse the repository at this point in the history
…irect mapping.

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. ]

Cc: stable@kernel.org   # > 2.6.32
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>
  • Loading branch information
Jacob Shin authored and H. Peter Anvin committed Oct 17, 2012
1 parent 961c797 commit 1bbbbe7
Showing 1 changed file with 15 additions and 2 deletions.
17 changes: 15 additions & 2 deletions arch/x86/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -919,8 +919,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;
}
Expand Down

0 comments on commit 1bbbbe7

Please sign in to comment.