diff --git a/xtoskrnl/includes/mm/amd64/pte.hh b/xtoskrnl/includes/mm/amd64/pte.hh index 70c7c9d..d07ac04 100644 --- a/xtoskrnl/includes/mm/amd64/pte.hh +++ b/xtoskrnl/includes/mm/amd64/pte.hh @@ -19,6 +19,7 @@ namespace MM { private: STATIC MMPTE FirstSystemFreePte[MaximumPtePoolTypes]; + STATIC ULONG_PTR ListTerminator; STATIC PMMPTE SystemPteBase; STATIC PMMPTE SystemPtesEnd[MaximumPtePoolTypes]; STATIC PMMPTE SystemPtesStart[MaximumPtePoolTypes]; @@ -31,7 +32,7 @@ namespace MM STATIC XTAPI PMMPTE GetSystemPteBaseAddress(VOID); STATIC XTAPI PMMPTE GetValidPte(VOID); STATIC XTAPI VOID InitializePageTable(VOID); - STATIC XTAPI VOID InitializePteTemplate(VOID); + STATIC XTAPI VOID InitializeSystemPte(VOID); STATIC XTAPI VOID InitializeSystemPteSpace(VOID); STATIC XTAPI VOID MapP5E(PVOID StartAddress, PVOID EndAddress, diff --git a/xtoskrnl/includes/mm/i686/pte.hh b/xtoskrnl/includes/mm/i686/pte.hh index 4576f48..44bd064 100644 --- a/xtoskrnl/includes/mm/i686/pte.hh +++ b/xtoskrnl/includes/mm/i686/pte.hh @@ -19,6 +19,7 @@ namespace MM { private: STATIC MMPTE FirstSystemFreePte[MaximumPtePoolTypes]; + STATIC ULONG_PTR ListTerminator; STATIC PMMPTE SystemPteBase; STATIC PMMPTE SystemPtesEnd[MaximumPtePoolTypes]; STATIC PMMPTE SystemPtesStart[MaximumPtePoolTypes]; @@ -31,7 +32,7 @@ namespace MM STATIC XTAPI PMMPTE GetSystemPteBaseAddress(VOID); STATIC XTAPI PMMPTE GetValidPte(VOID); STATIC XTAPI VOID InitializePageTable(VOID); - STATIC XTAPI VOID InitializePteTemplate(VOID); + STATIC XTAPI VOID InitializeSystemPte(VOID); STATIC XTAPI VOID InitializeSystemPteSpace(VOID); STATIC XTAPI VOID MapPDE(PVOID StartAddress, PVOID EndAddress, diff --git a/xtoskrnl/mm/amd64/pte.cc b/xtoskrnl/mm/amd64/pte.cc index 540f40f..a095915 100644 --- a/xtoskrnl/mm/amd64/pte.cc +++ b/xtoskrnl/mm/amd64/pte.cc @@ -154,7 +154,7 @@ MM::Pte::InitializePageTable(VOID) } /** - * Initializes the PTE template. + * Initializes the system's PTE. * * @return This routine does not return any value. * @@ -162,9 +162,13 @@ MM::Pte::InitializePageTable(VOID) */ XTAPI VOID -MM::Pte::InitializePteTemplate(VOID) +MM::Pte::InitializeSystemPte(VOID) { + /* Initialize the PTE template */ ValidPte = {MM_PTE_VALID|MM_PTE_EXECUTE_READWRITE|MM_PTE_DIRTY|MM_PTE_ACCESSED}; + + /* Initialize the system's PTE list terminator */ + ListTerminator = MM::Paging::GetPteListTerminator(); } /** diff --git a/xtoskrnl/mm/data.cc b/xtoskrnl/mm/data.cc index be3c853..27a29b4 100644 --- a/xtoskrnl/mm/data.cc +++ b/xtoskrnl/mm/data.cc @@ -97,6 +97,9 @@ MMPFNLIST MM::Pfn::ZeroedPagesList = {0, ZeroedPageList, MAXULONG_PTR, MAXULONG_ /* Array of lists for available System PTEs, separated by pool type */ MMPTE MM::Pte::FirstSystemFreePte[MaximumPtePoolTypes]; +/* PTE list terminator */ +ULONG_PTR MM::Pte::ListTerminator; + /* Virtual base address of the System PTE space */ PMMPTE MM::Pte::SystemPteBase; diff --git a/xtoskrnl/mm/i686/pte.cc b/xtoskrnl/mm/i686/pte.cc index e46a64f..be5e591 100644 --- a/xtoskrnl/mm/i686/pte.cc +++ b/xtoskrnl/mm/i686/pte.cc @@ -113,7 +113,7 @@ MM::Pte::InitializePageTable(VOID) } /** - * Initializes the PTE template. + * Initializes the system's PTE. * * @return This routine does not return any value. * @@ -121,9 +121,13 @@ MM::Pte::InitializePageTable(VOID) */ XTAPI VOID -MM::Pte::InitializePteTemplate(VOID) +MM::Pte::InitializeSystemPte(VOID) { + /* Initialize the PTE template */ ValidPte = {{MM_PTE_VALID|MM_PTE_EXECUTE_READWRITE|MM_PTE_DIRTY|MM_PTE_ACCESSED}}; + + /* Initialize the system's PTE list terminator */ + ListTerminator = MM::Paging::GetPteListTerminator(); } /** diff --git a/xtoskrnl/mm/mmgr.cc b/xtoskrnl/mm/mmgr.cc index 50fd8ba..29fa31e 100644 --- a/xtoskrnl/mm/mmgr.cc +++ b/xtoskrnl/mm/mmgr.cc @@ -64,7 +64,7 @@ MM::Manager::InitializeMemoryManager(VOID) InitializeMemoryLayout(); /* Initialize PTE template */ - MM::Pte::InitializePteTemplate(); + MM::Pte::InitializeSystemPte(); /* Initialize page table */ MM::Pte::InitializePageTable();