If it takes me 6 months to understand why, then yes. Hint: you can make this delay shorter.
Also the title is a bit misleading, it's the PDE that is not faulted in in case we don't terminate the loop iteration early. Le 19/02/2015 05:46, Alex Ionescu a écrit : > it might fix an assert but the patch is incorrect. will this also take 6 > months to revert? > > Best regards, > Alex Ionescu > > On Tue, Feb 17, 2015 at 6:19 AM, <[email protected]> wrote: > >> Author: jgardou >> Date: Tue Feb 17 14:19:05 2015 >> New Revision: 66334 >> >> URL: http://svn.reactos.org/svn/reactos?rev=66334&view=rev >> Log: >> [NTOSKRNL/MM] >> - MiIsEntireRangeCommitted: Ensure the PTE we are checking is really >> faulted in. >> - Prefer MiPteToPde and MiPdeToPte (which should really be called >> MiFirstPteInPde) instead of MiAddressToPte and MiPteToAddress >> Fixes weird failed ASSERT in page fault handler when using DPH. >> >> Modified: >> trunk/reactos/ntoskrnl/mm/ARM3/virtual.c >> >> Modified: trunk/reactos/ntoskrnl/mm/ARM3/virtual.c >> URL: >> http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/virtual.c?rev=66334&r1=66333&r2=66334&view=diff >> >> ============================================================================== >> --- trunk/reactos/ntoskrnl/mm/ARM3/virtual.c [iso-8859-1] (original) >> +++ trunk/reactos/ntoskrnl/mm/ARM3/virtual.c [iso-8859-1] Tue Feb 17 >> 14:19:05 2015 >> @@ -1994,14 +1994,13 @@ >> if (OnBoundary) >> { >> /* Is this PDE demand zero? */ >> - PointerPde = MiAddressToPte(PointerPte); >> + PointerPde = MiPteToPde(PointerPte); >> if (PointerPde->u.Long != 0) >> { >> /* It isn't -- is it valid? */ >> if (PointerPde->u.Hard.Valid == 0) >> { >> /* Nope, fault it in */ >> - PointerPte = MiPteToAddress(PointerPde); >> MiMakeSystemAddressValid(PointerPte, Process); >> } >> } >> @@ -2009,13 +2008,13 @@ >> { >> /* The PTE was already valid, so move to the next one */ >> PointerPde++; >> - PointerPte = MiPteToAddress(PointerPde); >> + PointerPte = MiPdeToPte(PointerPde); >> >> /* Is the entire VAD committed? If not, fail */ >> if (!Vad->u.VadFlags.MemCommit) return FALSE; >> >> - /* Everything is committed so far past the range, return >> true */ >> - if (PointerPte > LastPte) return TRUE; >> + /* New loop iteration with our new, on-boundary PTE. */ >> + continue; >> } >> } >> >> >> >> > > > > _______________________________________________ > Ros-dev mailing list > [email protected] > http://www.reactos.org/mailman/listinfo/ros-dev > _______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
