From 00cda98a6233dce7b1ba4c8496959f36e8f53ee8 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 1 Nov 2022 19:57:15 +0200 Subject: [PATCH] Added Check() function --- Core/Memory/VirtualMemoryManager.cpp | 22 ++++++++++++++++++++++ include/memory.hpp | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/Core/Memory/VirtualMemoryManager.cpp b/Core/Memory/VirtualMemoryManager.cpp index 748ca91..91cf0f9 100644 --- a/Core/Memory/VirtualMemoryManager.cpp +++ b/Core/Memory/VirtualMemoryManager.cpp @@ -5,6 +5,28 @@ namespace Memory { + bool Virtual::Check(void *VirtualAddress) + { + // 0x1000 aligned + uint64_t Address = (uint64_t)VirtualAddress; + Address &= 0xFFFFFFFFFFFFF000; + debug("%#lx=>%#lx", VirtualAddress, Address); + + PageMapIndexer Index = PageMapIndexer((uint64_t)Address); + PageDirectoryEntry PDE = this->Table->Entries[Index.PDP_i]; + debug("%x %x %x %x %x %x %x %x %x %x %x %p-%#llx", + PDE.Value.Present, PDE.Value.ReadWrite, + PDE.Value.UserSupervisor, PDE.Value.WriteThrough, + PDE.Value.CacheDisable, PDE.Value.Accessed, + PDE.Value.Dirty, PDE.Value.PageSize, + PDE.Value.Global, PDE.Value.PageAttributeTable, + PDE.Value.ExecuteDisable, PDE.GetAddress(), + PDE.Value); + if (!PDE.GetFlag(PTFlag::P)) + return false; + return true; + } + void Virtual::Map(void *VirtualAddress, void *PhysicalAddress, uint64_t Flags) { SmartLock(this->MemoryLock); diff --git a/include/memory.hpp b/include/memory.hpp index 929221a..f8c05be 100644 --- a/include/memory.hpp +++ b/include/memory.hpp @@ -389,6 +389,15 @@ namespace Memory }; public: + /** + * @brief Check if page is present + * + * @param VirtualAddress Virtual address of the page + * @return true if page is present + * @return false if page is not present + */ + bool Check(void *VirtualAddress); + /** * @brief Map page. * @@ -397,6 +406,7 @@ namespace Memory * @param Flags Flags of the page. Check PTFlag enum. */ void Map(void *VirtualAddress, void *PhysicalAddress, uint64_t Flags); + /** * @brief Map multiple pages. * @@ -406,12 +416,14 @@ namespace Memory * @param Flags Flags of the page. Check PTFlag enum. */ void Map(void *VirtualAddress, void *PhysicalAddress, uint64_t PageCount, uint64_t Flags); + /** * @brief Unmap page. * * @param VirtualAddress Virtual address of the page. */ void Unmap(void *VirtualAddress); + /** * @brief Unmap multiple pages. * @@ -419,12 +431,14 @@ namespace Memory * @param PageCount Number of pages. */ void Unmap(void *VirtualAddress, uint64_t PageCount); + /** * @brief Construct a new Virtual object * * @param Table Page table. If null, it will use the current page table. */ Virtual(PageTable *Table = nullptr); + /** * @brief Destroy the Virtual object *