1
2
3
4
5
6
7
8#ifndef __ASM_KERNEL_PGTABLE_H
9#define __ASM_KERNEL_PGTABLE_H
10
11#include <asm/pgtable-hwdef.h>
12#include <asm/sparsemem.h>
13
14
15
16
17
18
19
20#ifdef CONFIG_ARM64_4K_PAGES
21#define ARM64_KERNEL_USES_PMD_MAPS 1
22#else
23#define ARM64_KERNEL_USES_PMD_MAPS 0
24#endif
25
26
27
28
29
30
31
32
33
34
35
36#if ARM64_KERNEL_USES_PMD_MAPS
37#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS - 1)
38#define IDMAP_PGTABLE_LEVELS (ARM64_HW_PGTABLE_LEVELS(PHYS_MASK_SHIFT) - 1)
39#else
40#define SWAPPER_PGTABLE_LEVELS (CONFIG_PGTABLE_LEVELS)
41#define IDMAP_PGTABLE_LEVELS (ARM64_HW_PGTABLE_LEVELS(PHYS_MASK_SHIFT))
42#endif
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62#ifdef CONFIG_RANDOMIZE_BASE
63#define EARLY_KASLR (1)
64#else
65#define EARLY_KASLR (0)
66#endif
67
68#define EARLY_ENTRIES(vstart, vend, shift) \
69 ((((vend) - 1) >> (shift)) - ((vstart) >> (shift)) + 1 + EARLY_KASLR)
70
71#define EARLY_PGDS(vstart, vend) (EARLY_ENTRIES(vstart, vend, PGDIR_SHIFT))
72
73#if SWAPPER_PGTABLE_LEVELS > 3
74#define EARLY_PUDS(vstart, vend) (EARLY_ENTRIES(vstart, vend, PUD_SHIFT))
75#else
76#define EARLY_PUDS(vstart, vend) (0)
77#endif
78
79#if SWAPPER_PGTABLE_LEVELS > 2
80#define EARLY_PMDS(vstart, vend) (EARLY_ENTRIES(vstart, vend, SWAPPER_TABLE_SHIFT))
81#else
82#define EARLY_PMDS(vstart, vend) (0)
83#endif
84
85#define EARLY_PAGES(vstart, vend) ( 1 \
86 + EARLY_PGDS((vstart), (vend)) \
87 + EARLY_PUDS((vstart), (vend)) \
88 + EARLY_PMDS((vstart), (vend)))
89#define INIT_DIR_SIZE (PAGE_SIZE * EARLY_PAGES(KIMAGE_VADDR, _end))
90#define IDMAP_DIR_SIZE (IDMAP_PGTABLE_LEVELS * PAGE_SIZE)
91
92
93#if ARM64_KERNEL_USES_PMD_MAPS
94#define SWAPPER_BLOCK_SHIFT PMD_SHIFT
95#define SWAPPER_BLOCK_SIZE PMD_SIZE
96#define SWAPPER_TABLE_SHIFT PUD_SHIFT
97#else
98#define SWAPPER_BLOCK_SHIFT PAGE_SHIFT
99#define SWAPPER_BLOCK_SIZE PAGE_SIZE
100#define SWAPPER_TABLE_SHIFT PMD_SHIFT
101#endif
102
103
104
105
106#define SWAPPER_PTE_FLAGS (PTE_TYPE_PAGE | PTE_AF | PTE_SHARED)
107#define SWAPPER_PMD_FLAGS (PMD_TYPE_SECT | PMD_SECT_AF | PMD_SECT_S)
108
109#if ARM64_KERNEL_USES_PMD_MAPS
110#define SWAPPER_MM_MMUFLAGS (PMD_ATTRINDX(MT_NORMAL) | SWAPPER_PMD_FLAGS)
111#else
112#define SWAPPER_MM_MMUFLAGS (PTE_ATTRINDX(MT_NORMAL) | SWAPPER_PTE_FLAGS)
113#endif
114
115
116
117
118
119
120
121
122#if defined(CONFIG_ARM64_4K_PAGES)
123#define ARM64_MEMSTART_SHIFT PUD_SHIFT
124#elif defined(CONFIG_ARM64_16K_PAGES)
125#define ARM64_MEMSTART_SHIFT CONT_PMD_SHIFT
126#else
127#define ARM64_MEMSTART_SHIFT PMD_SHIFT
128#endif
129
130
131
132
133
134
135
136#if ARM64_MEMSTART_SHIFT < SECTION_SIZE_BITS
137#define ARM64_MEMSTART_ALIGN (1UL << SECTION_SIZE_BITS)
138#else
139#define ARM64_MEMSTART_ALIGN (1UL << ARM64_MEMSTART_SHIFT)
140#endif
141
142#endif
143