From eaaf713f3d9e1d7d876fbe3448843cbee1df5da0 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Sun, 9 May 2010 18:17:53 +0000 Subject: [PATCH] [NTOS]: Acquire PFN lock before setting up hyperspace PTE/page. [NTOS]: Flush TLB after setting up hyperspace. [NTOS]: Use new MiRemoveAnyPage interface instead of MmAllocPage(MC_SYSTEM), as the first test of the new Page API/ABI. [NTOS]: Add support for creating software PTEs. svn path=/trunk/; revision=47150 --- reactos/ntoskrnl/mm/ARM3/i386/init.c | 20 ++++++++++------ reactos/ntoskrnl/mm/ARM3/miarm.h | 36 ++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/mm/ARM3/i386/init.c b/reactos/ntoskrnl/mm/ARM3/i386/init.c index 250324ca65f..0e6908fcbcd 100644 --- a/reactos/ntoskrnl/mm/ARM3/i386/init.c +++ b/reactos/ntoskrnl/mm/ARM3/i386/init.c @@ -151,6 +151,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MMPTE TempPde, TempPte; PVOID NonPagedPoolExpansionVa; ULONG OldCount; + KIRQL OldIrql; /* Check for kernel stack size that's too big */ if (MmLargeStackSize > (KERNEL_LARGE_STACK_SIZE / _1KB)) @@ -541,21 +542,26 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // MiInitializeSystemPtes(PointerPte, MmNumberOfSystemPtes, SystemPteSpace); - // - // Get the PDE For hyperspace - // + /* Get the PDE For hyperspace */ StartPde = MiAddressToPde(HYPER_SPACE); - // - // Allocate a page for it and create it - // - PageFrameIndex = MmAllocPage(MC_SYSTEM); + /* Lock PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Allocate a page for hyperspace and create it */ + PageFrameIndex = MiRemoveAnyPage(0); TempPde.u.Hard.PageFrameNumber = PageFrameIndex; TempPde.u.Hard.Global = FALSE; // Hyperspace is local! ASSERT(StartPde->u.Hard.Valid == 0); ASSERT(TempPde.u.Hard.Valid == 1); *StartPde = TempPde; + /* Flush the TLB */ + KeFlushCurrentTb(); + + /* Release the lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + // // Zero out the page table now // diff --git a/reactos/ntoskrnl/mm/ARM3/miarm.h b/reactos/ntoskrnl/mm/ARM3/miarm.h index 11d4189a958..a6e87fe7b8b 100644 --- a/reactos/ntoskrnl/mm/ARM3/miarm.h +++ b/reactos/ntoskrnl/mm/ARM3/miarm.h @@ -89,6 +89,24 @@ #define MM_DECOMMIT 0x10 #define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE) +// +// Corresponds to MMPTE_SOFTWARE.Protection +// +#ifdef _M_IX86 +#define MM_PTE_SOFTWARE_PROTECTION_BITS 5 +#elif _M_ARM +#define MM_PTE_SOFTWARE_PROTECTION_BITS 5 +#elif _M_AMD64 +#define MM_PTE_SOFTWARE_PROTECTION_BITS 5 +#else +#error Define these please! +#endif + +// +// Creates a software PTE with the given protection +// +#define MI_MAKE_SOFTWARE_PTE(x) ((x) << MM_PTE_SOFTWARE_PROTECTION_BITS) + // // Special values for LoadedImports // @@ -409,6 +427,12 @@ MmArmAccessFault( IN PVOID TrapInformation ); +NTSTATUS +FASTCALL +MiCheckPdeForPagedPool( + IN PVOID Address +); + VOID NTAPI MiInitializeNonPagedPool( @@ -532,6 +556,18 @@ MiRemoveHeadList( IN PMMPFNLIST ListHead ); +PFN_NUMBER +NTAPI +MiAllocatePfn( + IN PMMPTE PointerPte, + IN ULONG Protection +); + +PFN_NUMBER +NTAPI +MiRemoveAnyPage( + IN ULONG Color +); VOID NTAPI