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
9 /* INCLUDES *******************************************************************/
15 #define MODULE_INVOLVED_IN_ARM3
16 #include <mm/ARM3/miarm.h>
18 /* GLOBALS ********************************************************************/
22 MmProtectToPteMask
[32] =
25 // These are the base MM_ protection flags
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
,
36 // These OR in the MM_NOCACHE flag
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
,
47 // These OR in the MM_DECOMMIT flag, which doesn't seem supported on x86/64/ARM
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
,
58 // These OR in the MM_NOACCESS flag, which seems to enable WriteCombining?
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
,
71 ULONG MmProtectToValue
[32] =
79 PAGE_EXECUTE_READWRITE
,
80 PAGE_EXECUTE_WRITECOPY
,
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
,
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
,
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
107 ULONG MmGlobalKernelPageDirectory
[4096];
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};
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
)};
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
)};
120 /* PRIVATE FUNCTIONS **********************************************************/
124 MiFlushTlb(IN PMMPTE PointerPte
,
127 UNIMPLEMENTED_DBGBREAK();
132 MmCreateProcessAddressSpace(IN ULONG MinWs
,
133 IN PEPROCESS Process
,
134 IN PULONG DirectoryTableBase
)
136 UNIMPLEMENTED_DBGBREAK();
142 MmGetPageDirectory(VOID
)
145 return (PULONG
)KeArmTranslationTableRegisterGet().AsUlong
;
150 MmCreateVirtualMappingUnsafe(IN PEPROCESS Process
,
153 IN PPFN_NUMBER Pages
,
156 UNIMPLEMENTED_DBGBREAK();
157 return STATUS_SUCCESS
;
162 MmCreateVirtualMapping(IN PEPROCESS Process
,
165 IN PPFN_NUMBER Pages
,
168 UNIMPLEMENTED_DBGBREAK();
169 return STATUS_SUCCESS
;
174 MmRawDeleteVirtualMapping(IN PVOID Address
)
176 UNIMPLEMENTED_DBGBREAK();
181 MmDeleteVirtualMapping(IN PEPROCESS Process
,
183 OUT PBOOLEAN WasDirty
,
184 OUT PPFN_NUMBER Page
)
186 UNIMPLEMENTED_DBGBREAK();
191 MmDeletePageFileMapping(IN PEPROCESS Process
,
193 IN SWAPENTRY
*SwapEntry
)
195 UNIMPLEMENTED_DBGBREAK();
200 MmCreatePageFileMapping(IN PEPROCESS Process
,
202 IN SWAPENTRY SwapEntry
)
204 UNIMPLEMENTED_DBGBREAK();
205 return STATUS_NOT_IMPLEMENTED
;
210 MmGetPfnForProcess(IN PEPROCESS Process
,
213 UNIMPLEMENTED_DBGBREAK();
219 MmIsDirtyPage(IN PEPROCESS Process
,
222 UNIMPLEMENTED_DBGBREAK();
228 MmSetCleanPage(IN PEPROCESS Process
,
231 UNIMPLEMENTED_DBGBREAK();
236 MmSetDirtyPage(IN PEPROCESS Process
,
239 UNIMPLEMENTED_DBGBREAK();
244 MmIsPagePresent(IN PEPROCESS Process
,
247 UNIMPLEMENTED_DBGBREAK();
253 MmIsPageSwapEntry(IN PEPROCESS Process
,
256 UNIMPLEMENTED_DBGBREAK();
262 MmGetPageProtect(IN PEPROCESS Process
,
265 /* We don't enforce any protection on the pages -- they are all RWX */
266 return PAGE_READWRITE
;
271 MmSetPageProtect(IN PEPROCESS Process
,
275 /* We don't enforce any protection on the pages -- they are all RWX */
281 MmInitGlobalKernelPageDirectory(VOID
)
284 PULONG CurrentPageDirectory
= (PULONG
)PDE_BASE
;
286 /* Loop the 2GB of address space which belong to the kernel */
287 for (i
= MiGetPdeOffset(MmSystemRangeStart
); i
< 2048; i
++)
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
]))
295 /* We don't, link it in our global page directory */
296 MmGlobalKernelPageDirectory
[i
] = CurrentPageDirectory
[i
];