*/
#include <linux/init.h>
#include <linux/mm.h>
+#include <asm/fixmap.h>
#include <asm/pgtable.h>
void pgd_init(unsigned long page)
void __init pagetable_init(void)
{
- pmd_t *pmd;
- pte_t *pte;
- int i;
+ unsigned long vaddr;
+ pgd_t *pgd_base;
/* Initialize the entire pgd. */
pgd_init((unsigned long)swapper_pg_dir);
+#ifdef MODULE_START
+ pgd_init((unsigned long)module_pg_dir);
+#endif
pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table);
- memset((void *)invalid_pte_table, 0, sizeof(pte_t) * PTRS_PER_PTE);
-
- memset((void *)kptbl, 0, PAGE_SIZE << PGD_ORDER);
- memset((void *)kpmdtbl, 0, PAGE_SIZE);
- set_pgd(swapper_pg_dir, __pgd((unsigned long)kpmdtbl));
+ pgd_base = swapper_pg_dir;
/*
- * The 64-bit kernel uses a flat pagetable for it's kernel mappings ...
+ * Fixed mappings:
*/
- pmd = kpmdtbl;
- pte = kptbl;
- i = 0;
- while (i < (1 << PGD_ORDER)) {
- pmd_val(*pmd) = (unsigned long)pte;
- pte += PTRS_PER_PTE;
- pmd++;
- i++;
- }
+ vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
+ fixrange_init(vaddr, 0, pgd_base);
}