Author: tkreuzer Date: Wed Jan 6 23:53:31 2010 New Revision: 44982
URL: http://svn.reactos.org/svn/reactos?rev=44982&view=rev Log: Some work on Mm initialization, added a call to HalInitializeBios, so we have a mapped bios now.
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/mm/amd64/init.c
Modified: branches/ros-amd64-bringup/reactos/ntoskrnl/mm/amd64/init.c URL: http://svn.reactos.org/svn/reactos/branches/ros-amd64-bringup/reactos/ntoskr... ============================================================================== --- branches/ros-amd64-bringup/reactos/ntoskrnl/mm/amd64/init.c [iso-8859-1] (original) +++ branches/ros-amd64-bringup/reactos/ntoskrnl/mm/amd64/init.c [iso-8859-1] Wed Jan 6 23:53:31 2010 @@ -1,5 +1,5 @@ /* - * COPYRIGHT: See COPYING in the top level directory + * COPYRIGHT: GPL, See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/mm/amd64/init.c * PURPOSE: Memory Manager Initialization for amd64 @@ -19,6 +19,10 @@ #ifndef KDBG extern PMMPTE MmDebugPte; #endif + +VOID +NTAPI +HalInitializeBios(ULONG Unknown, PLOADER_PARAMETER_BLOCK LoaderBlock);
/* GLOBALS *****************************************************************/
@@ -76,15 +80,16 @@ PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor; ULONG MiNumberDescriptors = 0; +PFN_NUMBER MiSystemPages = 0; BOOLEAN MiIncludeType[LoaderMaximum];
PFN_NUMBER MxFreePageBase; ULONG64 MxFreePageCount = 0; -ULONG MxPhase = 0;
PFN_NUMBER MmSystemPageDirectory; PFN_NUMBER MmSizeOfPagedPoolInPages = MI_MIN_INIT_PAGED_POOLSIZE / PAGE_SIZE;
+BOOLEAN MiPfnsInitialized = FALSE;
/* FUNCTIONS *****************************************************************/
@@ -98,7 +103,7 @@ NTAPI MiEvaluateMemoryDescriptors(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; PLIST_ENTRY ListEntry; PFN_NUMBER LastPage; ULONG i; @@ -120,31 +125,31 @@ ListEntry = ListEntry->Flink) { /* Get the memory descriptor */ - MdBlock = CONTAINING_RECORD(ListEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry);
/* Count it */ MiNumberDescriptors++;
/* Skip pages that are not part of the PFN database */ - if (!MiIncludeType[MdBlock->MemoryType]) + if (!MiIncludeType[Descriptor->MemoryType]) { continue; }
/* Add this to the total of pages */ - MmNumberOfPhysicalPages += MdBlock->PageCount; + MmNumberOfPhysicalPages += Descriptor->PageCount;
/* Check if this is the new lowest page */ - if (MdBlock->BasePage < MmLowestPhysicalPage) + if (Descriptor->BasePage < MmLowestPhysicalPage) { /* Update the lowest page */ - MmLowestPhysicalPage = MdBlock->BasePage; + MmLowestPhysicalPage = Descriptor->BasePage; }
/* Check if this is the new highest page */ - LastPage = MdBlock->BasePage + MdBlock->PageCount - 1; + LastPage = Descriptor->BasePage + Descriptor->PageCount - 1; if (LastPage > MmHighestPhysicalPage) { /* Update the highest page */ @@ -152,28 +157,38 @@ }
/* Check if this is currently free memory */ - if ((MdBlock->MemoryType == LoaderFree) || - (MdBlock->MemoryType == LoaderLoadedProgram) || - (MdBlock->MemoryType == LoaderFirmwareTemporary) || - (MdBlock->MemoryType == LoaderOsloaderStack)) + if ((Descriptor->MemoryType == LoaderFree) || + (Descriptor->MemoryType == LoaderLoadedProgram) || + (Descriptor->MemoryType == LoaderFirmwareTemporary) || + (Descriptor->MemoryType == LoaderOsloaderStack)) { /* Check if this is the largest memory descriptor */ - if (MdBlock->PageCount > MxFreePageCount) + if (Descriptor->PageCount > MxFreePageCount) { /* For now, it is */ - MxFreeDescriptor = MdBlock; - MxFreePageBase = MdBlock->BasePage; - MxFreePageCount = MdBlock->PageCount; + MxFreeDescriptor = Descriptor; + MxFreePageBase = Descriptor->BasePage; + MxFreePageCount = Descriptor->PageCount; } } + else + { + /* Add it to the amount of system used pages */ + MiSystemPages += Descriptor->PageCount; + } } }
PFN_NUMBER NTAPI -MxAllocEarlyPage() +MiEarlyAllocPage() { PFN_NUMBER Pfn; + + if (MiPfnsInitialized) + { + return MmAllocPage(MC_SYSTEM, 0); + }
/* Make sure we have enough pages */ if (!MxFreePageCount) @@ -193,13 +208,6 @@ return Pfn; }
-PFN_NUMBER -NTAPI -MxAllocPage() -{ - return (MxPhase == 0) ? MxAllocEarlyPage() : MmAllocPage(MC_SYSTEM, 0); -} - PMMPTE NTAPI MxGetPte(PVOID Address) @@ -217,8 +225,11 @@ if (!Pte->u.Hard.Valid) { /* It's not valid, map it! */ - TmplPte.u.Hard.PageFrameNumber = MxAllocPage(); + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); *Pte = TmplPte; + + /* Zero the page */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); }
/* Get a pointer to the PPE */ @@ -226,8 +237,11 @@ if (!Pte->u.Hard.Valid) { /* It's not valid, map it! */ - TmplPte.u.Hard.PageFrameNumber = MxAllocPage(); + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); *Pte = TmplPte; + + /* Zero the page */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); }
/* Get a pointer to the PDE */ @@ -235,8 +249,11 @@ if (!Pte->u.Hard.Valid) { /* It's not valid, map it! */ - TmplPte.u.Hard.PageFrameNumber = MxAllocPage(); + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage(); *Pte = TmplPte; + + /* Zero the page */ + RtlZeroMemory(MiPteToAddress(Pte), PAGE_SIZE); }
/* Get a pointer to the PTE */ @@ -254,7 +271,7 @@ TmplPte.u.Long = 0; TmplPte.u.Flush.Valid = 1; TmplPte.u.Flush.Write = 1; - TmplPte.u.Hard.PageFrameNumber = MxAllocPage(); + TmplPte.u.Hard.PageFrameNumber = MiEarlyAllocPage();
/* Get the PTE for that page */ Pte = MxGetPte(Address); @@ -281,7 +298,7 @@ NTAPI MiPreparePfnDatabse(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; PLIST_ENTRY ListEntry; PUCHAR Page, FirstPage; SIZE_T Size; @@ -299,16 +316,16 @@ ListEntry = ListEntry->Flink) { /* Get the memory descriptor */ - MdBlock = CONTAINING_RECORD(ListEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry);
/* Skip pages that are not part of the PFN database */ - if (MiIncludeType[MdBlock->MemoryType]) + if (MiIncludeType[Descriptor->MemoryType]) { /* Get the base and size of this pfn database entry */ - FirstPage = PAGE_ALIGN(&MmPfnDatabase[MdBlock->BasePage]); - Size = ROUND_TO_PAGES(MdBlock->PageCount * sizeof(MMPFN)); + FirstPage = PAGE_ALIGN(&MmPfnDatabase[Descriptor->BasePage]); + Size = ROUND_TO_PAGES(Descriptor->PageCount * sizeof(MMPFN));
/* Loop the pages of this Pfn database entry */ for (Page = FirstPage; Page < FirstPage + Size; Page += PAGE_SIZE) @@ -318,6 +335,7 @@ { /* It's not, map it now */ MxMapPage(Page); + RtlZeroMemory(Page, PAGE_SIZE); } }
@@ -384,6 +402,9 @@ __writecr4(__readcr4() | CR4_PGE); ASSERT(__readcr4() & CR4_PGE);
+ /* Enable no execute */ + __writemsr(X86_MSR_EFER, __readmsr(X86_MSR_EFER) | EFER_NXE); + /* Loop the user mode PXEs */ for (Pte = MiAddressToPxe(0); Pte <= MiAddressToPxe(MmHighestUserAddress); @@ -414,7 +435,7 @@ if (!Pte->u.Hard.Valid) { /* It's not Initialize it */ - TmplPte.u.Flush.PageFrameNumber = MxAllocPage(); + TmplPte.u.Flush.PageFrameNumber = MiEarlyAllocPage(0); *Pte = TmplPte;
/* Zero the page. The PXE is the PTE for the PDPT. */ @@ -593,7 +614,7 @@ MiBuildPhysicalMemoryBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PPHYSICAL_MEMORY_DESCRIPTOR Buffer; - PMEMORY_ALLOCATION_DESCRIPTOR MdBlock; + PMEMORY_ALLOCATION_DESCRIPTOR Descriptor; PLIST_ENTRY ListEntry; PFN_NUMBER NextPage = -1; PULONG Bitmap; @@ -632,35 +653,35 @@ ListEntry = ListEntry->Flink) { /* Get the memory descriptor */ - MdBlock = CONTAINING_RECORD(ListEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); + Descriptor = CONTAINING_RECORD(ListEntry, + MEMORY_ALLOCATION_DESCRIPTOR, + ListEntry);
/* Skip pages that are not part of the PFN database */ - if (!MiIncludeType[MdBlock->MemoryType]) + if (!MiIncludeType[Descriptor->MemoryType]) { continue; }
/* Does the memory block begin where the last ended? */ - if (MdBlock->BasePage == NextPage) + if (Descriptor->BasePage == NextPage) { /* Add it to the current run */ - Buffer->Run[Runs - 1].PageCount += MdBlock->PageCount; + Buffer->Run[Runs - 1].PageCount += Descriptor->PageCount; } else { /* Create a new run */ Runs++; - Buffer->Run[Runs - 1].BasePage = MdBlock->BasePage; - Buffer->Run[Runs - 1].PageCount = MdBlock->PageCount; + Buffer->Run[Runs - 1].BasePage = Descriptor->BasePage; + Buffer->Run[Runs - 1].PageCount = Descriptor->PageCount; }
/* Set the bits in the PFN bitmap */ - RtlSetBits(&MiPfnBitMap, MdBlock->BasePage, MdBlock->PageCount); + RtlSetBits(&MiPfnBitMap, Descriptor->BasePage, Descriptor->PageCount);
/* Set the next page */ - NextPage = MdBlock->BasePage + MdBlock->PageCount; + NextPage = Descriptor->BasePage + Descriptor->PageCount; }
// FIXME: allocate a buffer of better size @@ -728,14 +749,14 @@ if (!Pte->u.Flush.Valid) { /* Map it! */ - TmplPte.u.Flush.PageFrameNumber = MxAllocPage(); + TmplPte.u.Flush.PageFrameNumber = MiEarlyAllocPage(); *Pte = TmplPte; } }
/* Create and map the first PTE for paged pool */ Pte = MxGetPte(MmPagedPoolStart); - TmplPte.u.Flush.PageFrameNumber = MxAllocPage(); + TmplPte.u.Flush.PageFrameNumber = MiEarlyAllocPage(); *Pte = TmplPte;
/* Save the first and last paged pool PTE */ @@ -801,8 +822,14 @@ { if (Phase == 0) { - /* Parse memory descriptors */ + MmBootImageSize = KeLoaderBlock->Extension->LoaderPagesSpanned * PAGE_SIZE; + MmBootImageSize = ROUND_UP(MmBootImageSize, PAGE_SIZE); + + /* Parse memory descriptors, find free pages */ MiEvaluateMemoryDescriptors(LoaderBlock); + + /* Start PFN database at hardcoded address */ + MmPfnDatabase = MI_PFN_DATABASE;
/* Prepare PFN database mappings */ MiPreparePfnDatabse(LoaderBlock); @@ -824,8 +851,8 @@ /* The PFN database was created, restore the free descriptor */ *MxFreeDescriptor = MxOldFreeDescriptor;
- /* Switch to phase 1 */ - MxPhase = 1; + /* The pfn database is ready now */ + MiPfnsInitialized = TRUE;
/* Initialize the nonpaged pool */ MiBuildNonPagedPool(); @@ -838,6 +865,14 @@
/* Size up paged pool and build the shadow system page directory */ MiBuildPagedPool(); + + // This is the old stuff: + MmPagedPoolBase = (PVOID)((PCHAR)MmPagedPoolEnd + 1); + MmPagedPoolSize = MM_PAGED_POOL_SIZE; + ASSERT((PCHAR)MmPagedPoolBase + MmPagedPoolSize < (PCHAR)MmNonPagedSystemStart); + + + HalInitializeBios(0, LoaderBlock); }
return STATUS_SUCCESS;