aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/physaddrspace.cpp
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2019-06-30 18:22:27 +0200
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2019-06-30 18:22:27 +0200
commit9dc519887f61ae33ff82bb125fb69398503f91f6 (patch)
treec0074870df060adc0f546715e39169cacc8d5667 /qtmips_machine/physaddrspace.cpp
parentc86a491e26800f620b51ced800b612e73da1cced (diff)
downloadqtmips-9dc519887f61ae33ff82bb125fb69398503f91f6.tar.gz
qtmips-9dc519887f61ae33ff82bb125fb69398503f91f6.tar.bz2
qtmips-9dc519887f61ae33ff82bb125fb69398503f91f6.zip
Memory change counter moved to MemoryAccess and external changes notification added.
This change together with use of PhysAddrSpace as the memory content source for memory and program view allows to access and monitor contents of peripheral registers and frame-buffer memory from graphic user interface. Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
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;