1#ifndef _MOTOROLA_PGALLOC_H 2#define _MOTOROLA_PGALLOC_H 3 4#include <asm/tlb.h> 5#include <asm/tlbflush.h> 6 7extern pmd_t *get_pointer_table(void); 8extern int free_pointer_table(pmd_t *); 9 10static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) 11{ 12 pte_t *pte; 13 14 pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO); 15 if (pte) { 16 __flush_page_to_ram(pte); 17 flush_tlb_kernel_page(pte); 18 nocache_page(pte); 19 } 20 21 return pte; 22} 23 24static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) 25{ 26 cache_page(pte); 27 free_page((unsigned long) pte); 28} 29 30static inline pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) 31{ 32 struct page *page = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); 33 pte_t *pte; 34 35 if(!page) 36 return NULL; 37 38 pte = kmap(page); 39 __flush_page_to_ram(pte); 40 flush_tlb_kernel_page(pte); 41 nocache_page(pte); 42 kunmap(page); 43 pgtable_page_ctor(page); 44 return page; 45} 46 47static inline void pte_free(struct mm_struct *mm, pgtable_t page) 48{ 49 pgtable_page_dtor(page); 50 cache_page(kmap(page)); 51 kunmap(page); 52 __free_page(page); 53} 54 55static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page, 56 unsigned long address) 57{ 58 pgtable_page_dtor(page); 59 cache_page(kmap(page)); 60 kunmap(page); 61 __free_page(page); 62} 63 64 65static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) 66{ 67 return get_pointer_table(); 68} 69 70static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd) 71{ 72 return free_pointer_table(pmd); 73} 74 75static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, 76 unsigned long address) 77{ 78 return free_pointer_table(pmd); 79} 80 81 82static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 83{ 84 pmd_free(mm, (pmd_t *)pgd); 85} 86 87static inline pgd_t *pgd_alloc(struct mm_struct *mm) 88{ 89 return (pgd_t *)get_pointer_table(); 90} 91 92 93static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte) 94{ 95 pmd_set(pmd, pte); 96} 97 98static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page) 99{ 100 pmd_set(pmd, page_address(page)); 101} 102#define pmd_pgtable(pmd) pmd_page(pmd) 103 104static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) 105{ 106 pgd_set(pgd, pmd); 107} 108 109#endif /* _MOTOROLA_PGALLOC_H */ 110