tizen: packaging: Add baselibs.conf to provide 64-bit kernel & modules for 32-bit...
[platform/kernel/linux-rpi.git] / mm / debug_vm_pgtable.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * This kernel test validates architecture page table helpers and
4  * accessors and helps in verifying their continued compliance with
5  * expected generic MM semantics.
6  *
7  * Copyright (C) 2019 ARM Ltd.
8  *
9  * Author: Anshuman Khandual <anshuman.khandual@arm.com>
10  */
11 #define pr_fmt(fmt) "debug_vm_pgtable: [%-25s]: " fmt, __func__
12
13 #include <linux/gfp.h>
14 #include <linux/highmem.h>
15 #include <linux/hugetlb.h>
16 #include <linux/kernel.h>
17 #include <linux/kconfig.h>
18 #include <linux/memblock.h>
19 #include <linux/mm.h>
20 #include <linux/mman.h>
21 #include <linux/mm_types.h>
22 #include <linux/module.h>
23 #include <linux/pfn_t.h>
24 #include <linux/printk.h>
25 #include <linux/pgtable.h>
26 #include <linux/random.h>
27 #include <linux/spinlock.h>
28 #include <linux/swap.h>
29 #include <linux/swapops.h>
30 #include <linux/start_kernel.h>
31 #include <linux/sched/mm.h>
32 #include <linux/io.h>
33
34 #include <asm/cacheflush.h>
35 #include <asm/pgalloc.h>
36 #include <asm/tlbflush.h>
37
38 /*
39  * Please refer Documentation/mm/arch_pgtable_helpers.rst for the semantics
40  * expectations that are being validated here. All future changes in here
41  * or the documentation need to be in sync.
42  *
43  * On s390 platform, the lower 4 bits are used to identify given page table
44  * entry type. But these bits might affect the ability to clear entries with
45  * pxx_clear() because of how dynamic page table folding works on s390. So
46  * while loading up the entries do not change the lower 4 bits. It does not
47  * have affect any other platform. Also avoid the 62nd bit on ppc64 that is
48  * used to mark a pte entry.
49  */
50 #define S390_SKIP_MASK          GENMASK(3, 0)
51 #if __BITS_PER_LONG == 64
52 #define PPC64_SKIP_MASK         GENMASK(62, 62)
53 #else
54 #define PPC64_SKIP_MASK         0x0
55 #endif
56 #define ARCH_SKIP_MASK (S390_SKIP_MASK | PPC64_SKIP_MASK)
57 #define RANDOM_ORVALUE (GENMASK(BITS_PER_LONG - 1, 0) & ~ARCH_SKIP_MASK)
58 #define RANDOM_NZVALUE  GENMASK(7, 0)
59
60 struct pgtable_debug_args {
61         struct mm_struct        *mm;
62         struct vm_area_struct   *vma;
63
64         pgd_t                   *pgdp;
65         p4d_t                   *p4dp;
66         pud_t                   *pudp;
67         pmd_t                   *pmdp;
68         pte_t                   *ptep;
69
70         p4d_t                   *start_p4dp;
71         pud_t                   *start_pudp;
72         pmd_t                   *start_pmdp;
73         pgtable_t               start_ptep;
74
75         unsigned long           vaddr;
76         pgprot_t                page_prot;
77         pgprot_t                page_prot_none;
78
79         bool                    is_contiguous_page;
80         unsigned long           pud_pfn;
81         unsigned long           pmd_pfn;
82         unsigned long           pte_pfn;
83
84         unsigned long           fixed_alignment;
85         unsigned long           fixed_pgd_pfn;
86         unsigned long           fixed_p4d_pfn;
87         unsigned long           fixed_pud_pfn;
88         unsigned long           fixed_pmd_pfn;
89         unsigned long           fixed_pte_pfn;
90 };
91
92 static void __init pte_basic_tests(struct pgtable_debug_args *args, int idx)
93 {
94         pgprot_t prot = vm_get_page_prot(idx);
95         pte_t pte = pfn_pte(args->fixed_pte_pfn, prot);
96         unsigned long val = idx, *ptr = &val;
97
98         pr_debug("Validating PTE basic (%pGv)\n", ptr);
99
100         /*
101          * This test needs to be executed after the given page table entry
102          * is created with pfn_pte() to make sure that vm_get_page_prot(idx)
103          * does not have the dirty bit enabled from the beginning. This is
104          * important for platforms like arm64 where (!PTE_RDONLY) indicate
105          * dirty bit being set.
106          */
107         WARN_ON(pte_dirty(pte_wrprotect(pte)));
108
109         WARN_ON(!pte_same(pte, pte));
110         WARN_ON(!pte_young(pte_mkyoung(pte_mkold(pte))));
111         WARN_ON(!pte_dirty(pte_mkdirty(pte_mkclean(pte))));
112         WARN_ON(!pte_write(pte_mkwrite(pte_wrprotect(pte), args->vma)));
113         WARN_ON(pte_young(pte_mkold(pte_mkyoung(pte))));
114         WARN_ON(pte_dirty(pte_mkclean(pte_mkdirty(pte))));
115         WARN_ON(pte_write(pte_wrprotect(pte_mkwrite(pte, args->vma))));
116         WARN_ON(pte_dirty(pte_wrprotect(pte_mkclean(pte))));
117         WARN_ON(!pte_dirty(pte_wrprotect(pte_mkdirty(pte))));
118 }
119
120 static void __init pte_advanced_tests(struct pgtable_debug_args *args)
121 {
122         struct page *page;
123         pte_t pte;
124
125         /*
126          * Architectures optimize set_pte_at by avoiding TLB flush.
127          * This requires set_pte_at to be not used to update an
128          * existing pte entry. Clear pte before we do set_pte_at
129          *
130          * flush_dcache_page() is called after set_pte_at() to clear
131          * PG_arch_1 for the page on ARM64. The page flag isn't cleared
132          * when it's released and page allocation check will fail when
133          * the page is allocated again. For architectures other than ARM64,
134          * the unexpected overhead of cache flushing is acceptable.
135          */
136         page = (args->pte_pfn != ULONG_MAX) ? pfn_to_page(args->pte_pfn) : NULL;
137         if (!page)
138                 return;
139
140         pr_debug("Validating PTE advanced\n");
141         if (WARN_ON(!args->ptep))
142                 return;
143
144         pte = pfn_pte(args->pte_pfn, args->page_prot);
145         set_pte_at(args->mm, args->vaddr, args->ptep, pte);
146         flush_dcache_page(page);
147         ptep_set_wrprotect(args->mm, args->vaddr, args->ptep);
148         pte = ptep_get(args->ptep);
149         WARN_ON(pte_write(pte));
150         ptep_get_and_clear(args->mm, args->vaddr, args->ptep);
151         pte = ptep_get(args->ptep);
152         WARN_ON(!pte_none(pte));
153
154         pte = pfn_pte(args->pte_pfn, args->page_prot);
155         pte = pte_wrprotect(pte);
156         pte = pte_mkclean(pte);
157         set_pte_at(args->mm, args->vaddr, args->ptep, pte);
158         flush_dcache_page(page);
159         pte = pte_mkwrite(pte, args->vma);
160         pte = pte_mkdirty(pte);
161         ptep_set_access_flags(args->vma, args->vaddr, args->ptep, pte, 1);
162         pte = ptep_get(args->ptep);
163         WARN_ON(!(pte_write(pte) && pte_dirty(pte)));
164         ptep_get_and_clear_full(args->mm, args->vaddr, args->ptep, 1);
165         pte = ptep_get(args->ptep);
166         WARN_ON(!pte_none(pte));
167
168         pte = pfn_pte(args->pte_pfn, args->page_prot);
169         pte = pte_mkyoung(pte);
170         set_pte_at(args->mm, args->vaddr, args->ptep, pte);
171         flush_dcache_page(page);
172         ptep_test_and_clear_young(args->vma, args->vaddr, args->ptep);
173         pte = ptep_get(args->ptep);
174         WARN_ON(pte_young(pte));
175
176         ptep_get_and_clear_full(args->mm, args->vaddr, args->ptep, 1);
177 }
178
179 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
180 static void __init pmd_basic_tests(struct pgtable_debug_args *args, int idx)
181 {
182         pgprot_t prot = vm_get_page_prot(idx);
183         unsigned long val = idx, *ptr = &val;
184         pmd_t pmd;
185
186         if (!has_transparent_hugepage())
187                 return;
188
189         pr_debug("Validating PMD basic (%pGv)\n", ptr);
190         pmd = pfn_pmd(args->fixed_pmd_pfn, prot);
191
192         /*
193          * This test needs to be executed after the given page table entry
194          * is created with pfn_pmd() to make sure that vm_get_page_prot(idx)
195          * does not have the dirty bit enabled from the beginning. This is
196          * important for platforms like arm64 where (!PTE_RDONLY) indicate
197          * dirty bit being set.
198          */
199         WARN_ON(pmd_dirty(pmd_wrprotect(pmd)));
200
201
202         WARN_ON(!pmd_same(pmd, pmd));
203         WARN_ON(!pmd_young(pmd_mkyoung(pmd_mkold(pmd))));
204         WARN_ON(!pmd_dirty(pmd_mkdirty(pmd_mkclean(pmd))));
205         WARN_ON(!pmd_write(pmd_mkwrite(pmd_wrprotect(pmd), args->vma)));
206         WARN_ON(pmd_young(pmd_mkold(pmd_mkyoung(pmd))));
207         WARN_ON(pmd_dirty(pmd_mkclean(pmd_mkdirty(pmd))));
208         WARN_ON(pmd_write(pmd_wrprotect(pmd_mkwrite(pmd, args->vma))));
209         WARN_ON(pmd_dirty(pmd_wrprotect(pmd_mkclean(pmd))));
210         WARN_ON(!pmd_dirty(pmd_wrprotect(pmd_mkdirty(pmd))));
211         /*
212          * A huge page does not point to next level page table
213          * entry. Hence this must qualify as pmd_bad().
214          */
215         WARN_ON(!pmd_bad(pmd_mkhuge(pmd)));
216 }
217
218 static void __init pmd_advanced_tests(struct pgtable_debug_args *args)
219 {
220         struct page *page;
221         pmd_t pmd;
222         unsigned long vaddr = args->vaddr;
223
224         if (!has_transparent_hugepage())
225                 return;
226
227         page = (args->pmd_pfn != ULONG_MAX) ? pfn_to_page(args->pmd_pfn) : NULL;
228         if (!page)
229                 return;
230
231         /*
232          * flush_dcache_page() is called after set_pmd_at() to clear
233          * PG_arch_1 for the page on ARM64. The page flag isn't cleared
234          * when it's released and page allocation check will fail when
235          * the page is allocated again. For architectures other than ARM64,
236          * the unexpected overhead of cache flushing is acceptable.
237          */
238         pr_debug("Validating PMD advanced\n");
239         /* Align the address wrt HPAGE_PMD_SIZE */
240         vaddr &= HPAGE_PMD_MASK;
241
242         pgtable_trans_huge_deposit(args->mm, args->pmdp, args->start_ptep);
243
244         pmd = pfn_pmd(args->pmd_pfn, args->page_prot);
245         set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
246         flush_dcache_page(page);
247         pmdp_set_wrprotect(args->mm, vaddr, args->pmdp);
248         pmd = READ_ONCE(*args->pmdp);
249         WARN_ON(pmd_write(pmd));
250         pmdp_huge_get_and_clear(args->mm, vaddr, args->pmdp);
251         pmd = READ_ONCE(*args->pmdp);
252         WARN_ON(!pmd_none(pmd));
253
254         pmd = pfn_pmd(args->pmd_pfn, args->page_prot);
255         pmd = pmd_wrprotect(pmd);
256         pmd = pmd_mkclean(pmd);
257         set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
258         flush_dcache_page(page);
259         pmd = pmd_mkwrite(pmd, args->vma);
260         pmd = pmd_mkdirty(pmd);
261         pmdp_set_access_flags(args->vma, vaddr, args->pmdp, pmd, 1);
262         pmd = READ_ONCE(*args->pmdp);
263         WARN_ON(!(pmd_write(pmd) && pmd_dirty(pmd)));
264         pmdp_huge_get_and_clear_full(args->vma, vaddr, args->pmdp, 1);
265         pmd = READ_ONCE(*args->pmdp);
266         WARN_ON(!pmd_none(pmd));
267
268         pmd = pmd_mkhuge(pfn_pmd(args->pmd_pfn, args->page_prot));
269         pmd = pmd_mkyoung(pmd);
270         set_pmd_at(args->mm, vaddr, args->pmdp, pmd);
271         flush_dcache_page(page);
272         pmdp_test_and_clear_young(args->vma, vaddr, args->pmdp);
273         pmd = READ_ONCE(*args->pmdp);
274         WARN_ON(pmd_young(pmd));
275
276         /*  Clear the pte entries  */
277         pmdp_huge_get_and_clear(args->mm, vaddr, args->pmdp);
278         pgtable_trans_huge_withdraw(args->mm, args->pmdp);
279 }
280
281 static void __init pmd_leaf_tests(struct pgtable_debug_args *args)
282 {
283         pmd_t pmd;
284
285         if (!has_transparent_hugepage())
286                 return;
287
288         pr_debug("Validating PMD leaf\n");
289         pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
290
291         /*
292          * PMD based THP is a leaf entry.
293          */
294         pmd = pmd_mkhuge(pmd);
295         WARN_ON(!pmd_leaf(pmd));
296 }
297
298 #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
299 static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx)
300 {
301         pgprot_t prot = vm_get_page_prot(idx);
302         unsigned long val = idx, *ptr = &val;
303         pud_t pud;
304
305         if (!has_transparent_pud_hugepage())
306                 return;
307
308         pr_debug("Validating PUD basic (%pGv)\n", ptr);
309         pud = pfn_pud(args->fixed_pud_pfn, prot);
310
311         /*
312          * This test needs to be executed after the given page table entry
313          * is created with pfn_pud() to make sure that vm_get_page_prot(idx)
314          * does not have the dirty bit enabled from the beginning. This is
315          * important for platforms like arm64 where (!PTE_RDONLY) indicate
316          * dirty bit being set.
317          */
318         WARN_ON(pud_dirty(pud_wrprotect(pud)));
319
320         WARN_ON(!pud_same(pud, pud));
321         WARN_ON(!pud_young(pud_mkyoung(pud_mkold(pud))));
322         WARN_ON(!pud_dirty(pud_mkdirty(pud_mkclean(pud))));
323         WARN_ON(pud_dirty(pud_mkclean(pud_mkdirty(pud))));
324         WARN_ON(!pud_write(pud_mkwrite(pud_wrprotect(pud))));
325         WARN_ON(pud_write(pud_wrprotect(pud_mkwrite(pud))));
326         WARN_ON(pud_young(pud_mkold(pud_mkyoung(pud))));
327         WARN_ON(pud_dirty(pud_wrprotect(pud_mkclean(pud))));
328         WARN_ON(!pud_dirty(pud_wrprotect(pud_mkdirty(pud))));
329
330         if (mm_pmd_folded(args->mm))
331                 return;
332
333         /*
334          * A huge page does not point to next level page table
335          * entry. Hence this must qualify as pud_bad().
336          */
337         WARN_ON(!pud_bad(pud_mkhuge(pud)));
338 }
339
340 static void __init pud_advanced_tests(struct pgtable_debug_args *args)
341 {
342         struct page *page;
343         unsigned long vaddr = args->vaddr;
344         pud_t pud;
345
346         if (!has_transparent_pud_hugepage())
347                 return;
348
349         page = (args->pud_pfn != ULONG_MAX) ? pfn_to_page(args->pud_pfn) : NULL;
350         if (!page)
351                 return;
352
353         /*
354          * flush_dcache_page() is called after set_pud_at() to clear
355          * PG_arch_1 for the page on ARM64. The page flag isn't cleared
356          * when it's released and page allocation check will fail when
357          * the page is allocated again. For architectures other than ARM64,
358          * the unexpected overhead of cache flushing is acceptable.
359          */
360         pr_debug("Validating PUD advanced\n");
361         /* Align the address wrt HPAGE_PUD_SIZE */
362         vaddr &= HPAGE_PUD_MASK;
363
364         pud = pfn_pud(args->pud_pfn, args->page_prot);
365         set_pud_at(args->mm, vaddr, args->pudp, pud);
366         flush_dcache_page(page);
367         pudp_set_wrprotect(args->mm, vaddr, args->pudp);
368         pud = READ_ONCE(*args->pudp);
369         WARN_ON(pud_write(pud));
370
371 #ifndef __PAGETABLE_PMD_FOLDED
372         pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
373         pud = READ_ONCE(*args->pudp);
374         WARN_ON(!pud_none(pud));
375 #endif /* __PAGETABLE_PMD_FOLDED */
376         pud = pfn_pud(args->pud_pfn, args->page_prot);
377         pud = pud_wrprotect(pud);
378         pud = pud_mkclean(pud);
379         set_pud_at(args->mm, vaddr, args->pudp, pud);
380         flush_dcache_page(page);
381         pud = pud_mkwrite(pud);
382         pud = pud_mkdirty(pud);
383         pudp_set_access_flags(args->vma, vaddr, args->pudp, pud, 1);
384         pud = READ_ONCE(*args->pudp);
385         WARN_ON(!(pud_write(pud) && pud_dirty(pud)));
386
387 #ifndef __PAGETABLE_PMD_FOLDED
388         pudp_huge_get_and_clear_full(args->vma, vaddr, args->pudp, 1);
389         pud = READ_ONCE(*args->pudp);
390         WARN_ON(!pud_none(pud));
391 #endif /* __PAGETABLE_PMD_FOLDED */
392
393         pud = pfn_pud(args->pud_pfn, args->page_prot);
394         pud = pud_mkyoung(pud);
395         set_pud_at(args->mm, vaddr, args->pudp, pud);
396         flush_dcache_page(page);
397         pudp_test_and_clear_young(args->vma, vaddr, args->pudp);
398         pud = READ_ONCE(*args->pudp);
399         WARN_ON(pud_young(pud));
400
401         pudp_huge_get_and_clear(args->mm, vaddr, args->pudp);
402 }
403
404 static void __init pud_leaf_tests(struct pgtable_debug_args *args)
405 {
406         pud_t pud;
407
408         if (!has_transparent_pud_hugepage())
409                 return;
410
411         pr_debug("Validating PUD leaf\n");
412         pud = pfn_pud(args->fixed_pud_pfn, args->page_prot);
413         /*
414          * PUD based THP is a leaf entry.
415          */
416         pud = pud_mkhuge(pud);
417         WARN_ON(!pud_leaf(pud));
418 }
419 #else  /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
420 static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) { }
421 static void __init pud_advanced_tests(struct pgtable_debug_args *args) { }
422 static void __init pud_leaf_tests(struct pgtable_debug_args *args) { }
423 #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
424 #else  /* !CONFIG_TRANSPARENT_HUGEPAGE */
425 static void __init pmd_basic_tests(struct pgtable_debug_args *args, int idx) { }
426 static void __init pud_basic_tests(struct pgtable_debug_args *args, int idx) { }
427 static void __init pmd_advanced_tests(struct pgtable_debug_args *args) { }
428 static void __init pud_advanced_tests(struct pgtable_debug_args *args) { }
429 static void __init pmd_leaf_tests(struct pgtable_debug_args *args) { }
430 static void __init pud_leaf_tests(struct pgtable_debug_args *args) { }
431 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
432
433 #ifdef CONFIG_HAVE_ARCH_HUGE_VMAP
434 static void __init pmd_huge_tests(struct pgtable_debug_args *args)
435 {
436         pmd_t pmd;
437
438         if (!arch_vmap_pmd_supported(args->page_prot) ||
439             args->fixed_alignment < PMD_SIZE)
440                 return;
441
442         pr_debug("Validating PMD huge\n");
443         /*
444          * X86 defined pmd_set_huge() verifies that the given
445          * PMD is not a populated non-leaf entry.
446          */
447         WRITE_ONCE(*args->pmdp, __pmd(0));
448         WARN_ON(!pmd_set_huge(args->pmdp, __pfn_to_phys(args->fixed_pmd_pfn), args->page_prot));
449         WARN_ON(!pmd_clear_huge(args->pmdp));
450         pmd = READ_ONCE(*args->pmdp);
451         WARN_ON(!pmd_none(pmd));
452 }
453
454 static void __init pud_huge_tests(struct pgtable_debug_args *args)
455 {
456         pud_t pud;
457
458         if (!arch_vmap_pud_supported(args->page_prot) ||
459             args->fixed_alignment < PUD_SIZE)
460                 return;
461
462         pr_debug("Validating PUD huge\n");
463         /*
464          * X86 defined pud_set_huge() verifies that the given
465          * PUD is not a populated non-leaf entry.
466          */
467         WRITE_ONCE(*args->pudp, __pud(0));
468         WARN_ON(!pud_set_huge(args->pudp, __pfn_to_phys(args->fixed_pud_pfn), args->page_prot));
469         WARN_ON(!pud_clear_huge(args->pudp));
470         pud = READ_ONCE(*args->pudp);
471         WARN_ON(!pud_none(pud));
472 }
473 #else /* !CONFIG_HAVE_ARCH_HUGE_VMAP */
474 static void __init pmd_huge_tests(struct pgtable_debug_args *args) { }
475 static void __init pud_huge_tests(struct pgtable_debug_args *args) { }
476 #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
477
478 static void __init p4d_basic_tests(struct pgtable_debug_args *args)
479 {
480         p4d_t p4d;
481
482         pr_debug("Validating P4D basic\n");
483         memset(&p4d, RANDOM_NZVALUE, sizeof(p4d_t));
484         WARN_ON(!p4d_same(p4d, p4d));
485 }
486
487 static void __init pgd_basic_tests(struct pgtable_debug_args *args)
488 {
489         pgd_t pgd;
490
491         pr_debug("Validating PGD basic\n");
492         memset(&pgd, RANDOM_NZVALUE, sizeof(pgd_t));
493         WARN_ON(!pgd_same(pgd, pgd));
494 }
495
496 #ifndef __PAGETABLE_PUD_FOLDED
497 static void __init pud_clear_tests(struct pgtable_debug_args *args)
498 {
499         pud_t pud = READ_ONCE(*args->pudp);
500
501         if (mm_pmd_folded(args->mm))
502                 return;
503
504         pr_debug("Validating PUD clear\n");
505         pud = __pud(pud_val(pud) | RANDOM_ORVALUE);
506         WRITE_ONCE(*args->pudp, pud);
507         pud_clear(args->pudp);
508         pud = READ_ONCE(*args->pudp);
509         WARN_ON(!pud_none(pud));
510 }
511
512 static void __init pud_populate_tests(struct pgtable_debug_args *args)
513 {
514         pud_t pud;
515
516         if (mm_pmd_folded(args->mm))
517                 return;
518
519         pr_debug("Validating PUD populate\n");
520         /*
521          * This entry points to next level page table page.
522          * Hence this must not qualify as pud_bad().
523          */
524         pud_populate(args->mm, args->pudp, args->start_pmdp);
525         pud = READ_ONCE(*args->pudp);
526         WARN_ON(pud_bad(pud));
527 }
528 #else  /* !__PAGETABLE_PUD_FOLDED */
529 static void __init pud_clear_tests(struct pgtable_debug_args *args) { }
530 static void __init pud_populate_tests(struct pgtable_debug_args *args) { }
531 #endif /* PAGETABLE_PUD_FOLDED */
532
533 #ifndef __PAGETABLE_P4D_FOLDED
534 static void __init p4d_clear_tests(struct pgtable_debug_args *args)
535 {
536         p4d_t p4d = READ_ONCE(*args->p4dp);
537
538         if (mm_pud_folded(args->mm))
539                 return;
540
541         pr_debug("Validating P4D clear\n");
542         p4d = __p4d(p4d_val(p4d) | RANDOM_ORVALUE);
543         WRITE_ONCE(*args->p4dp, p4d);
544         p4d_clear(args->p4dp);
545         p4d = READ_ONCE(*args->p4dp);
546         WARN_ON(!p4d_none(p4d));
547 }
548
549 static void __init p4d_populate_tests(struct pgtable_debug_args *args)
550 {
551         p4d_t p4d;
552
553         if (mm_pud_folded(args->mm))
554                 return;
555
556         pr_debug("Validating P4D populate\n");
557         /*
558          * This entry points to next level page table page.
559          * Hence this must not qualify as p4d_bad().
560          */
561         pud_clear(args->pudp);
562         p4d_clear(args->p4dp);
563         p4d_populate(args->mm, args->p4dp, args->start_pudp);
564         p4d = READ_ONCE(*args->p4dp);
565         WARN_ON(p4d_bad(p4d));
566 }
567
568 static void __init pgd_clear_tests(struct pgtable_debug_args *args)
569 {
570         pgd_t pgd = READ_ONCE(*(args->pgdp));
571
572         if (mm_p4d_folded(args->mm))
573                 return;
574
575         pr_debug("Validating PGD clear\n");
576         pgd = __pgd(pgd_val(pgd) | RANDOM_ORVALUE);
577         WRITE_ONCE(*args->pgdp, pgd);
578         pgd_clear(args->pgdp);
579         pgd = READ_ONCE(*args->pgdp);
580         WARN_ON(!pgd_none(pgd));
581 }
582
583 static void __init pgd_populate_tests(struct pgtable_debug_args *args)
584 {
585         pgd_t pgd;
586
587         if (mm_p4d_folded(args->mm))
588                 return;
589
590         pr_debug("Validating PGD populate\n");
591         /*
592          * This entry points to next level page table page.
593          * Hence this must not qualify as pgd_bad().
594          */
595         p4d_clear(args->p4dp);
596         pgd_clear(args->pgdp);
597         pgd_populate(args->mm, args->pgdp, args->start_p4dp);
598         pgd = READ_ONCE(*args->pgdp);
599         WARN_ON(pgd_bad(pgd));
600 }
601 #else  /* !__PAGETABLE_P4D_FOLDED */
602 static void __init p4d_clear_tests(struct pgtable_debug_args *args) { }
603 static void __init pgd_clear_tests(struct pgtable_debug_args *args) { }
604 static void __init p4d_populate_tests(struct pgtable_debug_args *args) { }
605 static void __init pgd_populate_tests(struct pgtable_debug_args *args) { }
606 #endif /* PAGETABLE_P4D_FOLDED */
607
608 static void __init pte_clear_tests(struct pgtable_debug_args *args)
609 {
610         struct page *page;
611         pte_t pte = pfn_pte(args->pte_pfn, args->page_prot);
612
613         page = (args->pte_pfn != ULONG_MAX) ? pfn_to_page(args->pte_pfn) : NULL;
614         if (!page)
615                 return;
616
617         /*
618          * flush_dcache_page() is called after set_pte_at() to clear
619          * PG_arch_1 for the page on ARM64. The page flag isn't cleared
620          * when it's released and page allocation check will fail when
621          * the page is allocated again. For architectures other than ARM64,
622          * the unexpected overhead of cache flushing is acceptable.
623          */
624         pr_debug("Validating PTE clear\n");
625         if (WARN_ON(!args->ptep))
626                 return;
627
628 #ifndef CONFIG_RISCV
629         pte = __pte(pte_val(pte) | RANDOM_ORVALUE);
630 #endif
631         set_pte_at(args->mm, args->vaddr, args->ptep, pte);
632         flush_dcache_page(page);
633         barrier();
634         ptep_clear(args->mm, args->vaddr, args->ptep);
635         pte = ptep_get(args->ptep);
636         WARN_ON(!pte_none(pte));
637 }
638
639 static void __init pmd_clear_tests(struct pgtable_debug_args *args)
640 {
641         pmd_t pmd = READ_ONCE(*args->pmdp);
642
643         pr_debug("Validating PMD clear\n");
644         pmd = __pmd(pmd_val(pmd) | RANDOM_ORVALUE);
645         WRITE_ONCE(*args->pmdp, pmd);
646         pmd_clear(args->pmdp);
647         pmd = READ_ONCE(*args->pmdp);
648         WARN_ON(!pmd_none(pmd));
649 }
650
651 static void __init pmd_populate_tests(struct pgtable_debug_args *args)
652 {
653         pmd_t pmd;
654
655         pr_debug("Validating PMD populate\n");
656         /*
657          * This entry points to next level page table page.
658          * Hence this must not qualify as pmd_bad().
659          */
660         pmd_populate(args->mm, args->pmdp, args->start_ptep);
661         pmd = READ_ONCE(*args->pmdp);
662         WARN_ON(pmd_bad(pmd));
663 }
664
665 static void __init pte_special_tests(struct pgtable_debug_args *args)
666 {
667         pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
668
669         if (!IS_ENABLED(CONFIG_ARCH_HAS_PTE_SPECIAL))
670                 return;
671
672         pr_debug("Validating PTE special\n");
673         WARN_ON(!pte_special(pte_mkspecial(pte)));
674 }
675
676 static void __init pte_protnone_tests(struct pgtable_debug_args *args)
677 {
678         pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot_none);
679
680         if (!IS_ENABLED(CONFIG_NUMA_BALANCING))
681                 return;
682
683         pr_debug("Validating PTE protnone\n");
684         WARN_ON(!pte_protnone(pte));
685         WARN_ON(!pte_present(pte));
686 }
687
688 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
689 static void __init pmd_protnone_tests(struct pgtable_debug_args *args)
690 {
691         pmd_t pmd;
692
693         if (!IS_ENABLED(CONFIG_NUMA_BALANCING))
694                 return;
695
696         if (!has_transparent_hugepage())
697                 return;
698
699         pr_debug("Validating PMD protnone\n");
700         pmd = pmd_mkhuge(pfn_pmd(args->fixed_pmd_pfn, args->page_prot_none));
701         WARN_ON(!pmd_protnone(pmd));
702         WARN_ON(!pmd_present(pmd));
703 }
704 #else  /* !CONFIG_TRANSPARENT_HUGEPAGE */
705 static void __init pmd_protnone_tests(struct pgtable_debug_args *args) { }
706 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
707
708 #ifdef CONFIG_ARCH_HAS_PTE_DEVMAP
709 static void __init pte_devmap_tests(struct pgtable_debug_args *args)
710 {
711         pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
712
713         pr_debug("Validating PTE devmap\n");
714         WARN_ON(!pte_devmap(pte_mkdevmap(pte)));
715 }
716
717 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
718 static void __init pmd_devmap_tests(struct pgtable_debug_args *args)
719 {
720         pmd_t pmd;
721
722         if (!has_transparent_hugepage())
723                 return;
724
725         pr_debug("Validating PMD devmap\n");
726         pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
727         WARN_ON(!pmd_devmap(pmd_mkdevmap(pmd)));
728 }
729
730 #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
731 static void __init pud_devmap_tests(struct pgtable_debug_args *args)
732 {
733         pud_t pud;
734
735         if (!has_transparent_pud_hugepage())
736                 return;
737
738         pr_debug("Validating PUD devmap\n");
739         pud = pfn_pud(args->fixed_pud_pfn, args->page_prot);
740         WARN_ON(!pud_devmap(pud_mkdevmap(pud)));
741 }
742 #else  /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
743 static void __init pud_devmap_tests(struct pgtable_debug_args *args) { }
744 #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
745 #else  /* CONFIG_TRANSPARENT_HUGEPAGE */
746 static void __init pmd_devmap_tests(struct pgtable_debug_args *args) { }
747 static void __init pud_devmap_tests(struct pgtable_debug_args *args) { }
748 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
749 #else
750 static void __init pte_devmap_tests(struct pgtable_debug_args *args) { }
751 static void __init pmd_devmap_tests(struct pgtable_debug_args *args) { }
752 static void __init pud_devmap_tests(struct pgtable_debug_args *args) { }
753 #endif /* CONFIG_ARCH_HAS_PTE_DEVMAP */
754
755 static void __init pte_soft_dirty_tests(struct pgtable_debug_args *args)
756 {
757         pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
758
759         if (!IS_ENABLED(CONFIG_MEM_SOFT_DIRTY))
760                 return;
761
762         pr_debug("Validating PTE soft dirty\n");
763         WARN_ON(!pte_soft_dirty(pte_mksoft_dirty(pte)));
764         WARN_ON(pte_soft_dirty(pte_clear_soft_dirty(pte)));
765 }
766
767 static void __init pte_swap_soft_dirty_tests(struct pgtable_debug_args *args)
768 {
769         pte_t pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
770
771         if (!IS_ENABLED(CONFIG_MEM_SOFT_DIRTY))
772                 return;
773
774         pr_debug("Validating PTE swap soft dirty\n");
775         WARN_ON(!pte_swp_soft_dirty(pte_swp_mksoft_dirty(pte)));
776         WARN_ON(pte_swp_soft_dirty(pte_swp_clear_soft_dirty(pte)));
777 }
778
779 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
780 static void __init pmd_soft_dirty_tests(struct pgtable_debug_args *args)
781 {
782         pmd_t pmd;
783
784         if (!IS_ENABLED(CONFIG_MEM_SOFT_DIRTY))
785                 return;
786
787         if (!has_transparent_hugepage())
788                 return;
789
790         pr_debug("Validating PMD soft dirty\n");
791         pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
792         WARN_ON(!pmd_soft_dirty(pmd_mksoft_dirty(pmd)));
793         WARN_ON(pmd_soft_dirty(pmd_clear_soft_dirty(pmd)));
794 }
795
796 static void __init pmd_swap_soft_dirty_tests(struct pgtable_debug_args *args)
797 {
798         pmd_t pmd;
799
800         if (!IS_ENABLED(CONFIG_MEM_SOFT_DIRTY) ||
801                 !IS_ENABLED(CONFIG_ARCH_ENABLE_THP_MIGRATION))
802                 return;
803
804         if (!has_transparent_hugepage())
805                 return;
806
807         pr_debug("Validating PMD swap soft dirty\n");
808         pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
809         WARN_ON(!pmd_swp_soft_dirty(pmd_swp_mksoft_dirty(pmd)));
810         WARN_ON(pmd_swp_soft_dirty(pmd_swp_clear_soft_dirty(pmd)));
811 }
812 #else  /* !CONFIG_TRANSPARENT_HUGEPAGE */
813 static void __init pmd_soft_dirty_tests(struct pgtable_debug_args *args) { }
814 static void __init pmd_swap_soft_dirty_tests(struct pgtable_debug_args *args) { }
815 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
816
817 static void __init pte_swap_exclusive_tests(struct pgtable_debug_args *args)
818 {
819         unsigned long max_swap_offset;
820         swp_entry_t entry, entry2;
821         pte_t pte;
822
823         pr_debug("Validating PTE swap exclusive\n");
824
825         /* See generic_max_swapfile_size(): probe the maximum offset */
826         max_swap_offset = swp_offset(pte_to_swp_entry(swp_entry_to_pte(swp_entry(0, ~0UL))));
827
828         /* Create a swp entry with all possible bits set */
829         entry = swp_entry((1 << MAX_SWAPFILES_SHIFT) - 1, max_swap_offset);
830
831         pte = swp_entry_to_pte(entry);
832         WARN_ON(pte_swp_exclusive(pte));
833         WARN_ON(!is_swap_pte(pte));
834         entry2 = pte_to_swp_entry(pte);
835         WARN_ON(memcmp(&entry, &entry2, sizeof(entry)));
836
837         pte = pte_swp_mkexclusive(pte);
838         WARN_ON(!pte_swp_exclusive(pte));
839         WARN_ON(!is_swap_pte(pte));
840         WARN_ON(pte_swp_soft_dirty(pte));
841         entry2 = pte_to_swp_entry(pte);
842         WARN_ON(memcmp(&entry, &entry2, sizeof(entry)));
843
844         pte = pte_swp_clear_exclusive(pte);
845         WARN_ON(pte_swp_exclusive(pte));
846         WARN_ON(!is_swap_pte(pte));
847         entry2 = pte_to_swp_entry(pte);
848         WARN_ON(memcmp(&entry, &entry2, sizeof(entry)));
849 }
850
851 static void __init pte_swap_tests(struct pgtable_debug_args *args)
852 {
853         swp_entry_t swp;
854         pte_t pte;
855
856         pr_debug("Validating PTE swap\n");
857         pte = pfn_pte(args->fixed_pte_pfn, args->page_prot);
858         swp = __pte_to_swp_entry(pte);
859         pte = __swp_entry_to_pte(swp);
860         WARN_ON(args->fixed_pte_pfn != pte_pfn(pte));
861 }
862
863 #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
864 static void __init pmd_swap_tests(struct pgtable_debug_args *args)
865 {
866         swp_entry_t swp;
867         pmd_t pmd;
868
869         if (!has_transparent_hugepage())
870                 return;
871
872         pr_debug("Validating PMD swap\n");
873         pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
874         swp = __pmd_to_swp_entry(pmd);
875         pmd = __swp_entry_to_pmd(swp);
876         WARN_ON(args->fixed_pmd_pfn != pmd_pfn(pmd));
877 }
878 #else  /* !CONFIG_ARCH_ENABLE_THP_MIGRATION */
879 static void __init pmd_swap_tests(struct pgtable_debug_args *args) { }
880 #endif /* CONFIG_ARCH_ENABLE_THP_MIGRATION */
881
882 static void __init swap_migration_tests(struct pgtable_debug_args *args)
883 {
884         struct page *page;
885         swp_entry_t swp;
886
887         if (!IS_ENABLED(CONFIG_MIGRATION))
888                 return;
889
890         /*
891          * swap_migration_tests() requires a dedicated page as it needs to
892          * be locked before creating a migration entry from it. Locking the
893          * page that actually maps kernel text ('start_kernel') can be real
894          * problematic. Lets use the allocated page explicitly for this
895          * purpose.
896          */
897         page = (args->pte_pfn != ULONG_MAX) ? pfn_to_page(args->pte_pfn) : NULL;
898         if (!page)
899                 return;
900
901         pr_debug("Validating swap migration\n");
902
903         /*
904          * make_[readable|writable]_migration_entry() expects given page to
905          * be locked, otherwise it stumbles upon a BUG_ON().
906          */
907         __SetPageLocked(page);
908         swp = make_writable_migration_entry(page_to_pfn(page));
909         WARN_ON(!is_migration_entry(swp));
910         WARN_ON(!is_writable_migration_entry(swp));
911
912         swp = make_readable_migration_entry(swp_offset(swp));
913         WARN_ON(!is_migration_entry(swp));
914         WARN_ON(is_writable_migration_entry(swp));
915
916         swp = make_readable_migration_entry(page_to_pfn(page));
917         WARN_ON(!is_migration_entry(swp));
918         WARN_ON(is_writable_migration_entry(swp));
919         __ClearPageLocked(page);
920 }
921
922 #ifdef CONFIG_HUGETLB_PAGE
923 static void __init hugetlb_basic_tests(struct pgtable_debug_args *args)
924 {
925         struct page *page;
926         pte_t pte;
927
928         pr_debug("Validating HugeTLB basic\n");
929         /*
930          * Accessing the page associated with the pfn is safe here,
931          * as it was previously derived from a real kernel symbol.
932          */
933         page = pfn_to_page(args->fixed_pmd_pfn);
934         pte = mk_huge_pte(page, args->page_prot);
935
936         WARN_ON(!huge_pte_dirty(huge_pte_mkdirty(pte)));
937         WARN_ON(!huge_pte_write(huge_pte_mkwrite(huge_pte_wrprotect(pte))));
938         WARN_ON(huge_pte_write(huge_pte_wrprotect(huge_pte_mkwrite(pte))));
939
940 #ifdef CONFIG_ARCH_WANT_GENERAL_HUGETLB
941         pte = pfn_pte(args->fixed_pmd_pfn, args->page_prot);
942
943         WARN_ON(!pte_huge(arch_make_huge_pte(pte, PMD_SHIFT, VM_ACCESS_FLAGS)));
944 #endif /* CONFIG_ARCH_WANT_GENERAL_HUGETLB */
945 }
946 #else  /* !CONFIG_HUGETLB_PAGE */
947 static void __init hugetlb_basic_tests(struct pgtable_debug_args *args) { }
948 #endif /* CONFIG_HUGETLB_PAGE */
949
950 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
951 static void __init pmd_thp_tests(struct pgtable_debug_args *args)
952 {
953         pmd_t pmd;
954
955         if (!has_transparent_hugepage())
956                 return;
957
958         pr_debug("Validating PMD based THP\n");
959         /*
960          * pmd_trans_huge() and pmd_present() must return positive after
961          * MMU invalidation with pmd_mkinvalid(). This behavior is an
962          * optimization for transparent huge page. pmd_trans_huge() must
963          * be true if pmd_page() returns a valid THP to avoid taking the
964          * pmd_lock when others walk over non transhuge pmds (i.e. there
965          * are no THP allocated). Especially when splitting a THP and
966          * removing the present bit from the pmd, pmd_trans_huge() still
967          * needs to return true. pmd_present() should be true whenever
968          * pmd_trans_huge() returns true.
969          */
970         pmd = pfn_pmd(args->fixed_pmd_pfn, args->page_prot);
971         WARN_ON(!pmd_trans_huge(pmd_mkhuge(pmd)));
972
973 #ifndef __HAVE_ARCH_PMDP_INVALIDATE
974         WARN_ON(!pmd_trans_huge(pmd_mkinvalid(pmd_mkhuge(pmd))));
975         WARN_ON(!pmd_present(pmd_mkinvalid(pmd_mkhuge(pmd))));
976 #endif /* __HAVE_ARCH_PMDP_INVALIDATE */
977 }
978
979 #ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
980 static void __init pud_thp_tests(struct pgtable_debug_args *args)
981 {
982         pud_t pud;
983
984         if (!has_transparent_pud_hugepage())
985                 return;
986
987         pr_debug("Validating PUD based THP\n");
988         pud = pfn_pud(args->fixed_pud_pfn, args->page_prot);
989         WARN_ON(!pud_trans_huge(pud_mkhuge(pud)));
990
991         /*
992          * pud_mkinvalid() has been dropped for now. Enable back
993          * these tests when it comes back with a modified pud_present().
994          *
995          * WARN_ON(!pud_trans_huge(pud_mkinvalid(pud_mkhuge(pud))));
996          * WARN_ON(!pud_present(pud_mkinvalid(pud_mkhuge(pud))));
997          */
998 }
999 #else  /* !CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
1000 static void __init pud_thp_tests(struct pgtable_debug_args *args) { }
1001 #endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
1002 #else  /* !CONFIG_TRANSPARENT_HUGEPAGE */
1003 static void __init pmd_thp_tests(struct pgtable_debug_args *args) { }
1004 static void __init pud_thp_tests(struct pgtable_debug_args *args) { }
1005 #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
1006
1007 static unsigned long __init get_random_vaddr(void)
1008 {
1009         unsigned long random_vaddr, random_pages, total_user_pages;
1010
1011         total_user_pages = (TASK_SIZE - FIRST_USER_ADDRESS) / PAGE_SIZE;
1012
1013         random_pages = get_random_long() % total_user_pages;
1014         random_vaddr = FIRST_USER_ADDRESS + random_pages * PAGE_SIZE;
1015
1016         return random_vaddr;
1017 }
1018
1019 static void __init destroy_args(struct pgtable_debug_args *args)
1020 {
1021         struct page *page = NULL;
1022
1023         /* Free (huge) page */
1024         if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
1025             has_transparent_pud_hugepage() &&
1026             args->pud_pfn != ULONG_MAX) {
1027                 if (args->is_contiguous_page) {
1028                         free_contig_range(args->pud_pfn,
1029                                           (1 << (HPAGE_PUD_SHIFT - PAGE_SHIFT)));
1030                 } else {
1031                         page = pfn_to_page(args->pud_pfn);
1032                         __free_pages(page, HPAGE_PUD_SHIFT - PAGE_SHIFT);
1033                 }
1034
1035                 args->pud_pfn = ULONG_MAX;
1036                 args->pmd_pfn = ULONG_MAX;
1037                 args->pte_pfn = ULONG_MAX;
1038         }
1039
1040         if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
1041             has_transparent_hugepage() &&
1042             args->pmd_pfn != ULONG_MAX) {
1043                 if (args->is_contiguous_page) {
1044                         free_contig_range(args->pmd_pfn, (1 << HPAGE_PMD_ORDER));
1045                 } else {
1046                         page = pfn_to_page(args->pmd_pfn);
1047                         __free_pages(page, HPAGE_PMD_ORDER);
1048                 }
1049
1050                 args->pmd_pfn = ULONG_MAX;
1051                 args->pte_pfn = ULONG_MAX;
1052         }
1053
1054         if (args->pte_pfn != ULONG_MAX) {
1055                 page = pfn_to_page(args->pte_pfn);
1056                 __free_page(page);
1057
1058                 args->pte_pfn = ULONG_MAX;
1059         }
1060
1061         /* Free page table entries */
1062         if (args->start_ptep) {
1063                 pte_free(args->mm, args->start_ptep);
1064                 mm_dec_nr_ptes(args->mm);
1065         }
1066
1067         if (args->start_pmdp) {
1068                 pmd_free(args->mm, args->start_pmdp);
1069                 mm_dec_nr_pmds(args->mm);
1070         }
1071
1072         if (args->start_pudp) {
1073                 pud_free(args->mm, args->start_pudp);
1074                 mm_dec_nr_puds(args->mm);
1075         }
1076
1077         if (args->start_p4dp)
1078                 p4d_free(args->mm, args->start_p4dp);
1079
1080         /* Free vma and mm struct */
1081         if (args->vma)
1082                 vm_area_free(args->vma);
1083
1084         if (args->mm)
1085                 mmdrop(args->mm);
1086 }
1087
1088 static struct page * __init
1089 debug_vm_pgtable_alloc_huge_page(struct pgtable_debug_args *args, int order)
1090 {
1091         struct page *page = NULL;
1092
1093 #ifdef CONFIG_CONTIG_ALLOC
1094         if (order > MAX_ORDER) {
1095                 page = alloc_contig_pages((1 << order), GFP_KERNEL,
1096                                           first_online_node, NULL);
1097                 if (page) {
1098                         args->is_contiguous_page = true;
1099                         return page;
1100                 }
1101         }
1102 #endif
1103
1104         if (order <= MAX_ORDER)
1105                 page = alloc_pages(GFP_KERNEL, order);
1106
1107         return page;
1108 }
1109
1110 /*
1111  * Check if a physical memory range described by <pstart, pend> contains
1112  * an area that is of size psize, and aligned to psize.
1113  *
1114  * Don't use address 0, an all-zeroes physical address might mask bugs, and
1115  * it's not used on x86.
1116  */
1117 static void  __init phys_align_check(phys_addr_t pstart,
1118                                      phys_addr_t pend, unsigned long psize,
1119                                      phys_addr_t *physp, unsigned long *alignp)
1120 {
1121         phys_addr_t aligned_start, aligned_end;
1122
1123         if (pstart == 0)
1124                 pstart = PAGE_SIZE;
1125
1126         aligned_start = ALIGN(pstart, psize);
1127         aligned_end = aligned_start + psize;
1128
1129         if (aligned_end > aligned_start && aligned_end <= pend) {
1130                 *alignp = psize;
1131                 *physp = aligned_start;
1132         }
1133 }
1134
1135 static void __init init_fixed_pfns(struct pgtable_debug_args *args)
1136 {
1137         u64 idx;
1138         phys_addr_t phys, pstart, pend;
1139
1140         /*
1141          * Initialize the fixed pfns. To do this, try to find a
1142          * valid physical range, preferably aligned to PUD_SIZE,
1143          * but settling for aligned to PMD_SIZE as a fallback. If
1144          * neither of those is found, use the physical address of
1145          * the start_kernel symbol.
1146          *
1147          * The memory doesn't need to be allocated, it just needs to exist
1148          * as usable memory. It won't be touched.
1149          *
1150          * The alignment is recorded, and can be checked to see if we
1151          * can run the tests that require an actual valid physical
1152          * address range on some architectures ({pmd,pud}_huge_test
1153          * on x86).
1154          */
1155
1156         phys = __pa_symbol(&start_kernel);
1157         args->fixed_alignment = PAGE_SIZE;
1158
1159         for_each_mem_range(idx, &pstart, &pend) {
1160                 /* First check for a PUD-aligned area */
1161                 phys_align_check(pstart, pend, PUD_SIZE, &phys,
1162                                  &args->fixed_alignment);
1163
1164                 /* If a PUD-aligned area is found, we're done */
1165                 if (args->fixed_alignment == PUD_SIZE)
1166                         break;
1167
1168                 /*
1169                  * If no PMD-aligned area found yet, check for one,
1170                  * but continue the loop to look for a PUD-aligned area.
1171                  */
1172                 if (args->fixed_alignment < PMD_SIZE)
1173                         phys_align_check(pstart, pend, PMD_SIZE, &phys,
1174                                          &args->fixed_alignment);
1175         }
1176
1177         args->fixed_pgd_pfn = __phys_to_pfn(phys & PGDIR_MASK);
1178         args->fixed_p4d_pfn = __phys_to_pfn(phys & P4D_MASK);
1179         args->fixed_pud_pfn = __phys_to_pfn(phys & PUD_MASK);
1180         args->fixed_pmd_pfn = __phys_to_pfn(phys & PMD_MASK);
1181         args->fixed_pte_pfn = __phys_to_pfn(phys & PAGE_MASK);
1182         WARN_ON(!pfn_valid(args->fixed_pte_pfn));
1183 }
1184
1185
1186 static int __init init_args(struct pgtable_debug_args *args)
1187 {
1188         struct page *page = NULL;
1189         int ret = 0;
1190
1191         /*
1192          * Initialize the debugging data.
1193          *
1194          * vm_get_page_prot(VM_NONE) or vm_get_page_prot(VM_SHARED|VM_NONE)
1195          * will help create page table entries with PROT_NONE permission as
1196          * required for pxx_protnone_tests().
1197          */
1198         memset(args, 0, sizeof(*args));
1199         args->vaddr              = get_random_vaddr();
1200         args->page_prot          = vm_get_page_prot(VM_ACCESS_FLAGS);
1201         args->page_prot_none     = vm_get_page_prot(VM_NONE);
1202         args->is_contiguous_page = false;
1203         args->pud_pfn            = ULONG_MAX;
1204         args->pmd_pfn            = ULONG_MAX;
1205         args->pte_pfn            = ULONG_MAX;
1206         args->fixed_pgd_pfn      = ULONG_MAX;
1207         args->fixed_p4d_pfn      = ULONG_MAX;
1208         args->fixed_pud_pfn      = ULONG_MAX;
1209         args->fixed_pmd_pfn      = ULONG_MAX;
1210         args->fixed_pte_pfn      = ULONG_MAX;
1211
1212         /* Allocate mm and vma */
1213         args->mm = mm_alloc();
1214         if (!args->mm) {
1215                 pr_err("Failed to allocate mm struct\n");
1216                 ret = -ENOMEM;
1217                 goto error;
1218         }
1219
1220         args->vma = vm_area_alloc(args->mm);
1221         if (!args->vma) {
1222                 pr_err("Failed to allocate vma\n");
1223                 ret = -ENOMEM;
1224                 goto error;
1225         }
1226
1227         /*
1228          * Allocate page table entries. They will be modified in the tests.
1229          * Lets save the page table entries so that they can be released
1230          * when the tests are completed.
1231          */
1232         args->pgdp = pgd_offset(args->mm, args->vaddr);
1233         args->p4dp = p4d_alloc(args->mm, args->pgdp, args->vaddr);
1234         if (!args->p4dp) {
1235                 pr_err("Failed to allocate p4d entries\n");
1236                 ret = -ENOMEM;
1237                 goto error;
1238         }
1239         args->start_p4dp = p4d_offset(args->pgdp, 0UL);
1240         WARN_ON(!args->start_p4dp);
1241
1242         args->pudp = pud_alloc(args->mm, args->p4dp, args->vaddr);
1243         if (!args->pudp) {
1244                 pr_err("Failed to allocate pud entries\n");
1245                 ret = -ENOMEM;
1246                 goto error;
1247         }
1248         args->start_pudp = pud_offset(args->p4dp, 0UL);
1249         WARN_ON(!args->start_pudp);
1250
1251         args->pmdp = pmd_alloc(args->mm, args->pudp, args->vaddr);
1252         if (!args->pmdp) {
1253                 pr_err("Failed to allocate pmd entries\n");
1254                 ret = -ENOMEM;
1255                 goto error;
1256         }
1257         args->start_pmdp = pmd_offset(args->pudp, 0UL);
1258         WARN_ON(!args->start_pmdp);
1259
1260         if (pte_alloc(args->mm, args->pmdp)) {
1261                 pr_err("Failed to allocate pte entries\n");
1262                 ret = -ENOMEM;
1263                 goto error;
1264         }
1265         args->start_ptep = pmd_pgtable(READ_ONCE(*args->pmdp));
1266         WARN_ON(!args->start_ptep);
1267
1268         init_fixed_pfns(args);
1269
1270         /*
1271          * Allocate (huge) pages because some of the tests need to access
1272          * the data in the pages. The corresponding tests will be skipped
1273          * if we fail to allocate (huge) pages.
1274          */
1275         if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
1276             has_transparent_pud_hugepage()) {
1277                 page = debug_vm_pgtable_alloc_huge_page(args,
1278                                 HPAGE_PUD_SHIFT - PAGE_SHIFT);
1279                 if (page) {
1280                         args->pud_pfn = page_to_pfn(page);
1281                         args->pmd_pfn = args->pud_pfn;
1282                         args->pte_pfn = args->pud_pfn;
1283                         return 0;
1284                 }
1285         }
1286
1287         if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) &&
1288             has_transparent_hugepage()) {
1289                 page = debug_vm_pgtable_alloc_huge_page(args, HPAGE_PMD_ORDER);
1290                 if (page) {
1291                         args->pmd_pfn = page_to_pfn(page);
1292                         args->pte_pfn = args->pmd_pfn;
1293                         return 0;
1294                 }
1295         }
1296
1297         page = alloc_page(GFP_KERNEL);
1298         if (page)
1299                 args->pte_pfn = page_to_pfn(page);
1300
1301         return 0;
1302
1303 error:
1304         destroy_args(args);
1305         return ret;
1306 }
1307
1308 static int __init debug_vm_pgtable(void)
1309 {
1310         struct pgtable_debug_args args;
1311         spinlock_t *ptl = NULL;
1312         int idx, ret;
1313
1314         pr_info("Validating architecture page table helpers\n");
1315         ret = init_args(&args);
1316         if (ret)
1317                 return ret;
1318
1319         /*
1320          * Iterate over each possible vm_flags to make sure that all
1321          * the basic page table transformation validations just hold
1322          * true irrespective of the starting protection value for a
1323          * given page table entry.
1324          *
1325          * Protection based vm_flags combinatins are always linear
1326          * and increasing i.e starting from VM_NONE and going upto
1327          * (VM_SHARED | READ | WRITE | EXEC).
1328          */
1329 #define VM_FLAGS_START  (VM_NONE)
1330 #define VM_FLAGS_END    (VM_SHARED | VM_EXEC | VM_WRITE | VM_READ)
1331
1332         for (idx = VM_FLAGS_START; idx <= VM_FLAGS_END; idx++) {
1333                 pte_basic_tests(&args, idx);
1334                 pmd_basic_tests(&args, idx);
1335                 pud_basic_tests(&args, idx);
1336         }
1337
1338         /*
1339          * Both P4D and PGD level tests are very basic which do not
1340          * involve creating page table entries from the protection
1341          * value and the given pfn. Hence just keep them out from
1342          * the above iteration for now to save some test execution
1343          * time.
1344          */
1345         p4d_basic_tests(&args);
1346         pgd_basic_tests(&args);
1347
1348         pmd_leaf_tests(&args);
1349         pud_leaf_tests(&args);
1350
1351         pte_special_tests(&args);
1352         pte_protnone_tests(&args);
1353         pmd_protnone_tests(&args);
1354
1355         pte_devmap_tests(&args);
1356         pmd_devmap_tests(&args);
1357         pud_devmap_tests(&args);
1358
1359         pte_soft_dirty_tests(&args);
1360         pmd_soft_dirty_tests(&args);
1361         pte_swap_soft_dirty_tests(&args);
1362         pmd_swap_soft_dirty_tests(&args);
1363
1364         pte_swap_exclusive_tests(&args);
1365
1366         pte_swap_tests(&args);
1367         pmd_swap_tests(&args);
1368
1369         swap_migration_tests(&args);
1370
1371         pmd_thp_tests(&args);
1372         pud_thp_tests(&args);
1373
1374         hugetlb_basic_tests(&args);
1375
1376         /*
1377          * Page table modifying tests. They need to hold
1378          * proper page table lock.
1379          */
1380
1381         args.ptep = pte_offset_map_lock(args.mm, args.pmdp, args.vaddr, &ptl);
1382         pte_clear_tests(&args);
1383         pte_advanced_tests(&args);
1384         if (args.ptep)
1385                 pte_unmap_unlock(args.ptep, ptl);
1386
1387         ptl = pmd_lock(args.mm, args.pmdp);
1388         pmd_clear_tests(&args);
1389         pmd_advanced_tests(&args);
1390         pmd_huge_tests(&args);
1391         pmd_populate_tests(&args);
1392         spin_unlock(ptl);
1393
1394         ptl = pud_lock(args.mm, args.pudp);
1395         pud_clear_tests(&args);
1396         pud_advanced_tests(&args);
1397         pud_huge_tests(&args);
1398         pud_populate_tests(&args);
1399         spin_unlock(ptl);
1400
1401         spin_lock(&(args.mm->page_table_lock));
1402         p4d_clear_tests(&args);
1403         pgd_clear_tests(&args);
1404         p4d_populate_tests(&args);
1405         pgd_populate_tests(&args);
1406         spin_unlock(&(args.mm->page_table_lock));
1407
1408         destroy_args(&args);
1409         return 0;
1410 }
1411 late_initcall(debug_vm_pgtable);