Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/csky/include/asm/pgalloc.h
26493 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
3
#ifndef __ASM_CSKY_PGALLOC_H
4
#define __ASM_CSKY_PGALLOC_H
5
6
#include <linux/highmem.h>
7
#include <linux/mm.h>
8
#include <linux/sched.h>
9
10
#define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL
11
#include <asm-generic/pgalloc.h>
12
13
static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
14
pte_t *pte)
15
{
16
set_pmd(pmd, __pmd(__pa(pte)));
17
}
18
19
static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
20
pgtable_t pte)
21
{
22
set_pmd(pmd, __pmd(__pa(page_address(pte))));
23
}
24
25
extern void pgd_init(unsigned long *p);
26
27
static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm)
28
{
29
pte_t *pte;
30
unsigned long i;
31
32
pte = __pte_alloc_one_kernel(mm);
33
if (!pte)
34
return NULL;
35
36
for (i = 0; i < PAGE_SIZE/sizeof(pte_t); i++)
37
(pte + i)->pte_low = _PAGE_GLOBAL;
38
39
return pte;
40
}
41
42
static inline pgd_t *pgd_alloc(struct mm_struct *mm)
43
{
44
pgd_t *ret;
45
pgd_t *init;
46
47
ret = __pgd_alloc(mm, 0);
48
if (ret) {
49
init = pgd_offset(&init_mm, 0UL);
50
pgd_init((unsigned long *)ret);
51
memcpy(ret + USER_PTRS_PER_PGD, init + USER_PTRS_PER_PGD,
52
(PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
53
/* prevent out of order excute */
54
smp_mb();
55
#ifdef CONFIG_CPU_NEED_TLBSYNC
56
dcache_wb_range((unsigned int)ret,
57
(unsigned int)(ret + PTRS_PER_PGD));
58
#endif
59
}
60
61
return ret;
62
}
63
64
#define __pte_free_tlb(tlb, pte, address) \
65
tlb_remove_ptdesc((tlb), page_ptdesc(pte))
66
67
extern void pagetable_init(void);
68
extern void mmu_init(unsigned long min_pfn, unsigned long max_pfn);
69
extern void pre_trap_init(void);
70
71
#endif /* __ASM_CSKY_PGALLOC_H */
72
73