|
@@ -378,10 +378,18 @@ void __init init_extra_mapping_uc(unsigned long phys, unsigned long size)
|
|
|
void __init cleanup_highmap(void)
|
|
|
{
|
|
|
unsigned long vaddr = __START_KERNEL_map;
|
|
|
- unsigned long vaddr_end = __START_KERNEL_map + (max_pfn_mapped << PAGE_SHIFT);
|
|
|
+ unsigned long vaddr_end = __START_KERNEL_map + KERNEL_IMAGE_SIZE;
|
|
|
unsigned long end = roundup((unsigned long)_brk_end, PMD_SIZE) - 1;
|
|
|
pmd_t *pmd = level2_kernel_pgt;
|
|
|
|
|
|
+ /*
|
|
|
+ * Native path, max_pfn_mapped is not set yet.
|
|
|
+ * Xen has valid max_pfn_mapped set in
|
|
|
+ * arch/x86/xen/mmu.c:xen_setup_kernel_pagetable().
|
|
|
+ */
|
|
|
+ if (max_pfn_mapped)
|
|
|
+ vaddr_end = __START_KERNEL_map + (max_pfn_mapped << PAGE_SHIFT);
|
|
|
+
|
|
|
for (; vaddr + PMD_SIZE - 1 < vaddr_end; pmd++, vaddr += PMD_SIZE) {
|
|
|
if (pmd_none(*pmd))
|
|
|
continue;
|