2005-04-17 02:20:36 +04:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( C ) 1999 , 2000 by Silicon Graphics
* Copyright ( C ) 2003 by Ralf Baechle
*/
# include <linux/init.h>
# include <linux/mm.h>
2006-10-22 02:17:35 +04:00
# include <asm/fixmap.h>
2005-04-17 02:20:36 +04:00
# include <asm/pgtable.h>
2007-02-18 19:27:34 +03:00
# include <asm/pgalloc.h>
2005-04-17 02:20:36 +04:00
void pgd_init ( unsigned long page )
{
unsigned long * p , * end ;
2009-12-05 00:52:36 +03:00
unsigned long entry ;
# ifdef __PAGETABLE_PMD_FOLDED
entry = ( unsigned long ) invalid_pte_table ;
# else
entry = ( unsigned long ) invalid_pmd_table ;
# endif
2005-04-17 02:20:36 +04:00
p = ( unsigned long * ) page ;
end = p + PTRS_PER_PGD ;
while ( p < end ) {
2009-12-05 00:52:36 +03:00
p [ 0 ] = entry ;
p [ 1 ] = entry ;
p [ 2 ] = entry ;
p [ 3 ] = entry ;
p [ 4 ] = entry ;
p [ 5 ] = entry ;
p [ 6 ] = entry ;
p [ 7 ] = entry ;
2005-04-17 02:20:36 +04:00
p + = 8 ;
}
}
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
2005-04-17 02:20:36 +04:00
void pmd_init ( unsigned long addr , unsigned long pagetable )
{
unsigned long * p , * end ;
p = ( unsigned long * ) addr ;
end = p + PTRS_PER_PMD ;
while ( p < end ) {
2009-12-05 00:52:36 +03:00
p [ 0 ] = pagetable ;
p [ 1 ] = pagetable ;
p [ 2 ] = pagetable ;
p [ 3 ] = pagetable ;
p [ 4 ] = pagetable ;
p [ 5 ] = pagetable ;
p [ 6 ] = pagetable ;
p [ 7 ] = pagetable ;
2005-04-17 02:20:36 +04:00
p + = 8 ;
}
}
2009-12-05 00:52:36 +03:00
# endif
2005-04-17 02:20:36 +04:00
void __init pagetable_init ( void )
{
2006-10-22 02:17:35 +04:00
unsigned long vaddr ;
pgd_t * pgd_base ;
2005-04-17 02:20:36 +04:00
/* Initialize the entire pgd. */
pgd_init ( ( unsigned long ) swapper_pg_dir ) ;
2009-12-05 00:52:36 +03:00
# ifndef __PAGETABLE_PMD_FOLDED
2005-04-17 02:20:36 +04:00
pmd_init ( ( unsigned long ) invalid_pmd_table , ( unsigned long ) invalid_pte_table ) ;
2009-12-05 00:52:36 +03:00
# endif
2006-10-22 02:17:35 +04:00
pgd_base = swapper_pg_dir ;
/*
* Fixed mappings :
*/
vaddr = __fix_to_virt ( __end_of_fixed_addresses - 1 ) & PMD_MASK ;
fixrange_init ( vaddr , 0 , pgd_base ) ;
2005-04-17 02:20:36 +04:00
}