0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _ASM_PGTABLE_3LEVEL_H
0009 #define _ASM_PGTABLE_3LEVEL_H
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #define PTRS_PER_PTE 512
0021 #define PTRS_PER_PMD 512
0022 #define PTRS_PER_PGD 4
0023
0024 #define PTE_HWTABLE_PTRS (0)
0025 #define PTE_HWTABLE_OFF (0)
0026 #define PTE_HWTABLE_SIZE (PTRS_PER_PTE * sizeof(u64))
0027
0028 #define MAX_POSSIBLE_PHYSMEM_BITS 40
0029
0030
0031
0032
0033 #define PGDIR_SHIFT 30
0034
0035
0036
0037
0038 #define PMD_SHIFT 21
0039
0040 #define PMD_SIZE (1UL << PMD_SHIFT)
0041 #define PMD_MASK (~((1 << PMD_SHIFT) - 1))
0042 #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
0043 #define PGDIR_MASK (~((1 << PGDIR_SHIFT) - 1))
0044
0045
0046
0047
0048 #define SECTION_SHIFT 21
0049 #define SECTION_SIZE (1UL << SECTION_SHIFT)
0050 #define SECTION_MASK (~((1 << SECTION_SHIFT) - 1))
0051
0052 #define USER_PTRS_PER_PGD (PAGE_OFFSET / PGDIR_SIZE)
0053
0054
0055
0056
0057 #define HPAGE_SHIFT PMD_SHIFT
0058 #define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT)
0059 #define HPAGE_MASK (~(HPAGE_SIZE - 1))
0060 #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
0061
0062
0063
0064
0065
0066
0067
0068 #define L_PTE_VALID (_AT(pteval_t, 1) << 0)
0069 #define L_PTE_PRESENT (_AT(pteval_t, 3) << 0)
0070 #define L_PTE_USER (_AT(pteval_t, 1) << 6)
0071 #define L_PTE_SHARED (_AT(pteval_t, 3) << 8)
0072 #define L_PTE_YOUNG (_AT(pteval_t, 1) << 10)
0073 #define L_PTE_XN (_AT(pteval_t, 1) << 54)
0074 #define L_PTE_DIRTY (_AT(pteval_t, 1) << 55)
0075 #define L_PTE_SPECIAL (_AT(pteval_t, 1) << 56)
0076 #define L_PTE_NONE (_AT(pteval_t, 1) << 57)
0077 #define L_PTE_RDONLY (_AT(pteval_t, 1) << 58)
0078
0079 #define L_PMD_SECT_VALID (_AT(pmdval_t, 1) << 0)
0080 #define L_PMD_SECT_DIRTY (_AT(pmdval_t, 1) << 55)
0081 #define L_PMD_SECT_NONE (_AT(pmdval_t, 1) << 57)
0082 #define L_PMD_SECT_RDONLY (_AT(pteval_t, 1) << 58)
0083
0084
0085
0086
0087 #define L_PTE_XN_HIGH (1 << (54 - 32))
0088 #define L_PTE_DIRTY_HIGH (1 << (55 - 32))
0089
0090
0091
0092
0093 #define L_PTE_MT_UNCACHED (_AT(pteval_t, 0) << 2)
0094 #define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 1) << 2)
0095 #define L_PTE_MT_WRITETHROUGH (_AT(pteval_t, 2) << 2)
0096 #define L_PTE_MT_WRITEBACK (_AT(pteval_t, 3) << 2)
0097 #define L_PTE_MT_WRITEALLOC (_AT(pteval_t, 7) << 2)
0098 #define L_PTE_MT_DEV_SHARED (_AT(pteval_t, 4) << 2)
0099 #define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 4) << 2)
0100 #define L_PTE_MT_DEV_WC (_AT(pteval_t, 1) << 2)
0101 #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 3) << 2)
0102 #define L_PTE_MT_MASK (_AT(pteval_t, 7) << 2)
0103
0104
0105
0106
0107 #define L_PGD_SWAPPER (_AT(pgdval_t, 1) << 55)
0108
0109 #ifndef __ASSEMBLY__
0110
0111 #define pud_none(pud) (!pud_val(pud))
0112 #define pud_bad(pud) (!(pud_val(pud) & 2))
0113 #define pud_present(pud) (pud_val(pud))
0114 #define pmd_table(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \
0115 PMD_TYPE_TABLE)
0116 #define pmd_sect(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \
0117 PMD_TYPE_SECT)
0118 #define pmd_large(pmd) pmd_sect(pmd)
0119 #define pmd_leaf(pmd) pmd_sect(pmd)
0120
0121 #define pud_clear(pudp) \
0122 do { \
0123 *pudp = __pud(0); \
0124 clean_pmd_entry(pudp); \
0125 } while (0)
0126
0127 #define set_pud(pudp, pud) \
0128 do { \
0129 *pudp = pud; \
0130 flush_pmd_entry(pudp); \
0131 } while (0)
0132
0133 static inline pmd_t *pud_pgtable(pud_t pud)
0134 {
0135 return __va(pud_val(pud) & PHYS_MASK & (s32)PAGE_MASK);
0136 }
0137
0138 #define pmd_bad(pmd) (!(pmd_val(pmd) & 2))
0139
0140 #define copy_pmd(pmdpd,pmdps) \
0141 do { \
0142 *pmdpd = *pmdps; \
0143 flush_pmd_entry(pmdpd); \
0144 } while (0)
0145
0146 #define pmd_clear(pmdp) \
0147 do { \
0148 *pmdp = __pmd(0); \
0149 clean_pmd_entry(pmdp); \
0150 } while (0)
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 #define __HAVE_ARCH_PTE_SAME
0164 #define pte_same(pte_a,pte_b) ((pte_present(pte_a) ? pte_val(pte_a) & ~PTE_EXT_NG \
0165 : pte_val(pte_a)) \
0166 == (pte_present(pte_b) ? pte_val(pte_b) & ~PTE_EXT_NG \
0167 : pte_val(pte_b)))
0168
0169 #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,__pte(pte_val(pte)|(ext)))
0170
0171 #define pte_huge(pte) (pte_val(pte) && !(pte_val(pte) & PTE_TABLE_BIT))
0172 #define pte_mkhuge(pte) (__pte(pte_val(pte) & ~PTE_TABLE_BIT))
0173
0174 #define pmd_isset(pmd, val) ((u32)(val) == (val) ? pmd_val(pmd) & (val) \
0175 : !!(pmd_val(pmd) & (val)))
0176 #define pmd_isclear(pmd, val) (!(pmd_val(pmd) & (val)))
0177
0178 #define pmd_present(pmd) (pmd_isset((pmd), L_PMD_SECT_VALID))
0179 #define pmd_young(pmd) (pmd_isset((pmd), PMD_SECT_AF))
0180 #define pte_special(pte) (pte_isset((pte), L_PTE_SPECIAL))
0181 static inline pte_t pte_mkspecial(pte_t pte)
0182 {
0183 pte_val(pte) |= L_PTE_SPECIAL;
0184 return pte;
0185 }
0186
0187 #define pmd_write(pmd) (pmd_isclear((pmd), L_PMD_SECT_RDONLY))
0188 #define pmd_dirty(pmd) (pmd_isset((pmd), L_PMD_SECT_DIRTY))
0189
0190 #define pmd_hugewillfault(pmd) (!pmd_young(pmd) || !pmd_write(pmd))
0191 #define pmd_thp_or_huge(pmd) (pmd_huge(pmd) || pmd_trans_huge(pmd))
0192
0193 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
0194 #define pmd_trans_huge(pmd) (pmd_val(pmd) && !pmd_table(pmd))
0195 #endif
0196
0197 #define PMD_BIT_FUNC(fn,op) \
0198 static inline pmd_t pmd_##fn(pmd_t pmd) { pmd_val(pmd) op; return pmd; }
0199
0200 PMD_BIT_FUNC(wrprotect, |= L_PMD_SECT_RDONLY);
0201 PMD_BIT_FUNC(mkold, &= ~PMD_SECT_AF);
0202 PMD_BIT_FUNC(mkwrite, &= ~L_PMD_SECT_RDONLY);
0203 PMD_BIT_FUNC(mkdirty, |= L_PMD_SECT_DIRTY);
0204 PMD_BIT_FUNC(mkclean, &= ~L_PMD_SECT_DIRTY);
0205 PMD_BIT_FUNC(mkyoung, |= PMD_SECT_AF);
0206
0207 #define pmd_mkhuge(pmd) (__pmd(pmd_val(pmd) & ~PMD_TABLE_BIT))
0208
0209 #define pmd_pfn(pmd) (((pmd_val(pmd) & PMD_MASK) & PHYS_MASK) >> PAGE_SHIFT)
0210 #define pfn_pmd(pfn,prot) (__pmd(((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))
0211 #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot)
0212
0213
0214 #define pmdp_establish generic_pmdp_establish
0215
0216
0217 static inline pmd_t pmd_mkinvalid(pmd_t pmd)
0218 {
0219 return __pmd(pmd_val(pmd) & ~L_PMD_SECT_VALID);
0220 }
0221
0222 static inline pmd_t pmd_modify(pmd_t pmd, pgprot_t newprot)
0223 {
0224 const pmdval_t mask = PMD_SECT_USER | PMD_SECT_XN | L_PMD_SECT_RDONLY |
0225 L_PMD_SECT_VALID | L_PMD_SECT_NONE;
0226 pmd_val(pmd) = (pmd_val(pmd) & ~mask) | (pgprot_val(newprot) & mask);
0227 return pmd;
0228 }
0229
0230 static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr,
0231 pmd_t *pmdp, pmd_t pmd)
0232 {
0233 BUG_ON(addr >= TASK_SIZE);
0234
0235
0236 if (pmd_val(pmd) & L_PMD_SECT_NONE)
0237 pmd_val(pmd) &= ~L_PMD_SECT_VALID;
0238
0239 if (pmd_write(pmd) && pmd_dirty(pmd))
0240 pmd_val(pmd) &= ~PMD_SECT_AP2;
0241 else
0242 pmd_val(pmd) |= PMD_SECT_AP2;
0243
0244 *pmdp = __pmd(pmd_val(pmd) | PMD_SECT_nG);
0245 flush_pmd_entry(pmdp);
0246 }
0247
0248 #endif
0249
0250 #endif