This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / include / asm-x86_64 / pgalloc.h
1 #ifndef _X86_64_PGALLOC_H
2 #define _X86_64_PGALLOC_H
3
4 #include <asm/processor.h>
5 #include <asm/fixmap.h>
6 #include <asm/pda.h>
7 #include <linux/threads.h>
8 #include <linux/mm.h>
9
10 #define arch_add_exec_range(mm, limit) do { ; } while (0)
11 #define arch_flush_exec_range(mm)      do { ; } while (0)
12 #define arch_remove_exec_range(mm, limit) do { ; } while (0)
13
14
15 #define pmd_populate_kernel(mm, pmd, pte) \
16                 set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)))
17 #define pgd_populate(mm, pgd, pmd) \
18                 set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pmd)))
19
20 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
21 {
22         set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT)));
23 }
24
25 extern __inline__ pmd_t *get_pmd(void)
26 {
27         return (pmd_t *)get_zeroed_page(GFP_KERNEL);
28 }
29
30 extern __inline__ void pmd_free(pmd_t *pmd)
31 {
32         BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
33         free_page((unsigned long)pmd);
34 }
35
36 static inline pmd_t *pmd_alloc_one (struct mm_struct *mm, unsigned long addr)
37 {
38         return (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
39 }
40
41 static inline pgd_t *pgd_alloc (struct mm_struct *mm)
42 {
43         return (pgd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
44 }
45
46 static inline void pgd_free (pgd_t *pgd)
47 {
48         BUG_ON((unsigned long)pgd & (PAGE_SIZE-1));
49         free_page((unsigned long)pgd);
50 }
51
52 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
53 {
54         return (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
55 }
56
57 static inline struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
58 {
59         void *p = (void *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
60         if (!p)
61                 return NULL;
62         return virt_to_page(p);
63 }
64
65 /* Should really implement gc for free page table pages. This could be
66    done with a reference count in struct page. */
67
68 extern __inline__ void pte_free_kernel(pte_t *pte)
69 {
70         BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
71         free_page((unsigned long)pte); 
72 }
73
74 extern inline void pte_free(struct page *pte)
75 {
76         __free_page(pte);
77
78
79 #define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
80 #define __pmd_free_tlb(tlb,x)   pmd_free(x)
81
82 #endif /* _X86_64_PGALLOC_H */