Introduce page directory initialization helper
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (i686, release) (push) Successful in 31s
Builds / ExectOS (i686, debug) (push) Successful in 47s
Builds / ExectOS (amd64, release) (push) Successful in 51s

This commit is contained in:
2026-02-06 00:20:01 +01:00
parent 0590ad3bcd
commit b51f21f55c
3 changed files with 119 additions and 0 deletions

View File

@@ -57,6 +57,8 @@ namespace MM
private:
STATIC XTAPI VOID DecrementAvailablePages(VOID);
STATIC XTAPI VOID IncrementAvailablePages(VOID);
STATIC XTAPI VOID InitializePageDirectory(IN PMMPDE StartingPde,
IN PMMPDE EndingPde);
STATIC XTAPI VOID InitializePageTablePfns(VOID);
STATIC XTAPI VOID LinkFreePage(IN PFN_NUMBER PageFrameIndex);
STATIC XTAPI VOID LinkPage(IN PMMPFNLIST ListHead,

View File

@@ -10,6 +10,102 @@
#include <xtos.hh>
/**
* Allocates and initializes page directory structures for a range of PDEs.
*
* @param StartingPde
* Supplies a pointer to the first PDE in the range to initialize
*
* @param EndingPde
* Supplies a pointer to the last PDE in the range to initialize
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
MM::Pfn::InitializePageDirectory(IN PMMPDE StartingPde,
IN PMMPDE EndingPde)
{
PMMPTE ParentPte, ValidPte;
BOOLEAN PteValidated;
/* Get a template PTE for mapping the PFN database pages */
ValidPte = MM::Pte::GetValidPte();
/* Initialize validation flag */
PteValidated = FALSE;
/* Iterate through the range of PDEs to ensure the paging hierarchy is fully mapped */
while(StartingPde <= EndingPde)
{
/* Check if there is a need to validate upper-level page table entries */
if(!PteValidated || ((ULONG_PTR)StartingPde & (MM_PAGE_SIZE - 1)) == 0)
{
/* For LA57, ensure PML5 entry exists */
if(MM::Paging::GetXpaStatus())
{
/* Get the P5E that maps the PXE page containing this hierarchy */
ParentPte = MM::Paging::GetPpeAddress(StartingPde);
/* Check if P5E entry is valid */
if(!MM::Paging::PteValid(ParentPte))
{
/* Allocate a new PML4 page and map P5E to it */
MM::Paging::SetPte(ValidPte, AllocateBootstrapPages(1), 0);
*ParentPte = *ValidPte;
/* Clear the newly created page */
RTL::Memory::ZeroMemory(MM::Paging::GetPteVirtualAddress(ParentPte), MM_PAGE_SIZE);
}
}
/* Get the PXE that maps the PPE page containing PDE */
ParentPte = MM::Paging::GetPdeAddress(StartingPde);
/* Check if PXE entry is valid */
if(!MM::Paging::PteValid(ParentPte))
{
/* Allocate a new PPE page and map PXE to it */
MM::Paging::SetPte(ValidPte, AllocateBootstrapPages(1), 0);
*ParentPte = *ValidPte;
/* Clear the newly created page */
RTL::Memory::ZeroMemory(MM::Paging::GetPteVirtualAddress(ParentPte), MM_PAGE_SIZE);
}
/* Get the PPE that maps the PDE page containing PTE */
ParentPte = MM::Paging::GetPteAddress(StartingPde);
/* Check if PPE entry is valid */
if(!MM::Paging::PteValid(ParentPte))
{
/* Allocate a new PDE page and map PPE to it */
MM::Paging::SetPte(ValidPte, AllocateBootstrapPages(1), 0);
*ParentPte = *ValidPte;
/* Clear the newly created page */
RTL::Memory::ZeroMemory(MM::Paging::GetPteVirtualAddress(ParentPte), MM_PAGE_SIZE);
}
/* Upper levels for this PDE have been validated */
PteValidated = TRUE;
}
/* Ensure the PDE has a PTE page allocated */
if(!MM::Paging::PteValid(StartingPde))
{
/* Allocate a new PTE page and map PDE to it */
MM::Paging::SetPte(ValidPte, AllocateBootstrapPages(1), 0);
*StartingPde = *ValidPte;
}
/* Move to the next PDE */
StartingPde = MM::Paging::GetNextPte(StartingPde);
}
}
/**
* Initializes the PFN database by mapping virtual memory and populating entries.
*

View File

@@ -10,6 +10,27 @@
#include <xtos.hh>
/**
* Allocates and initializes page directory structures for a range of PDEs.
*
* @param StartingPde
* Supplies a pointer to the first PDE in the range to initialize
*
* @param EndingPde
* Supplies a pointer to the last PDE in the range to initialize
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
MM::Pfn::InitializePageDirectory(IN PMMPDE StartingPde,
IN PMMPDE EndingPde)
{
/* Nothing to do */
}
/**
* Initializes the PFN database by mapping virtual memory and populating entries.
*