Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 
0003 #ifndef __ASM_CSKY_PGALLOC_H
0004 #define __ASM_CSKY_PGALLOC_H
0005 
0006 #include <linux/highmem.h>
0007 #include <linux/mm.h>
0008 #include <linux/sched.h>
0009 
0010 #define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL
0011 #include <asm-generic/pgalloc.h>
0012 
0013 static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
0014                     pte_t *pte)
0015 {
0016     set_pmd(pmd, __pmd(__pa(pte)));
0017 }
0018 
0019 static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
0020                     pgtable_t pte)
0021 {
0022     set_pmd(pmd, __pmd(__pa(page_address(pte))));
0023 }
0024 
0025 extern void pgd_init(unsigned long *p);
0026 
0027 static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
0028 {
0029     pte_t *pte;
0030     unsigned long i;
0031 
0032     pte = (pte_t *) __get_free_page(GFP_KERNEL);
0033     if (!pte)
0034         return NULL;
0035 
0036     for (i = 0; i < PAGE_SIZE/sizeof(pte_t); i++)
0037         (pte + i)->pte_low = _PAGE_GLOBAL;
0038 
0039     return pte;
0040 }
0041 
0042 static inline pgd_t *pgd_alloc(struct mm_struct *mm)
0043 {
0044     pgd_t *ret;
0045     pgd_t *init;
0046 
0047     ret = (pgd_t *) __get_free_page(GFP_KERNEL);
0048     if (ret) {
0049         init = pgd_offset(&init_mm, 0UL);
0050         pgd_init((unsigned long *)ret);
0051         memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
0052             (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
0053         /* prevent out of order excute */
0054         smp_mb();
0055 #ifdef CONFIG_CPU_NEED_TLBSYNC
0056         dcache_wb_range((unsigned int)ret,
0057                 (unsigned int)(ret + PTRS_PER_PGD));
0058 #endif
0059     }
0060 
0061     return ret;
0062 }
0063 
0064 #define __pte_free_tlb(tlb, pte, address)       \
0065 do {                            \
0066     pgtable_pte_page_dtor(pte);         \
0067     tlb_remove_page(tlb, pte);          \
0068 } while (0)
0069 
0070 extern void pagetable_init(void);
0071 extern void mmu_init(unsigned long min_pfn, unsigned long max_pfn);
0072 extern void pre_trap_init(void);
0073 
0074 #endif /* __ASM_CSKY_PGALLOC_H */