diff options
author | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-02-11 18:40:40 +0100 |
---|---|---|
committer | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-02-11 18:40:40 +0100 |
commit | bb7092e96401e4c89c44773c932788c9b0f87b53 (patch) | |
tree | c888153bbdeb52f1c882af1c92fb6e1e9ebe894b /qtmips_gui | |
parent | 10f4d52221438f0d5ce7cc72c5b6c1f6720ef5c6 (diff) | |
download | qtmips-bb7092e96401e4c89c44773c932788c9b0f87b53.tar.gz qtmips-bb7092e96401e4c89c44773c932788c9b0f87b53.tar.bz2 qtmips-bb7092e96401e4c89c44773c932788c9b0f87b53.zip |
Basic "hardware" breakpoints support implemented.
It works like real inserted breakpoint on hardware.
Breakpoint has to be removed to allow code continue
because else instruction is refetch and breakpoint
triggers again. The single step function should
resolve temporal masking of the breakpoint.
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
Diffstat (limited to 'qtmips_gui')
-rw-r--r-- | qtmips_gui/programdock.cpp | 2 | ||||
-rw-r--r-- | qtmips_gui/programmodel.cpp | 22 | ||||
-rw-r--r-- | qtmips_gui/programmodel.h | 1 |
3 files changed, 23 insertions, 2 deletions
diff --git a/qtmips_gui/programdock.cpp b/qtmips_gui/programdock.cpp index a355b22..0466cc2 100644 --- a/qtmips_gui/programdock.cpp +++ b/qtmips_gui/programdock.cpp @@ -97,6 +97,8 @@ ProgramDock::ProgramDock(QWidget *parent, QSettings *settings) : Super(parent) { this, SLOT(set_follow_inst(int))); connect(this, SIGNAL(focus_addr(std::uint32_t)), program_content, SLOT(focus_address(std::uint32_t))); + connect(program_content, SIGNAL(doubleClicked(QModelIndex)), + program_model, SLOT(toggle_hw_break(QModelIndex))); } void ProgramDock::setup(machine::QtMipsMachine *machine) { diff --git a/qtmips_gui/programmodel.cpp b/qtmips_gui/programmodel.cpp index 19b0f0d..4a758b7 100644 --- a/qtmips_gui/programmodel.cpp +++ b/qtmips_gui/programmodel.cpp @@ -113,15 +113,18 @@ QVariant ProgramModel::data(const QModelIndex &index, int role) const { if (role == Qt::BackgroundRole) { std::uint32_t address; if (!get_row_address(address, index.row()) || - machine == nullptr || index.column() != 2) + machine == nullptr) return QVariant(); - if (machine->cache_program() != nullptr) { + if (index.column() == 2 && machine->cache_program() != nullptr) { machine::LocationStatus loc_stat; loc_stat = machine->cache_program()->location_status(address); if (loc_stat & machine::LOCSTAT_CACHED) { QBrush bgd(Qt::lightGray); return bgd; } + } else if (index.column() == 0 && machine->is_hwbreak(address)) { + QBrush bgd(Qt::red); + return bgd; } return QVariant(); } @@ -185,3 +188,18 @@ bool ProgramModel::adjustRowAndOffset(int &row, int optimal_row, std::uint32_t a } return get_row_for_address(row, address); } + +void ProgramModel::toggle_hw_break(const QModelIndex & index) { + std::uint32_t address; + if (index.column() != 0 || machine == nullptr) + return; + + if (!get_row_address(address, index.row())) + return; + + if (machine->is_hwbreak(address)) + machine->remove_hwbreak(address); + else + machine->insert_hwbreak(address); + update_all(); +} diff --git a/qtmips_gui/programmodel.h b/qtmips_gui/programmodel.h index 4a17e99..a6db493 100644 --- a/qtmips_gui/programmodel.h +++ b/qtmips_gui/programmodel.h @@ -85,6 +85,7 @@ public: public slots: void setup(machine::QtMipsMachine *machine); void check_for_updates(); + void toggle_hw_break(const QModelIndex & index); private: std::uint32_t index0_offset; |