Commit | Line | Data |
---|---|---|
f5df8e26 JH |
1 | #ifndef _METAG_PGALLOC_H |
2 | #define _METAG_PGALLOC_H | |
3 | ||
4 | #include <linux/threads.h> | |
5 | #include <linux/mm.h> | |
6 | ||
7 | #define pmd_populate_kernel(mm, pmd, pte) \ | |
8 | set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte))) | |
9 | ||
10 | #define pmd_populate(mm, pmd, pte) \ | |
11 | set_pmd(pmd, __pmd(_PAGE_TABLE | page_to_phys(pte))) | |
12 | ||
13 | #define pmd_pgtable(pmd) pmd_page(pmd) | |
14 | ||
15 | /* | |
16 | * Allocate and free page tables. | |
17 | */ | |
18 | #ifdef CONFIG_METAG_META21_MMU | |
19 | static inline void pgd_ctor(pgd_t *pgd) | |
20 | { | |
21 | memcpy(pgd + USER_PTRS_PER_PGD, | |
22 | swapper_pg_dir + USER_PTRS_PER_PGD, | |
23 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | |
24 | } | |
25 | #else | |
26 | #define pgd_ctor(x) do { } while (0) | |
27 | #endif | |
28 | ||
29 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | |
30 | { | |
31 | pgd_t *pgd = (pgd_t *)get_zeroed_page(GFP_KERNEL); | |
32 | if (pgd) | |
33 | pgd_ctor(pgd); | |
34 | return pgd; | |
35 | } | |
36 | ||
37 | static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | |
38 | { | |
39 | free_page((unsigned long)pgd); | |
40 | } | |
41 | ||
42 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | |
43 | unsigned long address) | |
44 | { | |
32d6bd90 | 45 | pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); |
f5df8e26 JH |
46 | return pte; |
47 | } | |
48 | ||
49 | static inline pgtable_t pte_alloc_one(struct mm_struct *mm, | |
50 | unsigned long address) | |
51 | { | |
52 | struct page *pte; | |
32d6bd90 | 53 | pte = alloc_pages(GFP_KERNEL | __GFP_ZERO, 0); |
855a3053 KS |
54 | if (!pte) |
55 | return NULL; | |
56 | if (!pgtable_page_ctor(pte)) { | |
57 | __free_page(pte); | |
58 | return NULL; | |
59 | } | |
f5df8e26 JH |
60 | return pte; |
61 | } | |
62 | ||
63 | static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte) | |
64 | { | |
65 | free_page((unsigned long)pte); | |
66 | } | |
67 | ||
68 | static inline void pte_free(struct mm_struct *mm, pgtable_t pte) | |
69 | { | |
70 | pgtable_page_dtor(pte); | |
71 | __free_page(pte); | |
72 | } | |
73 | ||
74 | #define __pte_free_tlb(tlb, pte, addr) \ | |
75 | do { \ | |
76 | pgtable_page_dtor(pte); \ | |
77 | tlb_remove_page((tlb), (pte)); \ | |
78 | } while (0) | |
79 | ||
80 | #define check_pgt_cache() do { } while (0) | |
81 | ||
82 | #endif |