0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <linux/kernel.h>
0021 #include <linux/gfp.h>
0022 #include <linux/mm.h>
0023 #include <linux/percpu.h>
0024 #include <linux/hardirq.h>
0025 #include <linux/hugetlb.h>
0026 #include <asm/tlbflush.h>
0027 #include <asm/tlb.h>
0028 #include <asm/hugetlb.h>
0029 #include <asm/pte-walk.h>
0030
0031 #ifdef CONFIG_PPC64
0032 #define PGD_ALIGN (sizeof(pgd_t) * MAX_PTRS_PER_PGD)
0033 #else
0034 #define PGD_ALIGN PAGE_SIZE
0035 #endif
0036
0037 pgd_t swapper_pg_dir[MAX_PTRS_PER_PGD] __section(".bss..page_aligned") __aligned(PGD_ALIGN);
0038
0039 static inline int is_exec_fault(void)
0040 {
0041 return current->thread.regs && TRAP(current->thread.regs) == 0x400;
0042 }
0043
0044
0045
0046
0047
0048
0049 static inline int pte_looks_normal(pte_t pte)
0050 {
0051
0052 if (pte_present(pte) && !pte_special(pte)) {
0053 if (pte_ci(pte))
0054 return 0;
0055 if (pte_user(pte))
0056 return 1;
0057 }
0058 return 0;
0059 }
0060
0061 static struct page *maybe_pte_to_page(pte_t pte)
0062 {
0063 unsigned long pfn = pte_pfn(pte);
0064 struct page *page;
0065
0066 if (unlikely(!pfn_valid(pfn)))
0067 return NULL;
0068 page = pfn_to_page(pfn);
0069 if (PageReserved(page))
0070 return NULL;
0071 return page;
0072 }
0073
0074 #ifdef CONFIG_PPC_BOOK3S
0075
0076
0077
0078
0079
0080
0081
0082 static pte_t set_pte_filter_hash(pte_t pte)
0083 {
0084 pte = __pte(pte_val(pte) & ~_PAGE_HPTEFLAGS);
0085 if (pte_looks_normal(pte) && !(cpu_has_feature(CPU_FTR_COHERENT_ICACHE) ||
0086 cpu_has_feature(CPU_FTR_NOEXECUTE))) {
0087 struct page *pg = maybe_pte_to_page(pte);
0088 if (!pg)
0089 return pte;
0090 if (!test_bit(PG_dcache_clean, &pg->flags)) {
0091 flush_dcache_icache_page(pg);
0092 set_bit(PG_dcache_clean, &pg->flags);
0093 }
0094 }
0095 return pte;
0096 }
0097
0098 #else
0099
0100 static pte_t set_pte_filter_hash(pte_t pte) { return pte; }
0101
0102 #endif
0103
0104
0105
0106
0107
0108 static inline pte_t set_pte_filter(pte_t pte)
0109 {
0110 struct page *pg;
0111
0112 if (radix_enabled())
0113 return pte;
0114
0115 if (mmu_has_feature(MMU_FTR_HPTE_TABLE))
0116 return set_pte_filter_hash(pte);
0117
0118
0119 if (!pte_exec(pte) || !pte_looks_normal(pte))
0120 return pte;
0121
0122
0123 pg = maybe_pte_to_page(pte);
0124 if (unlikely(!pg))
0125 return pte;
0126
0127
0128 if (test_bit(PG_dcache_clean, &pg->flags))
0129 return pte;
0130
0131
0132 if (is_exec_fault()) {
0133 flush_dcache_icache_page(pg);
0134 set_bit(PG_dcache_clean, &pg->flags);
0135 return pte;
0136 }
0137
0138
0139 return pte_exprotect(pte);
0140 }
0141
0142 static pte_t set_access_flags_filter(pte_t pte, struct vm_area_struct *vma,
0143 int dirty)
0144 {
0145 struct page *pg;
0146
0147 if (IS_ENABLED(CONFIG_PPC_BOOK3S_64))
0148 return pte;
0149
0150 if (mmu_has_feature(MMU_FTR_HPTE_TABLE))
0151 return pte;
0152
0153
0154
0155
0156
0157
0158 if (dirty || pte_exec(pte) || !is_exec_fault())
0159 return pte;
0160
0161 #ifdef CONFIG_DEBUG_VM
0162
0163
0164
0165
0166 if (WARN_ON(!(vma->vm_flags & VM_EXEC)))
0167 return pte;
0168 #endif
0169
0170
0171 pg = maybe_pte_to_page(pte);
0172 if (unlikely(!pg))
0173 goto bail;
0174
0175
0176 if (test_bit(PG_dcache_clean, &pg->flags))
0177 goto bail;
0178
0179
0180 flush_dcache_icache_page(pg);
0181 set_bit(PG_dcache_clean, &pg->flags);
0182
0183 bail:
0184 return pte_mkexec(pte);
0185 }
0186
0187
0188
0189
0190 void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep,
0191 pte_t pte)
0192 {
0193
0194
0195
0196
0197 VM_WARN_ON(pte_hw_valid(*ptep) && !pte_protnone(*ptep));
0198
0199
0200
0201
0202
0203 pte = set_pte_filter(pte);
0204
0205
0206 __set_pte_at(mm, addr, ptep, pte, 0);
0207 }
0208
0209 void unmap_kernel_page(unsigned long va)
0210 {
0211 pmd_t *pmdp = pmd_off_k(va);
0212 pte_t *ptep = pte_offset_kernel(pmdp, va);
0213
0214 pte_clear(&init_mm, va, ptep);
0215 flush_tlb_kernel_range(va, va + PAGE_SIZE);
0216 }
0217
0218
0219
0220
0221
0222
0223
0224
0225 int ptep_set_access_flags(struct vm_area_struct *vma, unsigned long address,
0226 pte_t *ptep, pte_t entry, int dirty)
0227 {
0228 int changed;
0229 entry = set_access_flags_filter(entry, vma, dirty);
0230 changed = !pte_same(*(ptep), entry);
0231 if (changed) {
0232 assert_pte_locked(vma->vm_mm, address);
0233 __ptep_set_access_flags(vma, ptep, entry,
0234 address, mmu_virtual_psize);
0235 }
0236 return changed;
0237 }
0238
0239 #ifdef CONFIG_HUGETLB_PAGE
0240 int huge_ptep_set_access_flags(struct vm_area_struct *vma,
0241 unsigned long addr, pte_t *ptep,
0242 pte_t pte, int dirty)
0243 {
0244 #ifdef HUGETLB_NEED_PRELOAD
0245
0246
0247
0248
0249
0250 ptep_set_access_flags(vma, addr, ptep, pte, dirty);
0251 return 1;
0252 #else
0253 int changed, psize;
0254
0255 pte = set_access_flags_filter(pte, vma, dirty);
0256 changed = !pte_same(*(ptep), pte);
0257 if (changed) {
0258
0259 #ifdef CONFIG_PPC_BOOK3S_64
0260 struct hstate *h = hstate_vma(vma);
0261
0262 psize = hstate_get_psize(h);
0263 #ifdef CONFIG_DEBUG_VM
0264 assert_spin_locked(huge_pte_lockptr(h, vma->vm_mm, ptep));
0265 #endif
0266
0267 #else
0268
0269
0270
0271
0272
0273 psize = MMU_PAGE_COUNT;
0274 #endif
0275 __ptep_set_access_flags(vma, ptep, pte, addr, psize);
0276 }
0277 return changed;
0278 #endif
0279 }
0280
0281 #if defined(CONFIG_PPC_8xx)
0282 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, pte_t pte)
0283 {
0284 pmd_t *pmd = pmd_off(mm, addr);
0285 pte_basic_t val;
0286 pte_basic_t *entry = (pte_basic_t *)ptep;
0287 int num, i;
0288
0289
0290
0291
0292
0293 VM_WARN_ON(pte_hw_valid(*ptep) && !pte_protnone(*ptep));
0294
0295 pte = set_pte_filter(pte);
0296
0297 val = pte_val(pte);
0298
0299 num = number_of_cells_per_pte(pmd, val, 1);
0300
0301 for (i = 0; i < num; i++, entry++, val += SZ_4K)
0302 *entry = val;
0303 }
0304 #endif
0305 #endif
0306
0307 #ifdef CONFIG_DEBUG_VM
0308 void assert_pte_locked(struct mm_struct *mm, unsigned long addr)
0309 {
0310 pgd_t *pgd;
0311 p4d_t *p4d;
0312 pud_t *pud;
0313 pmd_t *pmd;
0314
0315 if (mm == &init_mm)
0316 return;
0317 pgd = mm->pgd + pgd_index(addr);
0318 BUG_ON(pgd_none(*pgd));
0319 p4d = p4d_offset(pgd, addr);
0320 BUG_ON(p4d_none(*p4d));
0321 pud = pud_offset(p4d, addr);
0322 BUG_ON(pud_none(*pud));
0323 pmd = pmd_offset(pud, addr);
0324
0325
0326
0327
0328
0329
0330 if (pmd_none(*pmd))
0331 return;
0332 BUG_ON(!pmd_present(*pmd));
0333 assert_spin_locked(pte_lockptr(mm, pmd));
0334 }
0335 #endif
0336
0337 unsigned long vmalloc_to_phys(void *va)
0338 {
0339 unsigned long pfn = vmalloc_to_pfn(va);
0340
0341 BUG_ON(!pfn);
0342 return __pa(pfn_to_kaddr(pfn)) + offset_in_page(va);
0343 }
0344 EXPORT_SYMBOL_GPL(vmalloc_to_phys);
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358 pte_t *__find_linux_pte(pgd_t *pgdir, unsigned long ea,
0359 bool *is_thp, unsigned *hpage_shift)
0360 {
0361 pgd_t *pgdp;
0362 p4d_t p4d, *p4dp;
0363 pud_t pud, *pudp;
0364 pmd_t pmd, *pmdp;
0365 pte_t *ret_pte;
0366 hugepd_t *hpdp = NULL;
0367 unsigned pdshift;
0368
0369 if (hpage_shift)
0370 *hpage_shift = 0;
0371
0372 if (is_thp)
0373 *is_thp = false;
0374
0375
0376
0377
0378
0379
0380
0381
0382 pgdp = pgdir + pgd_index(ea);
0383 p4dp = p4d_offset(pgdp, ea);
0384 p4d = READ_ONCE(*p4dp);
0385 pdshift = P4D_SHIFT;
0386
0387 if (p4d_none(p4d))
0388 return NULL;
0389
0390 if (p4d_is_leaf(p4d)) {
0391 ret_pte = (pte_t *)p4dp;
0392 goto out;
0393 }
0394
0395 if (is_hugepd(__hugepd(p4d_val(p4d)))) {
0396 hpdp = (hugepd_t *)&p4d;
0397 goto out_huge;
0398 }
0399
0400
0401
0402
0403
0404
0405 pdshift = PUD_SHIFT;
0406 pudp = pud_offset(&p4d, ea);
0407 pud = READ_ONCE(*pudp);
0408
0409 if (pud_none(pud))
0410 return NULL;
0411
0412 if (pud_is_leaf(pud)) {
0413 ret_pte = (pte_t *)pudp;
0414 goto out;
0415 }
0416
0417 if (is_hugepd(__hugepd(pud_val(pud)))) {
0418 hpdp = (hugepd_t *)&pud;
0419 goto out_huge;
0420 }
0421
0422 pdshift = PMD_SHIFT;
0423 pmdp = pmd_offset(&pud, ea);
0424 pmd = READ_ONCE(*pmdp);
0425
0426
0427
0428
0429
0430 if (pmd_none(pmd))
0431 return NULL;
0432
0433 #ifdef CONFIG_PPC_BOOK3S_64
0434
0435
0436
0437
0438
0439
0440 if (pmd_is_serializing(pmd))
0441 return NULL;
0442 #endif
0443
0444 if (pmd_trans_huge(pmd) || pmd_devmap(pmd)) {
0445 if (is_thp)
0446 *is_thp = true;
0447 ret_pte = (pte_t *)pmdp;
0448 goto out;
0449 }
0450
0451 if (pmd_is_leaf(pmd)) {
0452 ret_pte = (pte_t *)pmdp;
0453 goto out;
0454 }
0455
0456 if (is_hugepd(__hugepd(pmd_val(pmd)))) {
0457 hpdp = (hugepd_t *)&pmd;
0458 goto out_huge;
0459 }
0460
0461 return pte_offset_kernel(&pmd, ea);
0462
0463 out_huge:
0464 if (!hpdp)
0465 return NULL;
0466
0467 ret_pte = hugepte_offset(*hpdp, ea, pdshift);
0468 pdshift = hugepd_shift(*hpdp);
0469 out:
0470 if (hpage_shift)
0471 *hpage_shift = pdshift;
0472 return ret_pte;
0473 }
0474 EXPORT_SYMBOL_GPL(__find_linux_pte);
0475
0476
0477 const pgprot_t protection_map[16] = {
0478 [VM_NONE] = PAGE_NONE,
0479 [VM_READ] = PAGE_READONLY,
0480 [VM_WRITE] = PAGE_COPY,
0481 [VM_WRITE | VM_READ] = PAGE_COPY,
0482 [VM_EXEC] = PAGE_READONLY_X,
0483 [VM_EXEC | VM_READ] = PAGE_READONLY_X,
0484 [VM_EXEC | VM_WRITE] = PAGE_COPY_X,
0485 [VM_EXEC | VM_WRITE | VM_READ] = PAGE_COPY_X,
0486 [VM_SHARED] = PAGE_NONE,
0487 [VM_SHARED | VM_READ] = PAGE_READONLY,
0488 [VM_SHARED | VM_WRITE] = PAGE_SHARED,
0489 [VM_SHARED | VM_WRITE | VM_READ] = PAGE_SHARED,
0490 [VM_SHARED | VM_EXEC] = PAGE_READONLY_X,
0491 [VM_SHARED | VM_EXEC | VM_READ] = PAGE_READONLY_X,
0492 [VM_SHARED | VM_EXEC | VM_WRITE] = PAGE_SHARED_X,
0493 [VM_SHARED | VM_EXEC | VM_WRITE | VM_READ] = PAGE_SHARED_X
0494 };
0495
0496 #ifndef CONFIG_PPC_BOOK3S_64
0497 DECLARE_VM_GET_PAGE_PROT
0498 #endif