Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / include / arch-x86_64 / pgtable.h
1 #ifndef _X86_64_PGTABLE_H
2 #define _X86_64_PGTABLE_H
3
4 #include <lwk/const.h>
5 #ifndef __ASSEMBLY__
6
7 /*
8  * This file contains the functions and defines necessary to modify and use
9  * the x86-64 page table tree.
10  */
11 #include <lwk/spinlock.h>
12 #include <arch/fixmap.h>
13 #include <arch/processor.h>
14 #include <arch/bitops.h>
15 #include <arch/pda.h>
16
17 extern pud_t level3_kernel_pgt[512];
18 extern pud_t level3_ident_pgt[512];
19 extern pmd_t level2_kernel_pgt[512];
20 extern pgd_t init_level4_pgt[];
21 extern unsigned long __supported_pte_mask;
22
23 #define swapper_pg_dir init_level4_pgt
24
25 extern void paging_init(void);
26 extern void clear_kernel_mapping(unsigned long addr, unsigned long size);
27
28 /*
29  * ZERO_PAGE is a global shared page that is always zero: used
30  * for zero-mapped memory areas etc..
31  */
32 extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
33 #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
34
35 #endif /* !__ASSEMBLY__ */
36
37 /*
38  * PGDIR_SHIFT determines what a top-level page table entry can map
39  */
40 #define PGDIR_SHIFT     39
41 #define PTRS_PER_PGD    512
42
43 /*
44  * 3rd level page
45  */
46 #define PUD_SHIFT       30
47 #define PTRS_PER_PUD    512
48
49 /*
50  * PMD_SHIFT determines the size of the area a middle-level
51  * page table can map
52  */
53 #define PMD_SHIFT       21
54 #define PTRS_PER_PMD    512
55
56 /*
57  * entries per page directory level
58  */
59 #define PTRS_PER_PTE    512
60
61 #ifndef __ASSEMBLY__
62
63 #define pte_ERROR(e) \
64         printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), pte_val(e))
65 #define pmd_ERROR(e) \
66         printk("%s:%d: bad pmd %p(%016lx).\n", __FILE__, __LINE__, &(e), pmd_val(e))
67 #define pud_ERROR(e) \
68         printk("%s:%d: bad pud %p(%016lx).\n", __FILE__, __LINE__, &(e), pud_val(e))
69 #define pgd_ERROR(e) \
70         printk("%s:%d: bad pgd %p(%016lx).\n", __FILE__, __LINE__, &(e), pgd_val(e))
71
72 #define pgd_none(x)     (!pgd_val(x))
73 #define pud_none(x)     (!pud_val(x))
74
75 static inline void set_pte(pte_t *dst, pte_t val)
76 {
77         pte_val(*dst) = pte_val(val);
78
79 #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
80
81 static inline void set_pmd(pmd_t *dst, pmd_t val)
82 {
83         pmd_val(*dst) = pmd_val(val); 
84
85
86 static inline void set_pud(pud_t *dst, pud_t val)
87 {
88         pud_val(*dst) = pud_val(val);
89 }
90
91 static inline void pud_clear (pud_t *pud)
92 {
93         set_pud(pud, __pud(0));
94 }
95
96 static inline void set_pgd(pgd_t *dst, pgd_t val)
97 {
98         pgd_val(*dst) = pgd_val(val); 
99
100
101 static inline void pgd_clear (pgd_t * pgd)
102 {
103         set_pgd(pgd, __pgd(0));
104 }
105
106 #define ptep_get_and_clear(mm,addr,xp)  __pte(xchg(&(xp)->pte, 0))
107
108 struct mm_struct;
109
110 static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full)
111 {
112         pte_t pte;
113         if (full) {
114                 pte = *ptep;
115                 *ptep = __pte(0);
116         } else {
117                 pte = ptep_get_and_clear(mm, addr, ptep);
118         }
119         return pte;
120 }
121
122 #define pte_same(a, b)          ((a).pte == (b).pte)
123
124 #define pte_pgprot(a)   (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK))
125
126 #endif /* !__ASSEMBLY__ */
127
128 #define PMD_SIZE        (_AC(1,UL) << PMD_SHIFT)
129 #define PMD_MASK        (~(PMD_SIZE-1))
130 #define PUD_SIZE        (_AC(1,UL) << PUD_SHIFT)
131 #define PUD_MASK        (~(PUD_SIZE-1))
132 #define PGDIR_SIZE      (_AC(1,UL) << PGDIR_SHIFT)
133 #define PGDIR_MASK      (~(PGDIR_SIZE-1))
134
135 #define USER_PTRS_PER_PGD       ((TASK_SIZE-1)/PGDIR_SIZE+1)
136 #define FIRST_USER_ADDRESS      0
137
138 #define MAXMEM           _AC(0x3fffffffffff, UL)
139 #define VMALLOC_START    _AC(0xffffc20000000000, UL)
140 #define VMALLOC_END      _AC(0xffffe1ffffffffff, UL)
141 #define MODULES_VADDR    _AC(0xffffffff88000000, UL)
142 #define MODULES_END      _AC(0xfffffffffff00000, UL)
143 #define MODULES_LEN   (MODULES_END - MODULES_VADDR)
144
145 #define _PAGE_BIT_PRESENT       0
146 #define _PAGE_BIT_RW            1
147 #define _PAGE_BIT_USER          2
148 #define _PAGE_BIT_PWT           3
149 #define _PAGE_BIT_PCD           4
150 #define _PAGE_BIT_ACCESSED      5
151 #define _PAGE_BIT_DIRTY         6
152 #define _PAGE_BIT_PSE           7       /* 4 MB (or 2MB) page */
153 #define _PAGE_BIT_GLOBAL        8       /* Global TLB entry PPro+ */
154 #define _PAGE_BIT_NX           63       /* No execute: only valid after cpuid check */
155
156 #define _PAGE_PRESENT   0x001
157 #define _PAGE_RW        0x002
158 #define _PAGE_USER      0x004
159 #define _PAGE_PWT       0x008
160 #define _PAGE_PCD       0x010
161 #define _PAGE_ACCESSED  0x020
162 #define _PAGE_DIRTY     0x040
163 #define _PAGE_PSE       0x080   /* 2MB page */
164 #define _PAGE_FILE      0x040   /* nonlinear file mapping, saved PTE; unset:swap */
165 #define _PAGE_GLOBAL    0x100   /* Global TLB entry */
166
167 #define _PAGE_PROTNONE  0x080   /* If not present */
168 #define _PAGE_NX        (_AC(1,UL)<<_PAGE_BIT_NX)
169
170 #define _PAGE_TABLE     (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
171 #define _KERNPG_TABLE   (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
172
173 #define _PAGE_CHG_MASK  (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY)
174
175 #define PAGE_NONE       __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
176 #define PAGE_SHARED     __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
177 #define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
178 #define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
179 #define PAGE_COPY PAGE_COPY_NOEXEC
180 #define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
181 #define PAGE_READONLY   __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
182 #define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
183 #define __PAGE_KERNEL \
184         (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
185 #define __PAGE_KERNEL_EXEC \
186         (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
187 #define __PAGE_KERNEL_NOCACHE \
188         (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED | _PAGE_NX)
189 #define __PAGE_KERNEL_RO \
190         (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
191 #define __PAGE_KERNEL_VSYSCALL \
192         (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
193 #define __PAGE_KERNEL_VSYSCALL_NOCACHE \
194         (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)
195 #define __PAGE_KERNEL_LARGE \
196         (__PAGE_KERNEL | _PAGE_PSE)
197 #define __PAGE_KERNEL_LARGE_EXEC \
198         (__PAGE_KERNEL_EXEC | _PAGE_PSE)
199
200 #define MAKE_GLOBAL(x) __pgprot((x) | _PAGE_GLOBAL)
201
202 #define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
203 #define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC)
204 #define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
205 #define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
206 #define PAGE_KERNEL_VSYSCALL32 __pgprot(__PAGE_KERNEL_VSYSCALL)
207 #define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)
208 #define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)
209 #define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)
210
211 /*         xwr */
212 #define __P000  PAGE_NONE
213 #define __P001  PAGE_READONLY
214 #define __P010  PAGE_COPY
215 #define __P011  PAGE_COPY
216 #define __P100  PAGE_READONLY_EXEC
217 #define __P101  PAGE_READONLY_EXEC
218 #define __P110  PAGE_COPY_EXEC
219 #define __P111  PAGE_COPY_EXEC
220
221 #define __S000  PAGE_NONE
222 #define __S001  PAGE_READONLY
223 #define __S010  PAGE_SHARED
224 #define __S011  PAGE_SHARED
225 #define __S100  PAGE_READONLY_EXEC
226 #define __S101  PAGE_READONLY_EXEC
227 #define __S110  PAGE_SHARED_EXEC
228 #define __S111  PAGE_SHARED_EXEC
229
230 #ifndef __ASSEMBLY__
231
232 static inline unsigned long pgd_bad(pgd_t pgd)
233 {
234         return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
235 }
236
237 static inline unsigned long pud_bad(pud_t pud)
238 {
239         return pud_val(pud) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
240 }
241
242 static inline unsigned long pmd_bad(pmd_t pmd)
243 {
244         return pmd_val(pmd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER);
245 }
246
247 #define pte_none(x)     (!pte_val(x))
248 #define pte_present(x)  (pte_val(x) & (_PAGE_PRESENT | _PAGE_PROTNONE))
249 #define pte_clear(mm,addr,xp)   do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
250
251 #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) /* FIXME: is this
252                                                    right? */
253 #define pte_page(x)     pfn_to_page(pte_pfn(x))
254 #define pte_pfn(x)  ((pte_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
255
256 static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
257 {
258         pte_t pte;
259         pte_val(pte) = (page_nr << PAGE_SHIFT);
260         pte_val(pte) |= pgprot_val(pgprot);
261         pte_val(pte) &= __supported_pte_mask;
262         return pte;
263 }
264
265 /*
266  * The following only work if pte_present() is true.
267  * Undefined behaviour if not..
268  */
269 #define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
270 static inline int pte_user(pte_t pte)           { return pte_val(pte) & _PAGE_USER; }
271 static inline int pte_read(pte_t pte)           { return pte_val(pte) & _PAGE_USER; }
272 static inline int pte_exec(pte_t pte)           { return !(pte_val(pte) & _PAGE_NX); }
273 static inline int pte_dirty(pte_t pte)          { return pte_val(pte) & _PAGE_DIRTY; }
274 static inline int pte_young(pte_t pte)          { return pte_val(pte) & _PAGE_ACCESSED; }
275 static inline int pte_write(pte_t pte)          { return pte_val(pte) & _PAGE_RW; }
276 static inline int pte_file(pte_t pte)           { return pte_val(pte) & _PAGE_FILE; }
277 static inline int pte_huge(pte_t pte)           { return pte_val(pte) & _PAGE_PSE; }
278
279 static inline pte_t pte_rdprotect(pte_t pte)    { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
280 static inline pte_t pte_exprotect(pte_t pte)    { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_USER)); return pte; }
281 static inline pte_t pte_mkclean(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_DIRTY)); return pte; }
282 static inline pte_t pte_mkold(pte_t pte)        { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_ACCESSED)); return pte; }
283 static inline pte_t pte_wrprotect(pte_t pte)    { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_RW)); return pte; }
284 static inline pte_t pte_mkread(pte_t pte)       { set_pte(&pte, __pte(pte_val(pte) | _PAGE_USER)); return pte; }
285 static inline pte_t pte_mkexec(pte_t pte)       { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_NX)); return pte; }
286 static inline pte_t pte_mkdirty(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_DIRTY)); return pte; }
287 static inline pte_t pte_mkyoung(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_ACCESSED)); return pte; }
288 static inline pte_t pte_mkwrite(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) | _PAGE_RW)); return pte; }
289 static inline pte_t pte_mkhuge(pte_t pte)       { set_pte(&pte, __pte(pte_val(pte) | _PAGE_PSE)); return pte; }
290 static inline pte_t pte_clrhuge(pte_t pte)      { set_pte(&pte, __pte(pte_val(pte) & ~_PAGE_PSE)); return pte; }
291
292 struct vm_area_struct;
293
294 static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
295 {
296         if (!pte_dirty(*ptep))
297                 return 0;
298         return test_and_clear_bit(_PAGE_BIT_DIRTY, &ptep->pte);
299 }
300
301 static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
302 {
303         if (!pte_young(*ptep))
304                 return 0;
305         return test_and_clear_bit(_PAGE_BIT_ACCESSED, &ptep->pte);
306 }
307
308 static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
309 {
310         clear_bit(_PAGE_BIT_RW, &ptep->pte);
311 }
312
313 /*
314  * Macro to mark a page protection value as "uncacheable".
315  */
316 #define pgprot_noncached(prot)  (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT))
317
318 static inline int pmd_large(pmd_t pte) { 
319         return (pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE; 
320 }       
321
322
323 /*
324  * Conversion functions: convert a page and protection to a page entry,
325  * and a page entry and page directory to the page they refer to.
326  */
327
328 /*
329  * Level 4 access.
330  */
331 #define pgd_page_vaddr(pgd) ((unsigned long) __va((unsigned long)pgd_val(pgd) & PTE_MASK))
332 #define pgd_page(pgd)           (pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT))
333 #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
334 #define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
335 #define pgd_offset_k(address) (init_level4_pgt + pgd_index(address))
336 #define pgd_present(pgd) (pgd_val(pgd) & _PAGE_PRESENT)
337 #define mk_kernel_pgd(address) ((pgd_t){ (address) | _KERNPG_TABLE })
338
339 /* PUD - Level3 access */
340 /* to find an entry in a page-table-directory. */
341 #define pud_page_vaddr(pud) ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK))
342 #define pud_page(pud)           (pfn_to_page(pud_val(pud) >> PAGE_SHIFT))
343 #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
344 #define pud_offset(pgd, address) ((pud_t *) pgd_page_vaddr(*(pgd)) + pud_index(address))
345 #define pud_present(pud) (pud_val(pud) & _PAGE_PRESENT)
346
347 /* PMD  - Level 2 access */
348 #define pmd_page_vaddr(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK))
349 #define pmd_page(pmd)           (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
350
351 #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
352 #define pmd_offset(dir, address) ((pmd_t *) pud_page_vaddr(*(dir)) + \
353                         pmd_index(address))
354 #define pmd_none(x)     (!pmd_val(x))
355 #define pmd_present(x)  (pmd_val(x) & _PAGE_PRESENT)
356 #define pmd_clear(xp)   do { set_pmd(xp, __pmd(0)); } while (0)
357 #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
358 #define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
359
360 #define pte_to_pgoff(pte) ((pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
361 #define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE })
362 #define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT
363
364 /* PTE - Level 1 access. */
365
366 /* page, protection -> pte */
367 #define mk_pte(page, pgprot)    pfn_pte(page_to_pfn(page), (pgprot))
368 #define mk_pte_huge(entry) (pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
369  
370 /* Change flags of a PTE */
371 static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
372
373         pte_val(pte) &= _PAGE_CHG_MASK;
374         pte_val(pte) |= pgprot_val(newprot);
375         pte_val(pte) &= __supported_pte_mask;
376        return pte; 
377 }
378
379 #define pte_index(address) \
380                 (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
381 #define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_vaddr(*(dir)) + \
382                         pte_index(address))
383
384 /* x86-64 always has all page tables mapped. */
385 #define pte_offset_map(dir,address) pte_offset_kernel(dir,address)
386 #define pte_offset_map_nested(dir,address) pte_offset_kernel(dir,address)
387 #define pte_unmap(pte) /* NOP */
388 #define pte_unmap_nested(pte) /* NOP */ 
389
390 #define update_mmu_cache(vma,address,pte) do { } while (0)
391
392 /* We only update the dirty/accessed state if we set
393  * the dirty bit by hand in the kernel, since the hardware
394  * will do the accessed bit for us, and we don't want to
395  * race with other CPU's that might be updating the dirty
396  * bit at the same time. */
397 #define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
398 #define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
399 ({                                                                        \
400         int __changed = !pte_same(*(__ptep), __entry);                    \
401         if (__changed && __dirty) {                                       \
402                 set_pte(__ptep, __entry);                                 \
403                 flush_tlb_page(__vma, __address);                         \
404         }                                                                 \
405         __changed;                                                        \
406 })
407
408 /* Encode and de-code a swap entry */
409 #define __swp_type(x)                   (((x).val >> 1) & 0x3f)
410 #define __swp_offset(x)                 ((x).val >> 8)
411 #define __swp_entry(type, offset)       ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
412 #define __pte_to_swp_entry(pte)         ((swp_entry_t) { pte_val(pte) })
413 #define __swp_entry_to_pte(x)           ((pte_t) { (x).val })
414
415 extern spinlock_t pgd_lock;
416 extern struct list_head pgd_list;
417
418 extern int kern_addr_valid(unsigned long addr); 
419
420 #define io_remap_pfn_range(vma, vaddr, pfn, size, prot)         \
421                 remap_pfn_range(vma, vaddr, pfn, size, prot)
422
423 #define HAVE_ARCH_UNMAPPED_AREA
424
425 #define pgtable_cache_init()   do { } while (0)
426 #define check_pgt_cache()      do { } while (0)
427
428 #define PAGE_AGP    PAGE_KERNEL_NOCACHE
429 #define HAVE_PAGE_AGP 1
430
431 /* fs/proc/kcore.c */
432 #define kc_vaddr_to_offset(v) ((v) & __VIRTUAL_MASK)
433 #define kc_offset_to_vaddr(o) \
434    (((o) & (1UL << (__VIRTUAL_MASK_SHIFT-1))) ? ((o) | (~__VIRTUAL_MASK)) : (o))
435
436 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
437 #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
438 #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
439 #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
440 #define __HAVE_ARCH_PTEP_SET_WRPROTECT
441 #define __HAVE_ARCH_PTE_SAME
442 #include <arch-generic/pgtable.h>
443 #endif /* !__ASSEMBLY__ */
444
445 #endif /* _X86_64_PGTABLE_H */