From b183d528061c35baec0122b05f080a7b3524bae5 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Thu, 18 Dec 2025 22:26:31 +0100 Subject: [PATCH] Fix paging abstraction for PDE/PTE virtual address calculation --- xtoskrnl/includes/mm/i686/pagemap.hh | 8 +- xtoskrnl/mm/i686/pagemap.cc | 116 ++++++++++++++++++--------- 2 files changed, 83 insertions(+), 41 deletions(-) diff --git a/xtoskrnl/includes/mm/i686/pagemap.hh b/xtoskrnl/includes/mm/i686/pagemap.hh index 5d94662..5ae935a 100644 --- a/xtoskrnl/includes/mm/i686/pagemap.hh +++ b/xtoskrnl/includes/mm/i686/pagemap.hh @@ -31,7 +31,7 @@ namespace MM VIRTUAL XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte) = 0; XTAPI PMMPDE GetPdeAddress(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 ULONG GetPpeIndex(IN PVOID Address); XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); @@ -40,7 +40,7 @@ namespace MM VIRTUAL XTAPI LONG GetPteDistance(PMMPTE EndPte, PMMPTE StartPte) = 0; VIRTUAL XTAPI ULONG GetPteSize(VOID) = 0; - XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); + VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0; XTAPI BOOLEAN GetXpaStatus(); VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0; VIRTUAL XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer) = 0; @@ -65,9 +65,11 @@ namespace MM XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); + XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); XTAPI LONG GetPteDistance(PMMPTE EndPte, PMMPTE StartPte); XTAPI ULONG GetPteSize(VOID); + XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); XTAPI VOID InitializePageMapInfo(VOID); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); XTAPI VOID SetNextEntry(IN PMMPTE Pte, @@ -91,9 +93,11 @@ namespace MM XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); + XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); XTAPI LONG GetPteDistance(PMMPTE EndPte, PMMPTE StartPte); XTAPI ULONG GetPteSize(VOID); + XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); XTAPI VOID InitializePageMapInfo(VOID); XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); XTAPI VOID SetNextEntry(IN PMMPTE Pte, diff --git a/xtoskrnl/mm/i686/pagemap.cc b/xtoskrnl/mm/i686/pagemap.cc index d695fe8..c972336 100644 --- a/xtoskrnl/mm/i686/pagemap.cc +++ b/xtoskrnl/mm/i686/pagemap.cc @@ -81,23 +81,6 @@ MM::PageMap::GetPdeIndex(IN PVOID Address) 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. @@ -123,7 +106,7 @@ MM::PageMap::GetPpeAddress(IN PVOID Address) * @param Address * 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 */ @@ -131,8 +114,8 @@ XTAPI ULONG MM::PageMap::GetPpeIndex(IN PVOID Address) { - /* Return PPE index */ - return ((((ULONG_PTR)(Address)) >> MM_PPI_SHIFT) & 0x3) * PageMapInfo.Xpa; + /* Return zero */ + return 0; } /** @@ -149,8 +132,8 @@ XTAPI PVOID MM::PageMap::GetPpeVirtualAddress(IN PMMPPE PpePointer) { - /* Return PPE virtual address */ - return (PVOID)((ULONG)(PpePointer) << 30); + /* Return zero */ + return (PVOID)0; } /** @@ -192,23 +175,6 @@ MM::PageMap::GetPteIndex(IN PVOID Address) 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. @@ -317,6 +283,24 @@ MM::PageMapBasic::GetPageFrameNumber(IN PMMPTE Pte) 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. * @@ -354,6 +338,24 @@ MM::PageMapBasic::GetPteSize(VOID) 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). * @@ -590,6 +592,24 @@ MM::PageMapXpa::GetPageFrameNumber(IN PMMPTE Pte) 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. * @@ -627,6 +647,24 @@ MM::PageMapXpa::GetPteSize(VOID) 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). *