aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/physaddrspace.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_machine/physaddrspace.cpp')
-rw-r--r--qtmips_machine/physaddrspace.cpp31
1 files changed, 27 insertions, 4 deletions
diff --git a/qtmips_machine/physaddrspace.cpp b/qtmips_machine/physaddrspace.cpp
index 4d0045c..22ae036 100644
--- a/qtmips_machine/physaddrspace.cpp
+++ b/qtmips_machine/physaddrspace.cpp
@@ -38,12 +38,12 @@
using namespace machine;
PhysAddrSpace::PhysAddrSpace() {
-
+ change_counter = 0;
}
PhysAddrSpace::~PhysAddrSpace() {
while (!ranges_by_access.isEmpty()) {
- RangeDesc *p_range = ranges_by_access.first();
+ RangeDesc *p_range = ranges_by_addr.first();
ranges_by_addr.remove(p_range->last_addr);
ranges_by_access.remove(p_range->mem_acces);
if (p_range->owned)
@@ -53,10 +53,14 @@ PhysAddrSpace::~PhysAddrSpace() {
}
bool PhysAddrSpace::wword(std::uint32_t address, std::uint32_t value) {
+ bool changed;
RangeDesc *p_range = find_range(address);
if (p_range == nullptr)
return false;
- return p_range->mem_acces->write_word(address - p_range->start_addr, value);
+ changed = p_range->mem_acces->write_word(address - p_range->start_addr, value);
+ if (changed)
+ change_counter++;
+ return changed;
}
std::uint32_t PhysAddrSpace::rword(std::uint32_t address, bool debug_access) const {
@@ -66,6 +70,10 @@ std::uint32_t PhysAddrSpace::rword(std::uint32_t address, bool debug_access) con
return p_range->mem_acces->read_word(address - p_range->start_addr, debug_access);
}
+std::uint32_t PhysAddrSpace::get_change_counter() const {
+ return change_counter;
+}
+
enum LocationStatus PhysAddrSpace::location_status(std::uint32_t address) const {
const RangeDesc *p_range = find_range(address);
if (p_range == nullptr)
@@ -92,7 +100,9 @@ bool PhysAddrSpace::insert_range(MemoryAccess *mem_acces, std::uint32_t start_ad
return false;
}
ranges_by_addr.insert(last_addr, p_range);
- ranges_by_access.insert(mem_acces, p_range);
+ ranges_by_access.insertMulti(mem_acces, p_range);
+ connect(mem_acces, SIGNAL(external_change_notify(const MemoryAccess*,std::uint32_t,std::uint32_t,bool)),
+ this, SLOT(range_external_change(const MemoryAccess*,std::uint32_t,std::uint32_t,bool)));
return true;
}
@@ -119,6 +129,19 @@ void PhysAddrSpace::clean_range(std::uint32_t start_addr, std::uint32_t last_add
}
}
+void PhysAddrSpace::range_external_change(const MemoryAccess *mem_access, std::uint32_t start_addr,
+ std::uint32_t last_addr, bool external) {
+ if (external)
+ change_counter++;
+ auto i = ranges_by_access.find(const_cast<MemoryAccess *>(mem_access));
+ while (i != ranges_by_access.end() && i.key() == mem_access) {
+ RangeDesc *p_range = i.value();
+ ++i;
+ emit external_change_notify(this, start_addr + p_range->start_addr,
+ last_addr + p_range->start_addr, external);
+ }
+}
+
PhysAddrSpace::RangeDesc::RangeDesc(MemoryAccess *mem_acces, std::uint32_t start_addr, std::uint32_t last_addr, bool owned) {
this->mem_acces = mem_acces;
this->start_addr = start_addr;