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
|
#define MM_PXE_BASE 0xFFFFF6FB7DBED000ULL
|
||||||
|
|
||||||
/* Page directory and page base addresses for 5-level paging */
|
/* Page directory and page base addresses for 5-level paging */
|
||||||
#define MM_PTE_LA57_BASE 0xFFFF000000000000ULL
|
#define MM_PTE_LA57_BASE 0xFFED000000000000ULL
|
||||||
#define MM_PDE_LA57_BASE 0xFFFF010000000000ULL
|
#define MM_PDE_LA57_BASE 0xFFEDF68000000000ULL
|
||||||
#define MM_PPE_LA57_BASE 0xFFFF010800000000ULL
|
#define MM_PPE_LA57_BASE 0xFFEDF6FB40000000ULL
|
||||||
#define MM_PXE_LA57_BASE 0xFFFF010840000000ULL
|
#define MM_PXE_LA57_BASE 0xFFEDF6FB7DA00000ULL
|
||||||
#define MM_P5E_LA57_BASE 0xFFFF010840200000ULL
|
#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 */
|
/* PTE shift values */
|
||||||
#define MM_PTE_SHIFT 3
|
#define MM_PTE_SHIFT 3
|
||||||
@@ -45,6 +49,46 @@
|
|||||||
#define MM_PPE_PER_PAGE 512
|
#define MM_PPE_PER_PAGE 512
|
||||||
#define MM_PXE_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 */
|
/* Minimum number of physical pages needed by the system */
|
||||||
#define MM_MINIMUM_PHYSICAL_PAGES 2048
|
#define MM_MINIMUM_PHYSICAL_PAGES 2048
|
||||||
|
|
||||||
@@ -99,6 +143,7 @@ typedef struct _HARDWARE_PTE
|
|||||||
typedef struct _MMPAGEMAP_INFO
|
typedef struct _MMPAGEMAP_INFO
|
||||||
{
|
{
|
||||||
BOOLEAN Xpa;
|
BOOLEAN Xpa;
|
||||||
|
ULONGLONG EmptyPteList;
|
||||||
ULONGLONG PteBase;
|
ULONGLONG PteBase;
|
||||||
ULONGLONG PdeBase;
|
ULONGLONG PdeBase;
|
||||||
ULONGLONG PpeBase;
|
ULONGLONG PpeBase;
|
||||||
@@ -252,6 +297,7 @@ typedef struct _MMPFN
|
|||||||
USHORT ReferenceCount;
|
USHORT ReferenceCount;
|
||||||
} e2;
|
} e2;
|
||||||
} u3;
|
} u3;
|
||||||
|
ULONG UsedPageTableEntries;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
MMPTE OriginalPte;
|
MMPTE OriginalPte;
|
||||||
@@ -262,12 +308,11 @@ typedef struct _MMPFN
|
|||||||
ULONG_PTR EntireFrame;
|
ULONG_PTR EntireFrame;
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
ULONG_PTR PteFrame:58;
|
ULONG_PTR PteFrame:57;
|
||||||
ULONG_PTR InPageError:1;
|
ULONG_PTR InPageError:1;
|
||||||
ULONG_PTR VerifierAllocation:1;
|
ULONG_PTR VerifierAllocation:1;
|
||||||
ULONG_PTR AweAllocation:1;
|
ULONG_PTR AweAllocation:1;
|
||||||
ULONG_PTR LockCharged:1;
|
ULONG_PTR Priority:3;
|
||||||
ULONG_PTR KernelStack:1;
|
|
||||||
ULONG_PTR MustBeCached:1;
|
ULONG_PTR MustBeCached:1;
|
||||||
};
|
};
|
||||||
} u4;
|
} u4;
|
||||||
|
|||||||
@@ -35,6 +35,46 @@
|
|||||||
#define MM_PTE_LEGACY_SHIFT 2
|
#define MM_PTE_LEGACY_SHIFT 2
|
||||||
#define MM_PDI_LEGACY_SHIFT 22
|
#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 */
|
/* Minimum number of physical pages needed by the system */
|
||||||
#define MM_MINIMUM_PHYSICAL_PAGES 1100
|
#define MM_MINIMUM_PHYSICAL_PAGES 1100
|
||||||
|
|
||||||
@@ -115,6 +155,7 @@ typedef union _HARDWARE_PTE
|
|||||||
typedef struct _MMPAGEMAP_INFO
|
typedef struct _MMPAGEMAP_INFO
|
||||||
{
|
{
|
||||||
BOOLEAN Xpa;
|
BOOLEAN Xpa;
|
||||||
|
ULONG EmptyPteList;
|
||||||
ULONG PteBase;
|
ULONG PteBase;
|
||||||
ULONG PdeBase;
|
ULONG PdeBase;
|
||||||
ULONG PdiShift;
|
ULONG PdiShift;
|
||||||
@@ -202,11 +243,11 @@ typedef union _MMPML2_PTE
|
|||||||
{
|
{
|
||||||
ULONG Long;
|
ULONG Long;
|
||||||
HARDWARE_PTE Flush;
|
HARDWARE_PTE Flush;
|
||||||
MMPML2_PTE_HARDWARE Hard;
|
MMPML2_PTE_HARDWARE Hardware;
|
||||||
MMPML2_PTE_PROTOTYPE Proto;
|
MMPML2_PTE_PROTOTYPE Prototype;
|
||||||
MMPML2_PTE_SOFTWARE Soft;
|
MMPML2_PTE_SOFTWARE Software;
|
||||||
MMPML2_PTE_TRANSITION Trans;
|
MMPML2_PTE_TRANSITION Transition;
|
||||||
MMPML2_PTE_SUBSECTION Subsect;
|
MMPML2_PTE_SUBSECTION Subsection;
|
||||||
MMPML2_PTE_LIST List;
|
MMPML2_PTE_LIST List;
|
||||||
} MMPML2_PTE, *PMMPML2_PTE;
|
} MMPML2_PTE, *PMMPML2_PTE;
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,27 @@
|
|||||||
#include ARCH_HEADER(xtstruct.h)
|
#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 */
|
/* Page map routines structure definition */
|
||||||
typedef CONST STRUCT _CMMPAGEMAP_ROUTINES
|
typedef CONST STRUCT _CMMPAGEMAP_ROUTINES
|
||||||
{
|
{
|
||||||
@@ -45,4 +66,13 @@ typedef struct _MMPFNENTRY
|
|||||||
USHORT ParityError:1;
|
USHORT ParityError:1;
|
||||||
} MMPFNENTRY, *PMMPFNENTRY;
|
} 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 */
|
#endif /* __XTDK_MMTYPES_H */
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ typedef UCHAR KRUNLEVEL, *PKRUNLEVEL;
|
|||||||
/* Spin locks synchronization mechanism */
|
/* Spin locks synchronization mechanism */
|
||||||
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
|
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
|
||||||
|
|
||||||
|
/* Page Frame Number count */
|
||||||
|
typedef ULONG PFN_COUNT;
|
||||||
|
|
||||||
/* Page Frame Number */
|
/* Page Frame Number */
|
||||||
typedef ULONG_PTR PFN_NUMBER, *PPFN_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 _KTIMER_TYPE KTIMER_TYPE, *PKTIMER_TYPE;
|
||||||
typedef enum _KUBSAN_DATA_TYPE KUBSAN_DATA_TYPE, *PKUBSAN_DATA_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 _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 _MODE MODE, *PMODE;
|
||||||
typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
typedef enum _RTL_VARIABLE_TYPE RTL_VARIABLE_TYPE, *PRTL_VARIABLE_TYPE;
|
||||||
typedef enum _SYSTEM_FIRMWARE_TYPE SYSTEM_FIRMWARE_TYPE, *PSYSTEM_FIRMWARE_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 _M128 M128, *PM128;
|
||||||
typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES;
|
typedef struct _MMCOLOR_TABLES MMCOLOR_TABLES, *PMMCOLOR_TABLES;
|
||||||
typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY;
|
typedef struct _MMPFNENTRY MMPFNENTRY, *PMMPFNENTRY;
|
||||||
|
typedef struct _MMPFNLIST MMPFNLIST, *PMMPFNLIST;
|
||||||
typedef struct _PCAT_FIRMWARE_INFORMATION PCAT_FIRMWARE_INFORMATION, *PPCAT_FIRMWARE_INFORMATION;
|
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_BRIDGE_CONTROL_REGISTER PCI_BRIDGE_CONTROL_REGISTER, *PPCI_BRIDGE_CONTROL_REGISTER;
|
||||||
typedef struct _PCI_COMMON_CONFIG PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
|
typedef struct _PCI_COMMON_CONFIG PCI_COMMON_CONFIG, *PPCI_COMMON_CONFIG;
|
||||||
|
|||||||
@@ -82,11 +82,12 @@ add_library(libxtos ${XTOSKRNL_SOURCE})
|
|||||||
|
|
||||||
# Link kernel executable
|
# Link kernel executable
|
||||||
add_executable(xtoskrnl
|
add_executable(xtoskrnl
|
||||||
${XTOSKRNL_SOURCE}
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def)
|
${CMAKE_CURRENT_BINARY_DIR}/xtoskrnl.def)
|
||||||
|
|
||||||
# Add linker libraries
|
# Add linker libraries
|
||||||
target_link_libraries(xtoskrnl)
|
target_link_libraries(xtoskrnl
|
||||||
|
PRIVATE
|
||||||
|
libxtos)
|
||||||
|
|
||||||
# Set proper binary name and install target
|
# Set proper binary name and install target
|
||||||
set_target_properties(xtoskrnl PROPERTIES SUFFIX .exe)
|
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
|
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.
|
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
|
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:
|
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()**
|
For all C++ code inside the kernel the naming model has evolved. Consider the **KE::KThread::InitializeThread()**
|
||||||
routine:
|
routine:
|
||||||
* **KE** - The namespace replaces the prefix and indicates the subsystem. Namespaces are written in uppercase and no
|
* **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
|
* **KThread** - Within each namespace, related functionality is grouped into classes, which encapsulate variables and
|
||||||
methods.
|
methods.
|
||||||
* **InitializeThread** - Method names follow the `<Operation><Object>` pattern.
|
* **InitializeThread** - Method names follow the `<Operation><Object>` pattern.
|
||||||
|
|
||||||
@@ -12,10 +12,10 @@
|
|||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
#include XTOS_ARCH_HEADER(mm, pagemap.hh)
|
#include XTOS_ARCH_HEADER(mm, pagemap.hh)
|
||||||
|
#include XTOS_ARCH_HEADER(mm, paging.hh)
|
||||||
|
|
||||||
#include <mm/hlpool.hh>
|
#include <mm/hlpool.hh>
|
||||||
#include <mm/init.hh>
|
#include <mm/init.hh>
|
||||||
#include <mm/kpool.hh>
|
#include <mm/kpool.hh>
|
||||||
#include <mm/paging.hh>
|
|
||||||
|
|
||||||
#endif /* __XTOSKRNL_MM_HH */
|
#endif /* __XTOSKRNL_MM_HH */
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
/**
|
/**
|
||||||
* PROJECT: ExectOS
|
* PROJECT: ExectOS
|
||||||
* COPYRIGHT: See COPYING.md in the top level directory
|
* 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
|
* DESCRIPTION: Low-level support for page map manipulation
|
||||||
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __XTOSKRNL_MM_PAGEMAP_HH
|
#ifndef __XTOSKRNL_MM_AMD64_PAGEMAP_HH
|
||||||
#define __XTOSKRNL_MM_PAGEMAP_HH
|
#define __XTOSKRNL_MM_AMD64_PAGEMAP_HH
|
||||||
|
|
||||||
#include <xtos.hh>
|
#include <xtos.hh>
|
||||||
|
|
||||||
@@ -21,33 +21,64 @@ namespace MM
|
|||||||
MMPAGEMAP_INFO PageMapInfo;
|
MMPAGEMAP_INFO PageMapInfo;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||||
XTAPI PMMP5E GetP5eAddress(PVOID Address);
|
IN LONG Count);
|
||||||
XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||||
XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
XTAPI ULONGLONG GetEmptyPteList(VOID);
|
||||||
XTAPI PMMPTE GetPteAddress(PVOID Address);
|
XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte);
|
||||||
XTAPI PMMPXE GetPxeAddress(PVOID Address);
|
XTAPI PMMPTE GetNextPte(IN PMMPTE Pte);
|
||||||
virtual XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte);
|
||||||
XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
XTAPI PMMP5E GetP5eAddress(IN PVOID Address);
|
||||||
XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
XTAPI ULONG GetP5eIndex(IN PVOID Address);
|
||||||
PFN_NUMBER PageFrameNumber,
|
XTAPI PVOID GetP5eVirtualAddress(IN PMMP5E P5ePointer);
|
||||||
BOOLEAN Writable);
|
XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte);
|
||||||
XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
XTAPI PMMPDE GetPdeAddress(IN PVOID Address);
|
||||||
BOOLEAN CacheDisable,
|
XTAPI ULONG GetPdeIndex(IN PVOID Address);
|
||||||
BOOLEAN WriteThrough);
|
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;
|
} PAGEMAP, *PPAGEMAP;
|
||||||
|
|
||||||
class PageMapBasic final : public PageMap
|
class PageMapBasic final : public PageMap
|
||||||
{
|
{
|
||||||
public:
|
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);
|
XTAPI VOID InitializePageMapInfo(VOID);
|
||||||
};
|
};
|
||||||
|
|
||||||
class PageMapXpa final : public PageMap
|
class PageMapXpa final : public PageMap
|
||||||
{
|
{
|
||||||
public:
|
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);
|
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;
|
MMPAGEMAP_INFO PageMapInfo;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
XTAPI VOID ClearPte(PHARDWARE_PTE PtePointer);
|
VIRTUAL XTAPI PMMPTE AdvancePte(IN PMMPTE Pte,
|
||||||
XTAPI PMMPDE GetPdeAddress(PVOID Address);
|
IN ULONG Count) = 0;
|
||||||
XTAPI PMMPPE GetPpeAddress(PVOID Address);
|
XTAPI VOID ClearPte(IN PMMPTE PtePointer);
|
||||||
XTAPI PMMPTE GetPteAddress(PVOID Address);
|
XTAPI ULONG GetEmptyPteList(VOID);
|
||||||
virtual XTAPI VOID InitializePageMapInfo(VOID) = 0;
|
VIRTUAL XTAPI ULONG_PTR GetNextEntry(IN PMMPTE Pte) = 0;
|
||||||
virtual XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer) = 0;
|
VIRTUAL XTAPI PMMPTE GetNextPte(IN PMMPTE Pte) = 0;
|
||||||
virtual XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
VIRTUAL XTAPI BOOLEAN GetOneEntry(IN PMMPTE Pte) = 0;
|
||||||
PFN_NUMBER PageFrameNumber,
|
VIRTUAL XTAPI PFN_NUMBER GetPageFrameNumber(IN PMMPTE Pte) = 0;
|
||||||
BOOLEAN Writable) = 0;
|
XTAPI PMMPDE GetPdeAddress(IN PVOID Address);
|
||||||
virtual XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
XTAPI ULONG GetPdeIndex(IN PVOID Address);
|
||||||
BOOLEAN CacheDisable,
|
XTAPI PVOID GetPdeVirtualAddress(IN PMMPDE PdePointer);
|
||||||
BOOLEAN WriteThrough) = 0;
|
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;
|
} PAGEMAP, *PPAGEMAP;
|
||||||
|
|
||||||
class PageMapBasic final : public PageMap
|
class PageMapBasic final : public PageMap
|
||||||
{
|
{
|
||||||
public:
|
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 VOID InitializePageMapInfo(VOID);
|
||||||
XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||||
XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||||
PFN_NUMBER PageFrameNumber,
|
IN ULONG_PTR Value);
|
||||||
BOOLEAN Writable);
|
XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||||
XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
IN BOOLEAN Value);
|
||||||
BOOLEAN CacheDisable,
|
XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||||
BOOLEAN WriteThrough);
|
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
|
class PageMapXpa final : public PageMap
|
||||||
{
|
{
|
||||||
public:
|
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 VOID InitializePageMapInfo(VOID);
|
||||||
XTAPI BOOLEAN PteValid(PHARDWARE_PTE PtePointer);
|
XTAPI BOOLEAN PteValid(IN PMMPTE PtePointer);
|
||||||
XTAPI VOID SetPte(PHARDWARE_PTE PtePointer,
|
XTAPI VOID SetNextEntry(IN PMMPTE Pte,
|
||||||
PFN_NUMBER PageFrameNumber,
|
IN ULONG_PTR Value);
|
||||||
BOOLEAN Writable);
|
XTAPI VOID SetOneEntry(IN PMMPTE Pte,
|
||||||
XTAPI VOID SetPteCaching(PHARDWARE_PTE PtePointer,
|
IN BOOLEAN Value);
|
||||||
BOOLEAN CacheDisable,
|
XTAPI VOID SetPte(IN PMMPTE PtePointer,
|
||||||
BOOLEAN WriteThrough);
|
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>
|
#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).
|
* Clears the contents of a page table entry (PTE).
|
||||||
*
|
*
|
||||||
@@ -21,13 +43,79 @@
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
MM::PageMap::ClearPte(IN PMMPTE PtePointer)
|
||||||
{
|
{
|
||||||
PtePointer->CacheDisable = 0;
|
/* Clear PTE */
|
||||||
PtePointer->PageFrameNumber = 0;
|
PtePointer->Long = 0;
|
||||||
PtePointer->Valid = 0;
|
}
|
||||||
PtePointer->Writable = 0;
|
|
||||||
PtePointer->WriteThrough = 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
|
XTAPI
|
||||||
PMMP5E
|
PMMP5E
|
||||||
MM::PageMap::GetP5eAddress(PVOID Address)
|
MM::PageMap::GetP5eAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONGLONG Offset;
|
ULONGLONG Offset;
|
||||||
|
|
||||||
@@ -51,6 +139,57 @@ MM::PageMap::GetP5eAddress(PVOID Address)
|
|||||||
return (PMMP5E)((PageMapInfo.P5eBase + Offset) * PageMapInfo.Xpa);
|
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.
|
* Gets the address of the PDE (Page Directory Entry), that maps given address.
|
||||||
*
|
*
|
||||||
@@ -63,7 +202,7 @@ MM::PageMap::GetP5eAddress(PVOID Address)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPDE
|
PMMPDE
|
||||||
MM::PageMap::GetPdeAddress(PVOID Address)
|
MM::PageMap::GetPdeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONGLONG Offset;
|
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
|
* @param Address
|
||||||
* Specifies the virtual address for which to retrieve the corresponding PDE.
|
* 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.
|
* @return This routine returns the address of the PPE.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPPE
|
PMMPPE
|
||||||
MM::PageMap::GetPpeAddress(PVOID Address)
|
MM::PageMap::GetPpeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONGLONG Offset;
|
ULONGLONG Offset;
|
||||||
|
|
||||||
@@ -93,6 +250,24 @@ MM::PageMap::GetPpeAddress(PVOID Address)
|
|||||||
return (PMMPPE)(PageMapInfo.PpeBase + Offset);
|
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.
|
* Gets the address of the PTE (Page Table Entry), that maps given address.
|
||||||
*
|
*
|
||||||
@@ -105,7 +280,7 @@ MM::PageMap::GetPpeAddress(PVOID Address)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPTE
|
PMMPTE
|
||||||
MM::PageMap::GetPteAddress(PVOID Address)
|
MM::PageMap::GetPteAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONGLONG Offset;
|
ULONGLONG Offset;
|
||||||
|
|
||||||
@@ -114,6 +289,39 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
|||||||
return (PMMPTE)(PageMapInfo.PteBase + Offset);
|
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.
|
* Gets the address of the PXE (Extended Page Entry), that maps given address.
|
||||||
*
|
*
|
||||||
@@ -126,14 +334,47 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPXE
|
PMMPXE
|
||||||
MM::PageMap::GetPxeAddress(PVOID Address)
|
MM::PageMap::GetPxeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONGLONG Offset;
|
ULONGLONG Offset;
|
||||||
|
|
||||||
|
/* Calculate offset and return PXE address */
|
||||||
Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << PageMapInfo.VaBits) - 1)) >> MM_PXI_SHIFT) << MM_PTE_SHIFT);
|
Offset = ((((ULONGLONG)Address & (((ULONGLONG)1 << PageMapInfo.VaBits) - 1)) >> MM_PXI_SHIFT) << MM_PTE_SHIFT);
|
||||||
return (PMMPXE)(PageMapInfo.PxeBase + Offset);
|
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.
|
* Checks whether the given PML2 page table entry (PTE) is valid.
|
||||||
*
|
*
|
||||||
@@ -146,9 +387,54 @@ MM::PageMap::GetPxeAddress(PVOID Address)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
BOOLEAN
|
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
|
* @param PageFrameNumber
|
||||||
* Physical frame number to map.
|
* Physical frame number to map.
|
||||||
*
|
*
|
||||||
* @param Writable
|
* @param AttributesMask
|
||||||
* Indicates whether the page should be writable.
|
* Specifies the attributes mask to apply to the PTE.
|
||||||
*
|
*
|
||||||
* @return This routine does not return any value.
|
* @return This routine does not return any value.
|
||||||
*
|
*
|
||||||
@@ -169,13 +455,14 @@ MM::PageMap::PteValid(PHARDWARE_PTE PtePointer)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMap::SetPte(PHARDWARE_PTE PtePointer,
|
MM::PageMap::SetPte(IN PMMPTE PtePointer,
|
||||||
PFN_NUMBER PageFrameNumber,
|
IN PFN_NUMBER PageFrameNumber,
|
||||||
BOOLEAN Writable)
|
IN ULONG_PTR AttributesMask)
|
||||||
{
|
{
|
||||||
PtePointer->PageFrameNumber = PageFrameNumber;
|
/* Set PTE */
|
||||||
PtePointer->Valid = 1;
|
PtePointer->Hardware.PageFrameNumber = PageFrameNumber;
|
||||||
PtePointer->Writable = Writable;
|
PtePointer->Hardware.Valid = 1;
|
||||||
|
PtePointer->Long |= AttributesMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -196,12 +483,85 @@ MM::PageMap::SetPte(PHARDWARE_PTE PtePointer,
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMap::SetPteCaching(PHARDWARE_PTE PtePointer,
|
MM::PageMap::SetPteCaching(IN PMMPTE PtePointer,
|
||||||
BOOLEAN CacheDisable,
|
IN BOOLEAN CacheDisable,
|
||||||
BOOLEAN WriteThrough)
|
IN BOOLEAN WriteThrough)
|
||||||
{
|
{
|
||||||
PtePointer->CacheDisable = CacheDisable;
|
/* Set caching attributes */
|
||||||
PtePointer->WriteThrough = WriteThrough;
|
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 */
|
/* Set PML4 page map information */
|
||||||
PageMapInfo.Xpa = FALSE;
|
PageMapInfo.Xpa = FALSE;
|
||||||
|
|
||||||
|
/* Set PML4 empty PTE list mask */
|
||||||
|
PageMapInfo.EmptyPteList = 0xFFFFFFFFUI64;
|
||||||
|
|
||||||
/* Set PML4 base addresses */
|
/* Set PML4 base addresses */
|
||||||
PageMapInfo.PteBase = MM_PTE_BASE;
|
PageMapInfo.PteBase = MM_PTE_BASE;
|
||||||
PageMapInfo.PdeBase = MM_PDE_BASE;
|
PageMapInfo.PdeBase = MM_PDE_BASE;
|
||||||
@@ -229,6 +592,78 @@ MM::PageMapBasic::InitializePageMapInfo(VOID)
|
|||||||
PageMapInfo.VaBits = 48;
|
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).
|
* Initializes page map information for XPA paging (PML5).
|
||||||
*
|
*
|
||||||
@@ -243,6 +678,9 @@ MM::PageMapXpa::InitializePageMapInfo(VOID)
|
|||||||
/* Set PML5 page map information */
|
/* Set PML5 page map information */
|
||||||
PageMapInfo.Xpa = TRUE;
|
PageMapInfo.Xpa = TRUE;
|
||||||
|
|
||||||
|
/* Set PML5 empty PTE list mask */
|
||||||
|
PageMapInfo.EmptyPteList = 0xFFFFFFFFUI64;
|
||||||
|
|
||||||
/* Set PML5 base addresses */
|
/* Set PML5 base addresses */
|
||||||
PageMapInfo.PteBase = MM_PTE_LA57_BASE;
|
PageMapInfo.PteBase = MM_PTE_LA57_BASE;
|
||||||
PageMapInfo.PdeBase = MM_PDE_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;
|
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.
|
* 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;
|
PVOID BaseAddress, ReturnAddress;
|
||||||
PFN_NUMBER MappedPages;
|
PFN_NUMBER MappedPages;
|
||||||
PHARDWARE_PTE PtePointer;
|
PMMPTE PtePointer;
|
||||||
|
|
||||||
/* Initialize variables */
|
/* Initialize variables */
|
||||||
BaseAddress = HardwareHeapStart;
|
BaseAddress = HardwareHeapStart;
|
||||||
@@ -189,7 +189,7 @@ MM::HardwarePool::MapHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get PTE pointer and advance to next page */
|
/* 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);
|
ReturnAddress = (PVOID)((ULONG_PTR)ReturnAddress + MM_PAGE_SIZE);
|
||||||
|
|
||||||
/* Check if PTE is valid */
|
/* Check if PTE is valid */
|
||||||
@@ -219,10 +219,10 @@ MM::HardwarePool::MapHardwareMemory(IN PHYSICAL_ADDRESS PhysicalAddress,
|
|||||||
while(MappedPages--)
|
while(MappedPages--)
|
||||||
{
|
{
|
||||||
/* Get PTE pointer */
|
/* Get PTE pointer */
|
||||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(BaseAddress);
|
PtePointer = MM::Paging::GetPteAddress(BaseAddress);
|
||||||
|
|
||||||
/* Fill the PTE */
|
/* 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 */
|
/* Advance to the next address */
|
||||||
PhysicalAddress.QuadPart += MM_PAGE_SIZE;
|
PhysicalAddress.QuadPart += MM_PAGE_SIZE;
|
||||||
@@ -259,18 +259,18 @@ VOID
|
|||||||
MM::HardwarePool::MarkHardwareMemoryWriteThrough(IN PVOID VirtualAddress,
|
MM::HardwarePool::MarkHardwareMemoryWriteThrough(IN PVOID VirtualAddress,
|
||||||
IN PFN_NUMBER PageCount)
|
IN PFN_NUMBER PageCount)
|
||||||
{
|
{
|
||||||
PHARDWARE_PTE PtePointer;
|
PMMPTE PtePointer;
|
||||||
PFN_NUMBER Page;
|
PFN_NUMBER Page;
|
||||||
|
|
||||||
/* Get PTE address from virtual address */
|
/* Get PTE address from virtual address */
|
||||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(VirtualAddress);
|
PtePointer = MM::Paging::GetPteAddress(VirtualAddress);
|
||||||
|
|
||||||
/* Iterate through mapped pages */
|
/* Iterate through mapped pages */
|
||||||
for(Page = 0; Page < PageCount; Page++)
|
for(Page = 0; Page < PageCount; Page++)
|
||||||
{
|
{
|
||||||
/* Mark pages as CD/WT */
|
/* Mark pages as CD/WT */
|
||||||
MM::Paging::SetPteCaching(PtePointer, TRUE, TRUE);
|
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 PHYSICAL_ADDRESS PhysicalAddress,
|
||||||
IN BOOLEAN FlushTlb)
|
IN BOOLEAN FlushTlb)
|
||||||
{
|
{
|
||||||
PHARDWARE_PTE PtePointer;
|
PMMPTE PtePointer;
|
||||||
|
|
||||||
/* Get PTE address from virtual address */
|
/* Get PTE address from virtual address */
|
||||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(VirtualAddress);
|
PtePointer = MM::Paging::GetPteAddress(VirtualAddress);
|
||||||
|
|
||||||
/* Remap the PTE */
|
/* 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 */
|
/* Check if TLB needs to be flushed */
|
||||||
if(FlushTlb)
|
if(FlushTlb)
|
||||||
@@ -334,7 +334,7 @@ MM::HardwarePool::UnmapHardwareMemory(IN PVOID VirtualAddress,
|
|||||||
IN PFN_NUMBER PageCount,
|
IN PFN_NUMBER PageCount,
|
||||||
IN BOOLEAN FlushTlb)
|
IN BOOLEAN FlushTlb)
|
||||||
{
|
{
|
||||||
PHARDWARE_PTE PtePointer;
|
PMMPTE PtePointer;
|
||||||
PFN_NUMBER Page;
|
PFN_NUMBER Page;
|
||||||
|
|
||||||
/* Check if address is valid hardware memory */
|
/* 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));
|
VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress & ~(MM_PAGE_SIZE - 1));
|
||||||
|
|
||||||
/* Get PTE address from virtual address */
|
/* Get PTE address from virtual address */
|
||||||
PtePointer = (PHARDWARE_PTE)MM::Paging::GetPteAddress(VirtualAddress);
|
PtePointer = MM::Paging::GetPteAddress(VirtualAddress);
|
||||||
|
|
||||||
/* Iterate through mapped pages */
|
/* Iterate through mapped pages */
|
||||||
for(Page = 0; Page < PageCount; Page++)
|
for(Page = 0; Page < PageCount; Page++)
|
||||||
|
|||||||
@@ -21,11 +21,27 @@
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
MM::PageMap::ClearPte(IN PMMPTE PtePointer)
|
||||||
{
|
{
|
||||||
|
/* Clear PTE */
|
||||||
PtePointer->Long = 0;
|
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.
|
* Gets the address of the PDE (Page Directory Entry), that maps given address.
|
||||||
*
|
*
|
||||||
@@ -38,7 +54,7 @@ MM::PageMap::ClearPte(PHARDWARE_PTE PtePointer)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPDE
|
PMMPDE
|
||||||
MM::PageMap::GetPdeAddress(PVOID Address)
|
MM::PageMap::GetPdeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONG Offset;
|
ULONG Offset;
|
||||||
|
|
||||||
@@ -47,6 +63,42 @@ MM::PageMap::GetPdeAddress(PVOID Address)
|
|||||||
return (PMMPDE)(PageMapInfo.PdeBase + Offset);
|
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.
|
* 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
|
XTAPI
|
||||||
PMMPPE
|
PMMPPE
|
||||||
MM::PageMap::GetPpeAddress(PVOID Address)
|
MM::PageMap::GetPpeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
/* Return zero */
|
/* Return zero */
|
||||||
return (PMMPPE)0;
|
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.
|
* Gets the address of the PTE (Page Table Entry), that maps given address.
|
||||||
*
|
*
|
||||||
@@ -77,7 +165,7 @@ MM::PageMap::GetPpeAddress(PVOID Address)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPTE
|
PMMPTE
|
||||||
MM::PageMap::GetPteAddress(PVOID Address)
|
MM::PageMap::GetPteAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
ULONG Offset;
|
ULONG Offset;
|
||||||
|
|
||||||
@@ -86,6 +174,164 @@ MM::PageMap::GetPteAddress(PVOID Address)
|
|||||||
return (PMMPTE)(PageMapInfo.PteBase + Offset);
|
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).
|
* Initializes page map information for basic paging (PML2).
|
||||||
*
|
*
|
||||||
@@ -100,6 +346,9 @@ MM::PageMapBasic::InitializePageMapInfo(VOID)
|
|||||||
/* Set PML2 page map information */
|
/* Set PML2 page map information */
|
||||||
PageMapInfo.Xpa = FALSE;
|
PageMapInfo.Xpa = FALSE;
|
||||||
|
|
||||||
|
/* Set PML2 empty PTE list mask */
|
||||||
|
PageMapInfo.EmptyPteList = (ULONG)0xFFFFF;
|
||||||
|
|
||||||
/* Set PML2 base addresses */
|
/* Set PML2 base addresses */
|
||||||
PageMapInfo.PteBase = MM_PTE_BASE;
|
PageMapInfo.PteBase = MM_PTE_BASE;
|
||||||
PageMapInfo.PdeBase = MM_PDE_LEGACY_BASE;
|
PageMapInfo.PdeBase = MM_PDE_LEGACY_BASE;
|
||||||
@@ -121,9 +370,54 @@ MM::PageMapBasic::InitializePageMapInfo(VOID)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
BOOLEAN
|
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
|
* @param PageFrameNumber
|
||||||
* Physical frame number to map.
|
* Physical frame number to map.
|
||||||
*
|
*
|
||||||
* @param Writable
|
* @param AttributesMask
|
||||||
* Indicates whether the page should be writable.
|
* Specifies the attributes mask to apply to the PTE.
|
||||||
*
|
*
|
||||||
* @return This routine does not return any value.
|
* @return This routine does not return any value.
|
||||||
*
|
*
|
||||||
@@ -144,13 +438,14 @@ MM::PageMapBasic::PteValid(PHARDWARE_PTE PtePointer)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMapBasic::SetPte(PHARDWARE_PTE PtePointer,
|
MM::PageMapBasic::SetPte(IN PMMPTE PtePointer,
|
||||||
PFN_NUMBER PageFrameNumber,
|
IN PFN_NUMBER PageFrameNumber,
|
||||||
BOOLEAN Writable)
|
IN ULONG_PTR AttributesMask)
|
||||||
{
|
{
|
||||||
PtePointer->Pml2.PageFrameNumber = PageFrameNumber;
|
/* Set PTE */
|
||||||
PtePointer->Pml2.Valid = 1;
|
PtePointer->Pml2.Hardware.PageFrameNumber = PageFrameNumber;
|
||||||
PtePointer->Pml2.Writable = Writable;
|
PtePointer->Pml2.Hardware.Valid = 1;
|
||||||
|
PtePointer->Long |= AttributesMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -171,12 +466,121 @@ MM::PageMapBasic::SetPte(PHARDWARE_PTE PtePointer,
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMapBasic::SetPteCaching(PHARDWARE_PTE PtePointer,
|
MM::PageMapBasic::SetPteCaching(IN PMMPTE PtePointer,
|
||||||
BOOLEAN CacheDisable,
|
IN BOOLEAN CacheDisable,
|
||||||
BOOLEAN WriteThrough)
|
IN BOOLEAN WriteThrough)
|
||||||
{
|
{
|
||||||
PtePointer->Pml2.CacheDisable = CacheDisable;
|
/* Set caching attributes */
|
||||||
PtePointer->Pml2.WriteThrough = WriteThrough;
|
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
|
VOID
|
||||||
MM::PageMapXpa::InitializePageMapInfo(VOID)
|
MM::PageMapXpa::InitializePageMapInfo(VOID)
|
||||||
{
|
{
|
||||||
/* Set PML2 page map information */
|
/* Set PML3 page map information */
|
||||||
PageMapInfo.Xpa = TRUE;
|
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.PteBase = MM_PTE_BASE;
|
||||||
PageMapInfo.PdeBase = MM_PDE_BASE;
|
PageMapInfo.PdeBase = MM_PDE_BASE;
|
||||||
|
|
||||||
/* Set PML2 shift values */
|
/* Set PML3 shift values */
|
||||||
PageMapInfo.PdiShift = MM_PDI_SHIFT;
|
PageMapInfo.PdiShift = MM_PDI_SHIFT;
|
||||||
PageMapInfo.PteShift = MM_PTE_SHIFT;
|
PageMapInfo.PteShift = MM_PTE_SHIFT;
|
||||||
}
|
}
|
||||||
@@ -214,9 +621,53 @@ MM::PageMapXpa::InitializePageMapInfo(VOID)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
BOOLEAN
|
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
|
* @param PageFrameNumber
|
||||||
* Physical frame number to map.
|
* Physical frame number to map.
|
||||||
*
|
*
|
||||||
* @param Writable
|
* @param AttributesMask
|
||||||
* Indicates whether the page should be writable.
|
* Specifies the attributes mask to apply to the PTE.
|
||||||
*
|
*
|
||||||
* @return This routine does not return any value.
|
* @return This routine does not return any value.
|
||||||
*
|
*
|
||||||
@@ -237,13 +688,14 @@ MM::PageMapXpa::PteValid(PHARDWARE_PTE PtePointer)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMapXpa::SetPte(PHARDWARE_PTE PtePointer,
|
MM::PageMapXpa::SetPte(IN PMMPTE PtePointer,
|
||||||
PFN_NUMBER PageFrameNumber,
|
IN PFN_NUMBER PageFrameNumber,
|
||||||
BOOLEAN Writable)
|
IN ULONG_PTR AttributesMask)
|
||||||
{
|
{
|
||||||
PtePointer->Pml3.PageFrameNumber = PageFrameNumber;
|
/* Set PTE */
|
||||||
PtePointer->Pml3.Valid = 1;
|
PtePointer->Pml3.Hardware.PageFrameNumber = PageFrameNumber;
|
||||||
PtePointer->Pml3.Writable = Writable;
|
PtePointer->Pml3.Hardware.Valid = 1;
|
||||||
|
PtePointer->Long |= AttributesMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -264,10 +716,11 @@ MM::PageMapXpa::SetPte(PHARDWARE_PTE PtePointer,
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::PageMapXpa::SetPteCaching(PHARDWARE_PTE PtePointer,
|
MM::PageMapXpa::SetPteCaching(IN PMMPTE PtePointer,
|
||||||
BOOLEAN CacheDisable,
|
IN BOOLEAN CacheDisable,
|
||||||
BOOLEAN WriteThrough)
|
IN BOOLEAN WriteThrough)
|
||||||
{
|
{
|
||||||
PtePointer->Pml3.CacheDisable = CacheDisable;
|
/* Set caching attributes */
|
||||||
PtePointer->Pml3.WriteThrough = WriteThrough;
|
PtePointer->Pml3.Hardware.CacheDisable = CacheDisable;
|
||||||
|
PtePointer->Pml3.Hardware.WriteThrough = WriteThrough;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,28 @@
|
|||||||
#include <xtos.hh>
|
#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).
|
* Clears the contents of a page table entry (PTE).
|
||||||
*
|
*
|
||||||
@@ -21,8 +43,9 @@
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::Paging::ClearPte(PHARDWARE_PTE PtePointer)
|
MM::Paging::ClearPte(IN PMMPTE PtePointer)
|
||||||
{
|
{
|
||||||
|
/* Clear PTE */
|
||||||
PmlRoutines->ClearPte(PtePointer);
|
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).
|
* Gets the page map routines for basic paging mode (non-XPA).
|
||||||
*
|
*
|
||||||
@@ -90,6 +199,8 @@ MM::PPAGEMAP
|
|||||||
MM::Paging::GetPageMapBasicRoutines(VOID)
|
MM::Paging::GetPageMapBasicRoutines(VOID)
|
||||||
{
|
{
|
||||||
static MM::PageMapBasic PageMapBasicRoutines;
|
static MM::PageMapBasic PageMapBasicRoutines;
|
||||||
|
|
||||||
|
/* Return non-XPA page map routines */
|
||||||
return &PageMapBasicRoutines;
|
return &PageMapBasicRoutines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +216,8 @@ MM::PPAGEMAP
|
|||||||
MM::Paging::GetPageMapXpaRoutines(VOID)
|
MM::Paging::GetPageMapXpaRoutines(VOID)
|
||||||
{
|
{
|
||||||
static MM::PageMapXpa PageMapXpaRoutines;
|
static MM::PageMapXpa PageMapXpaRoutines;
|
||||||
|
|
||||||
|
/* Return XPA page map routines */
|
||||||
return &PageMapXpaRoutines;
|
return &PageMapXpaRoutines;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,11 +233,30 @@ MM::Paging::GetPageMapXpaRoutines(VOID)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPDE
|
PMMPDE
|
||||||
MM::Paging::GetPdeAddress(PVOID Address)
|
MM::Paging::GetPdeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
|
/* Return PDE address */
|
||||||
return PmlRoutines->GetPdeAddress(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.
|
* 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
|
XTAPI
|
||||||
PMMPPE
|
PMMPPE
|
||||||
MM::Paging::GetPpeAddress(PVOID Address)
|
MM::Paging::GetPpeAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
|
/* Return PPE address */
|
||||||
return PmlRoutines->GetPpeAddress(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.
|
* Gets the address of the PTE (Page Table Entry), that maps given address.
|
||||||
*
|
*
|
||||||
@@ -154,11 +305,59 @@ MM::Paging::GetPpeAddress(PVOID Address)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
PMMPTE
|
PMMPTE
|
||||||
MM::Paging::GetPteAddress(PVOID Address)
|
MM::Paging::GetPteAddress(IN PVOID Address)
|
||||||
{
|
{
|
||||||
|
/* Return PTE address */
|
||||||
return PmlRoutines->GetPteAddress(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.
|
* Detects if eXtended Physical Addressing (XPA) is enabled and initializes page map support.
|
||||||
*
|
*
|
||||||
@@ -198,22 +397,20 @@ MM::Paging::InitializePageMapSupport(VOID)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
MM::Paging::PteValid(PHARDWARE_PTE PtePointer)
|
MM::Paging::PteValid(IN PMMPTE PtePointer)
|
||||||
{
|
{
|
||||||
|
/* Check if PTE is valid */
|
||||||
return PmlRoutines->PteValid(PtePointer);
|
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
|
* @param Pte
|
||||||
* Pointer to the page table entry (PTE) to set.
|
* The PTE pointer to modify.
|
||||||
*
|
*
|
||||||
* @param PageFrameNumber
|
* @param Value
|
||||||
* Physical frame number to map.
|
* The value to set as the next entry.
|
||||||
*
|
|
||||||
* @param Writable
|
|
||||||
* Indicates whether the page should be writable.
|
|
||||||
*
|
*
|
||||||
* @return This routine does not return any value.
|
* @return This routine does not return any value.
|
||||||
*
|
*
|
||||||
@@ -221,11 +418,59 @@ MM::Paging::PteValid(PHARDWARE_PTE PtePointer)
|
|||||||
*/
|
*/
|
||||||
XTAPI
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::Paging::SetPte(PHARDWARE_PTE PtePointer,
|
MM::Paging::SetNextEntry(IN PMMPTE Pte,
|
||||||
PFN_NUMBER PageFrameNumber,
|
IN ULONG_PTR Value)
|
||||||
BOOLEAN Writable)
|
|
||||||
{
|
{
|
||||||
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
|
XTAPI
|
||||||
VOID
|
VOID
|
||||||
MM::Paging::SetPteCaching(PHARDWARE_PTE PtePointer,
|
MM::Paging::SetPteCaching(IN PMMPTE PtePointer,
|
||||||
BOOLEAN CacheDisable,
|
IN BOOLEAN CacheDisable,
|
||||||
BOOLEAN WriteThrough)
|
IN BOOLEAN WriteThrough)
|
||||||
{
|
{
|
||||||
|
/* Set caching attributes */
|
||||||
PmlRoutines->SetPteCaching(PtePointer, CacheDisable, WriteThrough);
|
PmlRoutines->SetPteCaching(PtePointer, CacheDisable, WriteThrough);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user