Compare commits
24 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
c710ec4688
|
|||
|
8054bb915a
|
|||
|
86aa22e5f8
|
|||
|
4a7494ad3f
|
|||
|
d4287198b0
|
|||
|
4265ae92d0
|
|||
|
931586eebd
|
|||
|
c099882866
|
|||
|
0097cb88d7
|
|||
|
20b0bfdfad
|
|||
|
35523a230a
|
|||
|
7b11a8feb1
|
|||
|
0cf178a648
|
|||
|
66f27e4b9a
|
|||
|
10b8ab347a
|
|||
|
071c840ca8
|
|||
|
dda8f88830
|
|||
|
cb2da54956
|
|||
|
fd13091476
|
|||
|
c28c3f8344
|
|||
|
dfb0284427
|
|||
|
1150b9ecdb
|
|||
|
f6dac12057
|
|||
|
ffa480d69a
|
@@ -25,11 +25,15 @@
|
||||
#define MM_PXE_BASE 0xFFFFF6FB7DBED000ULL
|
||||
|
||||
/* Page directory and page base addresses for 5-level paging */
|
||||
#define MM_PTE_LA57_BASE 0xFFFF000000000000ULL
|
||||
#define MM_PDE_LA57_BASE 0xFFFF010000000000ULL
|
||||
#define MM_PPE_LA57_BASE 0xFFFF010800000000ULL
|
||||
#define MM_PXE_LA57_BASE 0xFFFF010840000000ULL
|
||||
#define MM_P5E_LA57_BASE 0xFFFF010840200000ULL
|
||||
#define MM_PTE_LA57_BASE 0xFFED000000000000ULL
|
||||
#define MM_PDE_LA57_BASE 0xFFEDF68000000000ULL
|
||||
#define MM_PPE_LA57_BASE 0xFFEDF6FB40000000ULL
|
||||
#define MM_PXE_LA57_BASE 0xFFEDF6FB7DA00000ULL
|
||||
#define MM_P5E_LA57_BASE 0xFFEDF6FB7DBED000ULL
|
||||
|
||||
/* Self map address */
|
||||
#define MM_PML4_SELF_MAP_ADDRESS 0xFFFFF6FB7DBEDF68ULL
|
||||
#define MM_PML5_SELF_MAP_ADDRESS 0xFFEDF6FB7DBEDF68ULL
|
||||
|
||||
/* PTE shift values */
|
||||
#define MM_PTE_SHIFT 3
|
||||
@@ -45,6 +49,46 @@
|
||||
#define MM_PPE_PER_PAGE 512
|
||||
#define MM_PXE_PER_PAGE 512
|
||||
|
||||
/* PTE state flags */
|
||||
#define MM_PTE_VALID 0x0000000000000001ULL
|
||||
#define MM_PTE_ACCESSED 0x0000000000000020ULL
|
||||
#define MM_PTE_DIRTY 0x0000000000000040ULL
|
||||
|
||||
/* PTE scope flags */
|
||||
#define MM_PTE_LARGE_PAGE 0x0000000000000080ULL
|
||||
#define MM_PTE_GLOBAL 0x0000000000000100ULL
|
||||
|
||||
/* PTE access flags */
|
||||
#define MM_PTE_NOACCESS 0x0000000000000000ULL
|
||||
#define MM_PTE_READONLY 0x0000000000000000ULL
|
||||
#define MM_PTE_EXECUTE 0x0000000000000000ULL
|
||||
#define MM_PTE_EXECUTE_READ 0x0000000000000000ULL
|
||||
#define MM_PTE_READWRITE 0x8000000000000002ULL
|
||||
#define MM_PTE_WRITECOPY 0x8000000000000200ULL
|
||||
#define MM_PTE_EXECUTE_READWRITE 0x0000000000000002ULL
|
||||
#define MM_PTE_EXECUTE_WRITECOPY 0x0000000000000200ULL
|
||||
|
||||
/* PTE protection flags */
|
||||
#define MM_PTE_NOEXECUTE 0x8000000000000000ULL
|
||||
#define MM_PTE_PROTECT 0x8000000000000612ULL
|
||||
|
||||
/* PTE cache flags */
|
||||
#define MM_PTE_CACHE_ENABLE 0x0000000000000000ULL
|
||||
#define MM_PTE_CACHE_DISABLE 0x0000000000000010ULL
|
||||
#define MM_PTE_CACHE_WRITECOMBINED 0x0000000000000010ULL
|
||||
#define MM_PTE_CACHE_WRITETHROUGH 0x0000000000000008ULL
|
||||
|
||||
/* PTE software flags */
|
||||
#define MM_PTE_COPY_ON_WRITE 0x0000000000000200ULL
|
||||
#define MM_PTE_PROTOTYPE 0x0000000000000400ULL
|
||||
#define MM_PTE_TRANSITION 0x0000000000000800ULL
|
||||
|
||||
/* PTE protection bits */
|
||||
#define MM_PTE_PROTECTION_BITS 5
|
||||
|
||||
/* Base address of the system page table */
|
||||
#define MM_SYSTEM_PTE_BASE KSEG0_BASE
|
||||
|
||||
/* Minimum number of physical pages needed by the system */
|
||||
#define MM_MINIMUM_PHYSICAL_PAGES 2048
|
||||
|
||||
@@ -99,6 +143,7 @@ typedef struct _HARDWARE_PTE
|
||||
typedef struct _MMPAGEMAP_INFO
|
||||
{
|
||||
BOOLEAN Xpa;
|
||||
ULONGLONG EmptyPteList;
|
||||
ULONGLONG PteBase;
|
||||
ULONGLONG PdeBase;
|
||||
ULONGLONG PpeBase;
|
||||
@@ -252,6 +297,7 @@ typedef struct _MMPFN
|
||||
USHORT ReferenceCount;
|
||||
} e2;
|
||||
} u3;
|
||||
ULONG UsedPageTableEntries;
|
||||
union
|
||||
{
|
||||
MMPTE OriginalPte;
|
||||
@@ -262,12 +308,11 @@ typedef struct _MMPFN
|
||||
ULONG_PTR EntireFrame;
|
||||
struct
|
||||
{
|
||||
ULONG_PTR PteFrame:58;
|
||||
ULONG_PTR PteFrame:57;
|
||||
ULONG_PTR InPageError:1;
|
||||
ULONG_PTR VerifierAllocation:1;
|
||||
ULONG_PTR AweAllocation:1;
|
||||
ULONG_PTR LockCharged:1;
|
||||
ULONG_PTR KernelStack:1;
|
||||
ULONG_PTR Priority:3;
|
||||
ULONG_PTR MustBeCached:1;
|
||||
};
|
||||
} u4;
|
||||
|
||||
@@ -35,6 +35,46 @@
|
||||
#define MM_PTE_LEGACY_SHIFT 2
|
||||
#define MM_PDI_LEGACY_SHIFT 22
|
||||
|
||||
/* PTE state flags */
|
||||
#define MM_PTE_VALID 0x00000001
|
||||
#define MM_PTE_ACCESSED 0x00000020
|
||||
#define MM_PTE_DIRTY 0x00000040
|
||||
|
||||
/* PTE scope flags */
|
||||
#define MM_PTE_LARGE_PAGE 0x00000080
|
||||
#define MM_PTE_GLOBAL 0x00000100
|
||||
|
||||
/* PTE access flags */
|
||||
#define MM_PTE_NOACCESS 0x00000000
|
||||
#define MM_PTE_READONLY 0x00000000
|
||||
#define MM_PTE_EXECUTE 0x00000000
|
||||
#define MM_PTE_EXECUTE_READ 0x00000000
|
||||
#define MM_PTE_READWRITE 0x00000002
|
||||
#define MM_PTE_WRITECOPY 0x00000200
|
||||
#define MM_PTE_EXECUTE_READWRITE 0x00000002
|
||||
#define MM_PTE_EXECUTE_WRITECOPY 0x00000200
|
||||
|
||||
/* PTE protection flags */
|
||||
#define MM_PTE_NOEXECUTE 0x00000000
|
||||
#define MM_PTE_PROTECT 0x00000612
|
||||
|
||||
/* PTE cache flags */
|
||||
#define MM_PTE_CACHE_ENABLE 0x00000000
|
||||
#define MM_PTE_CACHE_DISABLE 0x00000010
|
||||
#define MM_PTE_CACHE_WRITECOMBINED 0x00000010
|
||||
#define MM_PTE_CACHE_WRITETHROUGH 0x00000008
|
||||
|
||||
/* PTE software flags */
|
||||
#define MM_PTE_COPY_ON_WRITE 0x00000200
|
||||
#define MM_PTE_PROTOTYPE 0x00000400
|
||||
#define MM_PTE_TRANSITION 0x00000800
|
||||
|
||||
/* PTE protection bits */
|
||||
#define MM_PTE_PROTECTION_BITS 5
|
||||
|
||||
/* Base address of the system page table */
|
||||
#define MM_SYSTEM_PTE_BASE NULLPTR
|
||||
|
||||
/* Minimum number of physical pages needed by the system */
|
||||
#define MM_MINIMUM_PHYSICAL_PAGES 1100
|
||||
|
||||
@@ -115,6 +155,7 @@ typedef union _HARDWARE_PTE
|
||||
typedef struct _MMPAGEMAP_INFO
|
||||
{
|
||||
BOOLEAN Xpa;
|
||||
ULONG EmptyPteList;
|
||||
ULONG PteBase;
|
||||
ULONG PdeBase;
|
||||
ULONG PdiShift;
|
||||
@@ -202,11 +243,11 @@ typedef union _MMPML2_PTE
|
||||
{
|
||||
ULONG Long;
|
||||
HARDWARE_PTE Flush;
|
||||
MMPML2_PTE_HARDWARE Hard;
|
||||
MMPML2_PTE_PROTOTYPE Proto;
|
||||
MMPML2_PTE_SOFTWARE Soft;
|
||||
MMPML2_PTE_TRANSITION Trans;
|
||||
MMPML2_PTE_SUBSECTION Subsect;
|
||||
MMPML2_PTE_HARDWARE Hardware;
|
||||
MMPML2_PTE_PROTOTYPE Prototype;
|
||||
MMPML2_PTE_SOFTWARE Software;
|
||||
MMPML2_PTE_TRANSITION Transition;
|
||||
MMPML2_PTE_SUBSECTION Subsection;
|
||||
MMPML2_PTE_LIST List;
|
||||
} MMPML2_PTE, *PMMPML2_PTE;
|
||||
|
||||
|
||||
@@ -13,6 +13,27 @@
|
||||
#include ARCH_HEADER(xtstruct.h)
|
||||
|
||||
|
||||
/* Memory manager page lists */
|
||||
typedef enum _MMPAGELISTS
|
||||
{
|
||||
ZeroedPageList = 0,
|
||||
FreePageList = 1,
|
||||
StandbyPageList = 2,
|
||||
ModifiedPageList = 3,
|
||||
ModifiedNoWritePageList = 4,
|
||||
BadPageList = 5,
|
||||
ActiveAndValid = 6,
|
||||
TransitionPage = 7
|
||||
} MMPAGELISTS, *PMMPAGELISTS;
|
||||
|
||||
/* Page table pool types */
|
||||
typedef enum _MMSYSTEM_PTE_POOL_TYPE
|
||||
{
|
||||
SystemPteSpace,
|
||||
NonPagedPoolExpansion,
|
||||
MaximumPtePoolTypes
|
||||
} MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE;
|
||||
|
||||
/* Page map routines structure definition */
|
||||
typedef CONST STRUCT _CMMPAGEMAP_ROUTINES
|
||||
{
|
||||
@@ -45,4 +66,13 @@ typedef struct _MMPFNENTRY
|
||||
USHORT ParityError:1;
|
||||
} MMPFNENTRY, *PMMPFNENTRY;
|
||||
|
||||
/* Page Frame List structure definition */
|
||||
typedef struct _MMPFNLIST
|
||||
{
|
||||
PFN_NUMBER Total;
|
||||
MMPAGELISTS ListName;
|
||||
PFN_NUMBER Flink;
|
||||
PFN_NUMBER Blink;
|
||||
} MMPFNLIST, *PMMPFNLIST;
|
||||
|
||||
#endif /* __XTDK_MMTYPES_H */
|
||||
|
||||
@@ -29,6 +29,9 @@ typedef UCHAR KRUNLEVEL, *PKRUNLEVEL;
|
||||
/* Spin locks synchronization mechanism */
|
||||
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
|
||||
|
||||
/* Page Frame Number count */
|
||||
typedef ULONG PFN_COUNT;
|
||||
|
||||
/* Page Frame Number */
|
||||
typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
|
||||
|
||||
|
||||
@@ -48,6 +48,8 @@ typedef enum _KTHREAD_STATE KTHREAD_STATE, *PKTHREAD_STATE;
|
||||
typedef enum _KTIMER_TYPE KTIMER_TYPE, *PKTIMER_TYPE;
|
||||
typedef enum _KUBSAN_DATA_TYPE KUBSAN_DATA_TYPE, *PKUBSAN_DATA_TYPE;
|
||||
typedef enum _LOADER_MEMORY_TYPE LOADER_MEMORY_TYPE, *PLOADER_MEMORY_TYPE;
|
||||
typedef enum _MMPAGELISTS MMPAGELISTS, *PMMPAGELISTS;
|
||||
typedef enum _MMSYSTEM_PTE_POOL_TYPE MMSYSTEM_PTE_POOL_TYPE, *PMMSYSTEM_PTE_POOL_TYPE;
|
||||
typedef enum _MODE MODE, *PMODE;
|
||||
typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
||||
typedef enum _SYSTEM_FIRMWARE_TYPE SYSTEM_FIRMWARE_TYPE, *PSYSTEM_FIRMWARE_TYPE;
|
||||
@@ -275,6 +277,7 @@ typedef struct _LOADER_MEMORY_DESCRIPTOR LOADER_MEMORY_DESCRIPTOR, *PLOADER_MEMO
|
||||
typedef struct _M128 M128, *PM128;
|
||||
typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES;
|
||||
typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY;
|
||||
typedef struct _MMPFNLIST MMPFNLIST, *PMMPFNLIST;
|
||||
typedef struct _PCAT_FIRMWARE_INFORMATION PCAT_FIRMWARE_INFORMATION, *PPCAT_FIRMWARE_INFORMATION;
|
||||
typedef struct _PCI_BRIDGE_CONTROL_REGISTER PCI_BRIDGE_CONTROL_REGISTER, *PPCI_BRIDGE_CONTROL_REGISTER;
|
||||
typedef struct _PCI_COMMON_CONFIG PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
|
||||
|
||||
@@ -82,11 +82,12 @@ add_library(libxtos ${XTOSKRNL_SOURCE})
|
||||
|
||||
# Link kernel executable
|
||||
add_executable(xtoskrnl
|
||||
${XTOSKRNL_SOURCE}
|
||||
${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def)
|
||||
|
||||
# Add linker libraries
|
||||
target_link_libraries(xtoskrnl)
|
||||
target_link_libraries(xtoskrnl
|
||||
PRIVATE
|
||||
libxtos)
|
||||
|
||||
# Set proper binary name and install target
|
||||
set_target_properties(xtoskrnl PROPERTIES SUFFIX .exe)
|
||||
|
||||
@@ -4,6 +4,18 @@ within the XTOS kernel space. It is responsible for various core services, such
|
||||
management, and process scheduling. The kernel contains the scheduler (sometimes referred to as the Dispatcher), the
|
||||
cache, object, and memory managers, the security manager, and other executive components described below.
|
||||
|
||||
|
||||
## Kernel Parameters
|
||||
Kernel parameters are XTOS boot-time options used to ensure proper initialization and handling of hardware peripherals.
|
||||
These parameters can be configured either temporarily by editing the boot entry in the bootloader’s selection menu, or
|
||||
permanently by modifying the XTLDR configuration file.
|
||||
|
||||
The following is a consolidated list of available kernel parameters:
|
||||
* **NOXPA**: Disables PAE or LA57 support, depending on the CPU architecture. This parameter is handled by the
|
||||
bootloader, which configures paging and selects the appropriate Page Map Level (PML) before transferring control to
|
||||
the kernel.
|
||||
|
||||
## Source Code
|
||||
The source code of the kernel is organized into subsystem-specific directories. Each directory name also defines the
|
||||
corresponding C++ namespace in which the subsystem's classes and routines reside. These subsystems include:
|
||||
|
||||
@@ -68,8 +80,8 @@ routine:
|
||||
For all C++ code inside the kernel the naming model has evolved. Consider the **KE::KThread::InitializeThread()**
|
||||
routine:
|
||||
* **KE** - The namespace replaces the prefix and indicates the subsystem. Namespaces are written in uppercase and no
|
||||
longer use the trailing p for private routines, because classes use C++ visibility to control access.
|
||||
longer use the trailing p for private routines, because classes use C++ visibility to control access.
|
||||
* **KThread** - Within each namespace, related functionality is grouped into classes, which encapsulate variables and
|
||||
methods.
|
||||
methods.
|
||||
* **InitializeThread** - Method names follow the `<Operation><Object>` pattern.
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
#include <xtos.hh>
|
||||
|
||||
#include XTOS_ARCH_HEADER(mm, pagemap.hh)
|
||||
#include XTOS_ARCH_HEADER(mm, paging.hh)
|
||||
|
||||
#include <mm/hlpool.hh>
|
||||
#include <mm/init.hh>
|
||||
#include <mm/kpool.hh>
|
||||
#include <mm/paging.hh>
|
||||
|
||||
#endif /* __XTOSKRNL_MM_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 <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_PAGEMAP_HH
|
||||
#define __XTOSKRNL_MM_PAGEMAP_HH
|
||||
#ifndef __XTOSKRNL_MM_AMD64_PAGEMAP_HH
|
||||
#define __XTOSKRNL_MM_AMD64_PAGEMAP_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
@@ -21,33 +21,64 @@ namespace MM
|
||||
MMPAGEMAP_INFO PageMapInfo;
|
||||
|
||||
public:
|
||||
XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
||||
XTAPI PMMP5E GetP5eAddress(PVOID Address);
|
||||
XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
||||
XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
||||
XTAPI PMMPTE GetPteAddress(PVOID Address);
|
||||
XTAPI PMMPXE GetPxeAddress(PVOID Address);
|
||||
virtual XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
||||
XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
||||
XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable);
|
||||
XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough);
|
||||
XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||
IN LONG Count);
|
||||
XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||
XTAPI ULONGLONG GetEmptyPteList(VOID);
|
||||
XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
||||
XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
|
||||
XTAPI PMMP5E GetP5eAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetP5eIndex(IN PVOID Address);
|
||||
XTAPI PVOID GetP5eVirtualAddress(IN PMMP5E P5ePointer);
|
||||
XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
|
||||
XTAPI PMMPDE GetPdeAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPdeIndex(IN PVOID Address);
|
||||
VIRTUAL XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer) = 0;
|
||||
XTAPI PMMPPE GetPpeAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPpeIndex(IN PVOID Address);
|
||||
VIRTUAL XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer) = 0;
|
||||
XTAPI PMMPTE GetPteAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPteIndex(IN PVOID Address);
|
||||
XTAPI ULONG GetPteSize(VOID);
|
||||
VIRTUAL XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer) = 0;
|
||||
XTAPI PMMPXE GetPxeAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPxeIndex(IN PVOID Address);
|
||||
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,
|
||||
IN ULONG_PTR Value);
|
||||
XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value);
|
||||
XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask);
|
||||
XTAPI VOID SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough);
|
||||
} PAGEMAP, *PPAGEMAP;
|
||||
|
||||
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 */
|
||||
|
||||
67
xtoskrnl/includes/mm/amd64/paging.hh
Normal file
67
xtoskrnl/includes/mm/amd64/paging.hh
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/mm/amd64/paging.hh
|
||||
* DESCRIPTION: Low level page management support for AMD64
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_AMD64_PAGING_HH
|
||||
#define __XTOSKRNL_MM_AMD64_PAGING_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Memory Manager */
|
||||
namespace MM
|
||||
{
|
||||
class Paging
|
||||
{
|
||||
private:
|
||||
STATIC PPAGEMAP PmlRoutines;
|
||||
|
||||
public:
|
||||
STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||
IN LONG Count);
|
||||
STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI VOID FlushTlb(VOID);
|
||||
STATIC XTAPI ULONG_PTR GetEmptyPteList(VOID);
|
||||
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 PMMP5E P5ePointer);
|
||||
STATIC XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
|
||||
STATIC XTAPI PMMPDE GetPdeAddress(IN PVOID Address);
|
||||
STATIC XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer);
|
||||
STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address);
|
||||
STATIC XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer);
|
||||
STATIC XTAPI PMMPTE GetPteAddress(IN PVOID Address);
|
||||
STATIC XTAPI ULONG GetPteSize(VOID);
|
||||
STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI PMMPXE GetPxeAddress(IN PVOID Address);
|
||||
STATIC XTAPI PVOID GetPxeVirtualAddress(IN PMMPXE PxePointer);
|
||||
STATIC XTAPI BOOLEAN GetXpaStatus(VOID);
|
||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
||||
STATIC XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value);
|
||||
STATIC XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value);
|
||||
STATIC XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask);
|
||||
STATIC XTAPI VOID SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough);
|
||||
STATIC XTFASTCALL VOID ZeroPages(IN PVOID Address,
|
||||
IN ULONG Size);
|
||||
|
||||
private:
|
||||
STATIC XTAPI BOOLEAN GetExtendedPhysicalAddressingStatus(VOID);
|
||||
STATIC XTAPI PPAGEMAP GetPageMapBasicRoutines(VOID);
|
||||
STATIC XTAPI PPAGEMAP GetPageMapXpaRoutines(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_MM_AMD64_PAGING_HH */
|
||||
@@ -21,44 +21,85 @@ namespace MM
|
||||
MMPAGEMAP_INFO PageMapInfo;
|
||||
|
||||
public:
|
||||
XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
||||
XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
||||
XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
||||
XTAPI PMMPTE GetPteAddress(PVOID Address);
|
||||
virtual XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
||||
virtual XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer) = 0;
|
||||
virtual XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable) = 0;
|
||||
virtual XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough) = 0;
|
||||
VIRTUAL XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||
IN ULONG Count) = 0;
|
||||
XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||
XTAPI ULONG GetEmptyPteList(VOID);
|
||||
VIRTUAL XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte) = 0;
|
||||
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 PMMPDE GetPdeAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPdeIndex(IN PVOID Address);
|
||||
XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer);
|
||||
XTAPI PMMPPE GetPpeAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPpeIndex(IN PVOID Address);
|
||||
XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer);
|
||||
XTAPI PMMPTE GetPteAddress(IN PVOID Address);
|
||||
XTAPI ULONG GetPteIndex(IN PVOID Address);
|
||||
VIRTUAL XTAPI ULONG GetPteSize(VOID) = 0;
|
||||
XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
XTAPI BOOLEAN GetXpaStatus();
|
||||
VIRTUAL XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
||||
VIRTUAL XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer) = 0;
|
||||
VIRTUAL XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value) = 0;
|
||||
VIRTUAL XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value) = 0;
|
||||
VIRTUAL XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask) = 0;
|
||||
VIRTUAL XTAPI VOID SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough) = 0;
|
||||
} PAGEMAP, *PPAGEMAP;
|
||||
|
||||
class PageMapBasic final : public PageMap
|
||||
{
|
||||
public:
|
||||
XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||
IN ULONG Count);
|
||||
XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
||||
XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
|
||||
XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
|
||||
XTAPI ULONG GetPteSize(VOID);
|
||||
XTAPI VOID InitializePageMapInfo(VOID);
|
||||
XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
||||
XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable);
|
||||
XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough);
|
||||
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||
XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value);
|
||||
XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value);
|
||||
XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask);
|
||||
XTAPI VOID SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough);
|
||||
};
|
||||
|
||||
class PageMapXpa final : public PageMap
|
||||
{
|
||||
public:
|
||||
XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||
IN ULONG Count);
|
||||
XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
||||
XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
|
||||
XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
|
||||
XTAPI ULONG GetPteSize(VOID);
|
||||
XTAPI VOID InitializePageMapInfo(VOID);
|
||||
XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
||||
XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable);
|
||||
XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough);
|
||||
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||
XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value);
|
||||
XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value);
|
||||
XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask);
|
||||
XTAPI VOID SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough);
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
63
xtoskrnl/includes/mm/i686/paging.hh
Normal file
63
xtoskrnl/includes/mm/i686/paging.hh
Normal file
@@ -0,0 +1,63 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/mm/i686/paging.hh
|
||||
* DESCRIPTION: Low level page management support for i686
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_I686_PAGING_HH
|
||||
#define __XTOSKRNL_MM_I686_PAGING_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Memory Manager */
|
||||
namespace MM
|
||||
{
|
||||
class Paging
|
||||
{
|
||||
private:
|
||||
STATIC PPAGEMAP PmlRoutines;
|
||||
|
||||
public:
|
||||
STATIC XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||
IN LONG Count);
|
||||
STATIC XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI VOID FlushTlb(VOID);
|
||||
STATIC XTAPI ULONG_PTR GetEmptyPteList(VOID);
|
||||
STATIC XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||
STATIC XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
||||
STATIC XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
|
||||
STATIC XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
|
||||
STATIC XTAPI PMMPDE GetPdeAddress(IN PVOID Address);
|
||||
STATIC XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer);
|
||||
STATIC XTAPI PMMPPE GetPpeAddress(IN PVOID Address);
|
||||
STATIC XTAPI PVOID GetPpeVirtualAddress(IN PMMPPE PpePointer);
|
||||
STATIC XTAPI PMMPTE GetPteAddress(IN PVOID Address);
|
||||
STATIC XTAPI ULONG GetPteSize(VOID);
|
||||
STATIC XTAPI PVOID GetPteVirtualAddress(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI BOOLEAN GetXpaStatus(VOID);
|
||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
||||
STATIC XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||
STATIC XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value);
|
||||
STATIC XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value);
|
||||
STATIC XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask);
|
||||
STATIC XTAPI VOID SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough);
|
||||
STATIC XTFASTCALL VOID ZeroPages(IN PVOID Address,
|
||||
IN ULONG Size);
|
||||
|
||||
private:
|
||||
STATIC XTAPI BOOLEAN GetExtendedPhysicalAddressingStatus(VOID);
|
||||
STATIC XTAPI PPAGEMAP GetPageMapBasicRoutines(VOID);
|
||||
STATIC XTAPI PPAGEMAP GetPageMapXpaRoutines(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_MM_I686_PAGING_HH */
|
||||
@@ -1,47 +0,0 @@
|
||||
/**
|
||||
* PROJECT: ExectOS
|
||||
* COPYRIGHT: See COPYING.md in the top level directory
|
||||
* FILE: xtoskrnl/includes/mm/paging.hh
|
||||
* DESCRIPTION: Low level page management support
|
||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __XTOSKRNL_MM_PAGING_HH
|
||||
#define __XTOSKRNL_MM_PAGING_HH
|
||||
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/* Memory Manager */
|
||||
namespace MM
|
||||
{
|
||||
class Paging
|
||||
{
|
||||
private:
|
||||
STATIC PPAGEMAP PmlRoutines;
|
||||
|
||||
public:
|
||||
STATIC XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
||||
STATIC XTAPI VOID FlushTlb(VOID);
|
||||
STATIC XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
||||
STATIC XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
||||
STATIC XTAPI PMMPTE GetPteAddress(PVOID Address);
|
||||
STATIC XTAPI VOID InitializePageMapSupport(VOID);
|
||||
STATIC XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
||||
STATIC XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable);
|
||||
STATIC XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough);
|
||||
STATIC XTFASTCALL VOID ZeroPages(IN PVOID Address,
|
||||
IN ULONG Size);
|
||||
|
||||
private:
|
||||
STATIC XTAPI BOOLEAN GetExtendedPhysicalAddressingStatus(VOID);
|
||||
STATIC XTAPI PPAGEMAP GetPageMapBasicRoutines(VOID);
|
||||
STATIC XTAPI PPAGEMAP GetPageMapXpaRoutines(VOID);
|
||||
};
|
||||
}
|
||||
|
||||
#endif /* __XTOSKRNL_MM_PAGING_HH */
|
||||
@@ -9,6 +9,28 @@
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer by a given number of entries, considering the actual PTE size.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @param Count
|
||||
* The number of PTE entries to advance by.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMap::AdvancePte(IN PMMPTE Pte,
|
||||
IN LONG Count)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPTE)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the contents of a page table entry (PTE).
|
||||
*
|
||||
@@ -21,13 +43,79 @@
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
||||
MM::PageMap::ClearPte(IN PMMPTE PtePointer)
|
||||
{
|
||||
PtePointer->CacheDisable = 0;
|
||||
PtePointer->PageFrameNumber = 0;
|
||||
PtePointer->Valid = 0;
|
||||
PtePointer->Writable = 0;
|
||||
PtePointer->WriteThrough = 0;
|
||||
/* Clear PTE */
|
||||
PtePointer->Long = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value representing an empty PTE list.
|
||||
*
|
||||
* @return This routine returns the value representing an empty PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONGLONG
|
||||
MM::PageMap::GetEmptyPteList(VOID)
|
||||
{
|
||||
/* Return empty PTE list mask */
|
||||
return PageMapInfo.EmptyPteList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the next entry from.
|
||||
*
|
||||
* @return This routine returns the next entry in the PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
MM::PageMap::GetNextEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return next entry in PTE list */
|
||||
return Pte->List.NextEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer, considering the actual PTE size.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMap::GetNextPte(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return AdvancePte(Pte, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to check.
|
||||
*
|
||||
* @return This routine returns TRUE if the PTE list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMap::GetOneEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return one entry status */
|
||||
return Pte->List.OneEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -42,7 +130,7 @@ MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
||||
*/
|
||||
XTAPI
|
||||
PMMP5E
|
||||
MM::PageMap::GetP5eAddress(PVOID Address)
|
||||
MM::PageMap::GetP5eAddress(IN PVOID Address)
|
||||
{
|
||||
ULONGLONG Offset;
|
||||
|
||||
@@ -51,6 +139,57 @@ MM::PageMap::GetP5eAddress(PVOID Address)
|
||||
return (PMMP5E)((PageMapInfo.P5eBase + Offset) * PageMapInfo.Xpa);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index 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 index of the P5E, or NULLPTR if LA57 is not enabled.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetP5eIndex(IN PVOID Address)
|
||||
{
|
||||
return (((((ULONGLONG)Address) >> MM_P5I_SHIFT) & 0x1FF) * PageMapInfo.Xpa);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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::PageMap::GetP5eVirtualAddress(IN PMMP5E P5ePointer)
|
||||
{
|
||||
return (PVOID)((((LONGLONG)P5ePointer << 52) >> 7) * PageMapInfo.Xpa);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the page frame number from a corresponding PTE.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the page frame number from.
|
||||
*
|
||||
* @return This routine returns the page frame number.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PFN_NUMBER
|
||||
MM::PageMap::GetPageFrameNumber(IN PMMPTE Pte)
|
||||
{
|
||||
return Pte->Hardware.PageFrameNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PDE (Page Directory Entry), that maps given address.
|
||||
*
|
||||
@@ -63,7 +202,7 @@ MM::PageMap::GetP5eAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPDE
|
||||
MM::PageMap::GetPdeAddress(PVOID Address)
|
||||
MM::PageMap::GetPdeAddress(IN PVOID Address)
|
||||
{
|
||||
ULONGLONG Offset;
|
||||
|
||||
@@ -73,18 +212,36 @@ MM::PageMap::GetPdeAddress(PVOID Address)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address.
|
||||
* Gets the index of the PDE (Page Directory Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PDE.
|
||||
*
|
||||
* @return This routine returns the index of the PDE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPdeIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PDE index */
|
||||
return ((((ULONGLONG)Address) >> MM_PDI_SHIFT) & 0x1FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PPE.
|
||||
*
|
||||
* @return This routine returns the address of the PPE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPPE
|
||||
MM::PageMap::GetPpeAddress(PVOID Address)
|
||||
MM::PageMap::GetPpeAddress(IN PVOID Address)
|
||||
{
|
||||
ULONGLONG Offset;
|
||||
|
||||
@@ -93,6 +250,24 @@ MM::PageMap::GetPpeAddress(PVOID Address)
|
||||
return (PMMPPE)(PageMapInfo.PpeBase + Offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index of the PPE (Page Directory Pointer Table Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PPE.
|
||||
*
|
||||
* @return This routine returns the index of the PPE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPpeIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PPE index */
|
||||
return ((((ULONGLONG)Address) >> MM_PPI_SHIFT) & 0x1FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PTE (Page Table Entry), that maps given address.
|
||||
*
|
||||
@@ -105,7 +280,7 @@ MM::PageMap::GetPpeAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMap::GetPteAddress(PVOID Address)
|
||||
MM::PageMap::GetPteAddress(IN PVOID Address)
|
||||
{
|
||||
ULONGLONG Offset;
|
||||
|
||||
@@ -114,6 +289,39 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
||||
return (PMMPTE)(PageMapInfo.PteBase + Offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index of the PTE (Page Table Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PTE.
|
||||
*
|
||||
* @return This routine returns the index of the PTE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPteIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PTE index */
|
||||
return ((((ULONGLONG)Address) >> MM_PTI_SHIFT) & 0x1FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of a PTE.
|
||||
*
|
||||
* @return This routine returns the size of a PTE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPteSize(VOID)
|
||||
{
|
||||
/* Return the size of MMPTE */
|
||||
return sizeof(MMPTE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PXE (Extended Page Entry), that maps given address.
|
||||
*
|
||||
@@ -126,14 +334,47 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPXE
|
||||
MM::PageMap::GetPxeAddress(PVOID Address)
|
||||
MM::PageMap::GetPxeAddress(IN PVOID Address)
|
||||
{
|
||||
ULONGLONG Offset;
|
||||
|
||||
/* Calculate offset and return PXE address */
|
||||
Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << PageMapInfo.VaBits) - 1)) >> MM_PXI_SHIFT) << MM_PTE_SHIFT);
|
||||
return (PMMPXE)(PageMapInfo.PxeBase + Offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index 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 index of the PXE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPxeIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PXE index */
|
||||
return ((((ULONGLONG)Address) >> MM_PXI_SHIFT) & 0x1FF);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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::PageMap::GetXpaStatus()
|
||||
{
|
||||
return PageMapInfo.Xpa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether the given PML2 page table entry (PTE) is valid.
|
||||
*
|
||||
@@ -146,9 +387,54 @@ MM::PageMap::GetPxeAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMap::PteValid(PHARDWARE_PTE PtePointer)
|
||||
MM::PageMap::PteValid(IN PMMPTE PtePointer)
|
||||
{
|
||||
return (BOOLEAN)PtePointer->Valid;
|
||||
/* Check if PTE is valid */
|
||||
return (BOOLEAN)PtePointer->Hardware.Valid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set as the next entry.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMap::SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value)
|
||||
{
|
||||
/* Set next entry in PTE list */
|
||||
Pte->List.NextEntry = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the flag indicating whether a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set. TRUE if the list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMap::SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value)
|
||||
{
|
||||
/* Set one entry status */
|
||||
Pte->List.OneEntry = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -160,8 +446,8 @@ MM::PageMap::PteValid(PHARDWARE_PTE PtePointer)
|
||||
* @param PageFrameNumber
|
||||
* Physical frame number to map.
|
||||
*
|
||||
* @param Writable
|
||||
* Indicates whether the page should be writable.
|
||||
* @param AttributesMask
|
||||
* Specifies the attributes mask to apply to the PTE.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
@@ -169,13 +455,14 @@ MM::PageMap::PteValid(PHARDWARE_PTE PtePointer)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMap::SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable)
|
||||
MM::PageMap::SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask)
|
||||
{
|
||||
PtePointer->PageFrameNumber = PageFrameNumber;
|
||||
PtePointer->Valid = 1;
|
||||
PtePointer->Writable = Writable;
|
||||
/* Set PTE */
|
||||
PtePointer->Hardware.PageFrameNumber = PageFrameNumber;
|
||||
PtePointer->Hardware.Valid = 1;
|
||||
PtePointer->Long |= AttributesMask;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -196,12 +483,85 @@ MM::PageMap::SetPte(PHARDWARE_PTE PtePointer,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMap::SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough)
|
||||
MM::PageMap::SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough)
|
||||
{
|
||||
PtePointer->CacheDisable = CacheDisable;
|
||||
PtePointer->WriteThrough = WriteThrough;
|
||||
/* Set caching attributes */
|
||||
PtePointer->Hardware.CacheDisable = CacheDisable;
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -218,6 +578,9 @@ MM::PageMapBasic::InitializePageMapInfo(VOID)
|
||||
/* Set PML4 page map information */
|
||||
PageMapInfo.Xpa = FALSE;
|
||||
|
||||
/* Set PML4 empty PTE list mask */
|
||||
PageMapInfo.EmptyPteList = 0xFFFFFFFFUI64;
|
||||
|
||||
/* Set PML4 base addresses */
|
||||
PageMapInfo.PteBase = MM_PTE_BASE;
|
||||
PageMapInfo.PdeBase = MM_PDE_BASE;
|
||||
@@ -229,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).
|
||||
*
|
||||
@@ -243,6 +678,9 @@ MM::PageMapXpa::InitializePageMapInfo(VOID)
|
||||
/* Set PML5 page map information */
|
||||
PageMapInfo.Xpa = TRUE;
|
||||
|
||||
/* Set PML5 empty PTE list mask */
|
||||
PageMapInfo.EmptyPteList = 0xFFFFFFFFUI64;
|
||||
|
||||
/* Set PML5 base addresses */
|
||||
PageMapInfo.PteBase = MM_PTE_LA57_BASE;
|
||||
PageMapInfo.PdeBase = MM_PDE_LA57_BASE;
|
||||
|
||||
@@ -25,6 +25,78 @@ MM::Paging::GetExtendedPhysicalAddressingStatus(VOID)
|
||||
return ((AR::CpuFunc::ReadControlRegister(4) & CR4_LA57) != 0) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 PMMP5E P5ePointer)
|
||||
{
|
||||
/* Return PTE virtual address */
|
||||
return PmlRoutines->GetP5eVirtualAddress(P5ePointer);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Fills a section of memory with zeroes like RtlZeroMemory(), but in more efficient way.
|
||||
*
|
||||
|
||||
@@ -170,7 +170,7 @@ MM::HardwarePool::MapHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
{
|
||||
PVOID BaseAddress, ReturnAddress;
|
||||
PFN_NUMBER MappedPages;
|
||||
PHARDWARE_PTE PtePointer;
|
||||
PMMPTE PtePointer;
|
||||
|
||||
/* Initialize variables */
|
||||
BaseAddress = HardwareHeapStart;
|
||||
@@ -189,7 +189,7 @@ MM::HardwarePool::MapHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
}
|
||||
|
||||
/* Get PTE pointer and advance to next page */
|
||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(ReturnAddress);
|
||||
PtePointer = MM::Paging::GetPteAddress(ReturnAddress);
|
||||
ReturnAddress = (PVOID)((ULONG_PTR)ReturnAddress + MM_PAGE_SIZE);
|
||||
|
||||
/* Check if PTE is valid */
|
||||
@@ -219,10 +219,10 @@ MM::HardwarePool::MapHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
while(MappedPages--)
|
||||
{
|
||||
/* Get PTE pointer */
|
||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(BaseAddress);
|
||||
PtePointer = MM::Paging::GetPteAddress(BaseAddress);
|
||||
|
||||
/* Fill the PTE */
|
||||
MM::Paging::SetPte(PtePointer, (PFN_NUMBER)(PhysicalAddress.QuadPart >> MM_PAGE_SHIFT), TRUE);
|
||||
MM::Paging::SetPte(PtePointer, (PFN_NUMBER)(PhysicalAddress.QuadPart >> MM_PAGE_SHIFT), MM_PTE_READWRITE);
|
||||
|
||||
/* Advance to the next address */
|
||||
PhysicalAddress.QuadPart += MM_PAGE_SIZE;
|
||||
@@ -259,18 +259,18 @@ VOID
|
||||
MM::HardwarePool::MarkHardwareMemoryWriteThrough(IN PVOID VirtualAddress,
|
||||
IN PFN_NUMBER PageCount)
|
||||
{
|
||||
PHARDWARE_PTE PtePointer;
|
||||
PMMPTE PtePointer;
|
||||
PFN_NUMBER Page;
|
||||
|
||||
/* Get PTE address from virtual address */
|
||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(VirtualAddress);
|
||||
PtePointer = MM::Paging::GetPteAddress(VirtualAddress);
|
||||
|
||||
/* Iterate through mapped pages */
|
||||
for(Page = 0; Page < PageCount; Page++)
|
||||
{
|
||||
/* Mark pages as CD/WT */
|
||||
MM::Paging::SetPteCaching(PtePointer, TRUE, TRUE);
|
||||
PtePointer++;
|
||||
MM::Paging::GetNextEntry(PtePointer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,13 +296,13 @@ MM::HardwarePool::RemapHardwareMemory(IN PVOID VirtualAddress,
|
||||
IN PHYSICAL_ADDRESS PhysicalAddress,
|
||||
IN BOOLEAN FlushTlb)
|
||||
{
|
||||
PHARDWARE_PTE PtePointer;
|
||||
PMMPTE PtePointer;
|
||||
|
||||
/* Get PTE address from virtual address */
|
||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(VirtualAddress);
|
||||
PtePointer = MM::Paging::GetPteAddress(VirtualAddress);
|
||||
|
||||
/* Remap the PTE */
|
||||
MM::Paging::SetPte(PtePointer, (PFN_NUMBER)(PhysicalAddress.QuadPart >> MM_PAGE_SHIFT), TRUE);
|
||||
MM::Paging::SetPte(PtePointer, (PFN_NUMBER)(PhysicalAddress.QuadPart >> MM_PAGE_SHIFT), MM_PTE_READWRITE);
|
||||
|
||||
/* Check if TLB needs to be flushed */
|
||||
if(FlushTlb)
|
||||
@@ -334,7 +334,7 @@ MM::HardwarePool::UnmapHardwareMemory(IN PVOID VirtualAddress,
|
||||
IN PFN_NUMBER PageCount,
|
||||
IN BOOLEAN FlushTlb)
|
||||
{
|
||||
PHARDWARE_PTE PtePointer;
|
||||
PMMPTE PtePointer;
|
||||
PFN_NUMBER Page;
|
||||
|
||||
/* Check if address is valid hardware memory */
|
||||
@@ -348,7 +348,7 @@ MM::HardwarePool::UnmapHardwareMemory(IN PVOID VirtualAddress,
|
||||
VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress & ~(MM_PAGE_SIZE - 1));
|
||||
|
||||
/* Get PTE address from virtual address */
|
||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(VirtualAddress);
|
||||
PtePointer = MM::Paging::GetPteAddress(VirtualAddress);
|
||||
|
||||
/* Iterate through mapped pages */
|
||||
for(Page = 0; Page < PageCount; Page++)
|
||||
|
||||
@@ -21,11 +21,27 @@
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
||||
MM::PageMap::ClearPte(IN PMMPTE PtePointer)
|
||||
{
|
||||
/* Clear PTE */
|
||||
PtePointer->Long = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value representing an empty PTE list.
|
||||
*
|
||||
* @return This routine returns the value representing an empty PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetEmptyPteList(VOID)
|
||||
{
|
||||
/* Return empty PTE list mask */
|
||||
return PageMapInfo.EmptyPteList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PDE (Page Directory Entry), that maps given address.
|
||||
*
|
||||
@@ -38,7 +54,7 @@ MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPDE
|
||||
MM::PageMap::GetPdeAddress(PVOID Address)
|
||||
MM::PageMap::GetPdeAddress(IN PVOID Address)
|
||||
{
|
||||
ULONG Offset;
|
||||
|
||||
@@ -47,6 +63,42 @@ MM::PageMap::GetPdeAddress(PVOID Address)
|
||||
return (PMMPDE)(PageMapInfo.PdeBase + Offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index of the PDE (Page Directory Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PDE.
|
||||
*
|
||||
* @return This routine returns the index of the PDE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPdeIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PDE index */
|
||||
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.
|
||||
*
|
||||
@@ -59,12 +111,48 @@ MM::PageMap::GetPdeAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPPE
|
||||
MM::PageMap::GetPpeAddress(PVOID Address)
|
||||
MM::PageMap::GetPpeAddress(IN PVOID Address)
|
||||
{
|
||||
/* Return zero */
|
||||
return (PMMPPE)0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index of the PPE (Page Directory Pointer Table Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PPE.
|
||||
*
|
||||
* @return This routine returns the index of the PPE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPpeIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PPE index */
|
||||
return ((((ULONG_PTR)(Address)) >> MM_PPI_SHIFT) & 0x3) * PageMapInfo.Xpa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the virtual address that is mapped by a given Page Directory Pointer Table Entry.
|
||||
*
|
||||
* @param PpePointer
|
||||
* Specifies the virtual 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)((ULONG)(PpePointer) << 30);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PTE (Page Table Entry), that maps given address.
|
||||
*
|
||||
@@ -77,7 +165,7 @@ MM::PageMap::GetPpeAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMap::GetPteAddress(PVOID Address)
|
||||
MM::PageMap::GetPteAddress(IN PVOID Address)
|
||||
{
|
||||
ULONG Offset;
|
||||
|
||||
@@ -86,6 +174,164 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
||||
return (PMMPTE)(PageMapInfo.PteBase + Offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the index of the PTE (Page Table Entry), that maps given address.
|
||||
*
|
||||
* @param Address
|
||||
* Specifies the virtual address for which to retrieve the corresponding PTE.
|
||||
*
|
||||
* @return This routine returns the index of the PTE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMap::GetPteIndex(IN PVOID Address)
|
||||
{
|
||||
/* Return PTE index */
|
||||
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.
|
||||
*
|
||||
* @return This routine returns TRUE if XPA is enabled, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMap::GetXpaStatus()
|
||||
{
|
||||
return PageMapInfo.Xpa;
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer by a given number of entries, considering the actual PTE size for PML2.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @param Count
|
||||
* The number of PTE entries to advance by.
|
||||
*
|
||||
* @return This routine returns the advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMapBasic::AdvancePte(IN PMMPTE Pte,
|
||||
IN ULONG Count)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPML2_PTE)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the next entry from.
|
||||
*
|
||||
* @return This routine returns the next entry in the PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
MM::PageMapBasic::GetNextEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return next entry in PTE list */
|
||||
return Pte->Pml2.List.NextEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer, considering the actual PTE size for PML2.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMapBasic::GetNextPte(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return AdvancePte(Pte, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to check.
|
||||
*
|
||||
* @return This routine returns TRUE if the PTE list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMapBasic::GetOneEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return one entry status */
|
||||
return Pte->Pml2.List.OneEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the page frame number from a corresponding PTE.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the page frame number from.
|
||||
*
|
||||
* @return This routine returns the page frame number.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PFN_NUMBER
|
||||
MM::PageMapBasic::GetPageFrameNumber(IN PMMPTE Pte)
|
||||
{
|
||||
return Pte->Pml2.Hardware.PageFrameNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of a PTE for basic paging (PML2).
|
||||
*
|
||||
* @return This routine returns the size of a PTE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMapBasic::GetPteSize(VOID)
|
||||
{
|
||||
/* Return the size of MMPTE */
|
||||
return sizeof(MMPML2_PTE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes page map information for basic paging (PML2).
|
||||
*
|
||||
@@ -100,6 +346,9 @@ MM::PageMapBasic::InitializePageMapInfo(VOID)
|
||||
/* Set PML2 page map information */
|
||||
PageMapInfo.Xpa = FALSE;
|
||||
|
||||
/* Set PML2 empty PTE list mask */
|
||||
PageMapInfo.EmptyPteList = (ULONG)0xFFFFF;
|
||||
|
||||
/* Set PML2 base addresses */
|
||||
PageMapInfo.PteBase = MM_PTE_BASE;
|
||||
PageMapInfo.PdeBase = MM_PDE_LEGACY_BASE;
|
||||
@@ -121,9 +370,54 @@ MM::PageMapBasic::InitializePageMapInfo(VOID)
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMapBasic::PteValid(PHARDWARE_PTE PtePointer)
|
||||
MM::PageMapBasic::PteValid(IN PMMPTE PtePointer)
|
||||
{
|
||||
return (BOOLEAN)PtePointer->Pml2.Valid;
|
||||
/* Check if PTE is valid */
|
||||
return (BOOLEAN)PtePointer->Pml2.Hardware.Valid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set as the next entry.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapBasic::SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value)
|
||||
{
|
||||
/* Set next entry in PTE list */
|
||||
Pte->Pml2.List.NextEntry = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the flag indicating whether a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set. TRUE if the list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapBasic::SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value)
|
||||
{
|
||||
/* Set one entry status */
|
||||
Pte->Pml2.List.OneEntry = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -135,8 +429,8 @@ MM::PageMapBasic::PteValid(PHARDWARE_PTE PtePointer)
|
||||
* @param PageFrameNumber
|
||||
* Physical frame number to map.
|
||||
*
|
||||
* @param Writable
|
||||
* Indicates whether the page should be writable.
|
||||
* @param AttributesMask
|
||||
* Specifies the attributes mask to apply to the PTE.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
@@ -144,13 +438,14 @@ MM::PageMapBasic::PteValid(PHARDWARE_PTE PtePointer)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapBasic::SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable)
|
||||
MM::PageMapBasic::SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask)
|
||||
{
|
||||
PtePointer->Pml2.PageFrameNumber = PageFrameNumber;
|
||||
PtePointer->Pml2.Valid = 1;
|
||||
PtePointer->Pml2.Writable = Writable;
|
||||
/* Set PTE */
|
||||
PtePointer->Pml2.Hardware.PageFrameNumber = PageFrameNumber;
|
||||
PtePointer->Pml2.Hardware.Valid = 1;
|
||||
PtePointer->Long |= AttributesMask;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -171,12 +466,121 @@ MM::PageMapBasic::SetPte(PHARDWARE_PTE PtePointer,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapBasic::SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough)
|
||||
MM::PageMapBasic::SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough)
|
||||
{
|
||||
PtePointer->Pml2.CacheDisable = CacheDisable;
|
||||
PtePointer->Pml2.WriteThrough = WriteThrough;
|
||||
/* Set caching attributes */
|
||||
PtePointer->Pml2.Hardware.CacheDisable = CacheDisable;
|
||||
PtePointer->Pml2.Hardware.WriteThrough = WriteThrough;
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer by a given number of entries, considering the actual PTE size for PML3.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @param Count
|
||||
* The number of PTE entries to advance by.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMapXpa::AdvancePte(IN PMMPTE Pte,
|
||||
IN ULONG Count)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return (PMMPTE)((ULONG_PTR)Pte + (Count * sizeof(MMPML3_PTE)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the next entry from.
|
||||
*
|
||||
* @return This routine returns the next entry in the PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
MM::PageMapXpa::GetNextEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return next entry in PTE list */
|
||||
return Pte->Pml3.List.NextEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer, considering the actual PTE size for PML3.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::PageMapXpa::GetNextPte(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return AdvancePte(Pte, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to check.
|
||||
*
|
||||
* @return This routine returns TRUE if the PTE list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMapXpa::GetOneEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return one entry status */
|
||||
return Pte->Pml3.List.OneEntry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the page frame number from a corresponding PTE.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the page frame number from.
|
||||
*
|
||||
* @return This routine returns the page frame number.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PFN_NUMBER
|
||||
MM::PageMapXpa::GetPageFrameNumber(IN PMMPTE Pte)
|
||||
{
|
||||
return Pte->Pml3.Hardware.PageFrameNumber;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of a PTE for XPA paging (PML3).
|
||||
*
|
||||
* @return This routine returns the size of a PTE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::PageMapXpa::GetPteSize(VOID)
|
||||
{
|
||||
/* Return the size of MMPTE */
|
||||
return sizeof(MMPML3_PTE);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -190,14 +594,17 @@ XTAPI
|
||||
VOID
|
||||
MM::PageMapXpa::InitializePageMapInfo(VOID)
|
||||
{
|
||||
/* Set PML2 page map information */
|
||||
/* Set PML3 page map information */
|
||||
PageMapInfo.Xpa = TRUE;
|
||||
|
||||
/* Set PML2 base addresses */
|
||||
/* Set PML3 empty PTE list mask */
|
||||
PageMapInfo.EmptyPteList = (ULONG)0xFFFFFFFF;
|
||||
|
||||
/* Set PML3 base addresses */
|
||||
PageMapInfo.PteBase = MM_PTE_BASE;
|
||||
PageMapInfo.PdeBase = MM_PDE_BASE;
|
||||
|
||||
/* Set PML2 shift values */
|
||||
/* Set PML3 shift values */
|
||||
PageMapInfo.PdiShift = MM_PDI_SHIFT;
|
||||
PageMapInfo.PteShift = MM_PTE_SHIFT;
|
||||
}
|
||||
@@ -214,9 +621,53 @@ MM::PageMapXpa::InitializePageMapInfo(VOID)
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::PageMapXpa::PteValid(PHARDWARE_PTE PtePointer)
|
||||
MM::PageMapXpa::PteValid(IN PMMPTE PtePointer)
|
||||
{
|
||||
return (BOOLEAN)PtePointer->Pml3.Valid;
|
||||
return (BOOLEAN)PtePointer->Pml3.Hardware.Valid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set as the next entry.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapXpa::SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value)
|
||||
{
|
||||
/* Set next entry in PTE list */
|
||||
Pte->Pml3.List.NextEntry = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the flag indicating whether a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set. TRUE if the list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapXpa::SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value)
|
||||
{
|
||||
/* Set one entry status */
|
||||
Pte->Pml3.List.OneEntry = Value;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -228,8 +679,8 @@ MM::PageMapXpa::PteValid(PHARDWARE_PTE PtePointer)
|
||||
* @param PageFrameNumber
|
||||
* Physical frame number to map.
|
||||
*
|
||||
* @param Writable
|
||||
* Indicates whether the page should be writable.
|
||||
* @param AttributesMask
|
||||
* Specifies the attributes mask to apply to the PTE.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
@@ -237,13 +688,14 @@ MM::PageMapXpa::PteValid(PHARDWARE_PTE PtePointer)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapXpa::SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable)
|
||||
MM::PageMapXpa::SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask)
|
||||
{
|
||||
PtePointer->Pml3.PageFrameNumber = PageFrameNumber;
|
||||
PtePointer->Pml3.Valid = 1;
|
||||
PtePointer->Pml3.Writable = Writable;
|
||||
/* Set PTE */
|
||||
PtePointer->Pml3.Hardware.PageFrameNumber = PageFrameNumber;
|
||||
PtePointer->Pml3.Hardware.Valid = 1;
|
||||
PtePointer->Long |= AttributesMask;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -264,10 +716,11 @@ MM::PageMapXpa::SetPte(PHARDWARE_PTE PtePointer,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::PageMapXpa::SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough)
|
||||
MM::PageMapXpa::SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough)
|
||||
{
|
||||
PtePointer->Pml3.CacheDisable = CacheDisable;
|
||||
PtePointer->Pml3.WriteThrough = WriteThrough;
|
||||
/* Set caching attributes */
|
||||
PtePointer->Pml3.Hardware.CacheDisable = CacheDisable;
|
||||
PtePointer->Pml3.Hardware.WriteThrough = WriteThrough;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,28 @@
|
||||
#include <xtos.hh>
|
||||
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer by a given number of entries, considering the actual PTE size.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @param Count
|
||||
* The number of PTE entries to advance by.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::Paging::AdvancePte(IN PMMPTE Pte,
|
||||
IN LONG Count)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return PmlRoutines->AdvancePte(Pte, Count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the contents of a page table entry (PTE).
|
||||
*
|
||||
@@ -21,8 +43,9 @@
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::Paging::ClearPte(PHARDWARE_PTE PtePointer)
|
||||
MM::Paging::ClearPte(IN PMMPTE PtePointer)
|
||||
{
|
||||
/* Clear PTE */
|
||||
PmlRoutines->ClearPte(PtePointer);
|
||||
}
|
||||
|
||||
@@ -78,6 +101,92 @@ MM::Paging::FlushTlb(VOID)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the value representing an empty PTE list.
|
||||
*
|
||||
* @return This routine returns the value representing an empty PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
MM::Paging::GetEmptyPteList(VOID)
|
||||
{
|
||||
/* Return empty PTE list mask */
|
||||
return (ULONG_PTR)PmlRoutines->GetEmptyPteList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the next entry in a PTE list.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the next entry from.
|
||||
*
|
||||
* @return This routine returns the next entry in the PTE list.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG_PTR
|
||||
MM::Paging::GetNextEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return next entry in PTE list */
|
||||
return PmlRoutines->GetNextEntry(Pte);
|
||||
}
|
||||
|
||||
/**
|
||||
* Advances a PTE pointer, considering the actual PTE size.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to advance.
|
||||
*
|
||||
* @return The advanced PTE pointer.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::Paging::GetNextPte(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return advanced PTE pointer */
|
||||
return PmlRoutines->GetNextPte(Pte);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to check.
|
||||
*
|
||||
* @return This routine returns TRUE if the PTE list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::Paging::GetOneEntry(IN PMMPTE Pte)
|
||||
{
|
||||
/* Return one entry status */
|
||||
return PmlRoutines->GetOneEntry(Pte);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the page frame number from a corresponding PTE.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to get the page frame number from.
|
||||
*
|
||||
* @return This routine returns the page frame number.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
PFN_NUMBER
|
||||
MM::Paging::GetPageFrameNumber(IN PMMPTE Pte)
|
||||
{
|
||||
return PmlRoutines->GetPageFrameNumber(Pte);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the page map routines for basic paging mode (non-XPA).
|
||||
*
|
||||
@@ -90,6 +199,8 @@ MM::PPAGEMAP
|
||||
MM::Paging::GetPageMapBasicRoutines(VOID)
|
||||
{
|
||||
static MM::PageMapBasic PageMapBasicRoutines;
|
||||
|
||||
/* Return non-XPA page map routines */
|
||||
return &PageMapBasicRoutines;
|
||||
}
|
||||
|
||||
@@ -105,6 +216,8 @@ MM::PPAGEMAP
|
||||
MM::Paging::GetPageMapXpaRoutines(VOID)
|
||||
{
|
||||
static MM::PageMapXpa PageMapXpaRoutines;
|
||||
|
||||
/* Return XPA page map routines */
|
||||
return &PageMapXpaRoutines;
|
||||
}
|
||||
|
||||
@@ -120,11 +233,30 @@ MM::Paging::GetPageMapXpaRoutines(VOID)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPDE
|
||||
MM::Paging::GetPdeAddress(PVOID Address)
|
||||
MM::Paging::GetPdeAddress(IN PVOID Address)
|
||||
{
|
||||
/* Return PDE 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 PMMPDE PdePointer)
|
||||
{
|
||||
/* Return PTE virtual address */
|
||||
return PmlRoutines->GetPdeVirtualAddress(PdePointer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PPE (Page Directory Pointer Table Entry), that maps given address.
|
||||
*
|
||||
@@ -137,11 +269,30 @@ MM::Paging::GetPdeAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPPE
|
||||
MM::Paging::GetPpeAddress(PVOID Address)
|
||||
MM::Paging::GetPpeAddress(IN PVOID Address)
|
||||
{
|
||||
/* Return PPE 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 PMMPPE PpePointer)
|
||||
{
|
||||
/* Return PTE virtual address */
|
||||
return PmlRoutines->GetPpeVirtualAddress(PpePointer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the address of the PTE (Page Table Entry), that maps given address.
|
||||
*
|
||||
@@ -154,11 +305,59 @@ MM::Paging::GetPpeAddress(PVOID Address)
|
||||
*/
|
||||
XTAPI
|
||||
PMMPTE
|
||||
MM::Paging::GetPteAddress(PVOID Address)
|
||||
MM::Paging::GetPteAddress(IN PVOID Address)
|
||||
{
|
||||
/* Return PTE address */
|
||||
return PmlRoutines->GetPteAddress(Address);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of a PTE.
|
||||
*
|
||||
* @return This routine returns the size of a PTE.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
ULONG
|
||||
MM::Paging::GetPteSize(VOID)
|
||||
{
|
||||
/* Return the size of MMPTE */
|
||||
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 current status of eXtended Physical Addressing (XPA).
|
||||
*
|
||||
* @return This routine returns TRUE if PAE or LA57 (XPA) is enabled, or 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.
|
||||
*
|
||||
@@ -198,22 +397,20 @@ MM::Paging::InitializePageMapSupport(VOID)
|
||||
*/
|
||||
XTAPI
|
||||
BOOLEAN
|
||||
MM::Paging::PteValid(PHARDWARE_PTE PtePointer)
|
||||
MM::Paging::PteValid(IN PMMPTE PtePointer)
|
||||
{
|
||||
/* Check if PTE is valid */
|
||||
return PmlRoutines->PteValid(PtePointer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a PML2 page table entry (PTE) with the specified physical page and access flags.
|
||||
* Sets the next entry in a PTE list.
|
||||
*
|
||||
* @param PtePointer
|
||||
* Pointer to the page table entry (PTE) to set.
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param PageFrameNumber
|
||||
* Physical frame number to map.
|
||||
*
|
||||
* @param Writable
|
||||
* Indicates whether the page should be writable.
|
||||
* @param Value
|
||||
* The value to set as the next entry.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
@@ -221,11 +418,59 @@ MM::Paging::PteValid(PHARDWARE_PTE PtePointer)
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::Paging::SetPte(PHARDWARE_PTE PtePointer,
|
||||
PFN_NUMBER PageFrameNumber,
|
||||
BOOLEAN Writable)
|
||||
MM::Paging::SetNextEntry(IN PMMPTE Pte,
|
||||
IN ULONG_PTR Value)
|
||||
{
|
||||
PmlRoutines->SetPte(PtePointer, PageFrameNumber, Writable);
|
||||
/* Set next entry in PTE list */
|
||||
PmlRoutines->SetNextEntry(Pte, Value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the flag indicating whether a PTE list contains only one entry.
|
||||
*
|
||||
* @param Pte
|
||||
* The PTE pointer to modify.
|
||||
*
|
||||
* @param Value
|
||||
* The value to set. TRUE if the list has only one entry, FALSE otherwise.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::Paging::SetOneEntry(IN PMMPTE Pte,
|
||||
IN BOOLEAN Value)
|
||||
{
|
||||
/* Set one entry status */
|
||||
PmlRoutines->SetOneEntry(Pte, Value);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 AttributesMask
|
||||
* Specifies the attributes mask to apply to the PTE.
|
||||
*
|
||||
* @return This routine does not return any value.
|
||||
*
|
||||
* @since XT 1.0
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::Paging::SetPte(IN PMMPTE PtePointer,
|
||||
IN PFN_NUMBER PageFrameNumber,
|
||||
IN ULONG_PTR AttributesMask)
|
||||
{
|
||||
/* Set PTE */
|
||||
PmlRoutines->SetPte(PtePointer, PageFrameNumber, AttributesMask);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -246,9 +491,10 @@ MM::Paging::SetPte(PHARDWARE_PTE PtePointer,
|
||||
*/
|
||||
XTAPI
|
||||
VOID
|
||||
MM::Paging::SetPteCaching(PHARDWARE_PTE PtePointer,
|
||||
BOOLEAN CacheDisable,
|
||||
BOOLEAN WriteThrough)
|
||||
MM::Paging::SetPteCaching(IN PMMPTE PtePointer,
|
||||
IN BOOLEAN CacheDisable,
|
||||
IN BOOLEAN WriteThrough)
|
||||
{
|
||||
/* Set caching attributes */
|
||||
PmlRoutines->SetPteCaching(PtePointer, CacheDisable, WriteThrough);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user