From d4287198b062176f95dc1d616252589eec8cdc2d Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Sun, 30 Nov 2025 18:23:51 +0100 Subject: [PATCH] Implement virtual address resolvers for all page map levels and add XPA status accessor --- xtoskrnl/includes/mm/paging.hh | 11 ++- xtoskrnl/mm/paging.cc | 142 ++++++++++++++++++++++++++++++++- 2 files changed, 151 insertions(+), 2 deletions(-) diff --git a/xtoskrnl/includes/mm/paging.hh b/xtoskrnl/includes/mm/paging.hh index 17b65a6b..84e41ec9 100644 --- a/xtoskrnl/includes/mm/paging.hh +++ b/xtoskrnl/includes/mm/paging.hh @@ -22,7 +22,7 @@ namespace MM public: STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte, - IN ULONG Count); + IN LONG Count); STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer); STATIC XTAPI VOID FlushTlb(VOID); STATIC XTAPI ULONG_PTR GetEmptyPteList(VOID); @@ -30,11 +30,20 @@ namespace MM STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte); STATIC XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); STATIC XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); + STATIC XTAPI PMMPDE GetP5eAddress(IN PVOID Address); + STATIC XTAPI PVOID GetP5eVirtualAddress(IN PMMPTE P5ePointer); STATIC XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); STATIC XTAPI PMMPDE GetPdeAddress(IN PVOID Address); + STATIC XTAPI PVOID GetPdeVirtualAddress(IN PMMPXE PdePointer); STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address); + STATIC XTAPI PVOID GetPpeVirtualAddress(IN PMMPXE PpePointer); STATIC XTAPI PMMPTE GetPteAddress(IN PVOID Address); STATIC XTAPI ULONG GetPteSize(VOID); + STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPXE PtePointer); + STATIC XTAPI PMMPXE GetPxeAddress(IN PVOID Address); + STATIC XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); + STATIC XTAPI BOOLEAN GetXpaStatus(); + STATIC XTAPI VOID InitializeSystemSpaceMapping(VOID); STATIC XTAPI VOID InitializePageMapSupport(VOID); STATIC XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); STATIC XTAPI VOID SetNextEntry(IN PMMPTE Pte, diff --git a/xtoskrnl/mm/paging.cc b/xtoskrnl/mm/paging.cc index c85744ed..69a2c21e 100644 --- a/xtoskrnl/mm/paging.cc +++ b/xtoskrnl/mm/paging.cc @@ -25,7 +25,7 @@ XTAPI PMMPTE MM::Paging::AdvancePte(IN PMMPTE Pte, - IN ULONG Count) + IN LONG Count) { /* Return advanced PTE pointer */ return PmlRoutines->AdvancePte(Pte, Count); @@ -170,6 +170,42 @@ MM::Paging::GetOneEntry(IN PMMPTE Pte) return PmlRoutines->GetOneEntry(Pte); } +/** + * Gets the address of the P5E (Page Map Level 5 Entry), that maps given address. + * + * @param Address + * Specifies the virtual address for which to retrieve the corresponding P5E. + * + * @return This routine returns the address of the P5E, or NULLPTR if LA57 is not enabled. + * + * @since XT 1.0 + */ +XTAPI +PMMPDE +MM::Paging::GetP5eAddress(IN PVOID Address) +{ + /* Return PDE address */ + return PmlRoutines->GetP5eAddress(Address); +} + +/** + * Gets the virtual address that is mapped by a given Page Map Level 5 Entry. + * + * @param P5ePointer + * Specifies the address of the P5E. + * + * @return This routine returns the virtual address mapped by the P5E, or NULLPTR if LA57 is not enabled. + * + * @since XT 1.0 + */ +XTAPI +PVOID +MM::Paging::GetP5eVirtualAddress(IN PMMPTE P5ePointer) +{ + /* Return PTE virtual address */ + return PmlRoutines->GetP5eVirtualAddress(P5ePointer); +} + /** * Gets the page frame number from a corresponding PTE. * @@ -239,6 +275,24 @@ MM::Paging::GetPdeAddress(IN PVOID Address) return PmlRoutines->GetPdeAddress(Address); } +/** + * 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::Paging::GetPdeVirtualAddress(IN PMMPTE PdePointer) +{ + /* Return PTE virtual address */ + return PmlRoutines->GetPdeVirtualAddress(PdePointer); +} + /** * Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address. * @@ -257,6 +311,24 @@ MM::Paging::GetPpeAddress(IN PVOID Address) return PmlRoutines->GetPpeAddress(Address); } +/** + * Gets the virtual address that is mapped by a given Page Directory Pointer Table Entry. + * + * @param PpePointer + * Specifies the address of the PPE. + * + * @return This routine returns the virtual address mapped by the PPE. + * + * @since XT 1.0 + */ +XTAPI +PVOID +MM::Paging::GetPpeVirtualAddress(IN PMMPTE PpePointer) +{ + /* Return PTE virtual address */ + return PmlRoutines->GetPpeVirtualAddress(PpePointer); +} + /** * Gets the address of the PTE (Page Table Entry), that maps given address. * @@ -290,6 +362,74 @@ MM::Paging::GetPteSize(VOID) return PmlRoutines->GetPteSize(); } +/** + * Gets the virtual address that is mapped by a given Page Table Entry. + * + * @param PtePointer + * Specifies the address of the PTE. + * + * @return This routine returns the virtual address mapped by the PTE. + * + * @since XT 1.0 + */ +XTAPI +PVOID +MM::Paging::GetPteVirtualAddress(IN PMMPTE PtePointer) +{ + /* Return PTE virtual address */ + return PmlRoutines->GetPteVirtualAddress(PtePointer); +} + +/** + * Gets the address of the PXE (Extended Page Entry), that maps given address. + * + * @param Address + * Specifies the virtual address for which to retrieve the corresponding PXE. + * + * @return This routine returns the address of the PXE. + * + * @since XT 1.0 + */ +XTAPI +PMMPXE +MM::Paging::GetPxeAddress(IN PVOID Address) +{ + /* Return PXE address */ + return PmlRoutines->GetPxeAddress(Address); +} + +/** + * Gets the virtual address that is mapped by a given Extended Page Entry. + * + * @param PxePointer + * Specifies the address of the PXE. + * + * @return This routine returns the virtual address mapped by the PXE. + * + * @since XT 1.0 + */ +XTAPI +PVOID +MM::Paging::GetPxeVirtualAddress(IN PMMPXE PxePointer) +{ + /* Return PXE virtual address */ + return PmlRoutines->GetPxeVirtualAddress(PxePointer); +} + +/** + * Gets the status of Extended Paging Address (XPA) mode. + * + * @return This routine returns TRUE if XPA is enabled, FALSE otherwise. + * + * @since XT 1.0 + */ +XTAPI +BOOLEAN +MM::Paging::GetXpaStatus() +{ + return PmlRoutines->GetXpaStatus(); +} + /** * Detects if eXtended Physical Addressing (XPA) is enabled and initializes page map support. *