summaryrefslogtreecommitdiffhomepage
path: root/Private/Source
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-01 17:24:09 +0100
committerAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-01 17:24:09 +0100
commit6ce7dffe92775f262384a028af233999a7d18048 (patch)
tree985e7e39fd9657ceb45ab292f6a934e0e6d4571b /Private/Source
parent26ceef5cccbb40b00a302979ed297243b356feff (diff)
Kernel: Really big improvements on Paged Memory Model.
Bootloader: Design shift in BFileReader class. Signed-off-by: Amlal El Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Private/Source')
-rw-r--r--Private/Source/KernelHeap.cxx29
-rw-r--r--Private/Source/PageManager.cxx21
-rw-r--r--Private/Source/Pmm.cxx9
3 files changed, 46 insertions, 13 deletions
diff --git a/Private/Source/KernelHeap.cxx b/Private/Source/KernelHeap.cxx
index 42ea0187..603b91b3 100644
--- a/Private/Source/KernelHeap.cxx
+++ b/Private/Source/KernelHeap.cxx
@@ -9,6 +9,8 @@
#include <NewKit/KernelHeap.hpp>
+#include "NewKit/PageManager.hpp"
+
//! @file KernelHeap.cpp
//! @brief Kernel allocator.
@@ -48,6 +50,8 @@ VoidPtr ke_new_ke_heap(const SizeT &sz, const bool rw, const bool user) {
Ref<PTEWrapper *> wrapper = kPmm.RequestPage(user, rw);
if (wrapper) {
+ wrapper->NoExecute(true);
+
kLastWrapper = wrapper;
kWrapperList[kWrapperCount] = wrapper;
@@ -67,15 +71,27 @@ Int32 ke_delete_ke_heap(voidPtr ptr) {
const UIntPtr virtualAddress = reinterpret_cast<UIntPtr>(ptr);
if (kLastWrapper && virtualAddress == kLastWrapper->VirtualAddress()) {
- return kPmm.FreePage(kLastWrapper);
+ if (kPmm.FreePage(kLastWrapper)) {
+ kLastWrapper->NoExecute(false);
+ return true;
+ }
+
+ return false;
}
- Ref<PTEWrapper *> wrapper;
+ Ref<PTEWrapper *> wrapper{nullptr};
for (SizeT indexWrapper = 0; indexWrapper < kWrapperCount; ++indexWrapper) {
if (kWrapperList[indexWrapper]->VirtualAddress() == virtualAddress) {
wrapper = kWrapperList[indexWrapper];
- return kPmm.FreePage(wrapper);
+
+ // if page is no more, then mark it also as non executable.
+ if (kPmm.FreePage(wrapper)) {
+ wrapper->NoExecute(false);
+ return true;
+ }
+
+ return false;
}
}
}
@@ -108,11 +124,10 @@ Boolean kernel_valid_ptr(voidPtr ptr) {
}
/// @brief The Kernel heap initializer function.
-/// @return
-Void ke_init_ke_heap() noexcept
-{
+/// @return
+Void ke_init_ke_heap() noexcept {
kWrapperCount = 0UL;
- Ref<PTEWrapper *> kLastWrapper = Ref<PTEWrapper*>(nullptr);
+ Ref<PTEWrapper *> kLastWrapper = Ref<PTEWrapper *>(nullptr);
Pmm kPmm = Pmm();
}
} // namespace HCore
diff --git a/Private/Source/PageManager.cxx b/Private/Source/PageManager.cxx
index 95097f99..d6455a18 100644
--- a/Private/Source/PageManager.cxx
+++ b/Private/Source/PageManager.cxx
@@ -85,8 +85,20 @@ bool PageManager::Free(Ref<PTEWrapper *> &wrapper) {
return false;
}
+////////////////////////////
+
+// VIRTUAL ADDRESS
+
+////////////////////////////
+
const UIntPtr &PTEWrapper::VirtualAddress() { return m_VirtAddr; }
+////////////////////////////
+
+// PAGE GETTERS
+
+////////////////////////////
+
bool PTEWrapper::Shareable() {
auto raw = reinterpret_cast<PTE *>(m_VirtAddr);
@@ -120,4 +132,13 @@ bool PTEWrapper::Access() {
return m_Accessed;
}
+
+////////////////////////////
+
+// NO EXECUTE PROTECTION
+
+////////////////////////////
+
+void PTEWrapper::NoExecute(const bool enable) { this->m_ExecDisable = enable; }
+const bool &PTEWrapper::NoExecute() { return this->m_ExecDisable; }
} // namespace HCore
diff --git a/Private/Source/Pmm.cxx b/Private/Source/Pmm.cxx
index aa5a3c89..76191fdd 100644
--- a/Private/Source/Pmm.cxx
+++ b/Private/Source/Pmm.cxx
@@ -11,11 +11,8 @@
#include <NewKit/Pmm.hpp>
namespace HCore {
-Pmm::Pmm() = default;
-
-Pmm::Pmm(Ref<PageManager *> &pm) : m_PageManager(pm) {
- MUST_PASS(pm.Leak());
- kcout << "[PMM] New PhysicalMemoryManager\r\n";
+Pmm::Pmm() : m_PageManager() {
+ kcout << "[PMM] Allocate PageMemoryManager\r\n";
}
Pmm::~Pmm() = default;
@@ -23,7 +20,7 @@ Pmm::~Pmm() = default;
/* If this returns Null pointer, enter emergency mode */
Ref<PTEWrapper *> Pmm::RequestPage(Boolean user, Boolean readWrite) {
if (m_PageManager) {
- PTEWrapper *pt = m_PageManager.Leak()->Request(user, readWrite, true);
+ PTEWrapper *pt = m_PageManager.Leak().Request(user, readWrite, true);
if (pt) return Ref<PTEWrapper *>(pt);