diff --git a/xtoskrnl/includes/mm/amd64/pagemap.hh b/xtoskrnl/includes/mm/amd64/pagemap.hh index 14d32a7b..fce94808 100644 --- a/xtoskrnl/includes/mm/amd64/pagemap.hh +++ b/xtoskrnl/includes/mm/amd64/pagemap.hh @@ -1,13 +1,13 @@ /** * PROJECT: ExectOS * COPYRIGHT: See COPYING.md in the top level directory - * FILE: xtoskrnl/includes/mm/pagemap.hh + * FILE: xtoskrnl/includes/mm/amd64/pagemap.hh * DESCRIPTION: Low-level support for page map manipulation * DEVELOPERS: Aiken Harris */ -#ifndef __XTOSKRNL_MM_PAGEMAP_HH -#define __XTOSKRNL_MM_PAGEMAP_HH +#ifndef __XTOSKRNL_MM_AMD64_PAGEMAP_HH +#define __XTOSKRNL_MM_AMD64_PAGEMAP_HH #include @@ -22,7 +22,7 @@ namespace MM public: XTAPI PMMPTE AdvancePte(IN PMMPTE Pte, - IN ULONG Count); + IN LONG Count); XTAPI VOID ClearPte(IN PMMPTE PtePointer); XTAPI ULONGLONG GetEmptyPteList(VOID); XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte); @@ -34,17 +34,18 @@ namespace MM XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte); 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); + VIRTUAL XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer) = 0; XTAPI PMMPTE GetPteAddress(IN PVOID Address); XTAPI ULONG GetPteIndex(IN PVOID Address); XTAPI ULONG GetPteSize(VOID); - XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); + VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0; XTAPI PMMPXE GetPxeAddress(IN PVOID Address); XTAPI ULONG GetPxeIndex(IN PVOID Address); - XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); + VIRTUAL XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer) = 0; + XTAPI BOOLEAN GetXpaStatus(); VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0; XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer); XTAPI VOID SetNextEntry(IN PMMPTE Pte, @@ -62,14 +63,22 @@ namespace MM class PageMapBasic final : public PageMap { public: + XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); + XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); + XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); + XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); XTAPI VOID InitializePageMapInfo(VOID); }; class PageMapXpa final : public PageMap { public: + XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer); + XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer); + XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer); + XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer); XTAPI VOID InitializePageMapInfo(VOID); }; } -#endif /* __XTOSKRNL_MM_PAGEMAP_HH */ +#endif /* __XTOSKRNL_MM_AMD64_PAGEMAP_HH */ diff --git a/xtoskrnl/mm/amd64/pagemap.cc b/xtoskrnl/mm/amd64/pagemap.cc index e8074677..7384835d 100644 --- a/xtoskrnl/mm/amd64/pagemap.cc +++ b/xtoskrnl/mm/amd64/pagemap.cc @@ -25,7 +25,7 @@ XTAPI PMMPTE MM::PageMap::AdvancePte(IN PMMPTE Pte, - IN ULONG Count) + IN LONG Count) { /* Return advanced PTE pointer */ return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPTE))); @@ -170,7 +170,7 @@ XTAPI PVOID MM::PageMap::GetP5eVirtualAddress(IN PMMP5E P5ePointer) { - return (PVOID)((((LONGLONG)P5ePointer << 61) >> 16) * PageMapInfo.Xpa); + return (PVOID)((((LONGLONG)P5ePointer << 52) >> 7) * PageMapInfo.Xpa); } /** @@ -229,24 +229,6 @@ MM::PageMap::GetPdeIndex(IN PVOID Address) return ((((ULONGLONG)Address) >> MM_PDI_SHIFT) & 0x1FF); } -/** - * 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)(((LONGLONG)PdePointer << 34) >> 16); -} - /** * Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address. * @@ -286,24 +268,6 @@ MM::PageMap::GetPpeIndex(IN PVOID Address) return ((((ULONGLONG)Address) >> MM_PPI_SHIFT) & 0x1FF); } -/** - * 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::PageMap::GetPpeVirtualAddress(IN PMMPPE PpePointer) -{ - /* Return PPE virtual address */ - return (PVOID)(((LONGLONG)PpePointer << 43) >> 16); -} - /** * Gets the address of the PTE (Page Table Entry), that maps given address. * @@ -358,24 +322,6 @@ MM::PageMap::GetPteSize(VOID) return sizeof(MMPTE); } -/** - * 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::PageMap::GetPteVirtualAddress(IN PMMPTE PtePointer) -{ - /* Return PTE virtual address */ - return (PVOID)(((LONGLONG)PtePointer << 25) >> 16); -} - /** * Gets the address of the PXE (Extended Page Entry), that maps given address. * @@ -416,21 +362,17 @@ MM::PageMap::GetPxeIndex(IN PVOID Address) } /** - * Gets the virtual address that is mapped by a given Extended Page Entry. + * Gets the status of Extended Paging Address (XPA) mode. * - * @param PxePointer - * Specifies the address of the PXE. - * - * @return This routine returns the virtual address mapped by the PXE. + * @return This routine returns TRUE if XPA is enabled, FALSE otherwise. * * @since XT 1.0 */ XTAPI -PVOID -MM::PageMap::GetPxeVirtualAddress(IN PMMPXE PxePointer) +BOOLEAN +MM::PageMap::GetXpaStatus() { - /* Return PXE virtual address */ - return (PVOID)(((LONGLONG)PxePointer << 52) >> 16); + return PageMapInfo.Xpa; } /** @@ -550,6 +492,78 @@ MM::PageMap::SetPteCaching(IN PMMPTE PtePointer, PtePointer->Hardware.WriteThrough = WriteThrough; } +/** + * Gets the virtual address that is mapped by a given Page Directory Entry (PML4). + * + * @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)(((LONGLONG)PdePointer << 34) >> 16); +} + +/** + * Gets the virtual address that is mapped by a given Page Directory Pointer Table Entry (PML4). + * + * @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::PageMapBasic::GetPpeVirtualAddress(IN PMMPPE PpePointer) +{ + /* Return PPE virtual address */ + return (PVOID)(((LONGLONG)PpePointer << 43) >> 16); +} + +/** + * Gets the virtual address that is mapped by a given Page Table Entry (PML4). + * + * @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::PageMapBasic::GetPteVirtualAddress(IN PMMPTE PtePointer) +{ + /* Return PTE virtual address */ + return (PVOID)(((LONGLONG)PtePointer << 25) >> 16); +} + +/** + * Gets the virtual address that is mapped by a given Extended Page Entry (PML4). + * + * @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::PageMapBasic::GetPxeVirtualAddress(IN PMMPXE PxePointer) +{ + /* Return PXE virtual address */ + return (PVOID)(((LONGLONG)PxePointer << 52) >> 16); +} + /** * Initializes page map information for basic paging (PML4). * @@ -578,6 +592,78 @@ MM::PageMapBasic::InitializePageMapInfo(VOID) PageMapInfo.VaBits = 48; } +/** + * Gets the virtual address that is mapped by a given Page Directory Entry (PML5). + * + * @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)(((LONGLONG)PdePointer << 25) >> 7); +} + +/** + * Gets the virtual address that is mapped by a given Page Directory Pointer Table Entry (PML5). + * + * @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::PageMapXpa::GetPpeVirtualAddress(IN PMMPPE PpePointer) +{ + /* Return PPE virtual address */ + return (PVOID)(((LONGLONG)PpePointer << 34) >> 7); +} + +/** + * Gets the virtual address that is mapped by a given Page Table Entry (PML5). + * + * @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::PageMapXpa::GetPteVirtualAddress(IN PMMPTE PtePointer) +{ + /* Return PTE virtual address */ + return (PVOID)(((LONGLONG)PtePointer << 16) >> 7); +} + +/** + * Gets the virtual address that is mapped by a given Extended Page Entry (PML5). + * + * @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::PageMapXpa::GetPxeVirtualAddress(IN PMMPXE PxePointer) +{ + /* Return PXE virtual address */ + return (PVOID)(((LONGLONG)PxePointer << 43) >> 7); +} + /** * Initializes page map information for XPA paging (PML5). *