From 9dc519887f61ae33ff82bb125fb69398503f91f6 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Sun, 30 Jun 2019 18:22:27 +0200 Subject: 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 --- qtmips_machine/physaddrspace.cpp | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) (limited to 'qtmips_machine/physaddrspace.cpp') 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(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; -- cgit v1.2.3