Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / arch / mips / mm / pgtable-64.c
index 7eb9533..c46eb65 100644 (file)
@@ -8,6 +8,7 @@
  */
 #include <linux/init.h>
 #include <linux/mm.h>
+#include <asm/fixmap.h>
 #include <asm/pgtable.h>
 
 void pgd_init(unsigned long page)
@@ -52,29 +53,20 @@ void pmd_init(unsigned long addr, unsigned long pagetable)
 
 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);
 }