summaryrefslogtreecommitdiffhomepage
path: root/Private/Source/PageManager.cxx
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-29 18:17:47 +0100
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-01-29 18:18:59 +0100
commit65254486efff0fd1bb78a48ff90b7713a5ce539f (patch)
tree20ce02c12a74ba9e6cd382bf9c1f09a0c611cb4d /Private/Source/PageManager.cxx
parentf03986937db0b927da4b10554801e18e4dc7c43f (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.cxx245
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