Fix paging abstraction for PDE/PTE virtual address calculation
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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).
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user