https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b10d92a16c6985b8063b95...
commit b10d92a16c6985b8063b954d9211864bf8114052 Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Thu Apr 1 11:45:10 2021 +0200 Commit: Jérôme Gardou zefklop@users.noreply.github.com CommitDate: Thu Apr 8 15:40:37 2021 +0200
[NTOS:MM] Use MI_MAKE_HARDWARE_PTE & friends in legacy Mm --- ntoskrnl/mm/i386/page.c | 91 +++++++++++++++---------------------------------- 1 file changed, 28 insertions(+), 63 deletions(-)
diff --git a/ntoskrnl/mm/i386/page.c b/ntoskrnl/mm/i386/page.c index 35b0921d0ae..8b3ed370e94 100644 --- a/ntoskrnl/mm/i386/page.c +++ b/ntoskrnl/mm/i386/page.c @@ -15,9 +15,6 @@
#include <mm/ARM3/miarm.h>
-#define ADDR_TO_PDE_OFFSET MiAddressToPdeOffset -#define ADDR_TO_PAGE_TABLE(v) (((ULONG)(v)) / (1024 * PAGE_SIZE)) - /* GLOBALS *****************************************************************/
#define PA_BIT_PRESENT (0) @@ -134,47 +131,6 @@ ULONG MmProtectToValue[32] =
/* FUNCTIONS ***************************************************************/
-static ULONG -ProtectToPTE(ULONG flProtect) -{ - ULONG Attributes = 0; - - if (flProtect & (PAGE_NOACCESS|PAGE_GUARD)) - { - Attributes = 0; - } - else if (flProtect & PAGE_IS_WRITABLE) - { - Attributes = PA_PRESENT | PA_READWRITE; - } - else if (flProtect & (PAGE_IS_READABLE | PAGE_IS_EXECUTABLE)) - { - Attributes = PA_PRESENT; - } - else - { - DPRINT1("Unknown main protection type.\n"); - KeBugCheck(MEMORY_MANAGEMENT); - } - - if (flProtect & PAGE_SYSTEM) - { - } - else - { - Attributes = Attributes | PA_USER; - } - if (flProtect & PAGE_NOCACHE) - { - Attributes = Attributes | PA_CD; - } - if (flProtect & PAGE_WRITETHROUGH) - { - Attributes = Attributes | PA_WT; - } - return(Attributes); -} - NTSTATUS NTAPI MiFillSystemPageDirectory(IN PVOID Base, @@ -591,15 +547,22 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, ULONG flProtect, PFN_NUMBER Page) { - ULONG Attributes; + ULONG ProtectionMask; PMMPTE PointerPte; - ULONG Pte; + MMPTE TempPte; + ULONG_PTR Pte;
DPRINT("MmCreateVirtualMappingUnsafe(%p, %p, %lu, %x)\n", Process, Address, flProtect, Page);
ASSERT(((ULONG_PTR)Address % PAGE_SIZE) == 0);
+ ProtectionMask = MiMakeProtectionMask(flProtect); + /* Caller must have checked ! */ + ASSERT(ProtectionMask != MM_INVALID_PROTECTION); + ASSERT(ProtectionMask != MM_NOACCESS); + ASSERT(ProtectionMask != MM_ZERO_ACCESS); + /* Make sure our PDE is valid, and that everything is going fine */ if (Process == NULL) { @@ -626,22 +589,18 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process, MiMakePdeExistAndMakeValid(MiAddressToPde(Address), Process, MM_NOIRQL); }
- Attributes = ProtectToPTE(flProtect); - Attributes &= 0xfff; + PointerPte = MiAddressToPte(Address); + if (Address >= MmSystemRangeStart) { - Attributes &= ~PA_USER; + MI_MAKE_HARDWARE_PTE_KERNEL(&TempPte, PointerPte, ProtectionMask, Page); } else { - Attributes |= PA_USER; + MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, ProtectionMask, Page); }
- /* This must be for a valid address */ - ASSERT(FlagOn(Attributes, PA_PRESENT)); - - PointerPte = MiAddressToPte(Address); - Pte = InterlockedExchangePte(PointerPte, PFN_TO_PTE(Page) | Attributes); + Pte = InterlockedExchangePte(PointerPte, TempPte.u.Long); /* There should not have been anything valid here */ if (Pte != 0) { @@ -752,9 +711,10 @@ VOID NTAPI MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) { - ULONG Attributes = 0; + ULONG ProtectionMask; PMMPTE PointerPte; - ULONG Pte; + MMPTE TempPte; + ULONG_PTR Pte;
DPRINT("MmSetPageProtect(Process %p Address %p flProtect %x)\n", Process, Address, flProtect); @@ -764,17 +724,22 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
ASSERT(Process == PsGetCurrentProcess());
+ ProtectionMask = MiMakeProtectionMask(flProtect); + /* Caller must have checked ! */ + ASSERT(ProtectionMask != MM_INVALID_PROTECTION); + MiLockProcessWorkingSetUnsafe(Process, PsGetCurrentThread());
MiMakePdeExistAndMakeValid(MiAddressToPde(Address), Process, MM_NOIRQL);
- Attributes = ProtectToPTE(flProtect); + PointerPte = MiAddressToPte(Address);
- Attributes &= 0xfff; - Attributes |= PA_USER; + MI_MAKE_HARDWARE_PTE_USER(&TempPte, PointerPte, ProtectionMask, PFN_FROM_PTE(PointerPte)); + /* Keep dirty & accessed bits */ + TempPte.u.Hard.Accessed = PointerPte->u.Hard.Accessed; + TempPte.u.Hard.Dirty = PointerPte->u.Hard.Dirty;
- PointerPte = MiAddressToPte(Address); - Pte = InterlockedExchangePte(PointerPte, PAGE_MASK(PointerPte->u.Long) | Attributes | (PointerPte->u.Long & (PA_ACCESSED|PA_DIRTY))); + Pte = InterlockedExchangePte(PointerPte, TempPte.u.Long);
// We should be able to bring a page back from PAGE_NOACCESS if ((Pte & 0x800) || !(Pte >> PAGE_SHIFT)) @@ -783,7 +748,7 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect) KeBugCheck(MEMORY_MANAGEMENT); }
- if ((Pte & 0xFFF) != Attributes) + if (Pte != TempPte.u.Long) KeInvalidateTlbEntry(Address);
MiUnlockProcessWorkingSetUnsafe(Process, PsGetCurrentThread());