x64/page.h: convert some macros to inlines
[sfrench/cifs-2.6.git] / include / asm-x86 / page_32.h
1 #ifndef _I386_PAGE_H
2 #define _I386_PAGE_H
3
4 /* PAGE_SHIFT determines the page size */
5 #define PAGE_SHIFT      12
6 #define PAGE_SIZE       (1UL << PAGE_SHIFT)
7 #define PAGE_MASK       (~(PAGE_SIZE-1))
8
9 #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
10 #define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
11
12 #ifdef __KERNEL__
13 #ifndef __ASSEMBLY__
14
15 #include <linux/string.h>
16
17 #ifdef CONFIG_X86_USE_3DNOW
18
19 #include <asm/mmx.h>
20
21 static inline void clear_page(void *page)
22 {
23         mmx_clear_page(page);
24 }
25
26 static inline void copy_page(void *to, void *from)
27 {
28         mmx_copy_page(to, from);
29 }
30
31 #else
32
33 /*
34  *      On older X86 processors it's not a win to use MMX here it seems.
35  *      Maybe the K6-III ?
36  */
37  
38 static inline void clear_page(void *page)
39 {
40         memset(page, 0, PAGE_SIZE);
41 }
42
43 static inline void copy_page(void *to, void *from)
44 {
45         memcpy(to, from, PAGE_SIZE);
46 }
47
48 #endif
49
50 struct page;
51
52 static void inline clear_user_page(void *page, unsigned long vaddr,
53                                 struct page *pg)
54 {
55         clear_page(page);
56 }
57
58 static void inline copy_user_page(void *to, void *from, unsigned long vaddr,
59                                 struct page *topage)
60 {
61         copy_page(to, from);
62 }
63
64 #define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
65         alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
66 #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
67
68 /*
69  * These are used to make use of C type-checking..
70  */
71 extern int nx_enabled;
72
73 #ifdef CONFIG_X86_PAE
74 typedef struct { unsigned long pte_low, pte_high; } pte_t;
75 typedef struct { unsigned long long pmd; } pmd_t;
76 typedef struct { unsigned long long pgd; } pgd_t;
77 typedef struct { unsigned long long pgprot; } pgprot_t;
78
79 static inline unsigned long long native_pgd_val(pgd_t pgd)
80 {
81         return pgd.pgd;
82 }
83
84 static inline unsigned long long native_pmd_val(pmd_t pmd)
85 {
86         return pmd.pmd;
87 }
88
89 static inline unsigned long long native_pte_val(pte_t pte)
90 {
91         return pte.pte_low | ((unsigned long long)pte.pte_high << 32);
92 }
93
94 static inline pgd_t native_make_pgd(unsigned long long val)
95 {
96         return (pgd_t) { val };
97 }
98
99 static inline pmd_t native_make_pmd(unsigned long long val)
100 {
101         return (pmd_t) { val };
102 }
103
104 static inline pte_t native_make_pte(unsigned long long val)
105 {
106         return (pte_t) { .pte_low = val, .pte_high = (val >> 32) } ;
107 }
108
109 #ifndef CONFIG_PARAVIRT
110 #define pmd_val(x)      native_pmd_val(x)
111 #define __pmd(x)        native_make_pmd(x)
112 #endif
113
114 #define HPAGE_SHIFT     21
115 #include <asm-generic/pgtable-nopud.h>
116 #else  /* !CONFIG_X86_PAE */
117 typedef struct { unsigned long pte_low; } pte_t;
118 typedef struct { unsigned long pgd; } pgd_t;
119 typedef struct { unsigned long pgprot; } pgprot_t;
120 #define boot_pte_t pte_t /* or would you rather have a typedef */
121
122 static inline unsigned long native_pgd_val(pgd_t pgd)
123 {
124         return pgd.pgd;
125 }
126
127 static inline unsigned long native_pte_val(pte_t pte)
128 {
129         return pte.pte_low;
130 }
131
132 static inline pgd_t native_make_pgd(unsigned long val)
133 {
134         return (pgd_t) { val };
135 }
136
137 static inline pte_t native_make_pte(unsigned long val)
138 {
139         return (pte_t) { .pte_low = val };
140 }
141
142 #define HPAGE_SHIFT     22
143 #include <asm-generic/pgtable-nopmd.h>
144 #endif  /* CONFIG_X86_PAE */
145
146 #define PTE_MASK        PAGE_MASK
147
148 #ifdef CONFIG_HUGETLB_PAGE
149 #define HPAGE_SIZE      ((1UL) << HPAGE_SHIFT)
150 #define HPAGE_MASK      (~(HPAGE_SIZE - 1))
151 #define HUGETLB_PAGE_ORDER      (HPAGE_SHIFT - PAGE_SHIFT)
152 #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
153 #endif
154
155 #define pgprot_val(x)   ((x).pgprot)
156 #define __pgprot(x)     ((pgprot_t) { (x) } )
157
158 #ifndef CONFIG_PARAVIRT
159 #define pgd_val(x)      native_pgd_val(x)
160 #define __pgd(x)        native_make_pgd(x)
161 #define pte_val(x)      native_pte_val(x)
162 #define __pte(x)        native_make_pte(x)
163 #endif
164
165 #endif /* !__ASSEMBLY__ */
166
167 /* to align the pointer to the (next) page boundary */
168 #define PAGE_ALIGN(addr)        (((addr)+PAGE_SIZE-1)&PAGE_MASK)
169
170 /*
171  * This handles the memory map.. We could make this a config
172  * option, but too many people screw it up, and too few need
173  * it.
174  *
175  * A __PAGE_OFFSET of 0xC0000000 means that the kernel has
176  * a virtual address space of one gigabyte, which limits the
177  * amount of physical memory you can use to about 950MB. 
178  *
179  * If you want more physical memory than this then see the CONFIG_HIGHMEM4G
180  * and CONFIG_HIGHMEM64G options in the kernel configuration.
181  */
182
183 #ifndef __ASSEMBLY__
184
185 struct vm_area_struct;
186
187 /*
188  * This much address space is reserved for vmalloc() and iomap()
189  * as well as fixmap mappings.
190  */
191 extern unsigned int __VMALLOC_RESERVE;
192
193 extern int sysctl_legacy_va_layout;
194
195 extern int page_is_ram(unsigned long pagenr);
196
197 #endif /* __ASSEMBLY__ */
198
199 #ifdef __ASSEMBLY__
200 #define __PAGE_OFFSET           CONFIG_PAGE_OFFSET
201 #else
202 #define __PAGE_OFFSET           ((unsigned long)CONFIG_PAGE_OFFSET)
203 #endif
204
205
206 #define PAGE_OFFSET             ((unsigned long)__PAGE_OFFSET)
207 #define VMALLOC_RESERVE         ((unsigned long)__VMALLOC_RESERVE)
208 #define MAXMEM                  (-__PAGE_OFFSET-__VMALLOC_RESERVE)
209 #define __pa(x)                 ((unsigned long)(x)-PAGE_OFFSET)
210 /* __pa_symbol should be used for C visible symbols.
211    This seems to be the official gcc blessed way to do such arithmetic. */
212 #define __pa_symbol(x)          __pa(RELOC_HIDE((unsigned long)(x),0))
213 #define __va(x)                 ((void *)((unsigned long)(x)+PAGE_OFFSET))
214 #define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
215 #ifdef CONFIG_FLATMEM
216 #define pfn_valid(pfn)          ((pfn) < max_mapnr)
217 #endif /* CONFIG_FLATMEM */
218 #define virt_to_page(kaddr)     pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
219
220 #define virt_addr_valid(kaddr)  pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
221
222 #define VM_DATA_DEFAULT_FLAGS \
223         (VM_READ | VM_WRITE | \
224         ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
225                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
226
227 #include <asm-generic/memory_model.h>
228 #include <asm-generic/page.h>
229
230 #define __HAVE_ARCH_GATE_AREA 1
231 #endif /* __KERNEL__ */
232
233 #endif /* _I386_PAGE_H */