diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-29 18:17:47 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-01-29 18:18:59 +0100 |
| commit | 65254486efff0fd1bb78a48ff90b7713a5ce539f (patch) | |
| tree | 20ce02c12a74ba9e6cd382bf9c1f09a0c611cb4d /Private/Source/PageManager.cxx | |
| parent | f03986937db0b927da4b10554801e18e4dc7c43f (diff) | |
Kernel: Update TODO.
Src: Refactorings according to clang-format.
Meta: Update specification.
Public: Remove useless UIKit.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/Source/PageManager.cxx')
| -rw-r--r-- | Private/Source/PageManager.cxx | 245 |
1 files changed, 111 insertions, 134 deletions
diff --git a/Private/Source/PageManager.cxx b/Private/Source/PageManager.cxx index fc6b8e80..32c1f22a 100644 --- a/Private/Source/PageManager.cxx +++ b/Private/Source/PageManager.cxx @@ -10,137 +10,114 @@ #include <KernelKit/DebugOutput.hpp> #include <NewKit/PageManager.hpp> -namespace hCore -{ - PTEWrapper::PTEWrapper(Boolean Rw, Boolean User, Boolean ExecDisable, UIntPtr VirtAddr) - : m_Rw(Rw), - m_User(User), - m_ExecDisable(ExecDisable), - m_VirtAddr(VirtAddr), - m_Cache(false), - m_Shareable(false), - m_Wt(false), - m_Present(true), - m_Accessed(false) - { - // special case for the null region. - if (VirtAddr == 0) - { - m_Wt = false; - m_Rw = false; - m_Cache = false; - m_Shareable = false; - } - } - - PTEWrapper::~PTEWrapper() - { - PTE* raw = reinterpret_cast<PTE*>(m_VirtAddr); - - MUST_PASS(raw); - MUST_PASS(!raw->Accessed); - - if (raw->Present) - raw->Present = false; - } - - void PTEWrapper::FlushTLB(Ref<PageManager> &pm) - { - pm.Leak().FlushTLB(this->m_VirtAddr); - } - - void PageManager::FlushTLB(UIntPtr VirtAddr) - { - if (VirtAddr == kBadAddress) - return; - - flush_tlb(VirtAddr); - } - - bool PTEWrapper::Reclaim() - { - if (!this->m_Present) - { - this->m_Present = true; - return true; - } - - return false; - } - - PTEWrapper *PageManager::Request(Boolean Rw, Boolean User, Boolean ExecDisable) - { - PTEWrapper *PageTableEntry = - reinterpret_cast<PTEWrapper*>(hCore::HAL::hal_alloc_page(sizeof(PTEWrapper), Rw, User)); - - if (PageTableEntry == nullptr) { - kcout << "PTEWrapper : Page table is nullptr!, kernel_new_ptr failed!"; - return nullptr; - } - - *PageTableEntry = PTEWrapper{Rw, User, ExecDisable, Detail::create_page_wrapper(Rw, User)}; - return PageTableEntry; - } - - bool PageManager::Free(Ref<PTEWrapper*> &wrapper) - { - if (wrapper) { - if (!Detail::page_disable(wrapper->VirtualAddress())) - return false; - - this->FlushTLB(wrapper->VirtualAddress()); - return true; - } - - return false; - } - - const UIntPtr &PTEWrapper::VirtualAddress() - { - return m_VirtAddr; - } - - bool PTEWrapper::Shareable() - { - auto raw = reinterpret_cast<PTE*>(m_VirtAddr); - - if (raw->Present) - { - m_Shareable = raw->Shared; - return m_Shareable; - } - else - { - kcout << "[PTEWrapper::Shareable] page is not present!"; - return false; - } - } - - bool PTEWrapper::Present() - { - auto raw = reinterpret_cast<PTE*>(m_VirtAddr); - - if (raw->Present) - { - m_Present = raw->Present; - return m_Present; - } - else - { - kcout << "[PTEWrapper::Present] page is not present!"; - return false; - } - } - - bool PTEWrapper::Access() - { - auto raw = reinterpret_cast<PTE*>(m_VirtAddr); - - if (raw->Present) - { - m_Accessed = raw->Accessed; - } - - return m_Accessed; - } -} // namespace hCore +namespace hCore { +PTEWrapper::PTEWrapper(Boolean Rw, Boolean User, Boolean ExecDisable, + UIntPtr VirtAddr) + : m_Rw(Rw), + m_User(User), + m_ExecDisable(ExecDisable), + m_VirtAddr(VirtAddr), + m_Cache(false), + m_Shareable(false), + m_Wt(false), + m_Present(true), + m_Accessed(false) { + // special case for the null region. + if (VirtAddr == 0) { + m_Wt = false; + m_Rw = false; + m_Cache = false; + m_Shareable = false; + } +} + +PTEWrapper::~PTEWrapper() { + PTE *raw = reinterpret_cast<PTE *>(m_VirtAddr); + + MUST_PASS(raw); + MUST_PASS(!raw->Accessed); + + if (raw->Present) raw->Present = false; +} + +void PTEWrapper::FlushTLB(Ref<PageManager> &pm) { + pm.Leak().FlushTLB(this->m_VirtAddr); +} + +void PageManager::FlushTLB(UIntPtr VirtAddr) { + if (VirtAddr == kBadAddress) return; + + flush_tlb(VirtAddr); +} + +bool PTEWrapper::Reclaim() { + if (!this->m_Present) { + this->m_Present = true; + return true; + } + + return false; +} + +PTEWrapper *PageManager::Request(Boolean Rw, Boolean User, + Boolean ExecDisable) { + PTEWrapper *PageTableEntry = reinterpret_cast<PTEWrapper *>( + hCore::HAL::hal_alloc_page(sizeof(PTEWrapper), Rw, User)); + + if (PageTableEntry == nullptr) { + kcout << "PTEWrapper : Page table is nullptr!, kernel_new_ptr failed!"; + return nullptr; + } + + *PageTableEntry = + PTEWrapper{Rw, User, ExecDisable, Detail::create_page_wrapper(Rw, User)}; + return PageTableEntry; +} + +bool PageManager::Free(Ref<PTEWrapper *> &wrapper) { + if (wrapper) { + if (!Detail::page_disable(wrapper->VirtualAddress())) return false; + + this->FlushTLB(wrapper->VirtualAddress()); + return true; + } + + return false; +} + +const UIntPtr &PTEWrapper::VirtualAddress() { return m_VirtAddr; } + +bool PTEWrapper::Shareable() { + auto raw = reinterpret_cast<PTE *>(m_VirtAddr); + + if (raw->Present) { + m_Shareable = raw->Shared; + return m_Shareable; + } else { + kcout << "[PTEWrapper::Shareable] page is not present!"; + return false; + } +} + +bool PTEWrapper::Present() { + auto raw = reinterpret_cast<PTE *>(m_VirtAddr); + + if (raw->Present) { + m_Present = raw->Present; + return m_Present; + } else { + kcout << "[PTEWrapper::Present] page is not present!"; + return false; + } +} + +bool PTEWrapper::Access() { + auto raw = reinterpret_cast<PTE *>(m_VirtAddr); + + if (raw->Present) { + m_Accessed = raw->Accessed; + } + + return m_Accessed; +} +} // namespace hCore |
