* Sync up to trunk head (r65394).
[reactos.git] / ntoskrnl / mm / arm / page.c
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/mm/arm/page.c
5 * PURPOSE: Old-school Page Management
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include <ntoskrnl.h>
12 #define NDEBUG
13 #include <debug.h>
14
15 #define MODULE_INVOLVED_IN_ARM3
16 #include <mm/ARM3/miarm.h>
17
18 /* GLOBALS ********************************************************************/
19
20 const
21 ULONG
22 MmProtectToPteMask[32] =
23 {
24 //
25 // These are the base MM_ protection flags
26 //
27 0,
28 PTE_READONLY | PTE_ENABLE_CACHE,
29 PTE_EXECUTE | PTE_ENABLE_CACHE,
30 PTE_EXECUTE_READ | PTE_ENABLE_CACHE,
31 PTE_READWRITE | PTE_ENABLE_CACHE,
32 PTE_WRITECOPY | PTE_ENABLE_CACHE,
33 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE,
34 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE,
35 //
36 // These OR in the MM_NOCACHE flag
37 //
38 0,
39 PTE_READONLY | PTE_DISABLE_CACHE,
40 PTE_EXECUTE | PTE_DISABLE_CACHE,
41 PTE_EXECUTE_READ | PTE_DISABLE_CACHE,
42 PTE_READWRITE | PTE_DISABLE_CACHE,
43 PTE_WRITECOPY | PTE_DISABLE_CACHE,
44 PTE_EXECUTE_READWRITE | PTE_DISABLE_CACHE,
45 PTE_EXECUTE_WRITECOPY | PTE_DISABLE_CACHE,
46 //
47 // These OR in the MM_DECOMMIT flag, which doesn't seem supported on x86/64/ARM
48 //
49 0,
50 PTE_READONLY | PTE_ENABLE_CACHE,
51 PTE_EXECUTE | PTE_ENABLE_CACHE,
52 PTE_EXECUTE_READ | PTE_ENABLE_CACHE,
53 PTE_READWRITE | PTE_ENABLE_CACHE,
54 PTE_WRITECOPY | PTE_ENABLE_CACHE,
55 PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE,
56 PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE,
57 //
58 // These OR in the MM_NOACCESS flag, which seems to enable WriteCombining?
59 //
60 0,
61 PTE_READONLY | PTE_WRITECOMBINED_CACHE,
62 PTE_EXECUTE | PTE_WRITECOMBINED_CACHE,
63 PTE_EXECUTE_READ | PTE_WRITECOMBINED_CACHE,
64 PTE_READWRITE | PTE_WRITECOMBINED_CACHE,
65 PTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
66 PTE_EXECUTE_READWRITE | PTE_WRITECOMBINED_CACHE,
67 PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE,
68 };
69
70 const
71 ULONG MmProtectToValue[32] =
72 {
73 PAGE_NOACCESS,
74 PAGE_READONLY,
75 PAGE_EXECUTE,
76 PAGE_EXECUTE_READ,
77 PAGE_READWRITE,
78 PAGE_WRITECOPY,
79 PAGE_EXECUTE_READWRITE,
80 PAGE_EXECUTE_WRITECOPY,
81 PAGE_NOACCESS,
82 PAGE_NOCACHE | PAGE_READONLY,
83 PAGE_NOCACHE | PAGE_EXECUTE,
84 PAGE_NOCACHE | PAGE_EXECUTE_READ,
85 PAGE_NOCACHE | PAGE_READWRITE,
86 PAGE_NOCACHE | PAGE_WRITECOPY,
87 PAGE_NOCACHE | PAGE_EXECUTE_READWRITE,
88 PAGE_NOCACHE | PAGE_EXECUTE_WRITECOPY,
89 PAGE_NOACCESS,
90 PAGE_GUARD | PAGE_READONLY,
91 PAGE_GUARD | PAGE_EXECUTE,
92 PAGE_GUARD | PAGE_EXECUTE_READ,
93 PAGE_GUARD | PAGE_READWRITE,
94 PAGE_GUARD | PAGE_WRITECOPY,
95 PAGE_GUARD | PAGE_EXECUTE_READWRITE,
96 PAGE_GUARD | PAGE_EXECUTE_WRITECOPY,
97 PAGE_NOACCESS,
98 PAGE_WRITECOMBINE | PAGE_READONLY,
99 PAGE_WRITECOMBINE | PAGE_EXECUTE,
100 PAGE_WRITECOMBINE | PAGE_EXECUTE_READ,
101 PAGE_WRITECOMBINE | PAGE_READWRITE,
102 PAGE_WRITECOMBINE | PAGE_WRITECOPY,
103 PAGE_WRITECOMBINE | PAGE_EXECUTE_READWRITE,
104 PAGE_WRITECOMBINE | PAGE_EXECUTE_WRITECOPY
105 };
106
107 ULONG MmGlobalKernelPageDirectory[4096];
108
109 /* Template PTE and PDE for a kernel page */
110 MMPDE ValidKernelPde = {.u.Hard.Valid = 1};
111 MMPTE ValidKernelPte = {.u.Hard.Valid = 1, .u.Hard.Sbo = 1};
112
113 /* Template PDE for a demand-zero page */
114 MMPDE DemandZeroPde = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)};
115 MMPTE DemandZeroPte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS)};
116
117 /* Template PTE for prototype page */
118 MMPTE PrototypePte = {.u.Long = (MM_READWRITE << MM_PTE_SOFTWARE_PROTECTION_BITS) | PTE_PROTOTYPE | (MI_PTE_LOOKUP_NEEDED << PAGE_SHIFT)};
119
120 /* PRIVATE FUNCTIONS **********************************************************/
121
122 VOID
123 NTAPI
124 MiFlushTlb(IN PMMPTE PointerPte,
125 IN PVOID Address)
126 {
127 UNIMPLEMENTED_DBGBREAK();
128 }
129
130 BOOLEAN
131 NTAPI
132 MmCreateProcessAddressSpace(IN ULONG MinWs,
133 IN PEPROCESS Process,
134 IN PULONG DirectoryTableBase)
135 {
136 UNIMPLEMENTED_DBGBREAK();
137 return FALSE;
138 }
139
140 PULONG
141 NTAPI
142 MmGetPageDirectory(VOID)
143 {
144 /* Return the TTB */
145 return (PULONG)KeArmTranslationTableRegisterGet().AsUlong;
146 }
147
148 NTSTATUS
149 NTAPI
150 MmCreateVirtualMappingUnsafe(IN PEPROCESS Process,
151 IN PVOID Address,
152 IN ULONG Protection,
153 IN PPFN_NUMBER Pages,
154 IN ULONG PageCount)
155 {
156 UNIMPLEMENTED_DBGBREAK();
157 return STATUS_SUCCESS;
158 }
159
160 NTSTATUS
161 NTAPI
162 MmCreateVirtualMapping(IN PEPROCESS Process,
163 IN PVOID Address,
164 IN ULONG Protection,
165 IN PPFN_NUMBER Pages,
166 IN ULONG PageCount)
167 {
168 UNIMPLEMENTED_DBGBREAK();
169 return STATUS_SUCCESS;
170 }
171
172 VOID
173 NTAPI
174 MmRawDeleteVirtualMapping(IN PVOID Address)
175 {
176 UNIMPLEMENTED_DBGBREAK();
177 }
178
179 VOID
180 NTAPI
181 MmDeleteVirtualMapping(IN PEPROCESS Process,
182 IN PVOID Address,
183 OUT PBOOLEAN WasDirty,
184 OUT PPFN_NUMBER Page)
185 {
186 UNIMPLEMENTED_DBGBREAK();
187 }
188
189 VOID
190 NTAPI
191 MmDeletePageFileMapping(IN PEPROCESS Process,
192 IN PVOID Address,
193 IN SWAPENTRY *SwapEntry)
194 {
195 UNIMPLEMENTED_DBGBREAK();
196 }
197
198 NTSTATUS
199 NTAPI
200 MmCreatePageFileMapping(IN PEPROCESS Process,
201 IN PVOID Address,
202 IN SWAPENTRY SwapEntry)
203 {
204 UNIMPLEMENTED_DBGBREAK();
205 return STATUS_NOT_IMPLEMENTED;
206 }
207
208 PFN_NUMBER
209 NTAPI
210 MmGetPfnForProcess(IN PEPROCESS Process,
211 IN PVOID Address)
212 {
213 UNIMPLEMENTED_DBGBREAK();
214 return 0;
215 }
216
217 BOOLEAN
218 NTAPI
219 MmIsDirtyPage(IN PEPROCESS Process,
220 IN PVOID Address)
221 {
222 UNIMPLEMENTED_DBGBREAK();
223 return FALSE;
224 }
225
226 VOID
227 NTAPI
228 MmSetCleanPage(IN PEPROCESS Process,
229 IN PVOID Address)
230 {
231 UNIMPLEMENTED_DBGBREAK();
232 }
233
234 VOID
235 NTAPI
236 MmSetDirtyPage(IN PEPROCESS Process,
237 IN PVOID Address)
238 {
239 UNIMPLEMENTED_DBGBREAK();
240 }
241
242 BOOLEAN
243 NTAPI
244 MmIsPagePresent(IN PEPROCESS Process,
245 IN PVOID Address)
246 {
247 UNIMPLEMENTED_DBGBREAK();
248 return FALSE;
249 }
250
251 BOOLEAN
252 NTAPI
253 MmIsPageSwapEntry(IN PEPROCESS Process,
254 IN PVOID Address)
255 {
256 UNIMPLEMENTED_DBGBREAK();
257 return FALSE;
258 }
259
260 ULONG
261 NTAPI
262 MmGetPageProtect(IN PEPROCESS Process,
263 IN PVOID Address)
264 {
265 /* We don't enforce any protection on the pages -- they are all RWX */
266 return PAGE_READWRITE;
267 }
268
269 VOID
270 NTAPI
271 MmSetPageProtect(IN PEPROCESS Process,
272 IN PVOID Address,
273 IN ULONG Protection)
274 {
275 /* We don't enforce any protection on the pages -- they are all RWX */
276 return;
277 }
278
279 VOID
280 NTAPI
281 MmInitGlobalKernelPageDirectory(VOID)
282 {
283 ULONG i;
284 PULONG CurrentPageDirectory = (PULONG)PDE_BASE;
285
286 /* Loop the 2GB of address space which belong to the kernel */
287 for (i = MiGetPdeOffset(MmSystemRangeStart); i < 2048; i++)
288 {
289 /* Check if we have an entry for this already */
290 if ((i != MiGetPdeOffset(PTE_BASE)) &&
291 (i != MiGetPdeOffset(HYPER_SPACE)) &&
292 (!MmGlobalKernelPageDirectory[i]) &&
293 (CurrentPageDirectory[i]))
294 {
295 /* We don't, link it in our global page directory */
296 MmGlobalKernelPageDirectory[i] = CurrentPageDirectory[i];
297 }
298 }
299 }
300