Line data Source code
1 : #ifndef _ASM_X86_PGTABLE_DEFS_H
2 : #define _ASM_X86_PGTABLE_DEFS_H
3 :
4 : #include <linux/const.h>
5 : #include <asm/page_types.h>
6 :
7 : #define FIRST_USER_ADDRESS 0
8 :
9 : #define _PAGE_BIT_PRESENT 0 /* is present */
10 : #define _PAGE_BIT_RW 1 /* writeable */
11 : #define _PAGE_BIT_USER 2 /* userspace addressable */
12 : #define _PAGE_BIT_PWT 3 /* page write through */
13 : #define _PAGE_BIT_PCD 4 /* page cache disabled */
14 : #define _PAGE_BIT_ACCESSED 5 /* was accessed (raised by CPU) */
15 : #define _PAGE_BIT_DIRTY 6 /* was written to (raised by CPU) */
16 : #define _PAGE_BIT_PSE 7 /* 4 MB (or 2MB) page */
17 : #define _PAGE_BIT_PAT 7 /* on 4KB pages */
18 : #define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */
19 : #define _PAGE_BIT_UNUSED1 9 /* available for programmer */
20 : #define _PAGE_BIT_IOMAP 10 /* flag used to indicate IO mapping */
21 : #define _PAGE_BIT_HIDDEN 11 /* hidden by kmemcheck */
22 : #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */
23 : #define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1
24 : #define _PAGE_BIT_CPA_TEST _PAGE_BIT_UNUSED1
25 : #define _PAGE_BIT_NX 63 /* No execute: only valid after cpuid check */
26 :
27 : /* If _PAGE_BIT_PRESENT is clear, we use these: */
28 : /* - if the user mapped it with PROT_NONE; pte_present gives true */
29 : #define _PAGE_BIT_PROTNONE _PAGE_BIT_GLOBAL
30 : /* - set: nonlinear file mapping, saved PTE; unset:swap */
31 : #define _PAGE_BIT_FILE _PAGE_BIT_DIRTY
32 :
33 : #define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT)
34 : #define _PAGE_RW (_AT(pteval_t, 1) << _PAGE_BIT_RW)
35 : #define _PAGE_USER (_AT(pteval_t, 1) << _PAGE_BIT_USER)
36 : #define _PAGE_PWT (_AT(pteval_t, 1) << _PAGE_BIT_PWT)
37 : #define _PAGE_PCD (_AT(pteval_t, 1) << _PAGE_BIT_PCD)
38 : #define _PAGE_ACCESSED (_AT(pteval_t, 1) << _PAGE_BIT_ACCESSED)
39 : #define _PAGE_DIRTY (_AT(pteval_t, 1) << _PAGE_BIT_DIRTY)
40 : #define _PAGE_PSE (_AT(pteval_t, 1) << _PAGE_BIT_PSE)
41 : #define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL)
42 : #define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1)
43 : #define _PAGE_IOMAP (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP)
44 : #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT)
45 : #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE)
46 : #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL)
47 : #define _PAGE_CPA_TEST (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST)
48 : #define __HAVE_ARCH_PTE_SPECIAL
49 :
50 : #ifdef CONFIG_KMEMCHECK
51 : #define _PAGE_HIDDEN (_AT(pteval_t, 1) << _PAGE_BIT_HIDDEN)
52 : #else
53 : #define _PAGE_HIDDEN (_AT(pteval_t, 0))
54 : #endif
55 :
56 : #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
57 : #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX)
58 : #else
59 : #define _PAGE_NX (_AT(pteval_t, 0))
60 : #endif
61 :
62 : #define _PAGE_FILE (_AT(pteval_t, 1) << _PAGE_BIT_FILE)
63 : #define _PAGE_PROTNONE (_AT(pteval_t, 1) << _PAGE_BIT_PROTNONE)
64 :
65 : #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \
66 : _PAGE_ACCESSED | _PAGE_DIRTY)
67 : #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \
68 : _PAGE_DIRTY)
69 :
70 : /* Set of bits not changed in pte_modify */
71 : #define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \
72 : _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY)
73 :
74 : #define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT)
75 : #define _PAGE_CACHE_WB (0)
76 : #define _PAGE_CACHE_WC (_PAGE_PWT)
77 : #define _PAGE_CACHE_UC_MINUS (_PAGE_PCD)
78 : #define _PAGE_CACHE_UC (_PAGE_PCD | _PAGE_PWT)
79 :
80 : #define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
81 : #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \
82 : _PAGE_ACCESSED | _PAGE_NX)
83 :
84 : #define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | \
85 : _PAGE_USER | _PAGE_ACCESSED)
86 : #define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
87 : _PAGE_ACCESSED | _PAGE_NX)
88 : #define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
89 : _PAGE_ACCESSED)
90 : #define PAGE_COPY PAGE_COPY_NOEXEC
91 : #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | \
92 : _PAGE_ACCESSED | _PAGE_NX)
93 : #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
94 : _PAGE_ACCESSED)
95 :
96 : #define __PAGE_KERNEL_EXEC \
97 : (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL)
98 : #define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX)
99 :
100 : #define __PAGE_KERNEL_RO (__PAGE_KERNEL & ~_PAGE_RW)
101 : #define __PAGE_KERNEL_RX (__PAGE_KERNEL_EXEC & ~_PAGE_RW)
102 : #define __PAGE_KERNEL_EXEC_NOCACHE (__PAGE_KERNEL_EXEC | _PAGE_PCD | _PAGE_PWT)
103 : #define __PAGE_KERNEL_WC (__PAGE_KERNEL | _PAGE_CACHE_WC)
104 : #define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT)
105 : #define __PAGE_KERNEL_UC_MINUS (__PAGE_KERNEL | _PAGE_PCD)
106 : #define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RX | _PAGE_USER)
107 : #define __PAGE_KERNEL_VSYSCALL_NOCACHE (__PAGE_KERNEL_VSYSCALL | _PAGE_PCD | _PAGE_PWT)
108 : #define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE)
109 : #define __PAGE_KERNEL_LARGE_NOCACHE (__PAGE_KERNEL | _PAGE_CACHE_UC | _PAGE_PSE)
110 : #define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE)
111 :
112 : #define __PAGE_KERNEL_IO (__PAGE_KERNEL | _PAGE_IOMAP)
113 : #define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE | _PAGE_IOMAP)
114 : #define __PAGE_KERNEL_IO_UC_MINUS (__PAGE_KERNEL_UC_MINUS | _PAGE_IOMAP)
115 : #define __PAGE_KERNEL_IO_WC (__PAGE_KERNEL_WC | _PAGE_IOMAP)
116 :
117 : #define PAGE_KERNEL __pgprot(__PAGE_KERNEL)
118 : #define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO)
119 : #define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
120 : #define PAGE_KERNEL_RX __pgprot(__PAGE_KERNEL_RX)
121 : #define PAGE_KERNEL_WC __pgprot(__PAGE_KERNEL_WC)
122 : #define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE)
123 : #define PAGE_KERNEL_UC_MINUS __pgprot(__PAGE_KERNEL_UC_MINUS)
124 : #define PAGE_KERNEL_EXEC_NOCACHE __pgprot(__PAGE_KERNEL_EXEC_NOCACHE)
125 : #define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE)
126 : #define PAGE_KERNEL_LARGE_NOCACHE __pgprot(__PAGE_KERNEL_LARGE_NOCACHE)
127 : #define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC)
128 : #define PAGE_KERNEL_VSYSCALL __pgprot(__PAGE_KERNEL_VSYSCALL)
129 : #define PAGE_KERNEL_VSYSCALL_NOCACHE __pgprot(__PAGE_KERNEL_VSYSCALL_NOCACHE)
130 :
131 : #define PAGE_KERNEL_IO __pgprot(__PAGE_KERNEL_IO)
132 : #define PAGE_KERNEL_IO_NOCACHE __pgprot(__PAGE_KERNEL_IO_NOCACHE)
133 : #define PAGE_KERNEL_IO_UC_MINUS __pgprot(__PAGE_KERNEL_IO_UC_MINUS)
134 : #define PAGE_KERNEL_IO_WC __pgprot(__PAGE_KERNEL_IO_WC)
135 :
136 : /* xwr */
137 : #define __P000 PAGE_NONE
138 : #define __P001 PAGE_READONLY
139 : #define __P010 PAGE_COPY
140 : #define __P011 PAGE_COPY
141 : #define __P100 PAGE_READONLY_EXEC
142 : #define __P101 PAGE_READONLY_EXEC
143 : #define __P110 PAGE_COPY_EXEC
144 : #define __P111 PAGE_COPY_EXEC
145 :
146 : #define __S000 PAGE_NONE
147 : #define __S001 PAGE_READONLY
148 : #define __S010 PAGE_SHARED
149 : #define __S011 PAGE_SHARED
150 : #define __S100 PAGE_READONLY_EXEC
151 : #define __S101 PAGE_READONLY_EXEC
152 : #define __S110 PAGE_SHARED_EXEC
153 : #define __S111 PAGE_SHARED_EXEC
154 :
155 : /*
156 : * early identity mapping pte attrib macros.
157 : */
158 : #ifdef CONFIG_X86_64
159 : #define __PAGE_KERNEL_IDENT_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC
160 : #else
161 : /*
162 : * For PDE_IDENT_ATTR include USER bit. As the PDE and PTE protection
163 : * bits are combined, this will alow user to access the high address mapped
164 : * VDSO in the presence of CONFIG_COMPAT_VDSO
165 : */
166 : #define PTE_IDENT_ATTR 0x003 /* PRESENT+RW */
167 : #define PDE_IDENT_ATTR 0x067 /* PRESENT+RW+USER+DIRTY+ACCESSED */
168 : #define PGD_IDENT_ATTR 0x001 /* PRESENT (no other attributes) */
169 : #endif
170 :
171 : #ifdef CONFIG_X86_32
172 : # include "pgtable_32_types.h"
173 : #else
174 : # include "pgtable_64_types.h"
175 : #endif
176 :
177 : #ifndef __ASSEMBLY__
178 :
179 : #include <linux/types.h>
180 :
181 : /* PTE_PFN_MASK extracts the PFN from a (pte|pmd|pud|pgd)val_t */
182 : #define PTE_PFN_MASK ((pteval_t)PHYSICAL_PAGE_MASK)
183 :
184 : /* PTE_FLAGS_MASK extracts the flags from a (pte|pmd|pud|pgd)val_t */
185 : #define PTE_FLAGS_MASK (~PTE_PFN_MASK)
186 :
187 1 : typedef struct pgprot { pgprotval_t pgprot; } pgprot_t;
188 :
189 2 : typedef struct { pgdval_t pgd; } pgd_t;
190 :
191 : static inline pgd_t native_make_pgd(pgdval_t val)
192 : {
193 : return (pgd_t) { val };
194 : }
195 :
196 : static inline pgdval_t native_pgd_val(pgd_t pgd)
197 : {
198 : return pgd.pgd;
199 : }
200 :
201 : static inline pgdval_t pgd_flags(pgd_t pgd)
202 : {
203 : return native_pgd_val(pgd) & PTE_FLAGS_MASK;
204 : }
205 :
206 : #if PAGETABLE_LEVELS > 3
207 : typedef struct { pudval_t pud; } pud_t;
208 :
209 : static inline pud_t native_make_pud(pmdval_t val)
210 : {
211 : return (pud_t) { val };
212 : }
213 :
214 : static inline pudval_t native_pud_val(pud_t pud)
215 : {
216 : return pud.pud;
217 : }
218 : #else
219 : #include <asm-generic/pgtable-nopud.h>
220 :
221 : static inline pudval_t native_pud_val(pud_t pud)
222 : {
223 : return native_pgd_val(pud.pgd);
224 : }
225 : #endif
226 :
227 : #if PAGETABLE_LEVELS > 2
228 : typedef struct { pmdval_t pmd; } pmd_t;
229 :
230 : static inline pmd_t native_make_pmd(pmdval_t val)
231 : {
232 : return (pmd_t) { val };
233 : }
234 :
235 : static inline pmdval_t native_pmd_val(pmd_t pmd)
236 : {
237 : return pmd.pmd;
238 : }
239 : #else
240 : #include <asm-generic/pgtable-nopmd.h>
241 :
242 : static inline pmdval_t native_pmd_val(pmd_t pmd)
243 : {
244 : return native_pgd_val(pmd.pud.pgd);
245 : }
246 : #endif
247 :
248 : static inline pudval_t pud_flags(pud_t pud)
249 : {
250 : return native_pud_val(pud) & PTE_FLAGS_MASK;
251 : }
252 :
253 : static inline pmdval_t pmd_flags(pmd_t pmd)
254 : {
255 : return native_pmd_val(pmd) & PTE_FLAGS_MASK;
256 : }
257 :
258 : static inline pte_t native_make_pte(pteval_t val)
259 : {
260 : return (pte_t) { .pte = val };
261 : }
262 :
263 : static inline pteval_t native_pte_val(pte_t pte)
264 : {
265 : return pte.pte;
266 : }
267 :
268 : static inline pteval_t pte_flags(pte_t pte)
269 : {
270 : return native_pte_val(pte) & PTE_FLAGS_MASK;
271 : }
272 :
273 : #define pgprot_val(x) ((x).pgprot)
274 : #define __pgprot(x) ((pgprot_t) { (x) } )
275 :
276 :
277 : typedef struct page *pgtable_t;
278 :
279 : extern pteval_t __supported_pte_mask;
280 : extern void set_nx(void);
281 : extern int nx_enabled;
282 :
283 : #define pgprot_writecombine pgprot_writecombine
284 : extern pgprot_t pgprot_writecombine(pgprot_t prot);
285 1 :
286 : /* Indicate that x86 has its own track and untrack pfn vma functions */
287 : #define __HAVE_PFNMAP_TRACKING
288 :
289 : #define __HAVE_PHYS_MEM_ACCESS_PROT
290 : struct file;
291 : pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
292 : unsigned long size, pgprot_t vma_prot);
293 : int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
294 : unsigned long size, pgprot_t *vma_prot);
295 :
296 : /* Install a pte for a particular vaddr in kernel space. */
297 : void set_pte_vaddr(unsigned long vaddr, pte_t pte);
298 1 :
299 : #ifdef CONFIG_X86_32
300 : extern void native_pagetable_setup_start(pgd_t *base);
301 : extern void native_pagetable_setup_done(pgd_t *base);
302 : #else
303 : #define native_pagetable_setup_start x86_init_pgd_noop
304 : #define native_pagetable_setup_done x86_init_pgd_noop
305 : #endif
306 :
307 : struct seq_file;
308 : extern void arch_report_meminfo(struct seq_file *m);
309 :
310 : enum {
311 : PG_LEVEL_NONE,
312 : PG_LEVEL_4K,
313 : PG_LEVEL_2M,
314 : PG_LEVEL_1G,
315 : PG_LEVEL_NUM
316 : };
317 :
318 : #ifdef CONFIG_PROC_FS
319 : extern void update_page_count(int level, unsigned long pages);
320 : #else
321 : static inline void update_page_count(int level, unsigned long pages) { }
322 : #endif
323 :
324 : /*
325 : * Helper function that returns the kernel pagetable entry controlling
326 : * the virtual address 'address'. NULL means no pagetable entry present.
327 : * NOTE: the return type is pte_t but if the pmd is PSE then we return it
328 : * as a pte too.
329 : */
330 : extern pte_t *lookup_address(unsigned long address, unsigned int *level);
331 :
332 : #endif /* !__ASSEMBLY__ */
333 :
334 : #endif /* _ASM_X86_PGTABLE_DEFS_H */
|