mirror of
https://github.com/reactos/reactos.git
synced 2025-04-29 18:48:53 +00:00
[NTOSKRNL]
- Fix MMPTE vs MMPDE usage - Use MiPteToPde instead of MiAddressToPte svn path=/trunk/; revision=67632
This commit is contained in:
parent
c74c888770
commit
73e043f5b5
7 changed files with 63 additions and 47 deletions
|
@ -459,7 +459,7 @@ typedef struct _MM_SESSION_SPACE
|
|||
SIZE_T CommittedPages;
|
||||
PVOID PagedPoolStart;
|
||||
PVOID PagedPoolEnd;
|
||||
PMMPTE PagedPoolBasePde;
|
||||
PMMPDE PagedPoolBasePde;
|
||||
ULONG Color;
|
||||
LONG ResidentProcessCount;
|
||||
ULONG SessionPoolAllocationFailures[4];
|
||||
|
@ -479,9 +479,9 @@ typedef struct _MM_SESSION_SPACE
|
|||
PDRIVER_UNLOAD Win32KDriverUnload;
|
||||
POOL_DESCRIPTOR PagedPool;
|
||||
#if defined (_M_AMD64)
|
||||
MMPTE PageDirectory;
|
||||
MMPDE PageDirectory;
|
||||
#else
|
||||
PMMPTE PageTables;
|
||||
PMMPDE PageTables;
|
||||
#endif
|
||||
#if defined (_M_AMD64)
|
||||
PMMPTE SpecialPoolFirstPte;
|
||||
|
@ -1887,7 +1887,7 @@ NTSTATUS
|
|||
NTAPI
|
||||
MiInitializeAndChargePfn(
|
||||
OUT PPFN_NUMBER PageFrameIndex,
|
||||
IN PMMPTE PointerPde,
|
||||
IN PMMPDE PointerPde,
|
||||
IN PFN_NUMBER ContainingPageFrame,
|
||||
IN BOOLEAN SessionAllocation
|
||||
);
|
||||
|
@ -1904,7 +1904,7 @@ VOID
|
|||
NTAPI
|
||||
MiInitializePfnForOtherProcess(
|
||||
IN PFN_NUMBER PageFrameIndex,
|
||||
IN PMMPTE PointerPte,
|
||||
IN PVOID PteAddress,
|
||||
IN PFN_NUMBER PteFrame
|
||||
);
|
||||
|
||||
|
@ -2210,7 +2210,7 @@ MmDeterminePoolType(
|
|||
VOID
|
||||
NTAPI
|
||||
MiMakePdeExistAndMakeValid(
|
||||
IN PMMPTE PointerPde,
|
||||
IN PMMPDE PointerPde,
|
||||
IN PEPROCESS TargetProcess,
|
||||
IN KIRQL OldIrql
|
||||
);
|
||||
|
|
|
@ -336,7 +336,7 @@ FASTCALL
|
|||
MiCheckPdeForSessionSpace(IN PVOID Address)
|
||||
{
|
||||
MMPTE TempPde;
|
||||
PMMPTE PointerPde;
|
||||
PMMPDE PointerPde;
|
||||
PVOID SessionAddress;
|
||||
ULONG Index;
|
||||
|
||||
|
@ -1959,7 +1959,7 @@ UserFault:
|
|||
}
|
||||
|
||||
/* Write a demand-zero PDE */
|
||||
MI_WRITE_INVALID_PTE(PointerPde, DemandZeroPde);
|
||||
MI_WRITE_INVALID_PDE(PointerPde, DemandZeroPde);
|
||||
|
||||
/* Dispatch the fault */
|
||||
Status = MiDispatchFault(TRUE,
|
||||
|
@ -2087,7 +2087,12 @@ UserFault:
|
|||
if (PointerPde == MiAddressToPde(PTE_BASE))
|
||||
{
|
||||
/* Then it's really a demand-zero PDE (on behalf of user-mode) */
|
||||
#ifdef _M_ARM
|
||||
_WARN("This is probably completely broken!");
|
||||
MI_WRITE_INVALID_PDE((PMMPDE)PointerPte, DemandZeroPde);
|
||||
#else
|
||||
MI_WRITE_INVALID_PTE(PointerPte, DemandZeroPde);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -1083,15 +1083,15 @@ MiInitializePfnAndMakePteValid(IN PFN_NUMBER PageFrameIndex,
|
|||
NTSTATUS
|
||||
NTAPI
|
||||
MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex,
|
||||
IN PMMPTE PointerPde,
|
||||
IN PMMPDE PointerPde,
|
||||
IN PFN_NUMBER ContainingPageFrame,
|
||||
IN BOOLEAN SessionAllocation)
|
||||
{
|
||||
MMPTE TempPte;
|
||||
MMPDE TempPde;
|
||||
KIRQL OldIrql;
|
||||
|
||||
/* Use either a global or local PDE */
|
||||
TempPte = SessionAllocation ? ValidKernelPdeLocal : ValidKernelPde;
|
||||
TempPde = SessionAllocation ? ValidKernelPdeLocal : ValidKernelPde;
|
||||
|
||||
/* Lock the PFN database */
|
||||
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
|
||||
|
@ -1106,8 +1106,8 @@ MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex,
|
|||
|
||||
/* Grab a zero page and set the PFN, then make it valid */
|
||||
*PageFrameIndex = MiRemoveZeroPage(MI_GET_NEXT_COLOR());
|
||||
TempPte.u.Hard.PageFrameNumber = *PageFrameIndex;
|
||||
MI_WRITE_VALID_PTE(PointerPde, TempPte);
|
||||
TempPde.u.Hard.PageFrameNumber = *PageFrameIndex;
|
||||
MI_WRITE_VALID_PDE(PointerPde, TempPde);
|
||||
|
||||
/* Initialize the PFN */
|
||||
MiInitializePfnForOtherProcess(*PageFrameIndex,
|
||||
|
@ -1270,14 +1270,14 @@ MiDecrementReferenceCount(IN PMMPFN Pfn1,
|
|||
VOID
|
||||
NTAPI
|
||||
MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex,
|
||||
IN PMMPTE PointerPte,
|
||||
IN PVOID PteAddress,
|
||||
IN PFN_NUMBER PteFrame)
|
||||
{
|
||||
PMMPFN Pfn1;
|
||||
|
||||
/* Setup the PTE */
|
||||
Pfn1 = MI_PFN_ELEMENT(PageFrameIndex);
|
||||
Pfn1->PteAddress = PointerPte;
|
||||
Pfn1->PteAddress = PteAddress;
|
||||
|
||||
/* Make this a software PTE */
|
||||
MI_MAKE_SOFTWARE_PTE(&Pfn1->OriginalPte, MM_READWRITE);
|
||||
|
|
|
@ -507,7 +507,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType,
|
|||
//
|
||||
// We can only support this much then
|
||||
//
|
||||
PointerPde = MiAddressToPte(MmPagedPoolInfo.LastPteForPagedPool);
|
||||
PointerPde = MiPteToPde(MmPagedPoolInfo.LastPteForPagedPool);
|
||||
PageTableCount = (PFN_COUNT)(PointerPde + 1 -
|
||||
MmPagedPoolInfo.NextPdeForPagedPoolExpansion);
|
||||
ASSERT(PageTableCount < i);
|
||||
|
@ -1277,7 +1277,8 @@ NTSTATUS
|
|||
NTAPI
|
||||
MiInitializeSessionPool(VOID)
|
||||
{
|
||||
PMMPTE PointerPde, PointerPte, LastPte, LastPde;
|
||||
PMMPTE PointerPte, LastPte;
|
||||
PMMPDE PointerPde, LastPde;
|
||||
PFN_NUMBER PageFrameIndex, PdeCount;
|
||||
PPOOL_DESCRIPTOR PoolDescriptor;
|
||||
PMM_SESSION_SPACE SessionGlobal;
|
||||
|
|
|
@ -937,8 +937,8 @@ MiSessionCommitPageTables(IN PVOID StartVa,
|
|||
{
|
||||
KIRQL OldIrql;
|
||||
ULONG Color, Index;
|
||||
PMMPTE StartPde, EndPde;
|
||||
MMPTE TempPte = ValidKernelPdeLocal;
|
||||
PMMPDE StartPde, EndPde;
|
||||
MMPDE TempPde = ValidKernelPdeLocal;
|
||||
PMMPFN Pfn1;
|
||||
PFN_NUMBER PageCount = 0, ActualPages = 0, PageFrameNumber;
|
||||
|
||||
|
@ -976,7 +976,7 @@ MiSessionCommitPageTables(IN PVOID StartVa,
|
|||
_WARN("MiSessionCommitPageTables halfplemented for amd64")
|
||||
DBG_UNREFERENCED_LOCAL_VARIABLE(OldIrql);
|
||||
DBG_UNREFERENCED_LOCAL_VARIABLE(Color);
|
||||
DBG_UNREFERENCED_LOCAL_VARIABLE(TempPte);
|
||||
DBG_UNREFERENCED_LOCAL_VARIABLE(TempPde);
|
||||
DBG_UNREFERENCED_LOCAL_VARIABLE(Pfn1);
|
||||
DBG_UNREFERENCED_LOCAL_VARIABLE(PageFrameNumber);
|
||||
ASSERT(FALSE);
|
||||
|
@ -996,12 +996,12 @@ _WARN("MiSessionCommitPageTables halfplemented for amd64")
|
|||
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
|
||||
Color = (++MmSessionSpace->Color) & MmSecondaryColorMask;
|
||||
PageFrameNumber = MiRemoveZeroPage(Color);
|
||||
TempPte.u.Hard.PageFrameNumber = PageFrameNumber;
|
||||
MI_WRITE_VALID_PTE(StartPde, TempPte);
|
||||
TempPde.u.Hard.PageFrameNumber = PageFrameNumber;
|
||||
MI_WRITE_VALID_PDE(StartPde, TempPde);
|
||||
|
||||
/* Write the page table in session space structure */
|
||||
ASSERT(MmSessionSpace->PageTables[Index].u.Long == 0);
|
||||
MmSessionSpace->PageTables[Index] = TempPte;
|
||||
MmSessionSpace->PageTables[Index] = TempPde;
|
||||
|
||||
/* Initialize the PFN */
|
||||
MiInitializePfnForOtherProcess(PageFrameNumber,
|
||||
|
@ -2053,7 +2053,7 @@ MiSetProtectionOnSection(IN PEPROCESS Process,
|
|||
//
|
||||
if ((((ULONG_PTR)PointerPte) & (SYSTEM_PD_SIZE - 1)) == 0)
|
||||
{
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
||||
}
|
||||
|
||||
|
@ -2157,7 +2157,7 @@ MiRemoveMappedPtes(IN PVOID BaseAddress,
|
|||
Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(&PteContents));
|
||||
|
||||
/* Get the PTE */
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
|
||||
/* Lock the PFN database and make sure this isn't a mapped file */
|
||||
OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
|
||||
|
|
|
@ -480,8 +480,10 @@ NTAPI
|
|||
MiSessionInitializeWorkingSetList(VOID)
|
||||
{
|
||||
KIRQL OldIrql;
|
||||
PMMPTE PointerPte, PointerPde;
|
||||
PMMPTE PointerPte;
|
||||
PMMPDE PointerPde;
|
||||
MMPTE TempPte;
|
||||
MMPDE TempPde;
|
||||
ULONG Color, Index;
|
||||
PFN_NUMBER PageFrameIndex;
|
||||
PMM_SESSION_SPACE SessionGlobal;
|
||||
|
@ -501,7 +503,9 @@ MiSessionInitializeWorkingSetList(VOID)
|
|||
if (PointerPde->u.Hard.Valid == 1)
|
||||
{
|
||||
/* Nope, we'll have to do it */
|
||||
#ifndef _M_ARM
|
||||
ASSERT(PointerPde->u.Hard.Global == 0);
|
||||
#endif
|
||||
AllocatedPageTable = FALSE;
|
||||
}
|
||||
else
|
||||
|
@ -536,14 +540,14 @@ MiSessionInitializeWorkingSetList(VOID)
|
|||
}
|
||||
|
||||
/* Write a valid PDE for it */
|
||||
TempPte.u.Long = ValidKernelPdeLocal.u.Long;
|
||||
TempPte.u.Hard.PageFrameNumber = PageFrameIndex;
|
||||
MI_WRITE_VALID_PTE(PointerPde, TempPte);
|
||||
TempPde.u.Long = ValidKernelPdeLocal.u.Long;
|
||||
TempPde.u.Hard.PageFrameNumber = PageFrameIndex;
|
||||
MI_WRITE_VALID_PDE(PointerPde, TempPde);
|
||||
|
||||
/* Add this into the list */
|
||||
Index = ((ULONG_PTR)WorkingSetList - (ULONG_PTR)MmSessionBase) >> 22;
|
||||
#ifndef _M_AMD64
|
||||
MmSessionSpace->PageTables[Index] = TempPte;
|
||||
MmSessionSpace->PageTables[Index] = TempPde;
|
||||
#endif
|
||||
/* Initialize the page directory page, and now zero the working set list itself */
|
||||
MiInitializePfnForOtherProcess(PageFrameIndex,
|
||||
|
@ -614,10 +618,11 @@ MiSessionCreateInternal(OUT PULONG SessionId)
|
|||
PEPROCESS Process = PsGetCurrentProcess();
|
||||
ULONG NewFlags, Flags, Size, i, Color;
|
||||
KIRQL OldIrql;
|
||||
PMMPTE PointerPte, PageTables, SessionPte;
|
||||
PMMPDE PointerPde;
|
||||
PMMPTE PointerPte, SessionPte;
|
||||
PMMPDE PointerPde, PageTables;
|
||||
PMM_SESSION_SPACE SessionGlobal;
|
||||
MMPTE TempPte;
|
||||
MMPDE TempPde;
|
||||
NTSTATUS Status;
|
||||
BOOLEAN Result;
|
||||
PFN_NUMBER SessionPageDirIndex;
|
||||
|
@ -725,13 +730,13 @@ MiSessionCreateInternal(OUT PULONG SessionId)
|
|||
}
|
||||
|
||||
/* Fill the PTE out */
|
||||
TempPte.u.Long = ValidKernelPdeLocal.u.Long;
|
||||
TempPte.u.Hard.PageFrameNumber = SessionPageDirIndex;
|
||||
TempPde.u.Long = ValidKernelPdeLocal.u.Long;
|
||||
TempPde.u.Hard.PageFrameNumber = SessionPageDirIndex;
|
||||
|
||||
/* Setup, allocate, fill out the MmSessionSpace PTE */
|
||||
PointerPde = MiAddressToPde(MmSessionSpace);
|
||||
ASSERT(PointerPde->u.Long == 0);
|
||||
MI_WRITE_VALID_PTE(PointerPde, TempPte);
|
||||
MI_WRITE_VALID_PDE(PointerPde, TempPde);
|
||||
MiInitializePfnForOtherProcess(SessionPageDirIndex,
|
||||
PointerPde,
|
||||
SessionPageDirIndex);
|
||||
|
|
|
@ -45,7 +45,8 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
|
|||
IN PMMVAD Vad,
|
||||
IN PEPROCESS Process)
|
||||
{
|
||||
PMMPTE PointerPte, LastPte, PointerPde;
|
||||
PMMPTE PointerPte, LastPte;
|
||||
PMMPDE PointerPde;
|
||||
ULONG CommittedPages;
|
||||
|
||||
/* Compute starting and ending PTE and PDE addresses */
|
||||
|
@ -60,7 +61,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
|
|||
CommittedPages = (ULONG)BYTES_TO_PAGES(EndingAddress - StartingAddress);
|
||||
|
||||
/* Is the PDE demand-zero? */
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
if (PointerPde->u.Long != 0)
|
||||
{
|
||||
/* It is not. Is it valid? */
|
||||
|
@ -86,7 +87,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
|
|||
if (MiIsPteOnPdeBoundary(PointerPte))
|
||||
{
|
||||
/* Is this PDE demand zero? */
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
if (PointerPde->u.Long != 0)
|
||||
{
|
||||
/* It isn't -- is it valid? */
|
||||
|
@ -132,7 +133,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
|
|||
CommittedPages = 0;
|
||||
|
||||
/* Is the PDE demand-zero? */
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
if (PointerPde->u.Long != 0)
|
||||
{
|
||||
/* It isn't -- is it invalid? */
|
||||
|
@ -158,7 +159,7 @@ MiCalculatePageCommitment(IN ULONG_PTR StartingAddress,
|
|||
if (MiIsPteOnPdeBoundary(PointerPte))
|
||||
{
|
||||
/* Is this new PDE demand-zero? */
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
if (PointerPde->u.Long != 0)
|
||||
{
|
||||
/* It isn't. Is it valid? */
|
||||
|
@ -1978,7 +1979,8 @@ MiIsEntireRangeCommitted(IN ULONG_PTR StartingAddress,
|
|||
IN PMMVAD Vad,
|
||||
IN PEPROCESS Process)
|
||||
{
|
||||
PMMPTE PointerPte, LastPte, PointerPde;
|
||||
PMMPTE PointerPte, LastPte;
|
||||
PMMPDE PointerPde;
|
||||
BOOLEAN OnBoundary = TRUE;
|
||||
PAGED_CODE();
|
||||
|
||||
|
@ -2098,7 +2100,8 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
|
|||
PMMVAD Vad;
|
||||
PMMSUPPORT AddressSpace;
|
||||
ULONG_PTR StartingAddress, EndingAddress;
|
||||
PMMPTE PointerPde, PointerPte, LastPte;
|
||||
PMMPTE PointerPte, LastPte;
|
||||
PMMPDE PointerPde;
|
||||
MMPTE PteContents;
|
||||
PMMPFN Pfn1;
|
||||
ULONG ProtectionMask, OldProtect;
|
||||
|
@ -2273,7 +2276,7 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
|
|||
/* Check if we've crossed a PDE boundary and make the new PDE valid too */
|
||||
if (MiIsPteOnPdeBoundary(PointerPte))
|
||||
{
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
||||
}
|
||||
|
||||
|
@ -2366,7 +2369,7 @@ FailPath:
|
|||
|
||||
VOID
|
||||
NTAPI
|
||||
MiMakePdeExistAndMakeValid(IN PMMPTE PointerPde,
|
||||
MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
|
||||
IN PEPROCESS TargetProcess,
|
||||
IN KIRQL OldIrql)
|
||||
{
|
||||
|
@ -2502,7 +2505,8 @@ MiDecommitPages(IN PVOID StartingAddress,
|
|||
IN PEPROCESS Process,
|
||||
IN PMMVAD Vad)
|
||||
{
|
||||
PMMPTE PointerPde, PointerPte, CommitPte = NULL;
|
||||
PMMPTE PointerPte, CommitPte = NULL;
|
||||
PMMPDE PointerPde;
|
||||
ULONG CommitReduction = 0;
|
||||
PMMPTE ValidPteList[256];
|
||||
ULONG PteCount = 0;
|
||||
|
@ -4316,7 +4320,8 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
|
|||
ULONG ProtectionMask, QuotaCharge = 0, QuotaFree = 0;
|
||||
BOOLEAN Attached = FALSE, ChangeProtection = FALSE;
|
||||
MMPTE TempPte;
|
||||
PMMPTE PointerPte, PointerPde, LastPte;
|
||||
PMMPTE PointerPte, LastPte;
|
||||
PMMPDE PointerPde;
|
||||
TABLE_SEARCH_RESULT Result;
|
||||
PAGED_CODE();
|
||||
|
||||
|
@ -4891,7 +4896,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
|
|||
//
|
||||
// Get the PDE and now make it valid too
|
||||
//
|
||||
PointerPde = MiAddressToPte(PointerPte);
|
||||
PointerPde = MiPteToPde(PointerPte);
|
||||
MiMakePdeExistAndMakeValid(PointerPde, Process, MM_NOIRQL);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue