summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/src/Pmm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/src/Pmm.cpp')
-rw-r--r--src/kernel/src/Pmm.cpp74
1 files changed, 74 insertions, 0 deletions
diff --git a/src/kernel/src/Pmm.cpp b/src/kernel/src/Pmm.cpp
new file mode 100644
index 00000000..88635518
--- /dev/null
+++ b/src/kernel/src/Pmm.cpp
@@ -0,0 +1,74 @@
+// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org)
+// Licensed under the Apache License, Version 2.0 (see LICENSE file)
+// Official repository: https://github.com/nekernel-org/nekernel
+
+#include <ArchKit/ArchKit.h>
+#include <KernelKit/DebugOutput.h>
+#include <NeKit/Pmm.h>
+
+namespace Kernel {
+/***********************************************************************************/
+/// @brief Pmm constructor.
+/***********************************************************************************/
+Pmm::Pmm() : fPageMgr() {
+ kout << "[PMM] Allocate PageMemoryMgr.\r";
+}
+
+Pmm::~Pmm() = default;
+
+/***********************************************************************************/
+/// @param If this returns Null pointer, enter emergency mode.
+/// @param user is this a user page?
+/// @param readWrite is it r/w?
+/***********************************************************************************/
+Ref<PTEWrapper> Pmm::RequestPage(Boolean user, Boolean readWrite) {
+ PTEWrapper pt = fPageMgr.Leak().Request(user, readWrite, false, kPageSize, 0);
+
+ if (pt.fPresent) {
+ kout << "[PMM]: Allocation failed.\r";
+ return {pt};
+ }
+
+ return Ref<PTEWrapper>(pt);
+}
+
+Boolean Pmm::FreePage(Ref<PTEWrapper> PageRef) {
+ if (!PageRef) return false;
+
+ PageRef.Leak().fPresent = false;
+
+ return true;
+}
+
+Boolean Pmm::TogglePresent(Ref<PTEWrapper> PageRef, Boolean Enable) {
+ if (!PageRef) return false;
+
+ PageRef.Leak().fPresent = Enable;
+
+ return true;
+}
+
+Boolean Pmm::ToggleUser(Ref<PTEWrapper> PageRef, Boolean Enable) {
+ if (!PageRef) return false;
+
+ PageRef.Leak().fRw = Enable;
+
+ return true;
+}
+
+Boolean Pmm::ToggleRw(Ref<PTEWrapper> PageRef, Boolean Enable) {
+ if (!PageRef) return false;
+
+ PageRef.Leak().fRw = Enable;
+
+ return true;
+}
+
+Boolean Pmm::ToggleShare(Ref<PTEWrapper> PageRef, Boolean Enable) {
+ if (!PageRef) return false;
+
+ PageRef.Leak().fShareable = Enable;
+
+ return true;
+}
+} // namespace Kernel