1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#ifndef _ASM_ARC_PGALLOC_H
30#define _ASM_ARC_PGALLOC_H
31
32#include <linux/mm.h>
33#include <linux/log2.h>
34#include <asm-generic/pgalloc.h>
35
36static inline void
37pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
38{
39
40
41
42
43
44
45
46 set_pmd(pmd, __pmd((unsigned long)pte));
47}
48
49static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte_page)
50{
51 set_pmd(pmd, __pmd((unsigned long)page_address(pte_page)));
52}
53
54static inline pgd_t *pgd_alloc(struct mm_struct *mm)
55{
56 pgd_t *ret = (pgd_t *) __get_free_page(GFP_KERNEL);
57
58 if (ret) {
59 int num, num2;
60 num = USER_PTRS_PER_PGD + USER_KERNEL_GUTTER / PGDIR_SIZE;
61 memzero(ret, num * sizeof(pgd_t));
62
63 num2 = VMALLOC_SIZE / PGDIR_SIZE;
64 memcpy(ret + num, swapper_pg_dir + num, num2 * sizeof(pgd_t));
65
66 memzero(ret + num + num2,
67 (PTRS_PER_PGD - num - num2) * sizeof(pgd_t));
68
69 }
70 return ret;
71}
72
73#if CONFIG_PGTABLE_LEVELS > 3
74
75static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4dp, pud_t *pudp)
76{
77 set_p4d(p4dp, __p4d((unsigned long)pudp));
78}
79
80#define __pud_free_tlb(tlb, pmd, addr) pud_free((tlb)->mm, pmd)
81
82#endif
83
84#if CONFIG_PGTABLE_LEVELS > 2
85
86static inline void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmdp)
87{
88 set_pud(pudp, __pud((unsigned long)pmdp));
89}
90
91#define __pmd_free_tlb(tlb, pmd, addr) pmd_free((tlb)->mm, pmd)
92
93#endif
94
95#define __pte_free_tlb(tlb, pte, addr) pte_free((tlb)->mm, pte)
96
97#endif
98