1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
5 #include <linux/init.h>
6 #include <linux/export.h>
8 #include <asm/pgalloc.h>
9 #include <asm/pgtable.h>
10 #include <asm/tlbflush.h>
12 pgd_t *pgd_alloc(struct mm_struct *mm)
16 ret = (pgd_t *) __get_free_page(GFP_KERNEL);
18 init = pgd_offset(&init_mm, 0UL);
20 memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
21 (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
26 EXPORT_SYMBOL_GPL(pgd_alloc);
28 void pgd_init(void *addr)
30 unsigned long *p, *end;
33 #if !defined(__PAGETABLE_PUD_FOLDED)
34 entry = (unsigned long)invalid_pud_table;
35 #elif !defined(__PAGETABLE_PMD_FOLDED)
36 entry = (unsigned long)invalid_pmd_table;
38 entry = (unsigned long)invalid_pte_table;
41 p = (unsigned long *)addr;
42 end = p + PTRS_PER_PGD;
56 EXPORT_SYMBOL_GPL(pgd_init);
58 #ifndef __PAGETABLE_PMD_FOLDED
59 void pmd_init(void *addr)
61 unsigned long *p, *end;
62 unsigned long pagetable = (unsigned long)invalid_pte_table;
64 p = (unsigned long *)addr;
65 end = p + PTRS_PER_PMD;
79 EXPORT_SYMBOL_GPL(pmd_init);
82 #ifndef __PAGETABLE_PUD_FOLDED
83 void pud_init(void *addr)
85 unsigned long *p, *end;
86 unsigned long pagetable = (unsigned long)invalid_pmd_table;
88 p = (unsigned long *)addr;
89 end = p + PTRS_PER_PUD;
103 EXPORT_SYMBOL_GPL(pud_init);
106 pmd_t mk_pmd(struct page *page, pgprot_t prot)
110 pmd_val(pmd) = (page_to_pfn(page) << _PFN_SHIFT) | pgprot_val(prot);
115 void set_pmd_at(struct mm_struct *mm, unsigned long addr,
116 pmd_t *pmdp, pmd_t pmd)
122 void __init pagetable_init(void)
124 /* Initialize the entire pgd. */
125 pgd_init(swapper_pg_dir);
126 pgd_init(invalid_pg_dir);
127 #ifndef __PAGETABLE_PUD_FOLDED
128 pud_init(invalid_pud_table);
130 #ifndef __PAGETABLE_PMD_FOLDED
131 pmd_init(invalid_pmd_table);