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 "../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
,
133 MmCreateProcessAddressSpace(IN ULONG MinWs
,
134 IN PEPROCESS Process
,
135 IN PULONG DirectoryTableBase
)
144 MmUpdatePageDir(IN PEPROCESS Process
,
154 MmGetPageDirectory(VOID
)
157 return (PULONG
)KeArmTranslationTableRegisterGet().AsUlong
;
162 MmDisableVirtualMapping(IN PEPROCESS Process
,
164 OUT PBOOLEAN WasDirty
,
165 OUT PPFN_NUMBER Page
)
173 MmEnableVirtualMapping(IN PEPROCESS Process
,
182 MmCreateVirtualMappingUnsafe(IN PEPROCESS Process
,
185 IN PPFN_NUMBER Pages
,
190 return STATUS_SUCCESS
;
195 MmCreateVirtualMapping(IN PEPROCESS Process
,
198 IN PPFN_NUMBER Pages
,
203 return STATUS_SUCCESS
;
208 MmRawDeleteVirtualMapping(IN PVOID Address
)
216 MmDeleteVirtualMapping(IN PEPROCESS Process
,
219 OUT PBOOLEAN WasDirty
,
220 OUT PPFN_NUMBER Page
)
228 MmDeletePageFileMapping(IN PEPROCESS Process
,
230 IN SWAPENTRY
*SwapEntry
)
238 MmCreatePageFileMapping(IN PEPROCESS Process
,
240 IN SWAPENTRY SwapEntry
)
249 MmGetPfnForProcess(IN PEPROCESS Process
,
259 MmIsDirtyPage(IN PEPROCESS Process
,
269 MmSetCleanPage(IN PEPROCESS Process
,
278 MmSetDirtyPage(IN PEPROCESS Process
,
287 MmIsPagePresent(IN PEPROCESS Process
,
297 MmIsPageSwapEntry(IN PEPROCESS Process
,
307 MmGetPageProtect(IN PEPROCESS Process
,
310 /* We don't enforce any protection on the pages -- they are all RWX */
311 return PAGE_READWRITE
;
316 MmSetPageProtect(IN PEPROCESS Process
,
320 /* We don't enforce any protection on the pages -- they are all RWX */
326 MmInitGlobalKernelPageDirectory(VOID
)
329 PULONG CurrentPageDirectory
= (PULONG
)PDE_BASE
;
332 /* Loop the 2GB of address space which belong to the kernel */
333 for (i
= MiGetPdeOffset(MmSystemRangeStart
); i
< 2048; i
++)
335 /* Check if we have an entry for this already */
336 if ((i
!= MiGetPdeOffset(PTE_BASE
)) &&
337 (i
!= MiGetPdeOffset(HYPER_SPACE
)) &&
338 (!MmGlobalKernelPageDirectory
[i
]) &&
339 (CurrentPageDirectory
[i
]))
341 /* We don't, link it in our global page directory */
342 MmGlobalKernelPageDirectory
[i
] = CurrentPageDirectory
[i
];
347 /* PUBLIC FUNCTIONS ***********************************************************/
354 MmGetPhysicalAddress(IN PVOID Address
)
356 PHYSICAL_ADDRESS PhysicalAddress
;
357 PhysicalAddress
.QuadPart
= 0;
362 return PhysicalAddress
;