void __init pagetable_init(void)
{
+ pmd_t *pmd;
+ pte_t *pte;
+ int i;
+
/* Initialize the entire pgd. */
pgd_init((unsigned long)swapper_pg_dir);
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));
+
+ /*
+ * The 64-bit kernel uses a flat pagetable for it's kernel mappings ...
+ */
+ pmd = kpmdtbl;
+ pte = kptbl;
+ i = 0;
+ while (i < (1 << PGD_ORDER)) {
+ pmd_val(*pmd) = (unsigned long)pte;
+ pte += PTRS_PER_PTE;
+ pmd++;
+ i++;
+ }
}