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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#ifndef __ASSEMBLY__
32#include <linux/sched.h>
33#include <linux/mm_types.h>
34#include <asm/bitops.h>
35#include <asm/bug.h>
36#include <asm/processor.h>
37
38extern pgd_t swapper_pg_dir[] __attribute__ ((aligned (4096)));
39extern void paging_init(void);
40extern void vmem_map_init(void);
41
42
43
44
45
46#define update_mmu_cache(vma, address, pte) do { } while (0)
47
48
49
50
51
52extern char empty_zero_page[PAGE_SIZE];
53#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
54#endif
55
56
57
58
59
60
61#ifndef __s390x__
62# define PMD_SHIFT 20
63# define PUD_SHIFT 20
64# define PGDIR_SHIFT 20
65#else
66# define PMD_SHIFT 20
67# define PUD_SHIFT 31
68# define PGDIR_SHIFT 42
69#endif
70
71#define PMD_SIZE (1UL << PMD_SHIFT)
72#define PMD_MASK (~(PMD_SIZE-1))
73#define PUD_SIZE (1UL << PUD_SHIFT)
74#define PUD_MASK (~(PUD_SIZE-1))
75#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
76#define PGDIR_MASK (~(PGDIR_SIZE-1))
77
78
79
80
81
82
83
84#define PTRS_PER_PTE 256
85#ifndef __s390x__
86#define PTRS_PER_PMD 1
87#define PTRS_PER_PUD 1
88#else
89#define PTRS_PER_PMD 2048
90#define PTRS_PER_PUD 2048
91#endif
92#define PTRS_PER_PGD 2048
93
94#define FIRST_USER_ADDRESS 0
95
96#define pte_ERROR(e) \
97 printk("%s:%d: bad pte %p.\n", __FILE__, __LINE__, (void *) pte_val(e))
98#define pmd_ERROR(e) \
99 printk("%s:%d: bad pmd %p.\n", __FILE__, __LINE__, (void *) pmd_val(e))
100#define pud_ERROR(e) \
101 printk("%s:%d: bad pud %p.\n", __FILE__, __LINE__, (void *) pud_val(e))
102#define pgd_ERROR(e) \
103 printk("%s:%d: bad pgd %p.\n", __FILE__, __LINE__, (void *) pgd_val(e))
104
105#ifndef __ASSEMBLY__
106
107
108
109
110
111
112
113
114
115#ifndef __s390x__
116#define VMALLOC_START 0x78000000UL
117#define VMALLOC_END 0x7e000000UL
118#define VMEM_MAP_END 0x80000000UL
119#else
120#define VMALLOC_START 0x3e000000000UL
121#define VMALLOC_END 0x3e040000000UL
122#define VMEM_MAP_END 0x40000000000UL
123#endif
124
125
126
127
128
129
130#define VMEM_MAX_PAGES ((VMEM_MAP_END - VMALLOC_END) / sizeof(struct page))
131#define VMEM_MAX_PFN min(VMALLOC_START >> PAGE_SHIFT, VMEM_MAX_PAGES)
132#define VMEM_MAX_PHYS ((VMEM_MAX_PFN << PAGE_SHIFT) & ~((16 << 20) - 1))
133#define vmemmap ((struct page *) VMALLOC_END)
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
216
217
218#define _PAGE_RO 0x200
219#define _PAGE_INVALID 0x400
220
221
222#define _PAGE_SWT 0x001
223#define _PAGE_SWX 0x002
224#define _PAGE_SPECIAL 0x004
225#define __HAVE_ARCH_PTE_SPECIAL
226
227
228#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_SPECIAL)
229
230
231#define _PAGE_TYPE_EMPTY 0x400
232#define _PAGE_TYPE_NONE 0x401
233#define _PAGE_TYPE_SWAP 0x403
234#define _PAGE_TYPE_FILE 0x601
235#define _PAGE_TYPE_RO 0x200
236#define _PAGE_TYPE_RW 0x000
237#define _PAGE_TYPE_EX_RO 0x202
238#define _PAGE_TYPE_EX_RW 0x002
239
240
241
242
243
244#define _HPAGE_TYPE_EMPTY 0x020
245#define _HPAGE_TYPE_NONE 0x220
246#define _HPAGE_TYPE_RO 0x200
247#define _HPAGE_TYPE_RW 0x000
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278#define RCP_PCL_BIT 55
279#define RCP_HR_BIT 54
280#define RCP_HC_BIT 53
281#define RCP_GR_BIT 50
282#define RCP_GC_BIT 49
283
284
285#define KVM_UD_BIT 47
286
287#ifndef __s390x__
288
289
290#define _ASCE_SPACE_SWITCH 0x80000000UL
291#define _ASCE_ORIGIN_MASK 0x7ffff000UL
292#define _ASCE_PRIVATE_SPACE 0x100
293#define _ASCE_ALT_EVENT 0x80
294#define _ASCE_TABLE_LENGTH 0x7f
295
296
297#define _SEGMENT_ENTRY_ORIGIN 0x7fffffc0UL
298#define _SEGMENT_ENTRY_INV 0x20
299#define _SEGMENT_ENTRY_COMMON 0x10
300#define _SEGMENT_ENTRY_PTL 0x0f
301
302#define _SEGMENT_ENTRY (_SEGMENT_ENTRY_PTL)
303#define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV)
304
305#else
306
307
308#define _ASCE_ORIGIN ~0xfffUL
309#define _ASCE_PRIVATE_SPACE 0x100
310#define _ASCE_ALT_EVENT 0x80
311#define _ASCE_SPACE_SWITCH 0x40
312#define _ASCE_REAL_SPACE 0x20
313#define _ASCE_TYPE_MASK 0x0c
314#define _ASCE_TYPE_REGION1 0x0c
315#define _ASCE_TYPE_REGION2 0x08
316#define _ASCE_TYPE_REGION3 0x04
317#define _ASCE_TYPE_SEGMENT 0x00
318#define _ASCE_TABLE_LENGTH 0x03
319
320
321#define _REGION_ENTRY_ORIGIN ~0xfffUL
322#define _REGION_ENTRY_INV 0x20
323#define _REGION_ENTRY_TYPE_MASK 0x0c
324#define _REGION_ENTRY_TYPE_R1 0x0c
325#define _REGION_ENTRY_TYPE_R2 0x08
326#define _REGION_ENTRY_TYPE_R3 0x04
327#define _REGION_ENTRY_LENGTH 0x03
328
329#define _REGION1_ENTRY (_REGION_ENTRY_TYPE_R1 | _REGION_ENTRY_LENGTH)
330#define _REGION1_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R1 | _REGION_ENTRY_INV)
331#define _REGION2_ENTRY (_REGION_ENTRY_TYPE_R2 | _REGION_ENTRY_LENGTH)
332#define _REGION2_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R2 | _REGION_ENTRY_INV)
333#define _REGION3_ENTRY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_LENGTH)
334#define _REGION3_ENTRY_EMPTY (_REGION_ENTRY_TYPE_R3 | _REGION_ENTRY_INV)
335
336
337#define _SEGMENT_ENTRY_ORIGIN ~0x7ffUL
338#define _SEGMENT_ENTRY_RO 0x200
339#define _SEGMENT_ENTRY_INV 0x20
340
341#define _SEGMENT_ENTRY (0)
342#define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INV)
343
344#define _SEGMENT_ENTRY_LARGE 0x400
345#define _SEGMENT_ENTRY_CO 0x100
346
347#endif
348
349
350
351
352
353
354#define _ASCE_USER_BITS (_ASCE_SPACE_SWITCH | _ASCE_PRIVATE_SPACE | \
355 _ASCE_ALT_EVENT)
356
357
358#define _PAGE_CHANGED 0x02
359#define _PAGE_REFERENCED 0x04
360
361
362
363
364#define PAGE_NONE __pgprot(_PAGE_TYPE_NONE)
365#define PAGE_RO __pgprot(_PAGE_TYPE_RO)
366#define PAGE_RW __pgprot(_PAGE_TYPE_RW)
367#define PAGE_EX_RO __pgprot(_PAGE_TYPE_EX_RO)
368#define PAGE_EX_RW __pgprot(_PAGE_TYPE_EX_RW)
369
370#define PAGE_KERNEL PAGE_RW
371#define PAGE_COPY PAGE_RO
372
373
374
375
376
377
378
379
380
381
382#define __P000 PAGE_NONE
383#define __P001 PAGE_RO
384#define __P010 PAGE_RO
385#define __P011 PAGE_RO
386#define __P100 PAGE_EX_RO
387#define __P101 PAGE_EX_RO
388#define __P110 PAGE_EX_RO
389#define __P111 PAGE_EX_RO
390
391#define __S000 PAGE_NONE
392#define __S001 PAGE_RO
393#define __S010 PAGE_RW
394#define __S011 PAGE_RW
395#define __S100 PAGE_EX_RO
396#define __S101 PAGE_EX_RO
397#define __S110 PAGE_EX_RW
398#define __S111 PAGE_EX_RW
399
400#ifndef __s390x__
401# define PxD_SHADOW_SHIFT 1
402#else
403# define PxD_SHADOW_SHIFT 2
404#endif
405
406static inline void *get_shadow_table(void *table)
407{
408 unsigned long addr, offset;
409 struct page *page;
410
411 addr = (unsigned long) table;
412 offset = addr & ((PAGE_SIZE << PxD_SHADOW_SHIFT) - 1);
413 page = virt_to_page((void *)(addr ^ offset));
414 return (void *)(addr_t)(page->index ? (page->index | offset) : 0UL);
415}
416
417
418
419
420
421
422static inline void set_pte_at(struct mm_struct *mm, unsigned long addr,
423 pte_t *ptep, pte_t entry)
424{
425 *ptep = entry;
426 if (mm->context.noexec) {
427 if (!(pte_val(entry) & _PAGE_INVALID) &&
428 (pte_val(entry) & _PAGE_SWX))
429 pte_val(entry) |= _PAGE_RO;
430 else
431 pte_val(entry) = _PAGE_TYPE_EMPTY;
432 ptep[PTRS_PER_PTE] = entry;
433 }
434}
435
436
437
438
439#ifndef __s390x__
440
441static inline int pgd_present(pgd_t pgd) { return 1; }
442static inline int pgd_none(pgd_t pgd) { return 0; }
443static inline int pgd_bad(pgd_t pgd) { return 0; }
444
445static inline int pud_present(pud_t pud) { return 1; }
446static inline int pud_none(pud_t pud) { return 0; }
447static inline int pud_bad(pud_t pud) { return 0; }
448
449#else
450
451static inline int pgd_present(pgd_t pgd)
452{
453 if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2)
454 return 1;
455 return (pgd_val(pgd) & _REGION_ENTRY_ORIGIN) != 0UL;
456}
457
458static inline int pgd_none(pgd_t pgd)
459{
460 if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2)
461 return 0;
462 return (pgd_val(pgd) & _REGION_ENTRY_INV) != 0UL;
463}
464
465static inline int pgd_bad(pgd_t pgd)
466{
467
468
469
470
471
472 unsigned long mask =
473 ~_SEGMENT_ENTRY_ORIGIN & ~_REGION_ENTRY_INV &
474 ~_REGION_ENTRY_TYPE_MASK & ~_REGION_ENTRY_LENGTH;
475 return (pgd_val(pgd) & mask) != 0;
476}
477
478static inline int pud_present(pud_t pud)
479{
480 if ((pud_val(pud) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R3)
481 return 1;
482 return (pud_val(pud) & _REGION_ENTRY_ORIGIN) != 0UL;
483}
484
485static inline int pud_none(pud_t pud)
486{
487 if ((pud_val(pud) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R3)
488 return 0;
489 return (pud_val(pud) & _REGION_ENTRY_INV) != 0UL;
490}
491
492static inline int pud_bad(pud_t pud)
493{
494
495
496
497
498
499 unsigned long mask =
500 ~_SEGMENT_ENTRY_ORIGIN & ~_REGION_ENTRY_INV &
501 ~_REGION_ENTRY_TYPE_MASK & ~_REGION_ENTRY_LENGTH;
502 return (pud_val(pud) & mask) != 0;
503}
504
505#endif
506
507static inline int pmd_present(pmd_t pmd)
508{
509 return (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN) != 0UL;
510}
511
512static inline int pmd_none(pmd_t pmd)
513{
514 return (pmd_val(pmd) & _SEGMENT_ENTRY_INV) != 0UL;
515}
516
517static inline int pmd_bad(pmd_t pmd)
518{
519 unsigned long mask = ~_SEGMENT_ENTRY_ORIGIN & ~_SEGMENT_ENTRY_INV;
520 return (pmd_val(pmd) & mask) != _SEGMENT_ENTRY;
521}
522
523static inline int pte_none(pte_t pte)
524{
525 return (pte_val(pte) & _PAGE_INVALID) && !(pte_val(pte) & _PAGE_SWT);
526}
527
528static inline int pte_present(pte_t pte)
529{
530 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT | _PAGE_SWX;
531 return (pte_val(pte) & mask) == _PAGE_TYPE_NONE ||
532 (!(pte_val(pte) & _PAGE_INVALID) &&
533 !(pte_val(pte) & _PAGE_SWT));
534}
535
536static inline int pte_file(pte_t pte)
537{
538 unsigned long mask = _PAGE_RO | _PAGE_INVALID | _PAGE_SWT;
539 return (pte_val(pte) & mask) == _PAGE_TYPE_FILE;
540}
541
542static inline int pte_special(pte_t pte)
543{
544 return (pte_val(pte) & _PAGE_SPECIAL);
545}
546
547#define __HAVE_ARCH_PTE_SAME
548#define pte_same(a,b) (pte_val(a) == pte_val(b))
549
550static inline void rcp_lock(pte_t *ptep)
551{
552#ifdef CONFIG_PGSTE
553 unsigned long *pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
554 preempt_disable();
555 while (test_and_set_bit(RCP_PCL_BIT, pgste))
556 ;
557#endif
558}
559
560static inline void rcp_unlock(pte_t *ptep)
561{
562#ifdef CONFIG_PGSTE
563 unsigned long *pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
564 clear_bit(RCP_PCL_BIT, pgste);
565 preempt_enable();
566#endif
567}
568
569
570static inline void page_clear_dirty(struct page *page);
571#include <linux/page-flags.h>
572
573static inline void ptep_rcp_copy(pte_t *ptep)
574{
575#ifdef CONFIG_PGSTE
576 struct page *page = virt_to_page(pte_val(*ptep));
577 unsigned int skey;
578 unsigned long *pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
579
580 skey = page_get_storage_key(page_to_phys(page));
581 if (skey & _PAGE_CHANGED) {
582 set_bit_simple(RCP_GC_BIT, pgste);
583 set_bit_simple(KVM_UD_BIT, pgste);
584 }
585 if (skey & _PAGE_REFERENCED)
586 set_bit_simple(RCP_GR_BIT, pgste);
587 if (test_and_clear_bit_simple(RCP_HC_BIT, pgste)) {
588 SetPageDirty(page);
589 set_bit_simple(KVM_UD_BIT, pgste);
590 }
591 if (test_and_clear_bit_simple(RCP_HR_BIT, pgste))
592 SetPageReferenced(page);
593#endif
594}
595
596
597
598
599
600static inline int pte_write(pte_t pte)
601{
602 return (pte_val(pte) & _PAGE_RO) == 0;
603}
604
605static inline int pte_dirty(pte_t pte)
606{
607
608
609
610
611 return 0;
612}
613
614static inline int pte_young(pte_t pte)
615{
616
617
618
619
620 return 0;
621}
622
623
624
625
626
627#ifndef __s390x__
628
629#define pgd_clear(pgd) do { } while (0)
630#define pud_clear(pud) do { } while (0)
631
632#else
633
634static inline void pgd_clear_kernel(pgd_t * pgd)
635{
636 if ((pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R2)
637 pgd_val(*pgd) = _REGION2_ENTRY_EMPTY;
638}
639
640static inline void pgd_clear(pgd_t * pgd)
641{
642 pgd_t *shadow = get_shadow_table(pgd);
643
644 pgd_clear_kernel(pgd);
645 if (shadow)
646 pgd_clear_kernel(shadow);
647}
648
649static inline void pud_clear_kernel(pud_t *pud)
650{
651 if ((pud_val(*pud) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
652 pud_val(*pud) = _REGION3_ENTRY_EMPTY;
653}
654
655static inline void pud_clear(pud_t *pud)
656{
657 pud_t *shadow = get_shadow_table(pud);
658
659 pud_clear_kernel(pud);
660 if (shadow)
661 pud_clear_kernel(shadow);
662}
663
664#endif
665
666static inline void pmd_clear_kernel(pmd_t * pmdp)
667{
668 pmd_val(*pmdp) = _SEGMENT_ENTRY_EMPTY;
669}
670
671static inline void pmd_clear(pmd_t *pmd)
672{
673 pmd_t *shadow = get_shadow_table(pmd);
674
675 pmd_clear_kernel(pmd);
676 if (shadow)
677 pmd_clear_kernel(shadow);
678}
679
680static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
681{
682 pte_val(*ptep) = _PAGE_TYPE_EMPTY;
683 if (mm->context.noexec)
684 pte_val(ptep[PTRS_PER_PTE]) = _PAGE_TYPE_EMPTY;
685}
686
687
688
689
690
691static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
692{
693 pte_val(pte) &= _PAGE_CHG_MASK;
694 pte_val(pte) |= pgprot_val(newprot);
695 return pte;
696}
697
698static inline pte_t pte_wrprotect(pte_t pte)
699{
700
701 if (!(pte_val(pte) & _PAGE_INVALID))
702 pte_val(pte) |= _PAGE_RO;
703 return pte;
704}
705
706static inline pte_t pte_mkwrite(pte_t pte)
707{
708 pte_val(pte) &= ~_PAGE_RO;
709 return pte;
710}
711
712static inline pte_t pte_mkclean(pte_t pte)
713{
714
715
716
717
718 return pte;
719}
720
721static inline pte_t pte_mkdirty(pte_t pte)
722{
723
724
725
726
727 return pte;
728}
729
730static inline pte_t pte_mkold(pte_t pte)
731{
732
733
734
735 return pte;
736}
737
738static inline pte_t pte_mkyoung(pte_t pte)
739{
740
741
742
743 return pte;
744}
745
746static inline pte_t pte_mkspecial(pte_t pte)
747{
748 pte_val(pte) |= _PAGE_SPECIAL;
749 return pte;
750}
751
752#ifdef CONFIG_PGSTE
753
754
755
756static inline int kvm_s390_test_and_clear_page_dirty(struct mm_struct *mm,
757 pte_t *ptep)
758{
759 int dirty;
760 unsigned long *pgste;
761 struct page *page;
762 unsigned int skey;
763
764 if (!mm->context.has_pgste)
765 return -EINVAL;
766 rcp_lock(ptep);
767 pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
768 page = virt_to_page(pte_val(*ptep));
769 skey = page_get_storage_key(page_to_phys(page));
770 if (skey & _PAGE_CHANGED) {
771 set_bit_simple(RCP_GC_BIT, pgste);
772 set_bit_simple(KVM_UD_BIT, pgste);
773 }
774 if (test_and_clear_bit_simple(RCP_HC_BIT, pgste)) {
775 SetPageDirty(page);
776 set_bit_simple(KVM_UD_BIT, pgste);
777 }
778 dirty = test_and_clear_bit_simple(KVM_UD_BIT, pgste);
779 if (skey & _PAGE_CHANGED)
780 page_clear_dirty(page);
781 rcp_unlock(ptep);
782 return dirty;
783}
784#endif
785
786#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
787static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
788 unsigned long addr, pte_t *ptep)
789{
790#ifdef CONFIG_PGSTE
791 unsigned long physpage;
792 int young;
793 unsigned long *pgste;
794
795 if (!vma->vm_mm->context.has_pgste)
796 return 0;
797 physpage = pte_val(*ptep) & PAGE_MASK;
798 pgste = (unsigned long *) (ptep + PTRS_PER_PTE);
799
800 young = ((page_get_storage_key(physpage) & _PAGE_REFERENCED) != 0);
801 rcp_lock(ptep);
802 if (young)
803 set_bit_simple(RCP_GR_BIT, pgste);
804 young |= test_and_clear_bit_simple(RCP_HR_BIT, pgste);
805 rcp_unlock(ptep);
806 return young;
807#endif
808 return 0;
809}
810
811#define __HAVE_ARCH_PTEP_CLEAR_YOUNG_FLUSH
812static inline int ptep_clear_flush_young(struct vm_area_struct *vma,
813 unsigned long address, pte_t *ptep)
814{
815
816
817
818
819#ifdef CONFIG_PGSTE
820 return ptep_test_and_clear_young(vma, address, ptep);
821#endif
822 return 0;
823}
824
825static inline void __ptep_ipte(unsigned long address, pte_t *ptep)
826{
827 if (!(pte_val(*ptep) & _PAGE_INVALID)) {
828#ifndef __s390x__
829
830 pte_t *pto = (pte_t *) (((unsigned long) ptep) & 0x7ffffc00);
831#else
832
833 pte_t *pto = ptep;
834#endif
835 asm volatile(
836 " ipte %2,%3"
837 : "=m" (*ptep) : "m" (*ptep),
838 "a" (pto), "a" (address));
839 }
840}
841
842static inline void ptep_invalidate(struct mm_struct *mm,
843 unsigned long address, pte_t *ptep)
844{
845 if (mm->context.has_pgste) {
846 rcp_lock(ptep);
847 __ptep_ipte(address, ptep);
848 ptep_rcp_copy(ptep);
849 pte_val(*ptep) = _PAGE_TYPE_EMPTY;
850 rcp_unlock(ptep);
851 return;
852 }
853 __ptep_ipte(address, ptep);
854 pte_val(*ptep) = _PAGE_TYPE_EMPTY;
855 if (mm->context.noexec) {
856 __ptep_ipte(address, ptep + PTRS_PER_PTE);
857 pte_val(*(ptep + PTRS_PER_PTE)) = _PAGE_TYPE_EMPTY;
858 }
859}
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
875#define ptep_get_and_clear(__mm, __address, __ptep) \
876({ \
877 pte_t __pte = *(__ptep); \
878 if (atomic_read(&(__mm)->mm_users) > 1 || \
879 (__mm) != current->active_mm) \
880 ptep_invalidate(__mm, __address, __ptep); \
881 else \
882 pte_clear((__mm), (__address), (__ptep)); \
883 __pte; \
884})
885
886#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
887static inline pte_t ptep_clear_flush(struct vm_area_struct *vma,
888 unsigned long address, pte_t *ptep)
889{
890 pte_t pte = *ptep;
891 ptep_invalidate(vma->vm_mm, address, ptep);
892 return pte;
893}
894
895
896
897
898
899
900
901
902#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
903static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
904 unsigned long addr,
905 pte_t *ptep, int full)
906{
907 pte_t pte = *ptep;
908
909 if (full)
910 pte_clear(mm, addr, ptep);
911 else
912 ptep_invalidate(mm, addr, ptep);
913 return pte;
914}
915
916#define __HAVE_ARCH_PTEP_SET_WRPROTECT
917#define ptep_set_wrprotect(__mm, __addr, __ptep) \
918({ \
919 pte_t __pte = *(__ptep); \
920 if (pte_write(__pte)) { \
921 if (atomic_read(&(__mm)->mm_users) > 1 || \
922 (__mm) != current->active_mm) \
923 ptep_invalidate(__mm, __addr, __ptep); \
924 set_pte_at(__mm, __addr, __ptep, pte_wrprotect(__pte)); \
925 } \
926})
927
928#define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
929#define ptep_set_access_flags(__vma, __addr, __ptep, __entry, __dirty) \
930({ \
931 int __changed = !pte_same(*(__ptep), __entry); \
932 if (__changed) { \
933 ptep_invalidate((__vma)->vm_mm, __addr, __ptep); \
934 set_pte_at((__vma)->vm_mm, __addr, __ptep, __entry); \
935 } \
936 __changed; \
937})
938
939
940
941
942
943
944
945
946#define __HAVE_ARCH_PAGE_TEST_DIRTY
947static inline int page_test_dirty(struct page *page)
948{
949 return (page_get_storage_key(page_to_phys(page)) & _PAGE_CHANGED) != 0;
950}
951
952#define __HAVE_ARCH_PAGE_CLEAR_DIRTY
953static inline void page_clear_dirty(struct page *page)
954{
955 page_set_storage_key(page_to_phys(page), PAGE_DEFAULT_KEY);
956}
957
958
959
960
961#define __HAVE_ARCH_PAGE_TEST_AND_CLEAR_YOUNG
962static inline int page_test_and_clear_young(struct page *page)
963{
964 unsigned long physpage = page_to_phys(page);
965 int ccode;
966
967 asm volatile(
968 " rrbe 0,%1\n"
969 " ipm %0\n"
970 " srl %0,28\n"
971 : "=d" (ccode) : "a" (physpage) : "cc" );
972 return ccode & 2;
973}
974
975
976
977
978
979static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
980{
981 pte_t __pte;
982 pte_val(__pte) = physpage + pgprot_val(pgprot);
983 return __pte;
984}
985
986static inline pte_t mk_pte(struct page *page, pgprot_t pgprot)
987{
988 unsigned long physpage = page_to_phys(page);
989
990 return mk_pte_phys(physpage, pgprot);
991}
992
993#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
994#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
995#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
996#define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE-1))
997
998#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
999#define pgd_offset_k(address) pgd_offset(&init_mm, address)
1000
1001#ifndef __s390x__
1002
1003#define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN)
1004#define pud_deref(pmd) ({ BUG(); 0UL; })
1005#define pgd_deref(pmd) ({ BUG(); 0UL; })
1006
1007#define pud_offset(pgd, address) ((pud_t *) pgd)
1008#define pmd_offset(pud, address) ((pmd_t *) pud + pmd_index(address))
1009
1010#else
1011
1012#define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN)
1013#define pud_deref(pud) (pud_val(pud) & _REGION_ENTRY_ORIGIN)
1014#define pgd_deref(pgd) (pgd_val(pgd) & _REGION_ENTRY_ORIGIN)
1015
1016static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address)
1017{
1018 pud_t *pud = (pud_t *) pgd;
1019 if ((pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R2)
1020 pud = (pud_t *) pgd_deref(*pgd);
1021 return pud + pud_index(address);
1022}
1023
1024static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address)
1025{
1026 pmd_t *pmd = (pmd_t *) pud;
1027 if ((pud_val(*pud) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
1028 pmd = (pmd_t *) pud_deref(*pud);
1029 return pmd + pmd_index(address);
1030}
1031
1032#endif
1033
1034#define pfn_pte(pfn,pgprot) mk_pte_phys(__pa((pfn) << PAGE_SHIFT),(pgprot))
1035#define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT)
1036#define pte_page(x) pfn_to_page(pte_pfn(x))
1037
1038#define pmd_page(pmd) pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)
1039
1040
1041#define pte_offset(pmd, addr) ((pte_t *) pmd_deref(*(pmd)) + pte_index(addr))
1042#define pte_offset_kernel(pmd, address) pte_offset(pmd,address)
1043#define pte_offset_map(pmd, address) pte_offset_kernel(pmd, address)
1044#define pte_offset_map_nested(pmd, address) pte_offset_kernel(pmd, address)
1045#define pte_unmap(pte) do { } while (0)
1046#define pte_unmap_nested(pte) do { } while (0)
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083#ifndef __s390x__
1084#define __SWP_OFFSET_MASK (~0UL >> 12)
1085#else
1086#define __SWP_OFFSET_MASK (~0UL >> 11)
1087#endif
1088static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
1089{
1090 pte_t pte;
1091 offset &= __SWP_OFFSET_MASK;
1092 pte_val(pte) = _PAGE_TYPE_SWAP | ((type & 0x1f) << 2) |
1093 ((offset & 1UL) << 7) | ((offset & ~1UL) << 11);
1094 return pte;
1095}
1096
1097#define __swp_type(entry) (((entry).val >> 2) & 0x1f)
1098#define __swp_offset(entry) (((entry).val >> 11) | (((entry).val >> 7) & 1))
1099#define __swp_entry(type,offset) ((swp_entry_t) { pte_val(mk_swap_pte((type),(offset))) })
1100
1101#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
1102#define __swp_entry_to_pte(x) ((pte_t) { (x).val })
1103
1104#ifndef __s390x__
1105# define PTE_FILE_MAX_BITS 26
1106#else
1107# define PTE_FILE_MAX_BITS 59
1108#endif
1109
1110#define pte_to_pgoff(__pte) \
1111 ((((__pte).pte >> 12) << 7) + (((__pte).pte >> 1) & 0x7f))
1112
1113#define pgoff_to_pte(__off) \
1114 ((pte_t) { ((((__off) & 0x7f) << 1) + (((__off) >> 7) << 12)) \
1115 | _PAGE_TYPE_FILE })
1116
1117#endif
1118
1119#define kern_addr_valid(addr) (1)
1120
1121extern int vmem_add_mapping(unsigned long start, unsigned long size);
1122extern int vmem_remove_mapping(unsigned long start, unsigned long size);
1123extern int s390_enable_sie(void);
1124
1125
1126
1127
1128#define pgtable_cache_init() do { } while (0)
1129
1130#include <asm-generic/pgtable.h>
1131
1132#endif
1133