From f30d3df5b3eafbf78ffc3a6c3f230955334b867d Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Sun, 17 Aug 2025 21:48:28 +0200 Subject: [PATCH] Implement PTE manipulation functions for AMD64 architecture --- xtoskrnl/includes/amd64/mmi.h | 20 +++++++++++ xtoskrnl/mm/amd64/globals.c | 16 ++++----- xtoskrnl/mm/amd64/pmap.c | 65 +++++++++++++++++++++++++++++++++++ 3 files changed, 93 insertions(+), 8 deletions(-) diff --git a/xtoskrnl/includes/amd64/mmi.h b/xtoskrnl/includes/amd64/mmi.h index cccbfc3..dbbcba0 100644 --- a/xtoskrnl/includes/amd64/mmi.h +++ b/xtoskrnl/includes/amd64/mmi.h @@ -22,6 +22,10 @@ VOID MmZeroPages(IN PVOID Address, IN ULONG Size); +XTAPI +VOID +MmpClearPte(PHARDWARE_PTE PtePointer); + XTAPI BOOLEAN MmpGetExtendedPhysicalAddressingStatus(VOID); @@ -50,4 +54,20 @@ XTAPI VOID MmpInitializeArchitecture(VOID); +XTAPI +BOOLEAN +MmpPteValid(PHARDWARE_PTE PtePointer); + +XTAPI +VOID +MmpSetPte(PHARDWARE_PTE PtePointer, + PFN_NUMBER PageFrameNumber, + BOOLEAN Writable); + +XTAPI +VOID +MmpSetPteCaching(PHARDWARE_PTE PtePointer, + BOOLEAN CacheDisable, + BOOLEAN WriteThrough); + #endif /* __XTOSKRNL_AMD64_MMI_H */ diff --git a/xtoskrnl/mm/amd64/globals.c b/xtoskrnl/mm/amd64/globals.c index 52994aa..f5959a1 100644 --- a/xtoskrnl/mm/amd64/globals.c +++ b/xtoskrnl/mm/amd64/globals.c @@ -11,16 +11,16 @@ /* Page mapping routines for systems using 4-level paging (PML4) */ CMMPAGEMAP_ROUTINES MmpPml4Routines = { - // .ClearPte = MmpClearPte, - // .PteValid = MmpPml2PteValid, - // .SetPteCaching = MmpSetPml2PteCaching, - // .SetPte = MmpSetPml2Pte, + .ClearPte = MmpClearPte, + .PteValid = MmpPteValid, + .SetPteCaching = MmpSetPteCaching, + .SetPte = MmpSetPte, }; /* Page mapping routines for systems using 5-level paging (PML5) */ CMMPAGEMAP_ROUTINES MmpPml5Routines = { - // .ClearPte = MmpClearPte, - // .PteValid = MmpPml3PteValid, - // .SetPteCaching = MmpSetPml3PteCaching, - // .SetPte = MmpSetPml3Pte, + .ClearPte = MmpClearPte, + .PteValid = MmpPteValid, + .SetPteCaching = MmpSetPteCaching, + .SetPte = MmpSetPte, }; diff --git a/xtoskrnl/mm/amd64/pmap.c b/xtoskrnl/mm/amd64/pmap.c index dc59230..20b9ec1 100644 --- a/xtoskrnl/mm/amd64/pmap.c +++ b/xtoskrnl/mm/amd64/pmap.c @@ -9,6 +9,27 @@ #include +/** + * Clears the contents of a page table entry (PTE). + * + * @param PtePointer + * Pointer to the page table entry (PTE) to be cleared. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +MmpClearPte(PHARDWARE_PTE PtePointer) +{ + PtePointer->CacheDisable = 0; + PtePointer->PageFrameNumber = 0; + PtePointer->Valid = 0; + PtePointer->Writable = 0; + PtePointer->WriteThrough = 0; +} + /** * Checks if eXtended Physical Addressing (XPA) is enabled. * @@ -123,3 +144,47 @@ MmpGetPxeAddress(PVOID Address) Offset = (((ULONGLONG)Address >> MM_PXI_SHIFT) << MM_PTE_SHIFT); return (PMMPXE)(MmpPageMapInfo.PxeBase + Offset); } + +/** + * Checks whether the given page table entry (PTE) is valid. + * + * @param PtePointer + * Pointer to the page table entry (PTE) to check. + * + * @return Returns TRUE if the entry is valid, FALSE otherwise. + * + * @since XT 1.0 + */ +XTAPI +BOOLEAN +MmpPteValid(PHARDWARE_PTE PtePointer) +{ + return (BOOLEAN)PtePointer->Valid; +} + +/** + * Sets a page table entry (PTE) with the specified physical page and access flags. + * + * @param PtePointer + * Pointer to the page table entry (PTE) to set. + * + * @param PageFrameNumber + * Physical frame number to map. + * + * @param Writable + * Indicates whether the page should be writable. + * + * @return This routine does not return any value. + * + * @since XT 1.0 + */ +XTAPI +VOID +MmpSetPte(PHARDWARE_PTE PtePointer, + PFN_NUMBER PageFrameNumber, + BOOLEAN Writable) +{ + PtePointer->PageFrameNumber = PageFrameNumber; + PtePointer->Valid = 1; + PtePointer->Writable = Writable; +}