Integrate MMIO into the memory manager

This commit is contained in:
momo5502
2024-11-18 17:15:38 +01:00
parent 49a8435f6b
commit 1a23e82f91
2 changed files with 28 additions and 2 deletions

View File

@@ -198,6 +198,24 @@ bool memory_manager::protect_memory(const uint64_t address, const size_t size, c
return true;
}
bool memory_manager::allocate_mmio(uint64_t address, size_t size, mmio_read_callback read_cb,
mmio_write_callback write_cb)
{
if (this->overlaps_reserved_region(address, size))
{
return false;
}
this->map_mmio(address, size, std::move(read_cb), std::move(write_cb));
const auto entry = this->reserved_regions_.try_emplace(address, size).first;
entry->second.committed_regions[address] = committed_region{
.length = size, .pemissions = memory_permission::read_write, .is_mmio = true,
};
return true;
}
bool memory_manager::allocate_memory(const uint64_t address, const size_t size, const memory_permission permissions,
const bool reserve_only)
{
@@ -211,7 +229,9 @@ bool memory_manager::allocate_memory(const uint64_t address, const size_t size,
if (!reserve_only)
{
this->map_memory(address, size, permissions);
entry->second.committed_regions[address] = committed_region{size, permissions};
entry->second.committed_regions[address] = committed_region{
.length = size, .pemissions = memory_permission::read_write
};
}
return true;
@@ -303,6 +323,11 @@ bool memory_manager::decommit_memory(const uint64_t address, const size_t size)
break;
}
if (i->second.is_mmio)
{
throw std::runtime_error("Not allowed to decommit MMIO!");
}
const auto sub_region_end = i->first + i->second.length;
if (i->first >= address && sub_region_end <= end)
{

View File

@@ -23,6 +23,7 @@ public:
{
size_t length{};
memory_permission pemissions{};
bool is_mmio{false};
};
using committed_region_map = std::map<uint64_t, committed_region>;
@@ -82,6 +83,7 @@ public:
bool protect_memory(uint64_t address, size_t size, memory_permission permissions,
memory_permission* old_permissions = nullptr);
bool allocate_mmio(uint64_t address, size_t size, mmio_read_callback read_cb, mmio_write_callback write_cb);
bool allocate_memory(uint64_t address, size_t size, memory_permission permissions,
bool reserve_only = false);
@@ -118,7 +120,6 @@ private:
virtual void apply_memory_protection(uint64_t address, size_t size, memory_permission permissions) = 0;
protected:
void serialize_memory_state(utils::buffer_serializer& buffer, bool is_snapshot) const;
void deserialize_memory_state(utils::buffer_deserializer& buffer, bool is_snapshot);