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
10#define _PAGE_BIT_RW 1
11#define _PAGE_BIT_USER 2
12#define _PAGE_BIT_PWT 3
13#define _PAGE_BIT_PCD 4
14#define _PAGE_BIT_ACCESSED 5
15#define _PAGE_BIT_DIRTY 6
16#define _PAGE_BIT_PSE 7
17#define _PAGE_BIT_PAT 7
18#define _PAGE_BIT_GLOBAL 8
19#define _PAGE_BIT_UNUSED1 9
20#define _PAGE_BIT_IOMAP 10
21#define _PAGE_BIT_HIDDEN 11
22#define _PAGE_BIT_PAT_LARGE 12
23#define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1
24#define _PAGE_BIT_CPA_TEST _PAGE_BIT_UNUSED1
25#define _PAGE_BIT_SPLITTING _PAGE_BIT_UNUSED1
26#define _PAGE_BIT_NX 63
27
28
29
30#define _PAGE_BIT_PROTNONE _PAGE_BIT_GLOBAL
31
32#define _PAGE_BIT_FILE _PAGE_BIT_DIRTY
33
34#define _PAGE_PRESENT (_AT(pteval_t, 1) << _PAGE_BIT_PRESENT)
35#define _PAGE_RW (_AT(pteval_t, 1) << _PAGE_BIT_RW)
36#define _PAGE_USER (_AT(pteval_t, 1) << _PAGE_BIT_USER)
37#define _PAGE_PWT (_AT(pteval_t, 1) << _PAGE_BIT_PWT)
38#define _PAGE_PCD (_AT(pteval_t, 1) << _PAGE_BIT_PCD)
39#define _PAGE_ACCESSED (_AT(pteval_t, 1) << _PAGE_BIT_ACCESSED)
40#define _PAGE_DIRTY (_AT(pteval_t, 1) << _PAGE_BIT_DIRTY)
41#define _PAGE_PSE (_AT(pteval_t, 1) << _PAGE_BIT_PSE)
42#define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL)
43#define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1)
44#define _PAGE_IOMAP (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP)
45#define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT)
46#define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE)
47#define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL)
48#define _PAGE_CPA_TEST (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST)
49#define _PAGE_SPLITTING (_AT(pteval_t, 1) << _PAGE_BIT_SPLITTING)
50#define __HAVE_ARCH_PTE_SPECIAL
51
52#ifdef CONFIG_KMEMCHECK
53#define _PAGE_HIDDEN (_AT(pteval_t, 1) << _PAGE_BIT_HIDDEN)
54#else
55#define _PAGE_HIDDEN (_AT(pteval_t, 0))
56#endif
57
58
59
60
61
62
63
64#define _PAGE_BIT_SOFT_DIRTY _PAGE_BIT_HIDDEN
65
66#ifdef CONFIG_MEM_SOFT_DIRTY
67#define _PAGE_SOFT_DIRTY (_AT(pteval_t, 1) << _PAGE_BIT_SOFT_DIRTY)
68#else
69#define _PAGE_SOFT_DIRTY (_AT(pteval_t, 0))
70#endif
71
72
73
74
75
76
77
78
79#ifdef CONFIG_MEM_SOFT_DIRTY
80#define _PAGE_SWP_SOFT_DIRTY _PAGE_PSE
81#else
82#define _PAGE_SWP_SOFT_DIRTY (_AT(pteval_t, 0))
83#endif
84
85#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
86#define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX)
87#else
88#define _PAGE_NX (_AT(pteval_t, 0))
89#endif
90
91#define _PAGE_FILE (_AT(pteval_t, 1) << _PAGE_BIT_FILE)
92#define _PAGE_PROTNONE (_AT(pteval_t, 1) << _PAGE_BIT_PROTNONE)
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112#define _PAGE_NUMA _PAGE_PROTNONE
113
114#define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \
115 _PAGE_ACCESSED | _PAGE_DIRTY)
116#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | \
117 _PAGE_DIRTY)
118
119
120#define _PAGE_CHG_MASK (PTE_PFN_MASK | _PAGE_PCD | _PAGE_PWT | \
121 _PAGE_SPECIAL | _PAGE_ACCESSED | _PAGE_DIRTY)
122#define _HPAGE_CHG_MASK (_PAGE_CHG_MASK | _PAGE_PSE)
123
124#define _PAGE_CACHE_MASK (_PAGE_PCD | _PAGE_PWT)
125#define _PAGE_CACHE_WB (0)
126#define _PAGE_CACHE_WC (_PAGE_PWT)
127#define _PAGE_CACHE_UC_MINUS (_PAGE_PCD)
128#define _PAGE_CACHE_UC (_PAGE_PCD | _PAGE_PWT)
129
130#define PAGE_NONE __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
131#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | \
132 _PAGE_ACCESSED | _PAGE_NX)
133
134#define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | \
135 _PAGE_USER | _PAGE_ACCESSED)
136#define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
137 _PAGE_ACCESSED | _PAGE_NX)
138#define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
139 _PAGE_ACCESSED)
140#define PAGE_COPY PAGE_COPY_NOEXEC
141#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | \
142 _PAGE_ACCESSED | _PAGE_NX)
143#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
144 _PAGE_ACCESSED)
145
146#define __PAGE_KERNEL_EXEC \
147 (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_GLOBAL)
148#define __PAGE_KERNEL (__PAGE_KERNEL_EXEC | _PAGE_NX)
149
150#define __PAGE_KERNEL_RO (__PAGE_KERNEL & ~_PAGE_RW)
151#define __PAGE_KERNEL_RX (__PAGE_KERNEL_EXEC & ~_PAGE_RW)
152#define __PAGE_KERNEL_EXEC_NOCACHE (__PAGE_KERNEL_EXEC | _PAGE_PCD | _PAGE_PWT)
153#define __PAGE_KERNEL_WC (__PAGE_KERNEL | _PAGE_CACHE_WC)
154#define __PAGE_KERNEL_NOCACHE (__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT)
155#define __PAGE_KERNEL_UC_MINUS (__PAGE_KERNEL | _PAGE_PCD)
156#define __PAGE_KERNEL_VSYSCALL (__PAGE_KERNEL_RX | _PAGE_USER)
157#define __PAGE_KERNEL_VVAR (__PAGE_KERNEL_RO | _PAGE_USER)
158#define __PAGE_KERNEL_VVAR_NOCACHE (__PAGE_KERNEL_VVAR | _PAGE_PCD | _PAGE_PWT)
159#define __PAGE_KERNEL_LARGE (__PAGE_KERNEL | _PAGE_PSE)
160#define __PAGE_KERNEL_LARGE_NOCACHE (__PAGE_KERNEL | _PAGE_CACHE_UC | _PAGE_PSE)
161#define __PAGE_KERNEL_LARGE_EXEC (__PAGE_KERNEL_EXEC | _PAGE_PSE)
162
163#define __PAGE_KERNEL_IO (__PAGE_KERNEL | _PAGE_IOMAP)
164#define __PAGE_KERNEL_IO_NOCACHE (__PAGE_KERNEL_NOCACHE | _PAGE_IOMAP)
165#define __PAGE_KERNEL_IO_UC_MINUS (__PAGE_KERNEL_UC_MINUS | _PAGE_IOMAP)
166#define __PAGE_KERNEL_IO_WC (__PAGE_KERNEL_WC | _PAGE_IOMAP)
167
168#define PAGE_KERNEL __pgprot(__PAGE_KERNEL)
169#define PAGE_KERNEL_RO __pgprot(__PAGE_KERNEL_RO)
170#define PAGE_KERNEL_EXEC __pgprot(__PAGE_KERNEL_EXEC)
171#define PAGE_KERNEL_RX __pgprot(__PAGE_KERNEL_RX)
172#define PAGE_KERNEL_WC __pgprot(__PAGE_KERNEL_WC)
173#define PAGE_KERNEL_NOCACHE __pgprot(__PAGE_KERNEL_NOCACHE)
174#define PAGE_KERNEL_UC_MINUS __pgprot(__PAGE_KERNEL_UC_MINUS)
175#define PAGE_KERNEL_EXEC_NOCACHE __pgprot(__PAGE_KERNEL_EXEC_NOCACHE)
176#define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE)
177#define PAGE_KERNEL_LARGE_NOCACHE __pgprot(__PAGE_KERNEL_LARGE_NOCACHE)
178#define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC)
179#define PAGE_KERNEL_VSYSCALL __pgprot(__PAGE_KERNEL_VSYSCALL)
180#define PAGE_KERNEL_VVAR __pgprot(__PAGE_KERNEL_VVAR)
181#define PAGE_KERNEL_VVAR_NOCACHE __pgprot(__PAGE_KERNEL_VVAR_NOCACHE)
182
183#define PAGE_KERNEL_IO __pgprot(__PAGE_KERNEL_IO)
184#define PAGE_KERNEL_IO_NOCACHE __pgprot(__PAGE_KERNEL_IO_NOCACHE)
185#define PAGE_KERNEL_IO_UC_MINUS __pgprot(__PAGE_KERNEL_IO_UC_MINUS)
186#define PAGE_KERNEL_IO_WC __pgprot(__PAGE_KERNEL_IO_WC)
187
188
189#define __P000 PAGE_NONE
190#define __P001 PAGE_READONLY
191#define __P010 PAGE_COPY
192#define __P011 PAGE_COPY
193#define __P100 PAGE_READONLY_EXEC
194#define __P101 PAGE_READONLY_EXEC
195#define __P110 PAGE_COPY_EXEC
196#define __P111 PAGE_COPY_EXEC
197
198#define __S000 PAGE_NONE
199#define __S001 PAGE_READONLY
200#define __S010 PAGE_SHARED
201#define __S011 PAGE_SHARED
202#define __S100 PAGE_READONLY_EXEC
203#define __S101 PAGE_READONLY_EXEC
204#define __S110 PAGE_SHARED_EXEC
205#define __S111 PAGE_SHARED_EXEC
206
207
208
209
210#ifdef CONFIG_X86_64
211#define __PAGE_KERNEL_IDENT_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC
212#else
213
214
215
216
217
218#define PTE_IDENT_ATTR 0x003
219#define PDE_IDENT_ATTR 0x067
220#define PGD_IDENT_ATTR 0x001
221#endif
222
223#ifdef CONFIG_X86_32
224# include <asm/pgtable_32_types.h>
225#else
226# include <asm/pgtable_64_types.h>
227#endif
228
229#ifndef __ASSEMBLY__
230
231#include <linux/types.h>
232
233
234#define PTE_PFN_MASK ((pteval_t)PHYSICAL_PAGE_MASK)
235
236
237#define PTE_FLAGS_MASK (~PTE_PFN_MASK)
238
239typedef struct pgprot { pgprotval_t pgprot; } pgprot_t;
240
241typedef struct { pgdval_t pgd; } pgd_t;
242
243static inline pgd_t native_make_pgd(pgdval_t val)
244{
245 return (pgd_t) { val };
246}
247
248static inline pgdval_t native_pgd_val(pgd_t pgd)
249{
250 return pgd.pgd;
251}
252
253static inline pgdval_t pgd_flags(pgd_t pgd)
254{
255 return native_pgd_val(pgd) & PTE_FLAGS_MASK;
256}
257
258#if PAGETABLE_LEVELS > 3
259typedef struct { pudval_t pud; } pud_t;
260
261static inline pud_t native_make_pud(pmdval_t val)
262{
263 return (pud_t) { val };
264}
265
266static inline pudval_t native_pud_val(pud_t pud)
267{
268 return pud.pud;
269}
270#else
271#include <asm-generic/pgtable-nopud.h>
272
273static inline pudval_t native_pud_val(pud_t pud)
274{
275 return native_pgd_val(pud.pgd);
276}
277#endif
278
279#if PAGETABLE_LEVELS > 2
280typedef struct { pmdval_t pmd; } pmd_t;
281
282static inline pmd_t native_make_pmd(pmdval_t val)
283{
284 return (pmd_t) { val };
285}
286
287static inline pmdval_t native_pmd_val(pmd_t pmd)
288{
289 return pmd.pmd;
290}
291#else
292#include <asm-generic/pgtable-nopmd.h>
293
294static inline pmdval_t native_pmd_val(pmd_t pmd)
295{
296 return native_pgd_val(pmd.pud.pgd);
297}
298#endif
299
300static inline pudval_t pud_flags(pud_t pud)
301{
302 return native_pud_val(pud) & PTE_FLAGS_MASK;
303}
304
305static inline pmdval_t pmd_flags(pmd_t pmd)
306{
307 return native_pmd_val(pmd) & PTE_FLAGS_MASK;
308}
309
310static inline pte_t native_make_pte(pteval_t val)
311{
312 return (pte_t) { .pte = val };
313}
314
315static inline pteval_t native_pte_val(pte_t pte)
316{
317 return pte.pte;
318}
319
320static inline pteval_t pte_flags(pte_t pte)
321{
322 return native_pte_val(pte) & PTE_FLAGS_MASK;
323}
324
325#define pgprot_val(x) ((x).pgprot)
326#define __pgprot(x) ((pgprot_t) { (x) } )
327
328
329typedef struct page *pgtable_t;
330
331extern pteval_t __supported_pte_mask;
332extern void set_nx(void);
333extern int nx_enabled;
334
335#define pgprot_writecombine pgprot_writecombine
336extern pgprot_t pgprot_writecombine(pgprot_t prot);
337
338
339#define __HAVE_PFNMAP_TRACKING
340
341#define __HAVE_PHYS_MEM_ACCESS_PROT
342struct file;
343pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
344 unsigned long size, pgprot_t vma_prot);
345int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
346 unsigned long size, pgprot_t *vma_prot);
347
348
349void set_pte_vaddr(unsigned long vaddr, pte_t pte);
350
351#ifdef CONFIG_X86_32
352extern void native_pagetable_init(void);
353#else
354#define native_pagetable_init paging_init
355#endif
356
357struct seq_file;
358extern void arch_report_meminfo(struct seq_file *m);
359
360enum pg_level {
361 PG_LEVEL_NONE,
362 PG_LEVEL_4K,
363 PG_LEVEL_2M,
364 PG_LEVEL_1G,
365 PG_LEVEL_NUM
366};
367
368#ifdef CONFIG_PROC_FS
369extern void update_page_count(int level, unsigned long pages);
370#else
371static inline void update_page_count(int level, unsigned long pages) { }
372#endif
373
374
375
376
377
378
379
380extern pte_t *lookup_address(unsigned long address, unsigned int *level);
381extern phys_addr_t slow_virt_to_phys(void *__address);
382
383#endif
384
385#endif
386