mirror of
https://github.com/reactos/reactos.git
synced 2025-06-06 01:40:36 +00:00
[NTOS:MM] In MiMakePdeExistAndValid, do not overly check PDE validity
It's "okay" to not #ifdef, but it's useless and confusing.
This commit is contained in:
parent
c8fb3f7514
commit
678923bf4b
1 changed files with 35 additions and 12 deletions
|
@ -2477,7 +2477,13 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
|
||||||
IN PEPROCESS TargetProcess,
|
IN PEPROCESS TargetProcess,
|
||||||
IN KIRQL OldIrql)
|
IN KIRQL OldIrql)
|
||||||
{
|
{
|
||||||
PMMPTE PointerPte, PointerPpe, PointerPxe;
|
PMMPTE PointerPte;
|
||||||
|
#if _MI_PAGING_LEVELS >= 3
|
||||||
|
PMMPPE PointerPpe = MiPdeToPpe(PointerPde);
|
||||||
|
#if _MI_PAGING_LEVELS == 4
|
||||||
|
PMMPXE PointerPxe = MiPdeToPxe(PointerPde);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sanity checks. The latter is because we only use this function with the
|
// Sanity checks. The latter is because we only use this function with the
|
||||||
|
@ -2486,16 +2492,16 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
|
||||||
ASSERT(KeAreAllApcsDisabled() == TRUE);
|
ASSERT(KeAreAllApcsDisabled() == TRUE);
|
||||||
ASSERT(OldIrql == MM_NOIRQL);
|
ASSERT(OldIrql == MM_NOIRQL);
|
||||||
|
|
||||||
//
|
|
||||||
// Also get the PPE and PXE. This is okay not to #ifdef because they will
|
|
||||||
// return the same address as the PDE on 2-level page table systems.
|
|
||||||
//
|
//
|
||||||
// If everything is already valid, there is nothing to do.
|
// If everything is already valid, there is nothing to do.
|
||||||
//
|
//
|
||||||
PointerPpe = MiAddressToPte(PointerPde);
|
if (
|
||||||
PointerPxe = MiAddressToPde(PointerPde);
|
#if _MI_PAGING_LEVELS == 4
|
||||||
if ((PointerPxe->u.Hard.Valid) &&
|
(PointerPxe->u.Hard.Valid) &&
|
||||||
|
#endif
|
||||||
|
#if _MI_PAGING_LEVELS >= 3
|
||||||
(PointerPpe->u.Hard.Valid) &&
|
(PointerPpe->u.Hard.Valid) &&
|
||||||
|
#endif
|
||||||
(PointerPde->u.Hard.Valid))
|
(PointerPde->u.Hard.Valid))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
|
@ -2515,6 +2521,7 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
|
||||||
//
|
//
|
||||||
ASSERT(KeAreAllApcsDisabled() == TRUE);
|
ASSERT(KeAreAllApcsDisabled() == TRUE);
|
||||||
|
|
||||||
|
#if _MI_PAGING_LEVELS == 4
|
||||||
//
|
//
|
||||||
// First, make the PXE valid if needed
|
// First, make the PXE valid if needed
|
||||||
//
|
//
|
||||||
|
@ -2523,31 +2530,47 @@ MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde,
|
||||||
MiMakeSystemAddressValid(PointerPpe, TargetProcess);
|
MiMakeSystemAddressValid(PointerPpe, TargetProcess);
|
||||||
ASSERT(PointerPxe->u.Hard.Valid == 1);
|
ASSERT(PointerPxe->u.Hard.Valid == 1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if _MI_PAGING_LEVELS >= 3
|
||||||
//
|
//
|
||||||
// Next, the PPE
|
// Next, the PPE
|
||||||
//
|
//
|
||||||
if (!PointerPpe->u.Hard.Valid)
|
if (!PointerPpe->u.Hard.Valid)
|
||||||
{
|
{
|
||||||
|
#if _MI_PAGING_LEVELS == 4
|
||||||
|
if (PointerPpe->u.Long == 0)
|
||||||
|
MiIncrementPageTableReferences(PointerPde);
|
||||||
|
#endif
|
||||||
MiMakeSystemAddressValid(PointerPde, TargetProcess);
|
MiMakeSystemAddressValid(PointerPde, TargetProcess);
|
||||||
ASSERT(PointerPpe->u.Hard.Valid == 1);
|
ASSERT(PointerPpe->u.Hard.Valid == 1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//
|
//
|
||||||
// And finally, make the PDE itself valid.
|
// And finally, make the PDE itself valid.
|
||||||
//
|
//
|
||||||
|
#if _MI_PAGING_LEVELS >= 3
|
||||||
|
if (PointerPde->u.Long == 0)
|
||||||
|
MiIncrementPageTableReferences(PointerPte);
|
||||||
|
#endif
|
||||||
MiMakeSystemAddressValid(PointerPte, TargetProcess);
|
MiMakeSystemAddressValid(PointerPte, TargetProcess);
|
||||||
|
|
||||||
|
/* Do not increment Page table refcount here for the PDE, this must be managed by caller */
|
||||||
|
|
||||||
//
|
//
|
||||||
// This should've worked the first time so the loop is really just for
|
// This should've worked the first time so the loop is really just for
|
||||||
// show -- ASSERT that we're actually NOT going to be looping.
|
// show -- ASSERT that we're actually NOT going to be looping.
|
||||||
//
|
//
|
||||||
ASSERT(PointerPxe->u.Hard.Valid == 1);
|
|
||||||
ASSERT(PointerPpe->u.Hard.Valid == 1);
|
|
||||||
ASSERT(PointerPde->u.Hard.Valid == 1);
|
ASSERT(PointerPde->u.Hard.Valid == 1);
|
||||||
} while (!(PointerPxe->u.Hard.Valid) ||
|
} while (
|
||||||
!(PointerPpe->u.Hard.Valid) ||
|
#if _MI_PAGING_LEVELS == 4
|
||||||
!(PointerPde->u.Hard.Valid));
|
!PointerPxe->u.Hard.Valid ||
|
||||||
|
#endif
|
||||||
|
#if _MI_PAGING_LEVELS >= 3
|
||||||
|
!PointerPpe->u.Hard.Valid ||
|
||||||
|
#endif
|
||||||
|
!PointerPde->u.Hard.Valid);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
|
|
Loading…
Reference in a new issue