mirror of
https://github.com/momo5502/emulator.git
synced 2026-01-20 04:03:57 +00:00
Integrate MMIO into the memory manager
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user