diff --git a/kernel/orbis/src/blockpool.cpp b/kernel/orbis/src/blockpool.cpp index 6379f1ac5..881cafaf7 100644 --- a/kernel/orbis/src/blockpool.cpp +++ b/kernel/orbis/src/blockpool.cpp @@ -7,6 +7,7 @@ #include "rx/MemoryTable.hpp" #include "rx/die.hpp" #include "rx/format.hpp" +#include "rx/print.hpp" #include "thread/Process.hpp" #include "vmem.hpp" #include @@ -272,6 +273,13 @@ void orbis::blockpool::clear() { } orbis::ErrorCode orbis::blockpool::expand(rx::AddressRange dmemRange) { + rx::println(stderr, "blockpool::expand({:x}-{:x})", dmemRange.beginAddress(), + dmemRange.endAddress()); + + if (!dmemRange.isValid()) { + return ErrorCode::INVAL; + } + std::scoped_lock lock(*g_blockpool); g_blockpool->expand(dmemRange); return {}; @@ -315,6 +323,9 @@ orbis::ErrorCode orbis::blockpool::commit(Process *process, rx::AddressRange vmemRange, MemoryType type, rx::EnumBitSet protection) { + rx::println(stderr, "blockpool::commit({:x}-{:x}, {}, {})", + vmemRange.beginAddress(), vmemRange.endAddress(), type, + protection); auto pool = type == MemoryType::WbOnion ? g_cachedBlockpool : g_blockpool; auto otherPool = type == MemoryType::WbOnion ? g_blockpool : g_cachedBlockpool; diff --git a/kernel/orbis/src/dmem.cpp b/kernel/orbis/src/dmem.cpp index 8b4645c8f..c693a2f40 100644 --- a/kernel/orbis/src/dmem.cpp +++ b/kernel/orbis/src/dmem.cpp @@ -720,28 +720,29 @@ orbis::ErrorCode orbis::dmem::notifyUnmap(orbis::Process *process, for (auto mapIt = it->mappings.begin(); mapIt != it->mappings.end();) { if (mapIt->process == process && mapIt->vmRange.intersects(range)) { - if (mapIt->vmRange == range) { + auto blockRange = range.intersection(mapIt->vmRange); + if (mapIt->vmRange == blockRange) { mapIt = it->mappings.erase(mapIt); break; } - if (mapIt->vmRange.beginAddress() == range.beginAddress()) { + if (mapIt->vmRange.beginAddress() == blockRange.beginAddress()) { mapIt->vmRange = rx::AddressRange::fromBeginEnd( - range.endAddress(), mapIt->vmRange.endAddress()); + blockRange.endAddress(), mapIt->vmRange.endAddress()); break; } - if (mapIt->vmRange.endAddress() == range.endAddress()) { + if (mapIt->vmRange.endAddress() == blockRange.endAddress()) { mapIt->vmRange = rx::AddressRange::fromBeginEnd( - mapIt->vmRange.beginAddress(), range.beginAddress()); + mapIt->vmRange.beginAddress(), blockRange.beginAddress()); break; } auto leftAllocation = rx::AddressRange::fromBeginEnd( - mapIt->vmRange.beginAddress(), range.beginAddress()); + mapIt->vmRange.beginAddress(), blockRange.beginAddress()); auto rightAllocation = rx::AddressRange::fromBeginEnd( - range.endAddress(), mapIt->vmRange.endAddress()); + blockRange.endAddress(), mapIt->vmRange.endAddress()); mapIt->vmRange = leftAllocation; it->mappings.push_back({.process = process, .vmRange = rightAllocation});