1 #ifndef _MOTOROLA_PGALLOC_H 2 #define _MOTOROLA_PGALLOC_H 3 4 #include <asm/tlb.h> 5 #include <asm/tlbflush.h> 6 7 extern pmd_t *get_pointer_table(void); 8 extern int free_pointer_table(pmd_t *); 9 10 static 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 24 static 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 30 static 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 51 static 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 59 static 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 69 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address) 70 { 71 return get_pointer_table(); 72 } 73 74 static inline int pmd_free(struct mm_struct *mm, pmd_t *pmd) 75 { 76 return free_pointer_table(pmd); 77 } 78 79 static 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 86 static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) 87 { 88 pmd_free(mm, (pmd_t *)pgd); 89 } 90 91 static inline pgd_t *pgd_alloc(struct mm_struct *mm) 92 { 93 return (pgd_t *)get_pointer_table(); 94 } 95 96 97 static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte) 98 { 99 pmd_set(pmd, pte); 100 } 101 102 static 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 108 static 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