|
@@ -1025,3 +1025,57 @@ void __init sanity_check_meminfo(void)
|
|
|
}
|
|
|
if (reason) {
|
|
|
printk(KERN_CRIT "HIGHMEM is not supported %s, ignoring high memory\n",
|
|
|
+ reason);
|
|
|
+ while (j > 0 && meminfo.bank[j - 1].highmem)
|
|
|
+ j--;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ meminfo.nr_banks = j;
|
|
|
+ high_memory = __va(arm_lowmem_limit - 1) + 1;
|
|
|
+ memblock_set_current_limit(arm_lowmem_limit);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void prepare_page_table(void)
|
|
|
+{
|
|
|
+ unsigned long addr;
|
|
|
+ phys_addr_t end;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Clear out all the mappings below the kernel image.
|
|
|
+ */
|
|
|
+ for (addr = 0; addr < MODULES_VADDR; addr += PMD_SIZE)
|
|
|
+ pmd_clear(pmd_off_k(addr));
|
|
|
+
|
|
|
+#ifdef CONFIG_XIP_KERNEL
|
|
|
+ /* The XIP kernel is mapped in the module area -- skip over it */
|
|
|
+ addr = ((unsigned long)_etext + PMD_SIZE - 1) & PMD_MASK;
|
|
|
+#endif
|
|
|
+ for ( ; addr < PAGE_OFFSET; addr += PMD_SIZE)
|
|
|
+ pmd_clear(pmd_off_k(addr));
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Find the end of the first block of lowmem.
|
|
|
+ */
|
|
|
+ end = memblock.memory.regions[0].base + memblock.memory.regions[0].size;
|
|
|
+ if (end >= arm_lowmem_limit)
|
|
|
+ end = arm_lowmem_limit;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Clear out all the kernel space mappings, except for the first
|
|
|
+ * memory bank, up to the vmalloc region.
|
|
|
+ */
|
|
|
+ for (addr = __phys_to_virt(end);
|
|
|
+ addr < VMALLOC_START; addr += PMD_SIZE)
|
|
|
+ pmd_clear(pmd_off_k(addr));
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_ARM_LPAE
|
|
|
+/* the first page is reserved for pgd */
|
|
|
+#define SWAPPER_PG_DIR_SIZE (PAGE_SIZE + \
|
|
|
+ PTRS_PER_PGD * PTRS_PER_PMD * sizeof(pmd_t))
|
|
|
+#else
|
|
|
+#define SWAPPER_PG_DIR_SIZE (PTRS_PER_PGD * sizeof(pgd_t))
|
|
|
+#endif
|
|
|
+
|
|
|
+/*
|