forked from xt-sys/exectos
Implement PFN database initialization and memory descriptor processing
This commit is contained in:
@@ -93,3 +93,69 @@ MM::Colors::GetPagingColorsMask()
|
||||
/* Return the mask used for page coloring calculations */
|
||||
return PagingColorsMask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the data structures for page coloring.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::Colors::InitializeColorTables(VOID)
|
||||
{
|
||||
PMMMEMORY_LAYOUT MemoryLayout;
|
||||
PMMPTE PointerPte, LastPte;
|
||||
ULONG Color;
|
||||
PMMPTE ValidPte;
|
||||
|
||||
/* Get the memory layout */
|
||||
MemoryLayout = MM::Manager::GetMemoryLayout();
|
||||
|
||||
/* Set the base address of the color tables to start right after the PFN database */
|
||||
FreePages[0] = (PMMCOLOR_TABLES)&((PMMPFN)MemoryLayout->PfnDatabaseAddress)[MM::Pfn::GetHighestPhysicalPage() + 1];
|
||||
|
||||
/* Calculate the virtual address range for both color tables */
|
||||
PointerPte = MM::Paging::GetPteAddress(&FreePages[0][0]);
|
||||
LastPte = MM::Paging::GetPteAddress((PVOID)((ULONG_PTR)FreePages[0] +
|
||||
(2 * PagingColors * sizeof(MMCOLOR_TABLES)) - 1));
|
||||
|
||||
/* Get a pointer to a PTE template */
|
||||
ValidPte = MM::Pte::GetValidPte();
|
||||
|
||||
/* Ensure the entire virtual address range for the color tables is mapped */
|
||||
while(PointerPte <= LastPte)
|
||||
{
|
||||
/* Check if a page in the range is not mapped */
|
||||
if(!MM::Paging::PteValid(PointerPte))
|
||||
{
|
||||
/* Use the bootstrap allocator to get a physical page */
|
||||
MM::Paging::SetPte(ValidPte, MM::Pfn::AllocateBootstrapPages(1), 0);
|
||||
*PointerPte = *ValidPte;
|
||||
|
||||
/* Zero out the newly mapped page */
|
||||
RTL::Memory::ZeroMemory(MM::Paging::GetPteVirtualAddress(PointerPte), MM_PAGE_SIZE);
|
||||
}
|
||||
|
||||
/* Move to the next PTE in the range */
|
||||
PointerPte = MM::Paging::GetNextPte(PointerPte);
|
||||
}
|
||||
|
||||
/* Set the pointer for the second list */
|
||||
FreePages[1] = &FreePages[0][PagingColors];
|
||||
|
||||
/* Initialize all entries in both color tables */
|
||||
for(Color = 0; Color < PagingColors; Color++)
|
||||
{
|
||||
/* Initialize the FreePageList entry for the current color */
|
||||
FreePages[FreePageList][Color].Flink = MAXULONG_PTR;
|
||||
FreePages[FreePageList][Color].Blink = (PVOID)MAXULONG_PTR;
|
||||
FreePages[FreePageList][Color].Count = 0;
|
||||
|
||||
/* Initialize the ZeroedPageList entry for the current color */
|
||||
FreePages[ZeroedPageList][Color].Flink = MAXULONG_PTR;
|
||||
FreePages[ZeroedPageList][Color].Blink = (PVOID)MAXULONG_PTR;
|
||||
FreePages[ZeroedPageList][Color].Count = 0;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user