From 1a23e82f91690482c416928f2276be326c8116d3 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Mon, 18 Nov 2024 17:15:38 +0100 Subject: [PATCH] Integrate MMIO into the memory manager --- src/emulator/memory_manager.cpp | 27 ++++++++++++++++++++++++++- src/emulator/memory_manager.hpp | 3 ++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/emulator/memory_manager.cpp b/src/emulator/memory_manager.cpp index 4086899e..0dee8de5 100644 --- a/src/emulator/memory_manager.cpp +++ b/src/emulator/memory_manager.cpp @@ -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) { diff --git a/src/emulator/memory_manager.hpp b/src/emulator/memory_manager.hpp index c59ff3ce..b88d1cef 100644 --- a/src/emulator/memory_manager.hpp +++ b/src/emulator/memory_manager.hpp @@ -23,6 +23,7 @@ public: { size_t length{}; memory_permission pemissions{}; + bool is_mmio{false}; }; using committed_region_map = std::map; @@ -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);