From 8b553ef5863a07a0c9ae3a970bf6afe552ce6121 Mon Sep 17 00:00:00 2001 From: Pavel Pisa Date: Tue, 12 Feb 2019 00:39:09 +0100 Subject: Add debug access to rword and friends to allow read data through cache without disturbing statistic. This allows to switch view between CPU and raw memory content. Signed-off-by: Pavel Pisa --- qtmips_gui/memorydock.cpp | 14 +++++++++++--- qtmips_gui/memorymodel.cpp | 18 ++++++++++++++---- qtmips_gui/memorymodel.h | 2 ++ 3 files changed, 27 insertions(+), 7 deletions(-) (limited to 'qtmips_gui') diff --git a/qtmips_gui/memorydock.cpp b/qtmips_gui/memorydock.cpp index ccb3b6a..323f053 100644 --- a/qtmips_gui/memorydock.cpp +++ b/qtmips_gui/memorydock.cpp @@ -44,8 +44,6 @@ #include "memorytableview.h" #include "hexlineedit.h" - - MemoryDock::MemoryDock(QWidget *parent, QSettings *settings) : Super(parent) { setObjectName("Memory"); setWindowTitle("Memory"); @@ -58,6 +56,10 @@ MemoryDock::MemoryDock(QWidget *parent, QSettings *settings) : Super(parent) { cell_size->addItem("Word", MemoryModel::CELLSIZE_WORD); cell_size->setCurrentIndex(MemoryModel::CELLSIZE_WORD); + QComboBox *cached_access = new QComboBox(); + cached_access->addItem("Direct", 0); + cached_access->addItem("Cached", 1); + QTableView *memory_content = new MemoryTableView(0, settings); // memory_content->setSizePolicy(); MemoryModel *memory_model = new MemoryModel(0); @@ -67,8 +69,12 @@ MemoryDock::MemoryDock(QWidget *parent, QSettings *settings) : Super(parent) { QLineEdit *go_edit = new HexLineEdit(0, 8, 16, "0x"); + QHBoxLayout *layout_top = new QHBoxLayout; + layout_top->addWidget(cell_size); + layout_top->addWidget(cached_access); + QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(cell_size); + layout->addLayout(layout_top); layout->addWidget(memory_content); layout->addWidget(go_edit); @@ -79,6 +85,8 @@ MemoryDock::MemoryDock(QWidget *parent, QSettings *settings) : Super(parent) { connect(this, &MemoryDock::machine_setup, memory_model, &MemoryModel::setup); connect(cell_size, SIGNAL(currentIndexChanged(int)), memory_content, SLOT(set_cell_size(int))); + connect(cached_access, SIGNAL(currentIndexChanged(int)), + memory_model, SLOT(cached_access(int))); connect(go_edit, SIGNAL(value_edit_finished(std::uint32_t)), memory_content, SLOT(go_to_address(std::uint32_t))); connect(memory_content, SIGNAL(address_changed(std::uint32_t)), diff --git a/qtmips_gui/memorymodel.cpp b/qtmips_gui/memorymodel.cpp index 66da84c..12b3fcb 100644 --- a/qtmips_gui/memorymodel.cpp +++ b/qtmips_gui/memorymodel.cpp @@ -46,6 +46,7 @@ MemoryModel::MemoryModel(QObject *parent) machine = nullptr; memory_change_counter = 0; cache_data_change_counter = 0; + access_through_cache = 0; } int MemoryModel::rowCount(const QModelIndex & /*parent*/) const { @@ -80,6 +81,7 @@ QVariant MemoryModel::data(const QModelIndex &index, int role) const { QString s, t; std::uint32_t address; std::uint32_t data; + const machine::MemoryAccess *mem; if (!get_row_address(address, index.row())) return QString(""); if (index.column() == 0) { @@ -89,21 +91,24 @@ QVariant MemoryModel::data(const QModelIndex &index, int role) const { } if (machine == nullptr) return QString(""); - if (machine->memory() == nullptr) + mem = machine->memory(); + if (mem == nullptr) return QString(""); + if ((access_through_cache > 0) && (machine->cache_data() != nullptr)) + mem = machine->cache_data(); address += cellSizeBytes() * (index.column() - 1); if (address < index0_offset) return QString(""); switch (cell_size) { case CELLSIZE_BYTE: - data = machine->memory()->read_byte(address); + data = mem->read_byte(address, true); break; case CELLSIZE_HWORD: - data = machine->memory()->read_hword(address); + data = mem->read_hword(address, true); break; default: case CELLSIZE_WORD: - data = machine->memory()->read_word(address); + data = mem->read_word(address, true); break; } @@ -215,3 +220,8 @@ bool MemoryModel::adjustRowAndOffset(int &row, int optimal_row, std::uint32_t ad } return get_row_for_address(row, address); } + +void MemoryModel::cached_access(int cached) { + access_through_cache = cached; + update_all(); +} diff --git a/qtmips_gui/memorymodel.h b/qtmips_gui/memorymodel.h index f093dbb..83bc057 100644 --- a/qtmips_gui/memorymodel.h +++ b/qtmips_gui/memorymodel.h @@ -106,6 +106,7 @@ public slots: void setup(machine::QtMipsMachine *machine); void set_cell_size(int index); void check_for_updates(); + void cached_access(int cached); signals: void cell_size_changed(); @@ -118,6 +119,7 @@ private: machine::QtMipsMachine *machine; std::uint32_t memory_change_counter; std::uint32_t cache_data_change_counter; + int access_through_cache; }; -- cgit v1.2.3