Compare commits

24 Commits

Author SHA1 Message Date
c710ec4688 Refactor XPA detection API
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 32s
Builds / ExectOS (amd64, release) (push) Successful in 31s
Builds / ExectOS (i686, release) (push) Successful in 25s
Builds / ExectOS (i686, debug) (push) Successful in 28s
2025-12-04 23:07:59 +01:00
8054bb915a Fix incorrect pointer types
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (amd64, release) (push) Successful in 29s
Builds / ExectOS (i686, release) (push) Successful in 26s
Builds / ExectOS (i686, debug) (push) Successful in 27s
2025-11-30 20:06:51 +01:00
86aa22e5f8 Fix incorrect pointer types
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 28s
Builds / ExectOS (amd64, release) (push) Successful in 25s
Builds / ExectOS (i686, release) (push) Successful in 26s
Builds / ExectOS (i686, debug) (push) Successful in 28s
2025-11-30 20:03:12 +01:00
4a7494ad3f Split paging interface into arch-specific code
Some checks failed
Builds / ExectOS (amd64, release) (push) Successful in 26s
Builds / ExectOS (amd64, debug) (push) Successful in 28s
Builds / ExectOS (i686, debug) (push) Failing after 21s
Builds / ExectOS (i686, release) (push) Failing after 21s
2025-11-30 19:19:32 +01:00
d4287198b0 Implement virtual address resolvers for all page map levels and add XPA status accessor
Some checks failed
Builds / ExectOS (amd64, release) (push) Successful in 28s
Builds / ExectOS (amd64, debug) (push) Successful in 30s
Builds / ExectOS (i686, release) (push) Failing after 22s
Builds / ExectOS (i686, debug) (push) Failing after 24s
2025-11-30 18:23:51 +01:00
4265ae92d0 Add MM::PageMap::GetXpaStatus() for querying PML level
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 27s
Builds / ExectOS (amd64, debug) (push) Successful in 28s
Builds / ExectOS (i686, release) (push) Successful in 26s
Builds / ExectOS (i686, debug) (push) Successful in 27s
2025-11-29 23:45:00 +01:00
931586eebd Refactor PageMap to enable architecture-specific VA translation
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 26s
Builds / ExectOS (amd64, release) (push) Successful in 24s
Builds / ExectOS (i686, release) (push) Successful in 24s
Builds / ExectOS (i686, debug) (push) Successful in 26s
2025-11-29 23:37:08 +01:00
c099882866 Add PFN_COUNT typedef
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 29s
Builds / ExectOS (amd64, release) (push) Successful in 27s
Builds / ExectOS (i686, release) (push) Successful in 26s
Builds / ExectOS (i686, debug) (push) Successful in 28s
2025-11-29 23:14:30 +01:00
0097cb88d7 Correct LA57 paging base addresses, add self-map constants and extend PTE structures
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 8m33s
Builds / ExectOS (amd64, release) (push) Successful in 8m31s
Builds / ExectOS (i686, release) (push) Successful in 29s
Builds / ExectOS (i686, debug) (push) Successful in 31s
2025-11-29 23:11:54 +01:00
20b0bfdfad Add kernel parameters section and fix minor formatting issues
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 30s
Builds / ExectOS (amd64, debug) (push) Successful in 32s
Builds / ExectOS (i686, debug) (push) Successful in 30s
Builds / ExectOS (i686, release) (push) Successful in 28s
2025-11-17 23:19:16 +01:00
35523a230a Prevent duplicate object generation by linking xtoskrnl with libxtos
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 39s
Builds / ExectOS (amd64, debug) (push) Successful in 41s
Builds / ExectOS (i686, debug) (push) Successful in 32s
Builds / ExectOS (i686, release) (push) Successful in 29s
2025-11-17 23:15:22 +01:00
7b11a8feb1 Add page list and PTE pool type enums
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 33s
Builds / ExectOS (amd64, release) (push) Successful in 32s
Builds / ExectOS (i686, debug) (push) Successful in 32s
Builds / ExectOS (i686, release) (push) Successful in 30s
2025-11-06 06:55:31 +01:00
0cf178a648 Fix class name
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 32s
Builds / ExectOS (amd64, release) (push) Successful in 30s
Builds / ExectOS (i686, debug) (push) Successful in 31s
Builds / ExectOS (i686, release) (push) Successful in 29s
2025-11-04 23:10:02 +01:00
66f27e4b9a Add GetPageFrameNumber() to PTE interfaces
Some checks failed
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (amd64, release) (push) Successful in 29s
Builds / ExectOS (i686, debug) (push) Failing after 24s
Builds / ExectOS (i686, release) (push) Failing after 23s
2025-11-04 23:03:47 +01:00
10b8ab347a Make MM::Paging::GetExtendedPhysicalAddressingStatus public
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 32s
Builds / ExectOS (amd64, debug) (push) Successful in 33s
Builds / ExectOS (i686, release) (push) Successful in 29s
Builds / ExectOS (i686, debug) (push) Successful in 30s
2025-11-04 22:51:34 +01:00
071c840ca8 Replace writable flag with AttributesMask in PTE setup
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 29s
Builds / ExectOS (amd64, debug) (push) Successful in 33s
Builds / ExectOS (i686, debug) (push) Successful in 31s
Builds / ExectOS (i686, release) (push) Successful in 30s
2025-11-04 17:34:49 +01:00
dda8f88830 Add PTE attribute definitions
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 29s
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (i686, debug) (push) Successful in 30s
Builds / ExectOS (i686, release) (push) Successful in 28s
2025-11-04 17:26:47 +01:00
cb2da54956 Unify PTE pointer types across MM subsystem
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 29s
Builds / ExectOS (amd64, release) (push) Successful in 27s
Builds / ExectOS (i686, debug) (push) Successful in 31s
Builds / ExectOS (i686, release) (push) Successful in 29s
2025-11-03 22:13:32 +01:00
fd13091476 Unify MMPML2_PTE field naming convention
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (amd64, release) (push) Successful in 30s
Builds / ExectOS (i686, debug) (push) Successful in 35s
Builds / ExectOS (i686, release) (push) Successful in 33s
2025-11-03 22:02:59 +01:00
c28c3f8344 Add input qualifiers to page map interface definitions
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 32s
Builds / ExectOS (amd64, release) (push) Successful in 31s
Builds / ExectOS (i686, debug) (push) Successful in 30s
Builds / ExectOS (i686, release) (push) Successful in 29s
2025-11-03 20:04:21 +01:00
dfb0284427 Add input qualifiers to paging interface definitions
All checks were successful
Builds / ExectOS (amd64, release) (push) Successful in 34s
Builds / ExectOS (amd64, debug) (push) Successful in 36s
Builds / ExectOS (i686, release) (push) Successful in 30s
Builds / ExectOS (i686, debug) (push) Successful in 31s
2025-11-03 16:00:46 +01:00
1150b9ecdb Add PTE management routines
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (amd64, release) (push) Successful in 30s
Builds / ExectOS (i686, debug) (push) Successful in 28s
Builds / ExectOS (i686, release) (push) Successful in 27s
2025-10-30 22:03:25 +01:00
f6dac12057 Add missing EmptyPteList field to MMPAGEMAP_INFO
All checks were successful
Builds / ExectOS (amd64, debug) (push) Successful in 31s
Builds / ExectOS (amd64, release) (push) Successful in 30s
Builds / ExectOS (i686, debug) (push) Successful in 30s
Builds / ExectOS (i686, release) (push) Successful in 27s
2025-10-30 20:19:35 +01:00
ffa480d69a Implement unified PTE accessors and management helpers
Some checks failed
Builds / ExectOS (amd64, debug) (push) Failing after 26s
Builds / ExectOS (amd64, release) (push) Failing after 24s
Builds / ExectOS (i686, debug) (push) Failing after 27s
Builds / ExectOS (i686, release) (push) Failing after 25s
2025-10-30 20:14:02 +01:00
18 changed files with 1704 additions and 205 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -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 bootloaders 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:

View File

@@ -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 */

View File

@@ -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 */

View 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 */

View File

@@ -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);
}; };
} }

View 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 */

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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.
* *

View File

@@ -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++)

View File

@@ -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;
} }

View File

@@ -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);
} }