Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/mips/mm/pgtable-64.c
26424 views
1
/*
2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
4
* for more details.
5
*
6
* Copyright (C) 1999, 2000 by Silicon Graphics
7
* Copyright (C) 2003 by Ralf Baechle
8
*/
9
#include <linux/export.h>
10
#include <linux/init.h>
11
#include <linux/mm.h>
12
#include <asm/fixmap.h>
13
#include <asm/pgalloc.h>
14
#include <asm/tlbflush.h>
15
16
void pgd_init(void *addr)
17
{
18
unsigned long *p, *end;
19
unsigned long entry;
20
21
#if !defined(__PAGETABLE_PUD_FOLDED)
22
entry = (unsigned long)invalid_pud_table;
23
#elif !defined(__PAGETABLE_PMD_FOLDED)
24
entry = (unsigned long)invalid_pmd_table;
25
#else
26
entry = (unsigned long)invalid_pte_table;
27
#endif
28
29
p = (unsigned long *) addr;
30
end = p + PTRS_PER_PGD;
31
32
do {
33
p[0] = entry;
34
p[1] = entry;
35
p[2] = entry;
36
p[3] = entry;
37
p[4] = entry;
38
p += 8;
39
p[-3] = entry;
40
p[-2] = entry;
41
p[-1] = entry;
42
} while (p != end);
43
}
44
45
#ifndef __PAGETABLE_PMD_FOLDED
46
void pmd_init(void *addr)
47
{
48
unsigned long *p, *end;
49
unsigned long pagetable = (unsigned long)invalid_pte_table;
50
51
p = (unsigned long *)addr;
52
end = p + PTRS_PER_PMD;
53
54
do {
55
p[0] = pagetable;
56
p[1] = pagetable;
57
p[2] = pagetable;
58
p[3] = pagetable;
59
p[4] = pagetable;
60
p += 8;
61
p[-3] = pagetable;
62
p[-2] = pagetable;
63
p[-1] = pagetable;
64
} while (p != end);
65
}
66
EXPORT_SYMBOL_GPL(pmd_init);
67
#endif
68
69
#ifndef __PAGETABLE_PUD_FOLDED
70
void pud_init(void *addr)
71
{
72
unsigned long *p, *end;
73
unsigned long pagetable = (unsigned long)invalid_pmd_table;
74
75
p = (unsigned long *)addr;
76
end = p + PTRS_PER_PUD;
77
78
do {
79
p[0] = pagetable;
80
p[1] = pagetable;
81
p[2] = pagetable;
82
p[3] = pagetable;
83
p[4] = pagetable;
84
p += 8;
85
p[-3] = pagetable;
86
p[-2] = pagetable;
87
p[-1] = pagetable;
88
} while (p != end);
89
}
90
#endif
91
92
#ifdef CONFIG_TRANSPARENT_HUGEPAGE
93
void set_pmd_at(struct mm_struct *mm, unsigned long addr,
94
pmd_t *pmdp, pmd_t pmd)
95
{
96
*pmdp = pmd;
97
}
98
#endif
99
100
void __init pagetable_init(void)
101
{
102
unsigned long vaddr;
103
pgd_t *pgd_base;
104
105
/* Initialize the entire pgd. */
106
pgd_init(swapper_pg_dir);
107
#ifndef __PAGETABLE_PUD_FOLDED
108
pud_init(invalid_pud_table);
109
#endif
110
#ifndef __PAGETABLE_PMD_FOLDED
111
pmd_init(invalid_pmd_table);
112
#endif
113
pgd_base = swapper_pg_dir;
114
/*
115
* Fixed mappings:
116
*/
117
vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
118
fixrange_init(vaddr, vaddr + FIXADDR_SIZE, pgd_base);
119
}
120
121