2005-04-17 02:20:36 +04:00
/* sun3_pgalloc.h --
* reorganization around 2.3 .39 , routines moved from sun3_pgtable . h
*
*
* 02 / 27 / 2002 - - Modified to support " highpte " implementation in 2.5 .5 ( Sam )
*
* moved 1 / 26 / 2000 Sam Creasey
*/
# ifndef _SUN3_PGALLOC_H
# define _SUN3_PGALLOC_H
# include <asm/tlb.h>
/* FIXME - when we get this compiling */
/* erm, now that it's compiling, what do we do with it? */
# define _KERNPG_TABLE 0
extern const char bad_pmd_string [ ] ;
# define pmd_alloc_one(mm,address) ({ BUG(); ((pmd_t *)2); })
2008-02-05 09:29:14 +03:00
static inline void pte_free_kernel ( struct mm_struct * mm , pte_t * pte )
2005-04-17 02:20:36 +04:00
{
free_page ( ( unsigned long ) pte ) ;
}
2008-02-08 15:22:04 +03:00
static inline void pte_free ( struct mm_struct * mm , pgtable_t page )
2005-04-17 02:20:36 +04:00
{
2008-02-08 15:22:04 +03:00
pgtable_page_dtor ( page ) ;
2005-04-17 02:20:36 +04:00
__free_page ( page ) ;
}
2008-02-08 15:22:04 +03:00
# define __pte_free_tlb(tlb,pte) \
do { \
pgtable_page_dtor ( pte ) ; \
tlb_remove_page ( ( tlb ) , pte ) ; \
} while ( 0 )
2005-04-17 02:20:36 +04:00
static inline pte_t * pte_alloc_one_kernel ( struct mm_struct * mm ,
unsigned long address )
{
unsigned long page = __get_free_page ( GFP_KERNEL | __GFP_REPEAT ) ;
if ( ! page )
return NULL ;
memset ( ( void * ) page , 0 , PAGE_SIZE ) ;
return ( pte_t * ) ( page ) ;
}
2008-02-08 15:22:04 +03:00
static inline pgtable_t pte_alloc_one ( struct mm_struct * mm ,
unsigned long address )
2005-04-17 02:20:36 +04:00
{
struct page * page = alloc_pages ( GFP_KERNEL | __GFP_REPEAT , 0 ) ;
if ( page = = NULL )
return NULL ;
clear_highpage ( page ) ;
2008-02-08 15:22:04 +03:00
pgtable_page_ctor ( page ) ;
2005-04-17 02:20:36 +04:00
return page ;
}
static inline void pmd_populate_kernel ( struct mm_struct * mm , pmd_t * pmd , pte_t * pte )
{
pmd_val ( * pmd ) = __pa ( ( unsigned long ) pte ) ;
}
2008-02-08 15:22:04 +03:00
static inline void pmd_populate ( struct mm_struct * mm , pmd_t * pmd , pgtable_t page )
2005-04-17 02:20:36 +04:00
{
pmd_val ( * pmd ) = __pa ( ( unsigned long ) page_address ( page ) ) ;
}
2008-02-08 15:22:04 +03:00
# define pmd_pgtable(pmd) pmd_page(pmd)
2005-04-17 02:20:36 +04:00
/*
* allocating and freeing a pmd is trivial : the 1 - entry pmd is
* inside the pgd , so has no extra memory associated with it .
*/
2008-02-05 09:29:14 +03:00
# define pmd_free(mm, x) do { } while (0)
2005-04-17 02:20:36 +04:00
# define __pmd_free_tlb(tlb, x) do { } while (0)
2008-02-05 09:29:14 +03:00
static inline void pgd_free ( struct mm_struct * mm , pgd_t * pgd )
2005-04-17 02:20:36 +04:00
{
free_page ( ( unsigned long ) pgd ) ;
}
static inline pgd_t * pgd_alloc ( struct mm_struct * mm )
{
pgd_t * new_pgd ;
new_pgd = ( pgd_t * ) get_zeroed_page ( GFP_KERNEL ) ;
memcpy ( new_pgd , swapper_pg_dir , PAGE_SIZE ) ;
memset ( new_pgd , 0 , ( PAGE_OFFSET > > PGDIR_SHIFT ) ) ;
return new_pgd ;
}
# define pgd_populate(mm, pmd, pte) BUG()
# endif /* SUN3_PGALLOC_H */