|
@@ -1155,10 +1155,19 @@ void __init sanity_check_meminfo(void)
|
|
|
{
|
|
|
phys_addr_t memblock_limit = 0;
|
|
|
int highmem = 0;
|
|
|
- phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
|
|
|
+ u64 vmalloc_limit;
|
|
|
struct memblock_region *reg;
|
|
|
bool should_use_highmem = false;
|
|
|
|
|
|
+ /*
|
|
|
+ * Let's use our own (unoptimized) equivalent of __pa() that is
|
|
|
+ * not affected by wrap-arounds when sizeof(phys_addr_t) == 4.
|
|
|
+ * The result is used as the upper bound on physical memory address
|
|
|
+ * and may itself be outside the valid range for which phys_addr_t
|
|
|
+ * and therefore __pa() is defined.
|
|
|
+ */
|
|
|
+ vmalloc_limit = (u64)(uintptr_t)vmalloc_min - PAGE_OFFSET + PHYS_OFFSET;
|
|
|
+
|
|
|
for_each_memblock(memory, reg) {
|
|
|
phys_addr_t block_start = reg->base;
|
|
|
phys_addr_t block_end = reg->base + reg->size;
|
|
@@ -1183,10 +1192,11 @@ void __init sanity_check_meminfo(void)
|
|
|
if (reg->size > size_limit) {
|
|
|
phys_addr_t overlap_size = reg->size - size_limit;
|
|
|
|
|
|
- pr_notice("Truncating RAM at %pa-%pa to -%pa",
|
|
|
- &block_start, &block_end, &vmalloc_limit);
|
|
|
- memblock_remove(vmalloc_limit, overlap_size);
|
|
|
+ pr_notice("Truncating RAM at %pa-%pa",
|
|
|
+ &block_start, &block_end);
|
|
|
block_end = vmalloc_limit;
|
|
|
+ pr_cont(" to -%pa", &block_end);
|
|
|
+ memblock_remove(vmalloc_limit, overlap_size);
|
|
|
should_use_highmem = true;
|
|
|
}
|
|
|
}
|