aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/include/asm/pgtable.h
diff options
context:
space:
mode:
Diffstat (limited to 'arch/s390/include/asm/pgtable.h')
-rw-r--r--arch/s390/include/asm/pgtable.h125
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
131extern unsigned long MODULES_VADDR; 117extern unsigned long MODULES_VADDR;
132extern unsigned long MODULES_END; 118extern 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
138static inline int is_module_addr(void *addr) 123static 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
514static inline int pgd_present(pgd_t pgd) { return 1; }
515static inline int pgd_none(pgd_t pgd) { return 0; }
516static inline int pgd_bad(pgd_t pgd) { return 0; }
517
518static inline int pud_present(pud_t pud) { return 1; }
519static inline int pud_none(pud_t pud) { return 0; }
520static inline int pud_large(pud_t pud) { return 0; }
521static inline int pud_bad(pud_t pud) { return 0; }
522
523#else /* CONFIG_64BIT */
524
525static inline int pgd_present(pgd_t pgd) 443static 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
588static inline int pmd_present(pmd_t pmd) 504static 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
917static inline void pgd_clear(pgd_t *pgd) 833static 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
925static inline void pud_clear(pud_t *pud) 839static 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
933static inline void pmd_clear(pmd_t *pmdp) 845static 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
1737static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset) 1622static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
1738{ 1623{
1739 pte_t pte; 1624 pte_t pte;