1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 1999, 2000 by Silicon Graphics 7 * Copyright (C) 2003 by Ralf Baechle 8 */ 9 #include <linux/init.h> 10 #include <linux/mm.h> 11 #include <asm/fixmap.h> 12 #include <asm/pgtable.h> 13 #include <asm/pgalloc.h> 14 15 void pgd_init(unsigned long page) 16 { 17 unsigned long *p, *end; 18 19 p = (unsigned long *) page; 20 end = p + PTRS_PER_PGD; 21 22 while (p < end) { 23 p[0] = (unsigned long) invalid_pmd_table; 24 p[1] = (unsigned long) invalid_pmd_table; 25 p[2] = (unsigned long) invalid_pmd_table; 26 p[3] = (unsigned long) invalid_pmd_table; 27 p[4] = (unsigned long) invalid_pmd_table; 28 p[5] = (unsigned long) invalid_pmd_table; 29 p[6] = (unsigned long) invalid_pmd_table; 30 p[7] = (unsigned long) invalid_pmd_table; 31 p += 8; 32 } 33 } 34 35 void pmd_init(unsigned long addr, unsigned long pagetable) 36 { 37 unsigned long *p, *end; 38 39 p = (unsigned long *) addr; 40 end = p + PTRS_PER_PMD; 41 42 while (p < end) { 43 p[0] = (unsigned long)pagetable; 44 p[1] = (unsigned long)pagetable; 45 p[2] = (unsigned long)pagetable; 46 p[3] = (unsigned long)pagetable; 47 p[4] = (unsigned long)pagetable; 48 p[5] = (unsigned long)pagetable; 49 p[6] = (unsigned long)pagetable; 50 p[7] = (unsigned long)pagetable; 51 p += 8; 52 } 53 } 54 55 void __init pagetable_init(void) 56 { 57 unsigned long vaddr; 58 pgd_t *pgd_base; 59 60 /* Initialize the entire pgd. */ 61 pgd_init((unsigned long)swapper_pg_dir); 62 #ifdef MODULE_START 63 pgd_init((unsigned long)module_pg_dir); 64 #endif 65 pmd_init((unsigned long)invalid_pmd_table, (unsigned long)invalid_pte_table); 66 67 pgd_base = swapper_pg_dir; 68 /* 69 * Fixed mappings: 70 */ 71 vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; 72 fixrange_init(vaddr, 0, pgd_base); 73 } 74