diff options
Diffstat (limited to 'src/citra_qt/debugger')
-rw-r--r-- | src/citra_qt/debugger/callstack.cpp | 5 | ||||
-rw-r--r-- | src/citra_qt/debugger/disassembler.cpp | 89 | ||||
-rw-r--r-- | src/citra_qt/debugger/disassembler.h | 9 | ||||
-rw-r--r-- | src/citra_qt/debugger/graphics_breakpoints.cpp | 2 | ||||
-rw-r--r-- | src/citra_qt/debugger/graphics_breakpoints_p.h | 2 | ||||
-rw-r--r-- | src/citra_qt/debugger/graphics_cmdlists.cpp | 4 | ||||
-rw-r--r-- | src/citra_qt/debugger/graphics_framebuffer.cpp | 4 | ||||
-rw-r--r-- | src/citra_qt/debugger/profiler.cpp | 4 | ||||
-rw-r--r-- | src/citra_qt/debugger/profiler.h | 2 | ||||
-rw-r--r-- | src/citra_qt/debugger/ramview.cpp | 3 | ||||
-rw-r--r-- | src/citra_qt/debugger/registers.cpp | 33 | ||||
-rw-r--r-- | src/citra_qt/debugger/registers.h | 4 |
12 files changed, 95 insertions, 66 deletions
diff --git a/src/citra_qt/debugger/callstack.cpp b/src/citra_qt/debugger/callstack.cpp index 9bb22ca2e..94e204717 100644 --- a/src/citra_qt/debugger/callstack.cpp +++ b/src/citra_qt/debugger/callstack.cpp @@ -8,7 +8,7 @@ #include "core/core.h" #include "core/arm/arm_interface.h" -#include "core/mem_map.h" +#include "core/memory.h" #include "common/symbols.h" #include "core/arm/disassembler/arm_disasm.h" @@ -27,7 +27,6 @@ CallstackWidget::CallstackWidget(QWidget* parent): QDockWidget(parent) void CallstackWidget::OnDebugModeEntered() { - ARM_Disasm* disasm = new ARM_Disasm(); ARM_Interface* app_core = Core::g_app_core; u32 sp = app_core->GetReg(13); //stack pointer @@ -46,7 +45,7 @@ void CallstackWidget::OnDebugModeEntered() /* TODO (mattvail) clean me, move to debugger interface */ u32 insn = Memory::Read32(call_addr); - if (disasm->Decode(insn) == OP_BL) + if (ARM_Disasm::Decode(insn) == OP_BL) { std::string name; // ripped from disasm diff --git a/src/citra_qt/debugger/disassembler.cpp b/src/citra_qt/debugger/disassembler.cpp index 54d21dc90..e99ec1b30 100644 --- a/src/citra_qt/debugger/disassembler.cpp +++ b/src/citra_qt/debugger/disassembler.cpp @@ -7,8 +7,7 @@ #include "../bootmanager.h" #include "../hotkeys.h" -#include "common/common.h" -#include "core/mem_map.h" +#include "core/memory.h" #include "core/core.h" #include "common/break_points.h" @@ -18,8 +17,8 @@ #include "core/arm/disassembler/arm_disasm.h" -DisassemblerModel::DisassemblerModel(QObject* parent) : QAbstractListModel(parent), base_address(0), code_size(0), program_counter(0), selection(QModelIndex()) { - +DisassemblerModel::DisassemblerModel(QObject* parent) : + QAbstractListModel(parent), base_address(0), code_size(0), program_counter(0), selection(QModelIndex()) { } int DisassemblerModel::columnCount(const QModelIndex& parent) const { @@ -158,34 +157,28 @@ void DisassemblerModel::SetNextInstruction(unsigned int address) { emit dataChanged(prev_index, prev_index); } -DisassemblerWidget::DisassemblerWidget(QWidget* parent, EmuThread& emu_thread) : QDockWidget(parent), base_addr(0), emu_thread(emu_thread) -{ - disasm_ui.setupUi(this); +DisassemblerWidget::DisassemblerWidget(QWidget* parent, EmuThread* emu_thread) : + QDockWidget(parent), emu_thread(emu_thread), base_addr(0) { - model = new DisassemblerModel(this); - disasm_ui.treeView->setModel(model); + disasm_ui.setupUi(this); RegisterHotkey("Disassembler", "Start/Stop", QKeySequence(Qt::Key_F5), Qt::ApplicationShortcut); RegisterHotkey("Disassembler", "Step", QKeySequence(Qt::Key_F10), Qt::ApplicationShortcut); RegisterHotkey("Disassembler", "Step into", QKeySequence(Qt::Key_F11), Qt::ApplicationShortcut); RegisterHotkey("Disassembler", "Set Breakpoint", QKeySequence(Qt::Key_F9), Qt::ApplicationShortcut); - connect(disasm_ui.button_breakpoint, SIGNAL(clicked()), model, SLOT(OnSetOrUnsetBreakpoint())); connect(disasm_ui.button_step, SIGNAL(clicked()), this, SLOT(OnStep())); connect(disasm_ui.button_pause, SIGNAL(clicked()), this, SLOT(OnPause())); connect(disasm_ui.button_continue, SIGNAL(clicked()), this, SLOT(OnContinue())); - connect(disasm_ui.treeView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), - model, SLOT(OnSelectionChanged(const QModelIndex&))); - connect(GetHotkey("Disassembler", "Start/Stop", this), SIGNAL(activated()), this, SLOT(OnToggleStartStop())); connect(GetHotkey("Disassembler", "Step", this), SIGNAL(activated()), this, SLOT(OnStep())); connect(GetHotkey("Disassembler", "Step into", this), SIGNAL(activated()), this, SLOT(OnStepInto())); - connect(GetHotkey("Disassembler", "Set Breakpoint", this), SIGNAL(activated()), model, SLOT(OnSetOrUnsetBreakpoint())); + + setEnabled(false); } -void DisassemblerWidget::Init() -{ +void DisassemblerWidget::Init() { model->ParseFromAddress(Core::g_app_core->GetPC()); disasm_ui.treeView->resizeColumnToContents(0); @@ -197,25 +190,21 @@ void DisassemblerWidget::Init() disasm_ui.treeView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } -void DisassemblerWidget::OnContinue() -{ - emu_thread.SetCpuRunning(true); +void DisassemblerWidget::OnContinue() { + emu_thread->SetRunning(true); } -void DisassemblerWidget::OnStep() -{ +void DisassemblerWidget::OnStep() { OnStepInto(); // change later } -void DisassemblerWidget::OnStepInto() -{ - emu_thread.SetCpuRunning(false); - emu_thread.ExecStep(); +void DisassemblerWidget::OnStepInto() { + emu_thread->SetRunning(false); + emu_thread->ExecStep(); } -void DisassemblerWidget::OnPause() -{ - emu_thread.SetCpuRunning(false); +void DisassemblerWidget::OnPause() { + emu_thread->SetRunning(false); // TODO: By now, the CPU might not have actually stopped... if (Core::g_app_core) { @@ -223,20 +212,15 @@ void DisassemblerWidget::OnPause() } } -void DisassemblerWidget::OnToggleStartStop() -{ - emu_thread.SetCpuRunning(!emu_thread.IsCpuRunning()); +void DisassemblerWidget::OnToggleStartStop() { + emu_thread->SetRunning(!emu_thread->IsRunning()); } -void DisassemblerWidget::OnDebugModeEntered() -{ +void DisassemblerWidget::OnDebugModeEntered() { ARMword next_instr = Core::g_app_core->GetPC(); - // TODO: Make BreakPoints less crappy (i.e. const-correct) so that this doesn't need a const_cast. - if (const_cast<BreakPoints&>(model->GetBreakPoints()).IsAddressBreakPoint(next_instr)) - { - emu_thread.SetCpuRunning(false); - } + if (model->GetBreakPoints().IsAddressBreakPoint(next_instr)) + emu_thread->SetRunning(false); model->SetNextInstruction(next_instr); @@ -245,16 +229,35 @@ void DisassemblerWidget::OnDebugModeEntered() disasm_ui.treeView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); } -void DisassemblerWidget::OnDebugModeLeft() -{ - +void DisassemblerWidget::OnDebugModeLeft() { } -int DisassemblerWidget::SelectedRow() -{ +int DisassemblerWidget::SelectedRow() { QModelIndex index = disasm_ui.treeView->selectionModel()->currentIndex(); if (!index.isValid()) return -1; return disasm_ui.treeView->selectionModel()->currentIndex().row(); } + +void DisassemblerWidget::OnEmulationStarting(EmuThread* emu_thread) { + this->emu_thread = emu_thread; + + model = new DisassemblerModel(this); + disasm_ui.treeView->setModel(model); + + connect(disasm_ui.treeView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), + model, SLOT(OnSelectionChanged(const QModelIndex&))); + connect(disasm_ui.button_breakpoint, SIGNAL(clicked()), model, SLOT(OnSetOrUnsetBreakpoint())); + connect(GetHotkey("Disassembler", "Set Breakpoint", this), SIGNAL(activated()), model, SLOT(OnSetOrUnsetBreakpoint())); + + Init(); + setEnabled(true); +} + +void DisassemblerWidget::OnEmulationStopping() { + disasm_ui.treeView->setModel(nullptr); + delete model; + emu_thread = nullptr; + setEnabled(false); +} diff --git a/src/citra_qt/debugger/disassembler.h b/src/citra_qt/debugger/disassembler.h index 5e19d7c51..340fb9936 100644 --- a/src/citra_qt/debugger/disassembler.h +++ b/src/citra_qt/debugger/disassembler.h @@ -9,8 +9,8 @@ #include "ui_disassembler.h" -#include "common/common.h" #include "common/break_points.h" +#include "common/common_types.h" class QAction; class EmuThread; @@ -51,7 +51,7 @@ class DisassemblerWidget : public QDockWidget Q_OBJECT public: - DisassemblerWidget(QWidget* parent, EmuThread& emu_thread); + DisassemblerWidget(QWidget* parent, EmuThread* emu_thread); void Init(); @@ -65,6 +65,9 @@ public slots: void OnDebugModeEntered(); void OnDebugModeLeft(); + void OnEmulationStarting(EmuThread* emu_thread); + void OnEmulationStopping(); + private: // returns -1 if no row is selected int SelectedRow(); @@ -75,5 +78,5 @@ private: u32 base_addr; - EmuThread& emu_thread; + EmuThread* emu_thread; }; diff --git a/src/citra_qt/debugger/graphics_breakpoints.cpp b/src/citra_qt/debugger/graphics_breakpoints.cpp index 92348be34..1da64f616 100644 --- a/src/citra_qt/debugger/graphics_breakpoints.cpp +++ b/src/citra_qt/debugger/graphics_breakpoints.cpp @@ -8,6 +8,8 @@ #include <QVBoxLayout> #include <QLabel> +#include "common/assert.h" + #include "graphics_breakpoints.h" #include "graphics_breakpoints_p.h" diff --git a/src/citra_qt/debugger/graphics_breakpoints_p.h b/src/citra_qt/debugger/graphics_breakpoints_p.h index 232bfc863..34e72e859 100644 --- a/src/citra_qt/debugger/graphics_breakpoints_p.h +++ b/src/citra_qt/debugger/graphics_breakpoints_p.h @@ -25,7 +25,7 @@ public: QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; - bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override; public slots: void OnBreakPointHit(Pica::DebugContext::Event event); diff --git a/src/citra_qt/debugger/graphics_cmdlists.cpp b/src/citra_qt/debugger/graphics_cmdlists.cpp index 9bcd25821..66e11dd5b 100644 --- a/src/citra_qt/debugger/graphics_cmdlists.cpp +++ b/src/citra_qt/debugger/graphics_cmdlists.cpp @@ -159,7 +159,7 @@ void TextureInfoDockWidget::OnStrideChanged(int value) { } QPixmap TextureInfoDockWidget::ReloadPixmap() const { - u8* src = Memory::GetPointer(Pica::PAddrToVAddr(info.physical_address)); + u8* src = Memory::GetPhysicalPointer(info.physical_address); return QPixmap::fromImage(LoadTexture(src, info)); } @@ -274,7 +274,7 @@ void GPUCommandListWidget::SetCommandInfo(const QModelIndex& index) { auto format = Pica::registers.GetTextures()[index].format; auto info = Pica::DebugUtils::TextureInfo::FromPicaRegister(config, format); - u8* src = Memory::GetPointer(Pica::PAddrToVAddr(config.GetPhysicalAddress())); + u8* src = Memory::GetPhysicalPointer(config.GetPhysicalAddress()); new_info_widget = new TextureInfoWidget(src, info); } else { new_info_widget = new QWidget; diff --git a/src/citra_qt/debugger/graphics_framebuffer.cpp b/src/citra_qt/debugger/graphics_framebuffer.cpp index d621d7204..0c1a3f47f 100644 --- a/src/citra_qt/debugger/graphics_framebuffer.cpp +++ b/src/citra_qt/debugger/graphics_framebuffer.cpp @@ -10,6 +10,8 @@ #include <QSpinBox> #include "core/hw/gpu.h" +#include "core/memory.h" + #include "video_core/color.h" #include "video_core/pica.h" #include "video_core/utils.h" @@ -215,7 +217,7 @@ void GraphicsFramebufferWidget::OnUpdate() u32 bytes_per_pixel = GraphicsFramebufferWidget::BytesPerPixel(framebuffer_format); QImage decoded_image(framebuffer_width, framebuffer_height, QImage::Format_ARGB32); - u8* buffer = Memory::GetPointer(Pica::PAddrToVAddr(framebuffer_address)); + u8* buffer = Memory::GetPhysicalPointer(framebuffer_address); for (unsigned int y = 0; y < framebuffer_height; ++y) { for (unsigned int x = 0; x < framebuffer_width; ++x) { diff --git a/src/citra_qt/debugger/profiler.cpp b/src/citra_qt/debugger/profiler.cpp index ae0568b6a..2ac1748b7 100644 --- a/src/citra_qt/debugger/profiler.cpp +++ b/src/citra_qt/debugger/profiler.cpp @@ -26,7 +26,7 @@ static QVariant GetDataForColumn(int col, const AggregatedDuration& duration) static const TimingCategoryInfo* GetCategoryInfo(int id) { const auto& categories = GetProfilingManager().GetTimingCategoriesInfo(); - if (id >= categories.size()) { + if ((size_t)id >= categories.size()) { return nullptr; } else { return &categories[id]; @@ -98,7 +98,7 @@ QVariant ProfilerModel::data(const QModelIndex& index, int role) const const TimingCategoryInfo* info = GetCategoryInfo(index.row() - 2); return info != nullptr ? QString(info->name) : QVariant(); } else { - if (index.row() - 2 < results.time_per_category.size()) { + if (index.row() - 2 < (int)results.time_per_category.size()) { return GetDataForColumn(index.column(), results.time_per_category[index.row() - 2]); } else { return QVariant(); diff --git a/src/citra_qt/debugger/profiler.h b/src/citra_qt/debugger/profiler.h index a6d87aa0f..fabf279b8 100644 --- a/src/citra_qt/debugger/profiler.h +++ b/src/citra_qt/debugger/profiler.h @@ -18,7 +18,7 @@ class ProfilerModel : public QAbstractItemModel public: ProfilerModel(QObject* parent); - QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex& child) const override; int columnCount(const QModelIndex& parent = QModelIndex()) const override; diff --git a/src/citra_qt/debugger/ramview.cpp b/src/citra_qt/debugger/ramview.cpp index 88570f2cd..b6ebc7fc4 100644 --- a/src/citra_qt/debugger/ramview.cpp +++ b/src/citra_qt/debugger/ramview.cpp @@ -4,8 +4,7 @@ #include "ramview.h" -#include "common/common.h" -#include "core/mem_map.h" + GRamView::GRamView(QWidget* parent) : QHexEdit(parent) { } diff --git a/src/citra_qt/debugger/registers.cpp b/src/citra_qt/debugger/registers.cpp index ab3666156..5527a2afd 100644 --- a/src/citra_qt/debugger/registers.cpp +++ b/src/citra_qt/debugger/registers.cpp @@ -7,8 +7,7 @@ #include "core/core.h" #include "core/arm/arm_interface.h" -RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) -{ +RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) { cpu_regs_ui.setupUi(this); tree = cpu_regs_ui.treeWidget; @@ -18,8 +17,7 @@ RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) registers->setExpanded(true); CSPR->setExpanded(true); - for (int i = 0; i < 16; ++i) - { + for (int i = 0; i < 16; ++i) { QTreeWidgetItem* child = new QTreeWidgetItem(QStringList(QString("R[%1]").arg(i, 2, 10, QLatin1Char('0')))); registers->addChild(child); } @@ -39,12 +37,16 @@ RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent) CSPR->addChild(new QTreeWidgetItem(QStringList("C"))); CSPR->addChild(new QTreeWidgetItem(QStringList("Z"))); CSPR->addChild(new QTreeWidgetItem(QStringList("N"))); + + setEnabled(false); } -void RegistersWidget::OnDebugModeEntered() -{ +void RegistersWidget::OnDebugModeEntered() { ARM_Interface* app_core = Core::g_app_core; + if (app_core == nullptr) + return; + for (int i = 0; i < 16; ++i) registers->child(i)->setText(1, QString("0x%1").arg(app_core->GetReg(i), 8, 16, QLatin1Char('0'))); @@ -66,7 +68,22 @@ void RegistersWidget::OnDebugModeEntered() CSPR->child(14)->setText(1, QString("%1").arg((app_core->GetCPSR() >> 31) & 0x1)); // N - Negative/Less than } -void RegistersWidget::OnDebugModeLeft() -{ +void RegistersWidget::OnDebugModeLeft() { +} + +void RegistersWidget::OnEmulationStarting(EmuThread* emu_thread) { + setEnabled(true); +} + +void RegistersWidget::OnEmulationStopping() { + // Reset widget text + for (int i = 0; i < 16; ++i) + registers->child(i)->setText(1, QString("")); + + for (int i = 0; i < 15; ++i) + CSPR->child(i)->setText(1, QString("")); + + CSPR->setText(1, QString("")); + setEnabled(false); } diff --git a/src/citra_qt/debugger/registers.h b/src/citra_qt/debugger/registers.h index bf8955625..68e3fb908 100644 --- a/src/citra_qt/debugger/registers.h +++ b/src/citra_qt/debugger/registers.h @@ -8,6 +8,7 @@ #include <QTreeWidgetItem> class QTreeWidget; +class EmuThread; class RegistersWidget : public QDockWidget { @@ -20,6 +21,9 @@ public slots: void OnDebugModeEntered(); void OnDebugModeLeft(); + void OnEmulationStarting(EmuThread* emu_thread); + void OnEmulationStopping(); + private: Ui::ARMRegisters cpu_regs_ui; |