2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/mm/i386/page.c
5 * PURPOSE: Low level memory managment manipulation
7 * PROGRAMMERS: David Welch (welch@cwcom.net)
10 /* INCLUDES ***************************************************************/
14 #include <internal/debug.h>
16 #if defined (ALLOC_PRAGMA)
17 #pragma alloc_text(INIT, MmInitGlobalKernelPageDirectory)
18 #pragma alloc_text(INIT, MiInitPageDirectoryMap)
22 /* GLOBALS *****************************************************************/
24 ULONG64 MmGlobalKernelPageDirectory
[512];
27 /* FUNCTIONS ***************************************************************/
29 BOOLEAN
MmUnmapPageTable(PULONG Pt
);
33 MiFlushTlbIpiRoutine(ULONG_PTR Address
)
40 MiFlushTlb(PULONG Pt
, PVOID Address
)
48 MmGetPageDirectory(VOID
)
50 return (PULONG_PTR
)__readcr3();
54 ProtectToPTE(ULONG flProtect
)
61 Mmi386ReleaseMmInfo(PEPROCESS Process
)
64 return STATUS_UNSUCCESSFUL
;
69 MmInitializeHandBuiltProcess(IN PEPROCESS Process
,
70 IN PULONG_PTR DirectoryTableBase
)
73 return STATUS_UNSUCCESSFUL
;
78 MmCreateProcessAddressSpace(IN ULONG MinWs
,
80 IN PULONG_PTR DirectoryTableBase
)
88 MmDeletePageTable(PEPROCESS Process
, PVOID Address
)
95 MmFreePageTable(PEPROCESS Process
, PVOID Address
)
100 BOOLEAN
MmUnmapPageTable(PULONG Pt
)
108 MmGetPfnForProcess(PEPROCESS Process
,
117 MmDisableVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOLEAN
* WasDirty
, PPFN_TYPE Page
)
124 MmRawDeleteVirtualMapping(PVOID Address
)
131 MmDeleteVirtualMapping(PEPROCESS Process
, PVOID Address
, BOOLEAN FreePage
,
132 BOOLEAN
* WasDirty
, PPFN_TYPE Page
)
139 MmDeletePageFileMapping(PEPROCESS Process
, PVOID Address
,
140 SWAPENTRY
* SwapEntry
)
146 Mmi386MakeKernelPageTableGlobal(PVOID PAddress
)
154 MmIsDirtyPage(PEPROCESS Process
, PVOID Address
)
162 MmIsAccessedAndResetAccessPage(PEPROCESS Process
, PVOID Address
)
170 MmSetCleanPage(PEPROCESS Process
, PVOID Address
)
177 MmSetDirtyPage(PEPROCESS Process
, PVOID Address
)
184 MmEnableVirtualMapping(PEPROCESS Process
, PVOID Address
)
191 MmIsPagePresent(PEPROCESS Process
, PVOID Address
)
199 MmIsPageSwapEntry(PEPROCESS Process
, PVOID Address
)
207 MmCreateVirtualMappingForKernel(PVOID Address
,
213 return STATUS_UNSUCCESSFUL
;
218 MmCreatePageFileMapping(PEPROCESS Process
,
223 return STATUS_UNSUCCESSFUL
;
229 MmCreateVirtualMappingUnsafe(PEPROCESS Process
,
236 return STATUS_UNSUCCESSFUL
;
241 MmCreateVirtualMapping(PEPROCESS Process
,
248 return STATUS_UNSUCCESSFUL
;
253 MmGetPageProtect(PEPROCESS Process
, PVOID Address
)
261 MmSetPageProtect(PEPROCESS Process
, PVOID Address
, ULONG flProtect
)
269 PHYSICAL_ADDRESS STDCALL
270 MmGetPhysicalAddress(PVOID vaddr
)
272 PHYSICAL_ADDRESS ret
= {{0}};
279 MmCreateHyperspaceMapping(PFN_TYPE Page
)
287 MmChangeHyperspaceMapping(PVOID Address
, PFN_TYPE NewPage
)
295 MmDeleteHyperspaceMapping(PVOID Address
)
303 MmUpdatePageDir(PEPROCESS Process
, PVOID Address
, ULONG Size
)
305 ULONG StartIndex
, EndIndex
, Index
;
309 if (Address
< MmSystemRangeStart
)
314 /* Get pointer to the page directory to update */
315 if (Process
!= NULL
&& Process
!= PsGetCurrentProcess())
317 // Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase[0]));
321 Pde
= (PULONG64
)PXE_BASE
;
324 /* Update PML4 entries */
325 StartIndex
= VAtoPXI(Address
);
326 EndIndex
= VAtoPXI((ULONG64
)Address
+ Size
);
327 for (Index
= StartIndex
; Index
<= EndIndex
; Index
++)
329 if (Index
!= VAtoPXI(PXE_BASE
))
331 (void)InterlockedCompareExchangePointer((PVOID
*)&Pde
[Index
],
332 MmGlobalKernelPageDirectory
[Index
],
341 MmInitGlobalKernelPageDirectory(VOID
)
349 MiInitPageDirectoryMap(VOID
)