From c816943def7d4286da10dc4e2d709ff9611eb551 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sun, 30 May 2010 03:02:39 +0000 Subject: [PATCH] [NTOS]: Implement MiAllocatePfn, it is a simpler wrapper that grabs a page, sets its protection, and initializes its PFN entry. [NTOS]: Use MiAllocatePfn in MiLoadImageSection instead of MmAllocPage. Other than doing a better job at initializing the page, it creates our first caller of this function, great for testing, since this is a rather high-demand function, especially at boot. Please test. svn path=/trunk/; revision=47432 --- reactos/ntoskrnl/mm/ARM3/pfnlist.c | 38 ++++++++++++++++++++++++++++++ reactos/ntoskrnl/mm/sysldr.c | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/mm/ARM3/pfnlist.c b/reactos/ntoskrnl/mm/ARM3/pfnlist.c index b70e191c030..0a7ea0730b3 100644 --- a/reactos/ntoskrnl/mm/ARM3/pfnlist.c +++ b/reactos/ntoskrnl/mm/ARM3/pfnlist.c @@ -618,6 +618,44 @@ MiInitializePfn(IN PFN_NUMBER PageFrameIndex, Pfn1->u2.ShareCount++; } +PFN_NUMBER +NTAPI +MiAllocatePfn(IN PMMPTE PointerPte, + IN ULONG Protection) +{ + KIRQL OldIrql; + PFN_NUMBER PageFrameIndex; + MMPTE TempPte; + + /* Make an empty software PTE */ + MI_MAKE_SOFTWARE_PTE(&TempPte, MM_READWRITE); + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Check if we're running low on pages */ + if (MmAvailablePages < 128) + { + DPRINT1("Warning, running low on memory: %d pages left\n", MmAvailablePages); + //MiEnsureAvailablePageOrWait(NULL, OldIrql); + } + + /* Grab a page */ + PageFrameIndex = MiRemoveAnyPage(0); + + /* Write the software PTE */ + ASSERT(PointerPte->u.Hard.Valid == 0); + *PointerPte = TempPte; + PointerPte->u.Soft.Protection |= Protection; + + /* Initialize its PFN entry */ + MiInitializePfn(PageFrameIndex, PointerPte, TRUE); + + /* Release the PFN lock and return the page */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + return PageFrameIndex; +} + VOID NTAPI MiDecrementShareCount(IN PMMPFN Pfn1, diff --git a/reactos/ntoskrnl/mm/sysldr.c b/reactos/ntoskrnl/mm/sysldr.c index fcecf3c8da5..a242b4b2f6c 100644 --- a/reactos/ntoskrnl/mm/sysldr.c +++ b/reactos/ntoskrnl/mm/sysldr.c @@ -172,7 +172,7 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, while (PointerPte < LastPte) { /* Allocate a page */ - TempPte.u.Hard.PageFrameNumber = MmAllocPage(MC_NPPOOL); + TempPte.u.Hard.PageFrameNumber = MiAllocatePfn(PointerPte, MM_EXECUTE); /* Write it */ ASSERT(PointerPte->u.Hard.Valid == 0); -- 2.17.1