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; 33 pte_t *pte; 34 35 page = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); 36 if(!page) 37 return NULL; 38 if (!pgtable_page_ctor(page)) { 39 __free_page(page); 40 return NULL; 41 } 42 43 pte = kmap(page); 44 __flush_page_to_ram(pte); 45 flush_tlb_kernel_page(pte); 46 nocache_page(pte); 47 kunmap(page); 48 return page; 49} 50 51static inline void pte_free(struct mm_struct *mm, pgtable_t page) 52{ 53 pgtable_page_dtor(page); 54 cache_page(kmap(page)); 55 kunmap(page); 56 __free_page(page); 57} 58 59static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t page, 60 unsigned long address) 61{ 62 pgtable_page_dtor(page); 63 cache_page(kmap(page)); 64 kunmap(page); 65 __free_page(page); 66} 67 68 69static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) 70{ 71 return get_pointer_table(); 72} 73 74static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd) 75{ 76 return free_pointer_table(pmd); 77} 78 79static inline int __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, 80 unsigned long address) 81{ 82 return free_pointer_table(pmd); 83} 84 85 86static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 87{ 88 pmd_free(mm, (pmd_t *)pgd); 89} 90 91static inline pgd_t *pgd_alloc(struct mm_struct *mm) 92{ 93 return (pgd_t *)get_pointer_table(); 94} 95 96 97static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte) 98{ 99 pmd_set(pmd, pte); 100} 101 102static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t page) 103{ 104 pmd_set(pmd, page_address(page)); 105} 106#define pmd_pgtable(pmd) pmd_page(pmd) 107 108static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd) 109{ 110 pgd_set(pgd, pmd); 111} 112 113#endif /* _MOTOROLA_PGALLOC_H */ 114