From f7b7b61ea4f7cbe71b55679ade0bea5b26b3d27b Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Wed, 11 Feb 2026 20:23:24 +0100 Subject: [PATCH] Add interface to retrieve page map level (PML) --- xtoskrnl/includes/mm/amd64/pagemap.hh | 1 + xtoskrnl/includes/mm/amd64/paging.hh | 1 + xtoskrnl/includes/mm/i686/pagemap.hh | 1 + xtoskrnl/includes/mm/i686/paging.hh | 1 + xtoskrnl/mm/amd64/pagemap.cc | 14 ++++++++++++++ xtoskrnl/mm/i686/pagemap.cc | 14 ++++++++++++++ xtoskrnl/mm/paging.cc | 14 ++++++++++++++ 7 files changed, 46 insertions(+) diff --git a/xtoskrnl/includes/mm/amd64/pagemap.hh b/xtoskrnl/includes/mm/amd64/pagemap.hh index febc7ce..0d56e85 100644 --- a/xtoskrnl/includes/mm/amd64/pagemap.hh +++ b/xtoskrnl/includes/mm/amd64/pagemap.hh @@ -30,6 +30,7 @@ namespace MM XTAPI PMMP5E GetP5eAddress(IN PVOID Address); XTAPI ULONG GetP5eOffset(IN PVOID Address); XTAPI PVOID GetP5eVirtualAddress(IN PMMP5E P5ePointer); + XTAPI USHORT GetPageMapLevel(); XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); XTAPI PMMPDE GetPdeAddress(IN PVOID Address); XTAPI ULONG GetPdeOffset(IN PVOID Address); diff --git a/xtoskrnl/includes/mm/amd64/paging.hh b/xtoskrnl/includes/mm/amd64/paging.hh index 9cec44a..a0e5062 100644 --- a/xtoskrnl/includes/mm/amd64/paging.hh +++ b/xtoskrnl/includes/mm/amd64/paging.hh @@ -31,6 +31,7 @@ namespace MM STATIC XTAPI PMMP5E GetP5eAddress(IN PVOID Address); STATIC XTAPI PVOID GetP5eVirtualAddress(IN PMMP5E P5ePointer); STATIC XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); + STATIC XTAPI USHORT GetPageMapLevel(); STATIC XTAPI PMMPDE GetPdeAddress(IN PVOID Address); STATIC XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address); diff --git a/xtoskrnl/includes/mm/i686/pagemap.hh b/xtoskrnl/includes/mm/i686/pagemap.hh index bdfcb2d..3552cda 100644 --- a/xtoskrnl/includes/mm/i686/pagemap.hh +++ b/xtoskrnl/includes/mm/i686/pagemap.hh @@ -28,6 +28,7 @@ namespace MM VIRTUAL XTAPI PMMPTE GetNextPte(IN PMMPTE Pte) = 0; VIRTUAL XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte) = 0; VIRTUAL XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte) = 0; + XTAPI USHORT GetPageMapLevel(); XTAPI PMMPDE GetPdeAddress(IN PVOID Address); XTAPI ULONG GetPdeOffset(IN PVOID Address); VIRTUAL XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer) = 0; diff --git a/xtoskrnl/includes/mm/i686/paging.hh b/xtoskrnl/includes/mm/i686/paging.hh index b9722d9..cdc95ab 100644 --- a/xtoskrnl/includes/mm/i686/paging.hh +++ b/xtoskrnl/includes/mm/i686/paging.hh @@ -29,6 +29,7 @@ namespace MM STATIC XTAPI PMMPTE GetNextPte(IN PMMPTE Pte); STATIC XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte); STATIC XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); + STATIC XTAPI USHORT GetPageMapLevel(); STATIC XTAPI PMMPDE GetPdeAddress(IN PVOID Address); STATIC XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address); diff --git a/xtoskrnl/mm/amd64/pagemap.cc b/xtoskrnl/mm/amd64/pagemap.cc index 504cdcb..2d349a3 100644 --- a/xtoskrnl/mm/amd64/pagemap.cc +++ b/xtoskrnl/mm/amd64/pagemap.cc @@ -176,6 +176,20 @@ MM::PageMap::GetPageFrameNumber(IN PMMPTE Pte) return Pte->Hardware.PageFrameNumber; } +/** + * Gets Page Map Level (PML) for current paging mode. + * + * @return This routine returns the page map level. + * + * @since XT 1.0 + */ +XTAPI +USHORT +MM::PageMap::GetPageMapLevel() +{ + return PageMapInfo.Xpa ? 5 : 4; +} + /** * Gets the address of the PDE (Page Directory Entry), that maps given address. * diff --git a/xtoskrnl/mm/i686/pagemap.cc b/xtoskrnl/mm/i686/pagemap.cc index 1844115..d4db9b7 100644 --- a/xtoskrnl/mm/i686/pagemap.cc +++ b/xtoskrnl/mm/i686/pagemap.cc @@ -9,6 +9,20 @@ #include +/** + * Gets Page Map Level (PML) for current paging mode. + * + * @return This routine returns the page map level. + * + * @since XT 1.0 + */ +XTAPI +USHORT +MM::PageMap::GetPageMapLevel() +{ + return PageMapInfo.Xpa ? 3 : 2; +} + /** * Gets the address of the PDE (Page Directory Entry), that maps given address. * diff --git a/xtoskrnl/mm/paging.cc b/xtoskrnl/mm/paging.cc index 426e574..69305a6 100644 --- a/xtoskrnl/mm/paging.cc +++ b/xtoskrnl/mm/paging.cc @@ -189,6 +189,20 @@ MM::Paging::GetPageMapBasicRoutines(VOID) return &PageMapBasicRoutines; } +/** + * Gets Page Map Level (PML) for current paging mode. + * + * @return This routine returns the page map level. + * + * @since XT 1.0 + */ +XTAPI +USHORT +MM::Paging::GetPageMapLevel() +{ + return PmlRoutines->GetPageMapLevel(); +} + /** * Gets the page map routines for eXtended Physical Addressing (XPA) mode. *