/* ------------------------------------------- Copyright SoftwareLabs ------------------------------------------- */ #include #include namespace NewOS { /// @brief Pmm constructor. Pmm::Pmm() : fPageManager() { kcout << "[PMM] Allocate PageMemoryManager"; } Pmm::~Pmm() = default; /* If this returns Null pointer, enter emergency mode */ /// @param user is this a user page? /// @param readWrite is it r/w? Ref Pmm::RequestPage(Boolean user, Boolean readWrite) { PTEWrapper pt = fPageManager.Leak().Request(user, readWrite, false, kPTESize); if (pt.fPresent) { kcout << "[PMM]: Allocation was successful.\r"; return Ref(pt); } kcout << "[PMM]: Allocation failed.\r"; return {}; } Boolean Pmm::FreePage(Ref PageRef) { if (!PageRef) return false; PageRef.Leak().fPresent = false; return true; } Boolean Pmm::TogglePresent(Ref PageRef, Boolean Enable) { if (!PageRef) return false; PageRef.Leak().fPresent = Enable; return true; } Boolean Pmm::ToggleUser(Ref PageRef, Boolean Enable) { if (!PageRef) return false; PageRef.Leak().fRw = Enable; return true; } Boolean Pmm::ToggleRw(Ref PageRef, Boolean Enable) { if (!PageRef) return false; PageRef.Leak().fRw = Enable; return true; } Boolean Pmm::ToggleShare(Ref PageRef, Boolean Enable) { if (!PageRef) return false; PageRef.Leak().fShareable = Enable; return true; } } // namespace NewOS