diff options
Diffstat (limited to 'arch/s390/include/asm/pgtable.h')
-rw-r--r-- | arch/s390/include/asm/pgtable.h | 125 |
1 files changed, 5 insertions, 120 deletions
diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h index e08ec38f8c6e..989cfae9e202 100644 --- a/arch/s390/include/asm/pgtable.h +++ b/arch/s390/include/asm/pgtable.h | |||
@@ -66,15 +66,9 @@ extern unsigned long zero_page_mask; | |||
66 | * table can map | 66 | * table can map |
67 | * PGDIR_SHIFT determines what a third-level page table entry can map | 67 | * PGDIR_SHIFT determines what a third-level page table entry can map |
68 | */ | 68 | */ |
69 | #ifndef CONFIG_64BIT | 69 | #define PMD_SHIFT 20 |
70 | # define PMD_SHIFT 20 | 70 | #define PUD_SHIFT 31 |
71 | # define PUD_SHIFT 20 | 71 | #define PGDIR_SHIFT 42 |
72 | # define PGDIR_SHIFT 20 | ||
73 | #else /* CONFIG_64BIT */ | ||
74 | # define PMD_SHIFT 20 | ||
75 | # define PUD_SHIFT 31 | ||
76 | # define PGDIR_SHIFT 42 | ||
77 | #endif /* CONFIG_64BIT */ | ||
78 | 72 | ||
79 | #define PMD_SIZE (1UL << PMD_SHIFT) | 73 | #define PMD_SIZE (1UL << PMD_SHIFT) |
80 | #define PMD_MASK (~(PMD_SIZE-1)) | 74 | #define PMD_MASK (~(PMD_SIZE-1)) |
@@ -90,15 +84,8 @@ extern unsigned long zero_page_mask; | |||
90 | * that leads to 1024 pte per pgd | 84 | * that leads to 1024 pte per pgd |
91 | */ | 85 | */ |
92 | #define PTRS_PER_PTE 256 | 86 | #define PTRS_PER_PTE 256 |
93 | #ifndef CONFIG_64BIT | ||
94 | #define __PAGETABLE_PUD_FOLDED | ||
95 | #define PTRS_PER_PMD 1 | ||
96 | #define __PAGETABLE_PMD_FOLDED | ||
97 | #define PTRS_PER_PUD 1 | ||
98 | #else /* CONFIG_64BIT */ | ||
99 | #define PTRS_PER_PMD 2048 | 87 | #define PTRS_PER_PMD 2048 |
100 | #define PTRS_PER_PUD 2048 | 88 | #define PTRS_PER_PUD 2048 |
101 | #endif /* CONFIG_64BIT */ | ||
102 | #define PTRS_PER_PGD 2048 | 89 | #define PTRS_PER_PGD 2048 |
103 | 90 | ||
104 | #define FIRST_USER_ADDRESS 0UL | 91 | #define FIRST_USER_ADDRESS 0UL |
@@ -127,23 +114,19 @@ extern struct page *vmemmap; | |||
127 | 114 | ||
128 | #define VMEM_MAX_PHYS ((unsigned long) vmemmap) | 115 | #define VMEM_MAX_PHYS ((unsigned long) vmemmap) |
129 | 116 | ||
130 | #ifdef CONFIG_64BIT | ||
131 | extern unsigned long MODULES_VADDR; | 117 | extern unsigned long MODULES_VADDR; |
132 | extern unsigned long MODULES_END; | 118 | extern unsigned long MODULES_END; |
133 | #define MODULES_VADDR MODULES_VADDR | 119 | #define MODULES_VADDR MODULES_VADDR |
134 | #define MODULES_END MODULES_END | 120 | #define MODULES_END MODULES_END |
135 | #define MODULES_LEN (1UL << 31) | 121 | #define MODULES_LEN (1UL << 31) |
136 | #endif | ||
137 | 122 | ||
138 | static inline int is_module_addr(void *addr) | 123 | static inline int is_module_addr(void *addr) |
139 | { | 124 | { |
140 | #ifdef CONFIG_64BIT | ||
141 | BUILD_BUG_ON(MODULES_LEN > (1UL << 31)); | 125 | BUILD_BUG_ON(MODULES_LEN > (1UL << 31)); |
142 | if (addr < (void *)MODULES_VADDR) | 126 | if (addr < (void *)MODULES_VADDR) |
143 | return 0; | 127 | return 0; |
144 | if (addr > (void *)MODULES_END) | 128 | if (addr > (void *)MODULES_END) |
145 | return 0; | 129 | return 0; |
146 | #endif | ||
147 | return 1; | 130 | return 1; |
148 | } | 131 | } |
149 | 132 | ||
@@ -284,56 +267,6 @@ static inline int is_module_addr(void *addr) | |||
284 | * pte_swap is true for the bit pattern .10...xxxx10, (pte & 0x603) == 0x402 | 267 | * pte_swap is true for the bit pattern .10...xxxx10, (pte & 0x603) == 0x402 |
285 | */ | 268 | */ |
286 | 269 | ||
287 | #ifndef CONFIG_64BIT | ||
288 | |||
289 | /* Bits in the segment table address-space-control-element */ | ||
290 | #define _ASCE_SPACE_SWITCH 0x80000000UL /* space switch event */ | ||
291 | #define _ASCE_ORIGIN_MASK 0x7ffff000UL /* segment table origin */ | ||
292 | #define _ASCE_PRIVATE_SPACE 0x100 /* private space control */ | ||
293 | #define _ASCE_ALT_EVENT 0x80 /* storage alteration event control */ | ||
294 | #define _ASCE_TABLE_LENGTH 0x7f /* 128 x 64 entries = 8k */ | ||
295 | |||
296 | /* Bits in the segment table entry */ | ||
297 | #define _SEGMENT_ENTRY_BITS 0x7fffffffUL /* Valid segment table bits */ | ||
298 | #define _SEGMENT_ENTRY_ORIGIN 0x7fffffc0UL /* page table origin */ | ||
299 | #define _SEGMENT_ENTRY_PROTECT 0x200 /* page protection bit */ | ||
300 | #define _SEGMENT_ENTRY_INVALID 0x20 /* invalid segment table entry */ | ||
301 | #define _SEGMENT_ENTRY_COMMON 0x10 /* common segment bit */ | ||
302 | #define _SEGMENT_ENTRY_PTL 0x0f /* page table length */ | ||
303 | |||
304 | #define _SEGMENT_ENTRY_DIRTY 0 /* No sw dirty bit for 31-bit */ | ||
305 | #define _SEGMENT_ENTRY_YOUNG 0 /* No sw young bit for 31-bit */ | ||
306 | #define _SEGMENT_ENTRY_READ 0 /* No sw read bit for 31-bit */ | ||
307 | #define _SEGMENT_ENTRY_WRITE 0 /* No sw write bit for 31-bit */ | ||
308 | #define _SEGMENT_ENTRY_LARGE 0 /* No large pages for 31-bit */ | ||
309 | #define _SEGMENT_ENTRY_BITS_LARGE 0 | ||
310 | #define _SEGMENT_ENTRY_ORIGIN_LARGE 0 | ||
311 | |||
312 | #define _SEGMENT_ENTRY (_SEGMENT_ENTRY_PTL) | ||
313 | #define _SEGMENT_ENTRY_EMPTY (_SEGMENT_ENTRY_INVALID) | ||
314 | |||
315 | /* | ||
316 | * Segment table entry encoding (I = invalid, R = read-only bit): | ||
317 | * ..R...I..... | ||
318 | * prot-none ..1...1..... | ||
319 | * read-only ..1...0..... | ||
320 | * read-write ..0...0..... | ||
321 | * empty ..0...1..... | ||
322 | */ | ||
323 | |||
324 | /* Page status table bits for virtualization */ | ||
325 | #define PGSTE_ACC_BITS 0xf0000000UL | ||
326 | #define PGSTE_FP_BIT 0x08000000UL | ||
327 | #define PGSTE_PCL_BIT 0x00800000UL | ||
328 | #define PGSTE_HR_BIT 0x00400000UL | ||
329 | #define PGSTE_HC_BIT 0x00200000UL | ||
330 | #define PGSTE_GR_BIT 0x00040000UL | ||
331 | #define PGSTE_GC_BIT 0x00020000UL | ||
332 | #define PGSTE_UC_BIT 0x00008000UL /* user dirty (migration) */ | ||
333 | #define PGSTE_IN_BIT 0x00004000UL /* IPTE notify bit */ | ||
334 | |||
335 | #else /* CONFIG_64BIT */ | ||
336 | |||
337 | /* Bits in the segment/region table address-space-control-element */ | 270 | /* Bits in the segment/region table address-space-control-element */ |
338 | #define _ASCE_ORIGIN ~0xfffUL/* segment table origin */ | 271 | #define _ASCE_ORIGIN ~0xfffUL/* segment table origin */ |
339 | #define _ASCE_PRIVATE_SPACE 0x100 /* private space control */ | 272 | #define _ASCE_PRIVATE_SPACE 0x100 /* private space control */ |
@@ -417,8 +350,6 @@ static inline int is_module_addr(void *addr) | |||
417 | #define PGSTE_UC_BIT 0x0000800000000000UL /* user dirty (migration) */ | 350 | #define PGSTE_UC_BIT 0x0000800000000000UL /* user dirty (migration) */ |
418 | #define PGSTE_IN_BIT 0x0000400000000000UL /* IPTE notify bit */ | 351 | #define PGSTE_IN_BIT 0x0000400000000000UL /* IPTE notify bit */ |
419 | 352 | ||
420 | #endif /* CONFIG_64BIT */ | ||
421 | |||
422 | /* Guest Page State used for virtualization */ | 353 | /* Guest Page State used for virtualization */ |
423 | #define _PGSTE_GPS_ZERO 0x0000000080000000UL | 354 | #define _PGSTE_GPS_ZERO 0x0000000080000000UL |
424 | #define _PGSTE_GPS_USAGE_MASK 0x0000000003000000UL | 355 | #define _PGSTE_GPS_USAGE_MASK 0x0000000003000000UL |
@@ -509,19 +440,6 @@ static inline int mm_use_skey(struct mm_struct *mm) | |||
509 | /* | 440 | /* |
510 | * pgd/pmd/pte query functions | 441 | * pgd/pmd/pte query functions |
511 | */ | 442 | */ |
512 | #ifndef CONFIG_64BIT | ||
513 | |||
514 | static inline int pgd_present(pgd_t pgd) { return 1; } | ||
515 | static inline int pgd_none(pgd_t pgd) { return 0; } | ||
516 | static inline int pgd_bad(pgd_t pgd) { return 0; } | ||
517 | |||
518 | static inline int pud_present(pud_t pud) { return 1; } | ||
519 | static inline int pud_none(pud_t pud) { return 0; } | ||
520 | static inline int pud_large(pud_t pud) { return 0; } | ||
521 | static inline int pud_bad(pud_t pud) { return 0; } | ||
522 | |||
523 | #else /* CONFIG_64BIT */ | ||
524 | |||
525 | static inline int pgd_present(pgd_t pgd) | 443 | static inline int pgd_present(pgd_t pgd) |
526 | { | 444 | { |
527 | if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2) | 445 | if ((pgd_val(pgd) & _REGION_ENTRY_TYPE_MASK) < _REGION_ENTRY_TYPE_R2) |
@@ -583,8 +501,6 @@ static inline int pud_bad(pud_t pud) | |||
583 | return (pud_val(pud) & mask) != 0; | 501 | return (pud_val(pud) & mask) != 0; |
584 | } | 502 | } |
585 | 503 | ||
586 | #endif /* CONFIG_64BIT */ | ||
587 | |||
588 | static inline int pmd_present(pmd_t pmd) | 504 | static inline int pmd_present(pmd_t pmd) |
589 | { | 505 | { |
590 | return pmd_val(pmd) != _SEGMENT_ENTRY_INVALID; | 506 | return pmd_val(pmd) != _SEGMENT_ENTRY_INVALID; |
@@ -916,18 +832,14 @@ static inline int pte_unused(pte_t pte) | |||
916 | 832 | ||
917 | static inline void pgd_clear(pgd_t *pgd) | 833 | static inline void pgd_clear(pgd_t *pgd) |
918 | { | 834 | { |
919 | #ifdef CONFIG_64BIT | ||
920 | if ((pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R2) | 835 | if ((pgd_val(*pgd) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R2) |
921 | pgd_val(*pgd) = _REGION2_ENTRY_EMPTY; | 836 | pgd_val(*pgd) = _REGION2_ENTRY_EMPTY; |
922 | #endif | ||
923 | } | 837 | } |
924 | 838 | ||
925 | static inline void pud_clear(pud_t *pud) | 839 | static inline void pud_clear(pud_t *pud) |
926 | { | 840 | { |
927 | #ifdef CONFIG_64BIT | ||
928 | if ((pud_val(*pud) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3) | 841 | if ((pud_val(*pud) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3) |
929 | pud_val(*pud) = _REGION3_ENTRY_EMPTY; | 842 | pud_val(*pud) = _REGION3_ENTRY_EMPTY; |
930 | #endif | ||
931 | } | 843 | } |
932 | 844 | ||
933 | static inline void pmd_clear(pmd_t *pmdp) | 845 | static inline void pmd_clear(pmd_t *pmdp) |
@@ -1026,10 +938,6 @@ static inline void __ptep_ipte(unsigned long address, pte_t *ptep) | |||
1026 | { | 938 | { |
1027 | unsigned long pto = (unsigned long) ptep; | 939 | unsigned long pto = (unsigned long) ptep; |
1028 | 940 | ||
1029 | #ifndef CONFIG_64BIT | ||
1030 | /* pto in ESA mode must point to the start of the segment table */ | ||
1031 | pto &= 0x7ffffc00; | ||
1032 | #endif | ||
1033 | /* Invalidation + global TLB flush for the pte */ | 941 | /* Invalidation + global TLB flush for the pte */ |
1034 | asm volatile( | 942 | asm volatile( |
1035 | " ipte %2,%3" | 943 | " ipte %2,%3" |
@@ -1040,10 +948,6 @@ static inline void __ptep_ipte_local(unsigned long address, pte_t *ptep) | |||
1040 | { | 948 | { |
1041 | unsigned long pto = (unsigned long) ptep; | 949 | unsigned long pto = (unsigned long) ptep; |
1042 | 950 | ||
1043 | #ifndef CONFIG_64BIT | ||
1044 | /* pto in ESA mode must point to the start of the segment table */ | ||
1045 | pto &= 0x7ffffc00; | ||
1046 | #endif | ||
1047 | /* Invalidation + local TLB flush for the pte */ | 951 | /* Invalidation + local TLB flush for the pte */ |
1048 | asm volatile( | 952 | asm volatile( |
1049 | " .insn rrf,0xb2210000,%2,%3,0,1" | 953 | " .insn rrf,0xb2210000,%2,%3,0,1" |
@@ -1054,10 +958,6 @@ static inline void __ptep_ipte_range(unsigned long address, int nr, pte_t *ptep) | |||
1054 | { | 958 | { |
1055 | unsigned long pto = (unsigned long) ptep; | 959 | unsigned long pto = (unsigned long) ptep; |
1056 | 960 | ||
1057 | #ifndef CONFIG_64BIT | ||
1058 | /* pto in ESA mode must point to the start of the segment table */ | ||
1059 | pto &= 0x7ffffc00; | ||
1060 | #endif | ||
1061 | /* Invalidate a range of ptes + global TLB flush of the ptes */ | 961 | /* Invalidate a range of ptes + global TLB flush of the ptes */ |
1062 | do { | 962 | do { |
1063 | asm volatile( | 963 | asm volatile( |
@@ -1376,17 +1276,6 @@ static inline pte_t mk_pte(struct page *page, pgprot_t pgprot) | |||
1376 | #define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) | 1276 | #define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address)) |
1377 | #define pgd_offset_k(address) pgd_offset(&init_mm, address) | 1277 | #define pgd_offset_k(address) pgd_offset(&init_mm, address) |
1378 | 1278 | ||
1379 | #ifndef CONFIG_64BIT | ||
1380 | |||
1381 | #define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN) | ||
1382 | #define pud_deref(pmd) ({ BUG(); 0UL; }) | ||
1383 | #define pgd_deref(pmd) ({ BUG(); 0UL; }) | ||
1384 | |||
1385 | #define pud_offset(pgd, address) ((pud_t *) pgd) | ||
1386 | #define pmd_offset(pud, address) ((pmd_t *) pud + pmd_index(address)) | ||
1387 | |||
1388 | #else /* CONFIG_64BIT */ | ||
1389 | |||
1390 | #define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN) | 1279 | #define pmd_deref(pmd) (pmd_val(pmd) & _SEGMENT_ENTRY_ORIGIN) |
1391 | #define pud_deref(pud) (pud_val(pud) & _REGION_ENTRY_ORIGIN) | 1280 | #define pud_deref(pud) (pud_val(pud) & _REGION_ENTRY_ORIGIN) |
1392 | #define pgd_deref(pgd) (pgd_val(pgd) & _REGION_ENTRY_ORIGIN) | 1281 | #define pgd_deref(pgd) (pgd_val(pgd) & _REGION_ENTRY_ORIGIN) |
@@ -1407,8 +1296,6 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) | |||
1407 | return pmd + pmd_index(address); | 1296 | return pmd + pmd_index(address); |
1408 | } | 1297 | } |
1409 | 1298 | ||
1410 | #endif /* CONFIG_64BIT */ | ||
1411 | |||
1412 | #define pfn_pte(pfn,pgprot) mk_pte_phys(__pa((pfn) << PAGE_SHIFT),(pgprot)) | 1299 | #define pfn_pte(pfn,pgprot) mk_pte_phys(__pa((pfn) << PAGE_SHIFT),(pgprot)) |
1413 | #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT) | 1300 | #define pte_pfn(x) (pte_val(x) >> PAGE_SHIFT) |
1414 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | 1301 | #define pte_page(x) pfn_to_page(pte_pfn(x)) |
@@ -1729,11 +1616,9 @@ static inline int has_transparent_hugepage(void) | |||
1729 | * 0000000000111111111122222222223333333333444444444455 5555 5 55566 66 | 1616 | * 0000000000111111111122222222223333333333444444444455 5555 5 55566 66 |
1730 | * 0123456789012345678901234567890123456789012345678901 2345 6 78901 23 | 1617 | * 0123456789012345678901234567890123456789012345678901 2345 6 78901 23 |
1731 | */ | 1618 | */ |
1732 | #ifndef CONFIG_64BIT | 1619 | |
1733 | #define __SWP_OFFSET_MASK (~0UL >> 12) | ||
1734 | #else | ||
1735 | #define __SWP_OFFSET_MASK (~0UL >> 11) | 1620 | #define __SWP_OFFSET_MASK (~0UL >> 11) |
1736 | #endif | 1621 | |
1737 | static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) | 1622 | static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) |
1738 | { | 1623 | { |
1739 | pte_t pte; | 1624 | pte_t pte; |