From 241a326520d4e15b5f73d42bb58d78c330858e58 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 10 May 2015 19:35:24 +0000 Subject: [PATCH] [NTOSKRNL/MM] Add MI_MAKE_CLEAN_PAGE Use PTE access macros for portability svn path=/trunk/; revision=67633 --- reactos/ntoskrnl/include/internal/amd64/mm.h | 1 + reactos/ntoskrnl/include/internal/arm/mm.h | 1 + reactos/ntoskrnl/include/internal/i386/mm.h | 1 + reactos/ntoskrnl/mm/ARM3/pagfault.c | 37 +++++++++++--------- reactos/ntoskrnl/mm/ARM3/section.c | 2 +- reactos/ntoskrnl/mm/ARM3/session.c | 2 +- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/amd64/mm.h b/reactos/ntoskrnl/include/internal/amd64/mm.h index 5cdb0dd053c..a9452445045 100644 --- a/reactos/ntoskrnl/include/internal/amd64/mm.h +++ b/reactos/ntoskrnl/include/internal/amd64/mm.h @@ -87,6 +87,7 @@ /* Macros for portable PTE modification */ #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0) #define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1) +#define MI_MAKE_CLEAN_PAGE(x) ((x)->u.Hard.Dirty = 0) #define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1) #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1) #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1) diff --git a/reactos/ntoskrnl/include/internal/arm/mm.h b/reactos/ntoskrnl/include/internal/arm/mm.h index 9b252972e94..e7021b1de8a 100644 --- a/reactos/ntoskrnl/include/internal/arm/mm.h +++ b/reactos/ntoskrnl/include/internal/arm/mm.h @@ -76,6 +76,7 @@ /* Macros for portable PTE modification */ #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.NonGlobal = 1) #define MI_MAKE_DIRTY_PAGE(x) +#define MI_MAKE_CLEAN_PAGE(x) #define MI_MAKE_ACCESSED_PAGE(x) #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.Cached = 0) #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.Buffered = 0) diff --git a/reactos/ntoskrnl/include/internal/i386/mm.h b/reactos/ntoskrnl/include/internal/i386/mm.h index 935e731bd2f..5376dd5d414 100644 --- a/reactos/ntoskrnl/include/internal/i386/mm.h +++ b/reactos/ntoskrnl/include/internal/i386/mm.h @@ -91,6 +91,7 @@ /* Macros for portable PTE modification */ #define MI_MAKE_LOCAL_PAGE(x) ((x)->u.Hard.Global = 0) #define MI_MAKE_DIRTY_PAGE(x) ((x)->u.Hard.Dirty = 1) +#define MI_MAKE_CLEAN_PAGE(x) ((x)->u.Hard.Dirty = 0) #define MI_MAKE_ACCESSED_PAGE(x) ((x)->u.Hard.Accessed = 1) #define MI_PAGE_DISABLE_CACHE(x) ((x)->u.Hard.CacheDisable = 1) #define MI_PAGE_WRITE_THROUGH(x) ((x)->u.Hard.WriteThrough = 1) diff --git a/reactos/ntoskrnl/mm/ARM3/pagfault.c b/reactos/ntoskrnl/mm/ARM3/pagfault.c index 272ea92aee9..8ab496cf7e1 100644 --- a/reactos/ntoskrnl/mm/ARM3/pagfault.c +++ b/reactos/ntoskrnl/mm/ARM3/pagfault.c @@ -165,7 +165,8 @@ MiAccessCheck(IN PMMPTE PointerPte, if (StoreInstruction) { /* Is it writable?*/ - if ((TempPte.u.Hard.Write) || (TempPte.u.Hard.CopyOnWrite)) + if (MI_IS_PAGE_WRITEABLE(&TempPte) || + MI_IS_PAGE_COPY_ON_WRITE(&TempPte)) { /* Then there's nothing to worry about */ return STATUS_SUCCESS; @@ -791,7 +792,7 @@ MiCompleteProtoPteFault(IN BOOLEAN StoreInstruction, } /* Set the dirty flag if needed */ - if (DirtyPage) TempPte.u.Hard.Dirty = TRUE; + if (DirtyPage) MI_MAKE_DIRTY_PAGE(&TempPte); /* Write the PTE */ MI_WRITE_VALID_PTE(PointerPte, TempPte); @@ -1004,16 +1005,17 @@ MiResolveTransitionFault(IN PVOID FaultingAddress, MiDetermineUserGlobalPteMask(PointerPte); /* Is the PTE writeable? */ - if (((Pfn1->u3.e1.Modified) && (TempPte.u.Hard.Write)) && - (TempPte.u.Hard.CopyOnWrite == 0)) + if ((Pfn1->u3.e1.Modified) && + MI_IS_PAGE_WRITEABLE(&TempPte) && + !MI_IS_PAGE_COPY_ON_WRITE(&TempPte)) { /* Make it dirty */ - TempPte.u.Hard.Dirty = TRUE; + MI_MAKE_DIRTY_PAGE(&TempPte); } else { /* Make it clean */ - TempPte.u.Hard.Dirty = FALSE; + MI_MAKE_CLEAN_PAGE(&TempPte); } /* Write the valid PTE */ @@ -1302,19 +1304,20 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, TempPte.u.Long = (PointerProtoPte->u.Long & ~0xFFF) | MmProtectToPteMask[PointerProtoPte->u.Trans.Protection]; TempPte.u.Hard.Valid = 1; - TempPte.u.Hard.Accessed = 1; + MI_MAKE_ACCESSED_PAGE(&TempPte); /* Is the PTE writeable? */ - if (((Pfn1->u3.e1.Modified) && (TempPte.u.Hard.Write)) && - (TempPte.u.Hard.CopyOnWrite == 0)) + if ((Pfn1->u3.e1.Modified) && + MI_IS_PAGE_WRITEABLE(&TempPte) && + !MI_IS_PAGE_COPY_ON_WRITE(&TempPte)) { /* Make it dirty */ - TempPte.u.Hard.Dirty = TRUE; + MI_MAKE_DIRTY_PAGE(&TempPte); } else { /* Make it clean */ - TempPte.u.Hard.Dirty = FALSE; + MI_MAKE_CLEAN_PAGE(&TempPte); } /* Write the valid PTE */ @@ -1561,7 +1564,7 @@ MmArmAccessFault(IN BOOLEAN StoreInstruction, /* Not yet implemented in ReactOS */ ASSERT(MI_IS_PAGE_LARGE(PointerPde) == FALSE); - ASSERT(((StoreInstruction) && (PointerPte->u.Hard.CopyOnWrite)) == FALSE); + ASSERT(((StoreInstruction) && MI_IS_PAGE_COPY_ON_WRITE(PointerPte)) == FALSE); /* Check if this was a write */ if (StoreInstruction) @@ -1740,7 +1743,7 @@ _WARN("Session space stuff is not implemented yet!") Pfn1 = MI_PFN_ELEMENT(PointerPte->u.Hard.PageFrameNumber); if (!(TempPte.u.Long & PTE_READWRITE) && !(Pfn1->OriginalPte.u.Soft.Protection & MM_READWRITE) && - !(TempPte.u.Hard.CopyOnWrite)) + !MI_IS_PAGE_COPY_ON_WRITE(&TempPte)) { /* Case not yet handled */ ASSERT(!IsSessionAddress); @@ -1757,13 +1760,13 @@ _WARN("Session space stuff is not implemented yet!") /* Check for read-only write in session space */ if ((IsSessionAddress) && (StoreInstruction) && - !(TempPte.u.Hard.Write)) + !MI_IS_PAGE_WRITEABLE(&TempPte)) { /* Sanity check */ ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(Address)); /* Was this COW? */ - if (TempPte.u.Hard.CopyOnWrite == 0) + if (!MI_IS_PAGE_COPY_ON_WRITE(&TempPte)) { /* Then this is not allowed */ KeBugCheckEx(ATTEMPTED_WRITE_TO_READONLY_MEMORY, @@ -1993,14 +1996,14 @@ UserFault: if (StoreInstruction) { /* Is this a copy on write PTE? */ - if (TempPte.u.Hard.CopyOnWrite) + if (MI_IS_PAGE_COPY_ON_WRITE(&TempPte)) { /* Not supported yet */ ASSERT(FALSE); } /* Is this a read-only PTE? */ - if (!TempPte.u.Hard.Write) + if (!MI_IS_PAGE_WRITEABLE(&TempPte)) { /* Return the status */ MiUnlockProcessWorkingSet(CurrentProcess, CurrentThread); diff --git a/reactos/ntoskrnl/mm/ARM3/section.c b/reactos/ntoskrnl/mm/ARM3/section.c index de509fb5147..0c50daca48a 100644 --- a/reactos/ntoskrnl/mm/ARM3/section.c +++ b/reactos/ntoskrnl/mm/ARM3/section.c @@ -2164,7 +2164,7 @@ MiRemoveMappedPtes(IN PVOID BaseAddress, ASSERT(((Pfn1->u3.e1.PrototypePte) && (Pfn1->OriginalPte.u.Soft.Prototype)) == 0); /* Mark the page as modified accordingly */ - if (PteContents.u.Hard.Dirty) + if (MI_IS_PAGE_DIRTY(&PteContents)) Pfn1->u3.e1.Modified = 1; /* Was the PDE invalid */ diff --git a/reactos/ntoskrnl/mm/ARM3/session.c b/reactos/ntoskrnl/mm/ARM3/session.c index dd5948c2a15..ff8cb3f6459 100644 --- a/reactos/ntoskrnl/mm/ARM3/session.c +++ b/reactos/ntoskrnl/mm/ARM3/session.c @@ -572,7 +572,7 @@ MiSessionInitializeWorkingSetList(VOID) /* Write a valid PTE for it */ TempPte.u.Long = ValidKernelPteLocal.u.Long; - TempPte.u.Hard.Dirty = TRUE; + MI_MAKE_DIRTY_PAGE(&TempPte); TempPte.u.Hard.PageFrameNumber = PageFrameIndex; /* Initialize the working set list page */