2005-04-16 15:20:36 -07:00
/* pgalloc.h: Page allocation routines for FRV
*
* Copyright ( C ) 2004 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version
* 2 of the License , or ( at your option ) any later version .
*
* Derived from :
* include / asm - m68knommu / pgalloc . h
* include / asm - i386 / pgalloc . h
*/
# ifndef _ASM_PGALLOC_H
# define _ASM_PGALLOC_H
# include <asm/setup.h>
# include <asm/virtconvert.h>
# ifdef CONFIG_MMU
# define pmd_populate_kernel(mm, pmd, pte) __set_pmd(pmd, __pa(pte) | _PAGE_TABLE)
# define pmd_populate(MM, PMD, PAGE) \
do { \
__set_pmd ( ( PMD ) , page_to_pfn ( PAGE ) < < PAGE_SHIFT | _PAGE_TABLE ) ; \
} while ( 0 )
2008-02-08 04:22:04 -08:00
# define pmd_pgtable(pmd) pmd_page(pmd)
2005-04-16 15:20:36 -07:00
/*
* Allocate and free page tables .
*/
extern pgd_t * pgd_alloc ( struct mm_struct * ) ;
2008-02-04 22:29:14 -08:00
extern void pgd_free ( struct mm_struct * mm , pgd_t * ) ;
2005-04-16 15:20:36 -07:00
extern pte_t * pte_alloc_one_kernel ( struct mm_struct * , unsigned long ) ;
2008-02-08 04:22:04 -08:00
extern pgtable_t pte_alloc_one ( struct mm_struct * , unsigned long ) ;
2005-04-16 15:20:36 -07:00
2008-02-04 22:29:14 -08:00
static inline void pte_free_kernel ( struct mm_struct * mm , pte_t * pte )
2005-04-16 15:20:36 -07:00
{
free_page ( ( unsigned long ) pte ) ;
}
2008-02-08 04:22:04 -08:00
static inline void pte_free ( struct mm_struct * mm , pgtable_t pte )
2005-04-16 15:20:36 -07:00
{
2008-02-08 04:22:04 -08:00
pgtable_page_dtor ( pte ) ;
2005-04-16 15:20:36 -07:00
__free_page ( pte ) ;
}
2008-02-08 04:22:04 -08:00
# define __pte_free_tlb(tlb,pte) \
do { \
pgtable_page_dtor ( pte ) ; \
tlb_remove_page ( ( tlb ) , ( pte ) ) ; \
} while ( 0 )
2005-04-16 15:20:36 -07:00
/*
* allocating and freeing a pmd is trivial : the 1 - entry pmd is
* inside the pgd , so has no extra memory associated with it .
* ( In the PAE case we free the pmds as part of the pgd . )
*/
# define pmd_alloc_one(mm, addr) ({ BUG(); ((pmd_t *) 2); })
2008-02-04 22:29:14 -08:00
# define pmd_free(mm, x) do { } while (0)
2005-04-16 15:20:36 -07:00
# define __pmd_free_tlb(tlb,x) do { } while (0)
# endif /* CONFIG_MMU */
# endif /* _ASM_PGALLOC_H */