Fix paging abstraction for PDE/PTE virtual address calculation
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 29s
Builds / ExectOS (amd64, release) (push) Successful in 27s
Builds / ExectOS (i686, release) (push) Successful in 26s
Builds / ExectOS (i686, debug) (push) Successful in 28s

This commit is contained in:
2025-12-18 22:26:31 +01:00
parent 687c58d923
commit b183d52806
2 changed files with 83 additions and 41 deletions

View File

@@ -31,7 +31,7 @@ namespace MM
VIRTUAL XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte) = 0; VIRTUAL XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte) = 0;
XTAPI PMMPDE GetPdeAddress(IN PVOID Address); XTAPI PMMPDE GetPdeAddress(IN PVOID Address);
XTAPI ULONG GetPdeIndex(IN PVOID Address); XTAPI ULONG GetPdeIndex(IN PVOID Address);
XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); VIRTUAL XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer) = 0;
XTAPI PMMPPE GetPpeAddress(IN PVOID Address); XTAPI PMMPPE GetPpeAddress(IN PVOID Address);
XTAPI ULONG GetPpeIndex(IN PVOID Address); XTAPI ULONG GetPpeIndex(IN PVOID Address);
XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer);
@@ -40,7 +40,7 @@ namespace MM
VIRTUAL XTAPI LONG GetPteDistance(PMMPTE EndPte, VIRTUAL XTAPI LONG GetPteDistance(PMMPTE EndPte,
PMMPTE StartPte) = 0; PMMPTE StartPte) = 0;
VIRTUAL XTAPI ULONG GetPteSize(VOID) = 0; VIRTUAL XTAPI ULONG GetPteSize(VOID) = 0;
XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0;
XTAPI BOOLEAN GetXpaStatus(); XTAPI BOOLEAN GetXpaStatus();
VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0; VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0;
VIRTUAL XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer) = 0; VIRTUAL XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer) = 0;
@@ -65,9 +65,11 @@ namespace MM
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer);
XTAPI LONG GetPteDistance(PMMPTE EndPte, XTAPI LONG GetPteDistance(PMMPTE EndPte,
PMMPTE StartPte); PMMPTE StartPte);
XTAPI ULONG GetPteSize(VOID); XTAPI ULONG GetPteSize(VOID);
XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
XTAPI VOID InitializePageMapInfo(VOID); XTAPI VOID InitializePageMapInfo(VOID);
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
XTAPI VOID SetNextEntry(IN PMMPTE Pte, XTAPI VOID SetNextEntry(IN PMMPTE Pte,
@@ -91,9 +93,11 @@ namespace MM
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer);
XTAPI LONG GetPteDistance(PMMPTE EndPte, XTAPI LONG GetPteDistance(PMMPTE EndPte,
PMMPTE StartPte); PMMPTE StartPte);
XTAPI ULONG GetPteSize(VOID); XTAPI ULONG GetPteSize(VOID);
XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
XTAPI VOID InitializePageMapInfo(VOID); XTAPI VOID InitializePageMapInfo(VOID);
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
XTAPI VOID SetNextEntry(IN PMMPTE Pte, XTAPI VOID SetNextEntry(IN PMMPTE Pte,

View File

@@ -81,23 +81,6 @@ MM::PageMap::GetPdeIndex(IN PVOID Address)
return ((((ULONG_PTR)(Address)) >> PageMapInfo.PdiShift) & (PageMapInfo.Xpa ? 0x1FF : 0x3FF)); return ((((ULONG_PTR)(Address)) >> PageMapInfo.PdiShift) & (PageMapInfo.Xpa ? 0x1FF : 0x3FF));
} }
/**
* Gets the virtual address that is mapped by a given Page Directory Entry.
*
* @param PdePointer
* Specifies the address of the PDE.
*
* @return This routine returns the virtual address mapped by the PDE.
*
* @since XT 1.0
*/
XTAPI
PVOID
MM::PageMap::GetPdeVirtualAddress(IN PMMPDE PdePointer)
{
/* Return PDE virtual address */
return ((PVOID)((ULONG)(PdePointer) << 20));
}
/** /**
* Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address. * Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address.
@@ -123,7 +106,7 @@ MM::PageMap::GetPpeAddress(IN PVOID Address)
* @param Address * @param Address
* Specifies the virtual address for which to retrieve the corresponding PPE. * Specifies the virtual address for which to retrieve the corresponding PPE.
* *
* @return This routine returns the index of the PPE. * @return This routine returns the offset of the PPE.
* *
* @since XT 1.0 * @since XT 1.0
*/ */
@@ -131,8 +114,8 @@ XTAPI
ULONG ULONG
MM::PageMap::GetPpeIndex(IN PVOID Address) MM::PageMap::GetPpeIndex(IN PVOID Address)
{ {
/* Return PPE index */ /* Return zero */
return ((((ULONG_PTR)(Address)) >> MM_PPI_SHIFT) & 0x3) * PageMapInfo.Xpa; return 0;
} }
/** /**
@@ -149,8 +132,8 @@ XTAPI
PVOID PVOID
MM::PageMap::GetPpeVirtualAddress(IN PMMPPE PpePointer) MM::PageMap::GetPpeVirtualAddress(IN PMMPPE PpePointer)
{ {
/* Return PPE virtual address */ /* Return zero */
return (PVOID)((ULONG)(PpePointer) << 30); return (PVOID)0;
} }
/** /**
@@ -192,23 +175,6 @@ MM::PageMap::GetPteIndex(IN PVOID Address)
return ((((ULONG_PTR)(Address)) >> MM_PTI_SHIFT) & (PageMapInfo.Xpa ? 0x1FF : 0x3FF)); return ((((ULONG_PTR)(Address)) >> MM_PTI_SHIFT) & (PageMapInfo.Xpa ? 0x1FF : 0x3FF));
} }
/**
* Gets the virtual address that is mapped by a given Page Table Entry.
*
* @param PtePointer
* Specifies the virtual address of the PTE.
*
* @return This routine returns the virtual address mapped by the PTE.
*
* @since XT 1.0
*/
XTAPI
PVOID
MM::PageMap::GetPteVirtualAddress(IN PMMPTE PtePointer)
{
/* Return PTE virtual address */
return ((PVOID)((ULONG)(PtePointer) << 10));
}
/** /**
* Gets the status of Extended Paging Address (XPA) mode. * Gets the status of Extended Paging Address (XPA) mode.
@@ -317,6 +283,24 @@ MM::PageMapBasic::GetPageFrameNumber(IN PMMPTE Pte)
return Pte->Pml2.Hardware.PageFrameNumber; return Pte->Pml2.Hardware.PageFrameNumber;
} }
/**
* Gets the virtual address that is mapped by a given Page Directory Entry.
*
* @param PdePointer
* Specifies the address of the PDE.
*
* @return This routine returns the virtual address mapped by the PDE.
*
* @since XT 1.0
*/
XTAPI
PVOID
MM::PageMapBasic::GetPdeVirtualAddress(IN PMMPDE PdePointer)
{
/* Return PDE virtual address */
return ((PVOID)((ULONG)(PdePointer) << 20));
}
/** /**
* Calculates the distance between two PTE pointers. * Calculates the distance between two PTE pointers.
* *
@@ -354,6 +338,24 @@ MM::PageMapBasic::GetPteSize(VOID)
return sizeof(MMPML2_PTE); return sizeof(MMPML2_PTE);
} }
/**
* Gets the virtual address that is mapped by a given Page Table Entry.
*
* @param PtePointer
* Specifies the virtual address of the PTE.
*
* @return This routine returns the virtual address mapped by the PTE.
*
* @since XT 1.0
*/
XTAPI
PVOID
MM::PageMapBasic::GetPteVirtualAddress(IN PMMPTE PtePointer)
{
/* Return PTE virtual address */
return ((PVOID)((ULONG)(PtePointer) << 10));
}
/** /**
* Initializes page map information for basic paging (PML2). * Initializes page map information for basic paging (PML2).
* *
@@ -590,6 +592,24 @@ MM::PageMapXpa::GetPageFrameNumber(IN PMMPTE Pte)
return Pte->Pml3.Hardware.PageFrameNumber; return Pte->Pml3.Hardware.PageFrameNumber;
} }
/**
* Gets the virtual address that is mapped by a given Page Directory Entry.
*
* @param PdePointer
* Specifies the address of the PDE.
*
* @return This routine returns the virtual address mapped by the PDE.
*
* @since XT 1.0
*/
XTAPI
PVOID
MM::PageMapXpa::GetPdeVirtualAddress(IN PMMPDE PdePointer)
{
/* Return PDE virtual address */
return ((PVOID)((ULONG)(PdePointer) << 18));
}
/** /**
* Calculates the distance between two PTE pointers. * Calculates the distance between two PTE pointers.
* *
@@ -627,6 +647,24 @@ MM::PageMapXpa::GetPteSize(VOID)
return sizeof(MMPML3_PTE); return sizeof(MMPML3_PTE);
} }
/**
* Gets the virtual address that is mapped by a given Page Table Entry.
*
* @param PtePointer
* Specifies the virtual address of the PTE.
*
* @return This routine returns the virtual address mapped by the PTE.
*
* @since XT 1.0
*/
XTAPI
PVOID
MM::PageMapXpa::GetPteVirtualAddress(IN PMMPTE PtePointer)
{
/* Return PTE virtual address */
return ((PVOID)((ULONG)(PtePointer) << 9));
}
/** /**
* Initializes page map information for basic paging (PML3). * Initializes page map information for basic paging (PML3).
* *