1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef _ASM_S390_PGTABLE_H
14#define _ASM_S390_PGTABLE_H
15
16#include <asm-generic/4level-fixup.h>
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#ifndef __ASSEMBLY__
34#include <linux/mm_types.h>
35#include <asm/bug.h>
36#include <asm/processor.h>
37
38struct vm_area_struct;
39struct mm_struct;
40
41extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096)));
42extern void paging_init(void);
43extern void vmem_map_init(void);
44
45
46
47
48
49#define update_mmu_cache(vma, address, pte) do { } while (0)
50
51
52
53
54
55extern char empty_zero_page[PAGE_SIZE];
56#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
57#endif
58
59
60
61
62
63
64#ifndef __s390x__
65# define PMD_SHIFT 22
66# define PGDIR_SHIFT 22
67#else
68# define PMD_SHIFT 21
69# define PGDIR_SHIFT 31
70#endif
71
72#define PMD_SIZE (1UL << PMD_SHIFT)
73#define PMD_MASK (~(PMD_SIZE-1))
74#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
75#define PGDIR_MASK (~(PGDIR_SIZE-1))
76
77
78
79
80
81
82
83#ifndef __s390x__
84# define PTRS_PER_PTE 1024
85# define PTRS_PER_PMD 1
86# define PTRS_PER_PGD 512
87#else
88# define PTRS_PER_PTE 512
89# define PTRS_PER_PMD 1024
90# define PTRS_PER_PGD 2048
91#endif
92
93#define FIRST_USER_ADDRESS 0
94
95#define pte_ERROR(e) \
96 printk("%s:%d: bad pte %p.\n", __FILE__, __LINE__, (void *) pte_val(e))
97#define pmd_ERROR(e) \
98 printk("%s:%d: bad pmd %p.\n", __FILE__, __LINE__, (void *) pmd_val(e))
99#define pgd_ERROR(e) \
100 printk("%s:%d: bad pgd %p.\n", __FILE__, __LINE__, (void *) pgd_val(e))
101
102#ifndef __ASSEMBLY__
103
104
105
106
107
108
109
110
111extern unsigned long vmalloc_end;
112#define VMALLOC_OFFSET (8*1024*1024)
113#define VMALLOC_START (((unsigned long) high_memory + VMALLOC_OFFSET) \
114 & ~(VMALLOC_OFFSET-1))
115#define VMALLOC_END vmalloc_end
116
117
118
119
120
121
122
123
124#ifndef __s390x__
125#define VMALLOC_MIN_SIZE 0x8000000UL
126#define VMALLOC_END_INIT 0x80000000UL
127#else
128#define VMALLOC_MIN_SIZE 0x2000000000UL
129#define VMALLOC_END_INIT 0x40000000000UL
130#endif
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215#define _PAGE_RO 0x200
216#define _PAGE_INVALID 0x400
217#define _PAGE_SWT 0x001
218#define _PAGE_SWX 0x002
219
220
221#define _PAGE_TYPE_EMPTY 0x400
222#define _PAGE_TYPE_NONE 0x401
223#define _PAGE_TYPE_SWAP 0x403
224#define _PAGE_TYPE_FILE 0x601
225#define _PAGE_TYPE_RO 0x200
226#define _PAGE_TYPE_RW 0x000
227#define _PAGE_TYPE_EX_RO 0x202
228#define _PAGE_TYPE_EX_RW 0x002
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258#ifndef __s390x__
259
260
261#define _PAGE_TABLE_LEN 0xf
262#define _PAGE_TABLE_COM 0x10
263#define _PAGE_TABLE_INV 0x20
264#define _SEG_PRESENT 0x001
265
266
267#define _PAGE_CHANGED 0x02
268#define _PAGE_REFERENCED 0x04
269
270#define _USER_SEG_TABLE_LEN 0x7f
271#define _KERNEL_SEG_TABLE_LEN 0x7f
272
273
274
275
276#define _PAGE_TABLE _PAGE_TABLE_LEN
277#define _KERNPG_TABLE _PAGE_TABLE_LEN
278
279
280
281
282
283#define _SEGMENT_TABLE (_USER_SEG_TABLE_LEN|0x80000000|0x100)
284#define _KERNSEG_TABLE _KERNEL_SEG_TABLE_LEN
285
286#define USER_STD_MASK 0x00000080UL
287
288#else
289
290
291#define _PMD_ENTRY_INV 0x20
292#define _PMD_ENTRY 0x00
293
294
295#define _PGD_ENTRY_INV 0x20
296#define _PGD_ENTRY 0x07
297
298
299
300
301#define _REGION_THIRD 0x4
302#define _REGION_THIRD_LEN 0x3
303#define _REGION_TABLE (_REGION_THIRD|_REGION_THIRD_LEN|0x40|0x100)
304#define _KERN_REGION_TABLE (_REGION_THIRD|_REGION_THIRD_LEN)
305
306#define USER_STD_MASK 0x0000000000000080UL
307
308
309#define _PAGE_CHANGED 0x02
310#define _PAGE_REFERENCED 0x04
311
312#endif
313
314
315
316
317#define PAGE_NONE __pgprot(_PAGE_TYPE_NONE)
318#define PAGE_RO __pgprot(_PAGE_TYPE_RO)
319#define PAGE_RW __pgprot(_PAGE_TYPE_RW)
320#define PAGE_EX_RO __pgprot(_PAGE_TYPE_EX_RO)
321#define PAGE_EX_RW __pgprot(_PAGE_TYPE_EX_RW)
322
323#define PAGE_KERNEL PAGE_RW
324#define PAGE_COPY PAGE_RO
325
326
327
328
329
330
331
332
333
334
335#define __P000 PAGE_NONE
336#define __P001 PAGE_RO
337#define __P010 PAGE_RO
338#define __P011 PAGE_RO
339#define __P100 PAGE_EX_RO
340#define __P101 PAGE_EX_RO
341#define __P110 PAGE_EX_RO
342#define __P111 PAGE_EX_RO
343
344#define __S000 PAGE_NONE
345#define __S001 PAGE_RO
346#define __S010 PAGE_RW
347#define __S011 PAGE_RW
348#define __S100 PAGE_EX_RO
349#define __S101 PAGE_EX_RO
350#define __S110 PAGE_EX_RW
351#define __S111 PAGE_EX_RW
352
353#ifndef __s390x__
354# define PMD_SHADOW_SHIFT 1
355# define PGD_SHADOW_SHIFT 1
356#else
357# define PMD_SHADOW_SHIFT 2
358# define PGD_SHADOW_SHIFT 2
359#endif
360
361static inline struct page *get_shadow_page(struct page *page)
362{
363 if (s390_noexec && !list_empty(&page->lru))
364 return virt_to_page(page->lru.next);
365 return NULL;
366}
367
368static inline pte_t *get_shadow_pte(pte_t *ptep)
369{
370 unsigned long pteptr = (unsigned long) (ptep);
371
372 if (s390_noexec) {
373 unsigned long offset = pteptr & (PAGE_SIZE - 1);
374 void *addr = (void *) (pteptr ^ offset);
375 struct page *page = virt_to_page(addr);
376 if (!list_empty(&page->lru))
377 return (pte_t *) ((unsigned long) page->lru.next |
378 offset);
379 }
380 return NULL;
381}
382
383static inline pmd_t *get_shadow_pmd(pmd_t *pmdp)
384{
385 unsigned long pmdptr = (unsigned long) (pmdp);
386
387 if (s390_noexec) {
388 unsigned long offset = pmdptr &
389 ((PAGE_SIZE << PMD_SHADOW_SHIFT) - 1);
390 void *addr = (void *) (pmdptr ^ offset);
391 struct page *page = virt_to_page(addr);
392 if (!list_empty(&page->lru))
393 return (pmd_t *) ((unsigned long) page->lru.next |
394 offset);
395 }
396 return NULL;
397}
398
399static inline pgd_t *get_shadow_pgd(pgd_t *pgdp)
400{
401 unsigned long pgdptr = (unsigned long) (pgdp);
402
403 if (s390_noexec) {
404 unsigned long offset = pgdptr &
405 ((PAGE_SIZE << PGD_SHADOW_SHIFT) - 1);
406 void *addr = (void *) (pgdptr ^ offset);
407 struct page *page = virt_to_page(addr);
408 if (!list_empty(&page->lru))
409 return (pgd_t *) ((unsigned long) page->lru.next |
410 offset);
411 }
412 return NULL;
413}
414
415
416
417
418
419
420static inline void set_pte(pte_t *pteptr, pte_t pteval)
421{
422 pte_t *shadow_pte = get_shadow_pte(pteptr);
423
424 *pteptr = pteval;
425 if (shadow_pte) {
426 if (!(pte_val(pteval) & _PAGE_INVALID) &&
427 (pte_val(pteval) & _PAGE_SWX))
428 pte_val(*shadow_pte) = pte_val(pteval) | _PAGE_RO;
429 else
430 pte_val(*shadow_pte) = _PAGE_TYPE_EMPTY;
431 }
432}
433#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
434
435
436
437
438#ifndef __s390x__
439
440static inline int pgd_present(pgd_t pgd) { return 1; }
441static inline int pgd_none(pgd_t pgd) { return 0; }
442static inline int pgd_bad(pgd_t pgd) { return 0; }
443
444static inline int pmd_present(pmd_t pmd) { return pmd_val(pmd) & _SEG_PRESENT; }
445static inline int pmd_none(pmd_t pmd) { return pmd_val(pmd) & _PAGE_TABLE_INV; }
446static inline int pmd_bad(pmd_t pmd)
447{
448 return (pmd_val(pmd) & (~PAGE_MASK & ~_PAGE_TABLE_INV)) != _PAGE_TABLE;
449}
450
451#else
452
453static inline int pgd_present(pgd_t pgd)
454{
455 return (pgd_val(pgd) & ~PAGE_MASK) == _PGD_ENTRY;
456}
457
458static inline int pgd_none(pgd_t pgd)
459{
460 return pgd_val(pgd) & _PGD_ENTRY_INV;
461}
462
463static inline int pgd_bad(pgd_t pgd)
464{
465 return (pgd_val(pgd) & (~PAGE_MASK & ~_PGD_ENTRY_INV)) != _PGD_ENTRY;
466}
467
468static inline int pmd_present(pmd_t pmd)
469{
470 return (pmd_val(pmd) & ~PAGE_MASK) == _PMD_ENTRY;
471}
472
473static inline int pmd_none(pmd_t pmd)
474{
475 return pmd_val(pmd) & _PMD_ENTRY_INV;
476}
477
478static inline int pmd_bad(pmd_t pmd)
479{
480 return (pmd_val(pmd) & (~PAGE_MASK & ~_PMD_ENTRY_INV)) != _PMD_ENTRY;
481}
482
483#endif
484
485static inline int pte_none(pte_t pte)
486{
487 return (pte_val(pte) & _PAGE_INVALID) && !(pte_val(pte) & _PAGE_SWT);
488}
489
490static inline int pte_present(pte_t pte)
491{
492 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT | _PAGE_SWX;
493 return (pte_val(pte) & mask) == _PAGE_TYPE_NONE ||
494 (!(pte_val(pte) & _PAGE_INVALID) &&
495 !(pte_val(pte) & _PAGE_SWT));
496}
497
498static inline int pte_file(pte_t pte)
499{
500 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT;
501 return (pte_val(pte) & mask) == _PAGE_TYPE_FILE;
502}
503
504#define pte_same(a,b) (pte_val(a) == pte_val(b))
505
506
507
508
509
510static inline int pte_write(pte_t pte)
511{
512 return (pte_val(pte) & _PAGE_RO) == 0;
513}
514
515static inline int pte_dirty(pte_t pte)
516{
517
518
519
520
521 return 0;
522}
523
524static inline int pte_young(pte_t pte)
525{
526
527
528
529
530 return 0;
531}
532
533static inline int pte_read(pte_t pte)
534{
535
536
537
538 return 1;
539}
540
541
542
543
544
545#ifndef __s390x__
546
547static inline void pgd_clear(pgd_t * pgdp) { }
548
549static inline void pmd_clear_kernel(pmd_t * pmdp)
550{
551 pmd_val(pmdp[0]) = _PAGE_TABLE_INV;
552 pmd_val(pmdp[1]) = _PAGE_TABLE_INV;
553 pmd_val(pmdp[2]) = _PAGE_TABLE_INV;
554 pmd_val(pmdp[3]) = _PAGE_TABLE_INV;
555}
556
557static inline void pmd_clear(pmd_t * pmdp)
558{
559 pmd_t *shadow_pmd = get_shadow_pmd(pmdp);
560
561 pmd_clear_kernel(pmdp);
562 if (shadow_pmd)
563 pmd_clear_kernel(shadow_pmd);
564}
565
566#else
567
568static inline void pgd_clear_kernel(pgd_t * pgdp)
569{
570 pgd_val(*pgdp) = _PGD_ENTRY_INV | _PGD_ENTRY;
571}
572
573static inline void pgd_clear(pgd_t * pgdp)
574{
575 pgd_t *shadow_pgd = get_shadow_pgd(pgdp);
576
577 pgd_clear_kernel(pgdp);
578 if (shadow_pgd)
579 pgd_clear_kernel(shadow_pgd);
580}
581
582static inline void pmd_clear_kernel(pmd_t * pmdp)
583{
584 pmd_val(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY;
585 pmd_val1(*pmdp) = _PMD_ENTRY_INV | _PMD_ENTRY;
586}
587
588static inline void pmd_clear(pmd_t * pmdp)
589{
590 pmd_t *shadow_pmd = get_shadow_pmd(pmdp);
591
592 pmd_clear_kernel(pmdp);
593 if (shadow_pmd)
594 pmd_clear_kernel(shadow_pmd);
595}
596
597#endif
598
599static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
600{
601 pte_t *shadow_pte = get_shadow_pte(ptep);
602
603 pte_val(*ptep) = _PAGE_TYPE_EMPTY;
604 if (shadow_pte)
605 pte_val(*shadow_pte) = _PAGE_TYPE_EMPTY;
606}
607
608
609
610
611
612static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
613{
614 pte_val(pte) &= PAGE_MASK;
615 pte_val(pte) |= pgprot_val(newprot);
616 return pte;
617}
618
619static inline pte_t pte_wrprotect(pte_t pte)
620{
621
622 if (!(pte_val(pte) & _PAGE_INVALID))
623 pte_val(pte) |= _PAGE_RO;
624 return pte;
625}
626
627static inline pte_t pte_mkwrite(pte_t pte)
628{
629 pte_val(pte) &= ~_PAGE_RO;
630 return pte;
631}
632
633static inline pte_t pte_mkclean(pte_t pte)
634{
635
636
637
638
639 return pte;
640}
641
642static inline pte_t pte_mkdirty(pte_t pte)
643{
644
645
646
647
648 return pte;
649}
650
651static inline pte_t pte_mkold(pte_t pte)
652{
653
654
655
656 return pte;
657}
658
659static inline pte_t pte_mkyoung(pte_t pte)
660{
661
662
663
664 return pte;
665}
666
667static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
668{
669 return 0;
670}
671
672static inline int
673ptep_clear_flush_young(struct vm_area_struct *vma,
674 unsigned long address, pte_t *ptep)
675{
676
677 return ptep_test_and_clear_young(vma, address, ptep);
678}
679
680static inline int ptep_test_and_clear_dirty(struct vm_area_struct *vma, unsigned long addr, pte_t *ptep)
681{
682 return 0;
683}
684
685static inline int
686ptep_clear_flush_dirty(struct vm_area_struct *vma,
687 unsigned long address, pte_t *ptep)
688{
689
690 return ptep_test_and_clear_dirty(vma, address, ptep);
691}
692
693static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
694{
695 pte_t pte = *ptep;
696 pte_clear(mm, addr, ptep);
697 return pte;
698}
699
700static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
701{
702 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
703#ifndef __s390x__
704
705 pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00);
706#else
707
708 pte_t *pto = ptep;
709#endif
710 asm volatile(
711 " ipte %2,%3"
712 : "=m" (*ptep) : "m" (*ptep),
713 "a" (pto), "a" (address));
714 }
715 pte_val(*ptep) = _PAGE_TYPE_EMPTY;
716}
717
718static inline pte_t
719ptep_clear_flush(struct vm_area_struct *vma,
720 unsigned long address, pte_t *ptep)
721{
722 pte_t pte = *ptep;
723 pte_t *shadow_pte = get_shadow_pte(ptep);
724
725 __ptep_ipte(address, ptep);
726 if (shadow_pte)
727 __ptep_ipte(address, shadow_pte);
728 return pte;
729}
730
731static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
732{
733 pte_t old_pte = *ptep;
734 set_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
735}
736
737static inline void
738ptep_establish(struct vm_area_struct *vma,
739 unsigned long address, pte_t *ptep,
740 pte_t entry)
741{
742 ptep_clear_flush(vma, address, ptep);
743 set_pte(ptep, entry);
744}
745
746#define ptep_set_access_flags(__vma, __address, __ptep, __entry, __dirty) \
747({ \
748 int __changed = !pte_same(*(__ptep), __entry); \
749 if (__changed) \
750 ptep_establish(__vma, __address, __ptep, __entry); \
751 __changed; \
752})
753
754
755
756
757
758
759
760
761static inline int page_test_dirty(struct page *page)
762{
763 return (page_get_storage_key(page_to_phys(page)) & _PAGE_CHANGED) != 0;
764}
765
766static inline void page_clear_dirty(struct page *page)
767{
768 page_set_storage_key(page_to_phys(page), PAGE_DEFAULT_KEY);
769}
770
771
772
773
774static inline int page_test_and_clear_young(struct page *page)
775{
776 unsigned long physpage = page_to_phys(page);
777 int ccode;
778
779 asm volatile(
780 " rrbe 0,%1\n"
781 " ipm %0\n"
782 " srl %0,28\n"
783 : "=d" (ccode) : "a" (physpage) : "cc" );
784 return ccode & 2;
785}
786
787
788
789
790
791static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
792{
793 pte_t __pte;
794 pte_val(__pte) = physpage + pgprot_val(pgprot);
795 return __pte;
796}
797
798static inline pte_t mk_pte(struct page *page, pgprot_t pgprot)
799{
800 unsigned long physpage = page_to_phys(page);
801
802 return mk_pte_phys(physpage, pgprot);
803}
804
805static inline pte_t pfn_pte(unsigned long pfn, pgprot_t pgprot)
806{
807 unsigned long physpage = __pa((pfn) << PAGE_SHIFT);
808
809 return mk_pte_phys(physpage, pgprot);
810}
811
812#ifdef __s390x__
813
814static inline pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot)
815{
816 unsigned long physpage = __pa((pfn) << PAGE_SHIFT);
817
818 return __pmd(physpage + pgprot_val(pgprot));
819}
820
821#endif
822
823#define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT)
824#define pte_page(x) pfn_to_page(pte_pfn(x))
825
826#define pmd_page_vaddr(pmd) (pmd_val(pmd) & PAGE_MASK)
827
828#define pmd_page(pmd) pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)
829
830#define pgd_page_vaddr(pgd) (pgd_val(pgd) & PAGE_MASK)
831
832#define pgd_page(pgd) pfn_to_page(pgd_val(pgd) >> PAGE_SHIFT)
833
834
835#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
836#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
837
838
839#define pgd_offset_k(address) pgd_offset(&init_mm, address)
840
841#ifndef __s390x__
842
843
844static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address)
845{
846 return (pmd_t *) dir;
847}
848
849#else
850
851
852#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
853#define pmd_offset(dir,addr) \
854 ((pmd_t *) pgd_page_vaddr(*(dir)) + pmd_index(addr))
855
856#endif
857
858
859#define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
860#define pte_offset_kernel(pmd, address) \
861 ((pte_t *) pmd_page_vaddr(*(pmd)) + pte_index(address))
862#define pte_offset_map(pmd, address) pte_offset_kernel(pmd, address)
863#define pte_offset_map_nested(pmd, address) pte_offset_kernel(pmd, address)
864#define pte_unmap(pte) do { } while (0)
865#define pte_unmap_nested(pte) do { } while (0)
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902#ifndef __s390x__
903#define __SWP_OFFSET_MASK (~0UL >> 12)
904#else
905#define __SWP_OFFSET_MASK (~0UL >> 11)
906#endif
907static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
908{
909 pte_t pte;
910 offset &= __SWP_OFFSET_MASK;
911 pte_val(pte) = _PAGE_TYPE_SWAP | ((type & 0x1f) << 2) |
912 ((offset & 1UL) << 7) | ((offset & ~1UL) << 11);
913 return pte;
914}
915
916#define __swp_type(entry) (((entry).val >> 2) & 0x1f)
917#define __swp_offset(entry) (((entry).val >> 11) | (((entry).val >> 7) & 1))
918#define __swp_entry(type,offset) ((swp_entry_t) { pte_val(mk_swap_pte((type),(offset))) })
919
920#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
921#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
922
923#ifndef __s390x__
924# define PTE_FILE_MAX_BITS 26
925#else
926# define PTE_FILE_MAX_BITS 59
927#endif
928
929#define pte_to_pgoff(__pte) \
930 ((((__pte).pte >> 12) << 7) + (((__pte).pte >> 1) & 0x7f))
931
932#define pgoff_to_pte(__off) \
933 ((pte_t) { ((((__off) & 0x7f) << 1) + (((__off) >> 7) << 12)) \
934 | _PAGE_TYPE_FILE })
935
936#endif
937
938#define kern_addr_valid(addr) (1)
939
940extern int add_shared_memory(unsigned long start, unsigned long size);
941extern int remove_shared_memory(unsigned long start, unsigned long size);
942
943
944
945
946#define pgtable_cache_init() do { } while (0)
947
948#define __HAVE_ARCH_MEMMAP_INIT
949extern void memmap_init(unsigned long, int, unsigned long, unsigned long);
950
951#define __HAVE_ARCH_PTEP_ESTABLISH
952#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
953#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
954#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
955#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
956#define __HAVE_ARCH_PTEP_CLEAR_DIRTY_FLUSH
957#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
958#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
959#define __HAVE_ARCH_PTEP_SET_WRPROTECT
960#define __HAVE_ARCH_PTE_SAME
961#define __HAVE_ARCH_PAGE_TEST_DIRTY
962#define __HAVE_ARCH_PAGE_CLEAR_DIRTY
963#define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
964#include <asm-generic/pgtable.h>
965
966#endif
967
968