2005-04-16 15:20:36 -07:00
# ifndef _I386_PGALLOC_H
# define _I386_PGALLOC_H
# include <linux/threads.h>
# include <linux/mm.h> /* for struct page */
2008-01-30 13:33:39 +01:00
# include <asm/tlb.h>
# include <asm-generic/tlb.h>
2005-04-16 15:20:36 -07:00
2007-02-13 13:26:21 +01:00
# ifdef CONFIG_PARAVIRT
# include <asm/paravirt.h>
# else
2007-07-17 18:37:03 -07:00
# define paravirt_alloc_pt(mm, pfn) do { } while (0)
2008-01-30 13:33:39 +01:00
# define paravirt_alloc_pd(mm, pfn) do { } while (0)
2007-02-13 13:26:21 +01:00
# define paravirt_alloc_pd_clone(pfn, clonepfn, start, count) do { } while (0)
# define paravirt_release_pt(pfn) do { } while (0)
# define paravirt_release_pd(pfn) do { } while (0)
# endif
2008-01-30 13:33:39 +01:00
static inline void pmd_populate_kernel ( struct mm_struct * mm ,
pmd_t * pmd , pte_t * pte )
{
paravirt_alloc_pt ( mm , __pa ( pte ) > > PAGE_SHIFT ) ;
set_pmd ( pmd , __pmd ( __pa ( pte ) | _PAGE_TABLE ) ) ;
}
2005-04-16 15:20:36 -07:00
2008-01-30 13:33:39 +01:00
static inline void pmd_populate ( struct mm_struct * mm , pmd_t * pmd , struct page * pte )
{
unsigned long pfn = page_to_pfn ( pte ) ;
paravirt_alloc_pt ( mm , pfn ) ;
set_pmd ( pmd , __pmd ( ( ( pteval_t ) pfn < < PAGE_SHIFT ) | _PAGE_TABLE ) ) ;
}
2007-02-13 13:26:21 +01:00
2005-04-16 15:20:36 -07:00
/*
* Allocate and free page tables .
*/
extern pgd_t * pgd_alloc ( struct mm_struct * ) ;
extern void pgd_free ( pgd_t * pgd ) ;
extern pte_t * pte_alloc_one_kernel ( struct mm_struct * , unsigned long ) ;
extern struct page * pte_alloc_one ( struct mm_struct * , unsigned long ) ;
static inline void pte_free_kernel ( pte_t * pte )
{
free_page ( ( unsigned long ) pte ) ;
}
static inline void pte_free ( struct page * pte )
{
__free_page ( pte ) ;
}
2008-01-30 13:33:39 +01:00
static inline void __pte_free_tlb ( struct mmu_gather * tlb , struct page * pte )
{
paravirt_release_pt ( page_to_pfn ( pte ) ) ;
tlb_remove_page ( tlb , pte ) ;
}
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_X86_PAE
/*
* In the PAE case we free the pmds as part of the pgd .
*/
2008-01-30 13:33:39 +01:00
static inline pmd_t * pmd_alloc_one ( struct mm_struct * mm , unsigned long addr )
{
BUG ( ) ;
return ( pmd_t * ) 2 ;
}
static inline void pmd_free ( pmd_t * pmd )
{
}
static inline void __pmd_free_tlb ( struct mmu_gather * tlb , pmd_t * pmd )
{
}
static inline void pud_populate ( struct mm_struct * mm , pud_t * pud , pmd_t * pmd )
{
BUG ( ) ;
}
# endif /* CONFIG_X86_PAE */
2005-04-16 15:20:36 -07:00
# endif /* _I386_PGALLOC_H */