summaryrefslogtreecommitdiff
path: root/src/citra_qt/debugger
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/citra_qt/debugger/callstack.cpp66
-rw-r--r--src/citra_qt/debugger/callstack.hxx (renamed from src/citra_qt/callstack.hxx)7
-rw-r--r--src/citra_qt/debugger/callstack.ui (renamed from src/citra_qt/callstack.ui)0
-rw-r--r--src/citra_qt/debugger/disassembler.cpp (renamed from src/citra_qt/disasm.cpp)52
-rw-r--r--src/citra_qt/debugger/disassembler.hxx (renamed from src/citra_qt/disasm.hxx)6
-rw-r--r--src/citra_qt/debugger/disassembler.ui88
-rw-r--r--src/citra_qt/debugger/ramview.cpp (renamed from src/citra_qt/ramview.cpp)0
-rw-r--r--src/citra_qt/debugger/ramview.hxx (renamed from src/citra_qt/ramview.hxx)0
-rw-r--r--src/citra_qt/debugger/registers.cpp (renamed from src/citra_qt/cpu_regs.cpp)8
-rw-r--r--src/citra_qt/debugger/registers.hxx (renamed from src/citra_qt/cpu_regs.hxx)8
-rw-r--r--src/citra_qt/debugger/registers.ui (renamed from src/citra_qt/cpu_regs.ui)0
11 files changed, 202 insertions, 33 deletions
diff --git a/src/citra_qt/debugger/callstack.cpp b/src/citra_qt/debugger/callstack.cpp
new file mode 100644
index 000000000..f59f2d8c8
--- /dev/null
+++ b/src/citra_qt/debugger/callstack.cpp
@@ -0,0 +1,66 @@
1#include <QStandardItemModel>
2
3#include "callstack.hxx"
4
5#include "core/core.h"
6#include "core/arm/arm_interface.h"
7#include "core/mem_map.h"
8#include "common/symbols.h"
9#include "core/arm/disassembler/arm_disasm.h"
10
11CallstackWidget::CallstackWidget(QWidget* parent): QDockWidget(parent)
12{
13 ui.setupUi(this);
14
15 callstack_model = new QStandardItemModel(this);
16 callstack_model->setColumnCount(4);
17 callstack_model->setHeaderData(0, Qt::Horizontal, "Stack pointer");
18 callstack_model->setHeaderData(2, Qt::Horizontal, "Return address");
19 callstack_model->setHeaderData(1, Qt::Horizontal, "Call address");
20 callstack_model->setHeaderData(3, Qt::Horizontal, "Function");
21 ui.treeView->setModel(callstack_model);
22}
23
24void CallstackWidget::OnCPUStepped()
25{
26 ARM_Disasm* disasm = new ARM_Disasm();
27 ARM_Interface* app_core = Core::g_app_core;
28
29 u32 sp = app_core->GetReg(13); //stack pointer
30 u32 addr, ret_addr, call_addr, func_addr;
31
32 int counter = 0;
33 for (int addr = 0x10000000; addr >= sp; addr -= 4)
34 {
35 ret_addr = Memory::Read32(addr);
36 call_addr = ret_addr - 4; //get call address???
37
38 /* TODO (mattvail) clean me, move to debugger interface */
39 u32 insn = Memory::Read32(call_addr);
40 if (disasm->decode(insn) == OP_BL)
41 {
42 std::string name;
43 // ripped from disasm
44 uint8_t cond = (insn >> 28) & 0xf;
45 uint32_t i_offset = insn & 0xffffff;
46 // Sign-extend the 24-bit offset
47 if ((i_offset >> 23) & 1)
48 i_offset |= 0xff000000;
49
50 // Pre-compute the left-shift and the prefetch offset
51 i_offset <<= 2;
52 i_offset += 8;
53 func_addr = call_addr + i_offset;
54
55 callstack_model->setItem(counter, 0, new QStandardItem(QString("0x%1").arg(addr, 8, 16, QLatin1Char('0'))));
56 callstack_model->setItem(counter, 1, new QStandardItem(QString("0x%1").arg(ret_addr, 8, 16, QLatin1Char('0'))));
57 callstack_model->setItem(counter, 2, new QStandardItem(QString("0x%1").arg(call_addr, 8, 16, QLatin1Char('0'))));
58
59 name = Symbols::HasSymbol(func_addr) ? Symbols::GetSymbol(func_addr).name : "unknown";
60 callstack_model->setItem(counter, 3, new QStandardItem(QString("%1_%2").arg(QString::fromStdString(name))
61 .arg(QString("0x%1").arg(func_addr, 8, 16, QLatin1Char('0')))));
62
63 counter++;
64 }
65 }
66} \ No newline at end of file
diff --git a/src/citra_qt/callstack.hxx b/src/citra_qt/debugger/callstack.hxx
index 4df1b96d5..3ad2af28b 100644
--- a/src/citra_qt/callstack.hxx
+++ b/src/citra_qt/debugger/callstack.hxx
@@ -1,15 +1,14 @@
1#include <QDockWidget> 1#include <QDockWidget>
2#include "ui_callstack.h" 2#include "../ui_callstack.h"
3#include "common/platform.h"
4 3
5class QStandardItemModel; 4class QStandardItemModel;
6 5
7class GCallstackView : public QDockWidget 6class CallstackWidget : public QDockWidget
8{ 7{
9 Q_OBJECT 8 Q_OBJECT
10 9
11public: 10public:
12 GCallstackView(QWidget* parent = 0); 11 CallstackWidget(QWidget* parent = 0);
13 12
14public slots: 13public slots:
15 void OnCPUStepped(); 14 void OnCPUStepped();
diff --git a/src/citra_qt/callstack.ui b/src/citra_qt/debugger/callstack.ui
index b3c4db632..b3c4db632 100644
--- a/src/citra_qt/callstack.ui
+++ b/src/citra_qt/debugger/callstack.ui
diff --git a/src/citra_qt/disasm.cpp b/src/citra_qt/debugger/disassembler.cpp
index 5f3a6058a..cc4cb13fa 100644
--- a/src/citra_qt/disasm.cpp
+++ b/src/citra_qt/debugger/disassembler.cpp
@@ -1,9 +1,9 @@
1#include <QtGui> 1#include <QtGui>
2#include "ui_disasm.h"
3#include "disasm.hxx"
4 2
5#include "bootmanager.hxx" 3#include "disassembler.hxx"
6#include "hotkeys.hxx" 4
5#include "../bootmanager.hxx"
6#include "../hotkeys.hxx"
7 7
8#include "common/common.h" 8#include "common/common.h"
9#include "core/mem_map.h" 9#include "core/mem_map.h"
@@ -14,7 +14,7 @@
14#include "core/arm/interpreter/armdefs.h" 14#include "core/arm/interpreter/armdefs.h"
15#include "core/arm/disassembler/arm_disasm.h" 15#include "core/arm/disassembler/arm_disasm.h"
16 16
17GDisAsmView::GDisAsmView(QWidget* parent, EmuThread& emu_thread) : QDockWidget(parent), base_addr(0), emu_thread(emu_thread) 17DisassemblerWidget::DisassemblerWidget(QWidget* parent, EmuThread& emu_thread) : QDockWidget(parent), base_addr(0), emu_thread(emu_thread)
18{ 18{
19 disasm_ui.setupUi(this); 19 disasm_ui.setupUi(this);
20 20
@@ -23,7 +23,7 @@ GDisAsmView::GDisAsmView(QWidget* parent, EmuThread& emu_thread) : QDockWidget(p
23 model = new QStandardItemModel(this); 23 model = new QStandardItemModel(this);
24 model->setColumnCount(3); 24 model->setColumnCount(3);
25 disasm_ui.treeView->setModel(model); 25 disasm_ui.treeView->setModel(model);
26 26 disasm_ui.tableView->setModel(model);
27 RegisterHotkey("Disassembler", "Start/Stop", QKeySequence(Qt::Key_F5), Qt::ApplicationShortcut); 27 RegisterHotkey("Disassembler", "Start/Stop", QKeySequence(Qt::Key_F5), Qt::ApplicationShortcut);
28 RegisterHotkey("Disassembler", "Step", QKeySequence(Qt::Key_F10), Qt::ApplicationShortcut); 28 RegisterHotkey("Disassembler", "Step", QKeySequence(Qt::Key_F10), Qt::ApplicationShortcut);
29 RegisterHotkey("Disassembler", "Step into", QKeySequence(Qt::Key_F11), Qt::ApplicationShortcut); 29 RegisterHotkey("Disassembler", "Step into", QKeySequence(Qt::Key_F11), Qt::ApplicationShortcut);
@@ -40,7 +40,7 @@ GDisAsmView::GDisAsmView(QWidget* parent, EmuThread& emu_thread) : QDockWidget(p
40 connect(GetHotkey("Disassembler", "Set Breakpoint", this), SIGNAL(activated()), this, SLOT(OnSetBreakpoint())); 40 connect(GetHotkey("Disassembler", "Set Breakpoint", this), SIGNAL(activated()), this, SLOT(OnSetBreakpoint()));
41} 41}
42 42
43void GDisAsmView::Init() 43void DisassemblerWidget::Init()
44{ 44{
45 ARM_Disasm* disasm = new ARM_Disasm(); 45 ARM_Disasm* disasm = new ARM_Disasm();
46 46
@@ -64,13 +64,20 @@ void GDisAsmView::Init()
64 } 64 }
65 disasm_ui.treeView->resizeColumnToContents(0); 65 disasm_ui.treeView->resizeColumnToContents(0);
66 disasm_ui.treeView->resizeColumnToContents(1); 66 disasm_ui.treeView->resizeColumnToContents(1);
67 67 disasm_ui.treeView->resizeColumnToContents(2);
68 disasm_ui.tableView->resizeColumnToContents(0);
69 disasm_ui.tableView->resizeColumnToContents(1);
70 disasm_ui.tableView->resizeColumnToContents(2);
71
68 QModelIndex model_index = model->index(0, 0); 72 QModelIndex model_index = model->index(0, 0);
69 disasm_ui.treeView->scrollTo(model_index); 73 disasm_ui.treeView->scrollTo(model_index);
70 disasm_ui.treeView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); 74 disasm_ui.treeView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
75
76 disasm_ui.tableView->scrollTo(model_index);
77 disasm_ui.tableView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
71} 78}
72 79
73void GDisAsmView::OnSetBreakpoint() 80void DisassemblerWidget::OnSetBreakpoint()
74{ 81{
75 int selected_row = SelectedRow(); 82 int selected_row = SelectedRow();
76 83
@@ -92,33 +99,33 @@ void GDisAsmView::OnSetBreakpoint()
92 } 99 }
93} 100}
94 101
95void GDisAsmView::OnContinue() 102void DisassemblerWidget::OnContinue()
96{ 103{
97 emu_thread.SetCpuRunning(true); 104 emu_thread.SetCpuRunning(true);
98} 105}
99 106
100void GDisAsmView::OnStep() 107void DisassemblerWidget::OnStep()
101{ 108{
102 OnStepInto(); // change later 109 OnStepInto(); // change later
103} 110}
104 111
105void GDisAsmView::OnStepInto() 112void DisassemblerWidget::OnStepInto()
106{ 113{
107 emu_thread.SetCpuRunning(false); 114 emu_thread.SetCpuRunning(false);
108 emu_thread.ExecStep(); 115 emu_thread.ExecStep();
109} 116}
110 117
111void GDisAsmView::OnPause() 118void DisassemblerWidget::OnPause()
112{ 119{
113 emu_thread.SetCpuRunning(false); 120 emu_thread.SetCpuRunning(false);
114} 121}
115 122
116void GDisAsmView::OnToggleStartStop() 123void DisassemblerWidget::OnToggleStartStop()
117{ 124{
118 emu_thread.SetCpuRunning(!emu_thread.IsCpuRunning()); 125 emu_thread.SetCpuRunning(!emu_thread.IsCpuRunning());
119} 126}
120 127
121void GDisAsmView::OnCPUStepped() 128void DisassemblerWidget::OnCPUStepped()
122{ 129{
123 ARMword next_instr = Core::g_app_core->GetPC(); 130 ARMword next_instr = Core::g_app_core->GetPC();
124 131
@@ -131,13 +138,24 @@ void GDisAsmView::OnCPUStepped()
131 QModelIndex model_index = model->index(index, 0); 138 QModelIndex model_index = model->index(index, 0);
132 disasm_ui.treeView->scrollTo(model_index); 139 disasm_ui.treeView->scrollTo(model_index);
133 disasm_ui.treeView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); 140 disasm_ui.treeView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
141
142 disasm_ui.tableView->scrollTo(model_index);
143 disasm_ui.tableView->selectionModel()->setCurrentIndex(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
144 disasm_ui.tableView->selectionModel()->select(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
134} 145}
135 146
136int GDisAsmView::SelectedRow() 147int DisassemblerWidget::SelectedRow()
137{ 148{
138 QModelIndex index = disasm_ui.treeView->selectionModel()->currentIndex(); 149 QModelIndex index = disasm_ui.treeView->selectionModel()->currentIndex();
139 if (!index.isValid()) 150 if (!index.isValid())
140 return -1; 151 return -1;
141 152
142 return model->itemFromIndex(disasm_ui.treeView->selectionModel()->currentIndex())->row(); 153 return model->itemFromIndex(disasm_ui.treeView->selectionModel()->currentIndex())->row();
143} \ No newline at end of file 154}
155/*
156void DisassemblerWidget::paintEvent()
157{
158 QPainter painter(this);
159 painter.drawRect(10, 10, 50, 50);
160}
161*/ \ No newline at end of file
diff --git a/src/citra_qt/disasm.hxx b/src/citra_qt/debugger/disassembler.hxx
index 0c5a37cac..e5b152d20 100644
--- a/src/citra_qt/disasm.hxx
+++ b/src/citra_qt/debugger/disassembler.hxx
@@ -1,5 +1,5 @@
1#include <QDockWidget> 1#include <QDockWidget>
2#include "ui_disasm.h" 2#include "../ui_disassembler.h"
3 3
4#include "common/common.h" 4#include "common/common.h"
5#include "common/break_points.h" 5#include "common/break_points.h"
@@ -8,12 +8,12 @@ class QAction;
8class QStandardItemModel; 8class QStandardItemModel;
9class EmuThread; 9class EmuThread;
10 10
11class GDisAsmView : public QDockWidget 11class DisassemblerWidget : public QDockWidget
12{ 12{
13 Q_OBJECT 13 Q_OBJECT
14 14
15public: 15public:
16 GDisAsmView(QWidget* parent, EmuThread& emu_thread); 16 DisassemblerWidget(QWidget* parent, EmuThread& emu_thread);
17 17
18 void Init(); 18 void Init();
19 19
diff --git a/src/citra_qt/debugger/disassembler.ui b/src/citra_qt/debugger/disassembler.ui
new file mode 100644
index 000000000..e65b0aa9b
--- /dev/null
+++ b/src/citra_qt/debugger/disassembler.ui
@@ -0,0 +1,88 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<ui version="4.0">
3 <class>DockWidget</class>
4 <widget class="QDockWidget" name="DockWidget">
5 <property name="geometry">
6 <rect>
7 <x>0</x>
8 <y>0</y>
9 <width>430</width>
10 <height>401</height>
11 </rect>
12 </property>
13 <property name="windowTitle">
14 <string>Disassembly</string>
15 </property>
16 <widget class="QWidget" name="dockWidgetContents">
17 <layout class="QVBoxLayout" name="verticalLayout">
18 <item>
19 <layout class="QHBoxLayout" name="horizontalLayout">
20 <item>
21 <widget class="QPushButton" name="button_step">
22 <property name="text">
23 <string>Step</string>
24 </property>
25 </widget>
26 </item>
27 <item>
28 <widget class="QPushButton" name="button_pause">
29 <property name="text">
30 <string>Pause</string>
31 </property>
32 </widget>
33 </item>
34 <item>
35 <widget class="QPushButton" name="button_continue">
36 <property name="text">
37 <string>Continue</string>
38 </property>
39 </widget>
40 </item>
41 <item>
42 <widget class="QPushButton" name="pushButton">
43 <property name="text">
44 <string>Step Into</string>
45 </property>
46 </widget>
47 </item>
48 <item>
49 <widget class="QPushButton" name="button_breakpoint">
50 <property name="text">
51 <string>Set Breakpoint</string>
52 </property>
53 </widget>
54 </item>
55 </layout>
56 </item>
57 <item>
58 <widget class="QTreeView" name="treeView">
59 <property name="alternatingRowColors">
60 <bool>true</bool>
61 </property>
62 <property name="indentation">
63 <number>20</number>
64 </property>
65 <property name="rootIsDecorated">
66 <bool>false</bool>
67 </property>
68 <attribute name="headerVisible">
69 <bool>false</bool>
70 </attribute>
71 </widget>
72 </item>
73 <item>
74 <widget class="QTableView" name="tableView">
75 <property name="alternatingRowColors">
76 <bool>true</bool>
77 </property>
78 <attribute name="headerVisible">
79 <bool>false</bool>
80 </attribute>
81 </widget>
82 </item>
83 </layout>
84 </widget>
85 </widget>
86 <resources/>
87 <connections/>
88</ui>
diff --git a/src/citra_qt/ramview.cpp b/src/citra_qt/debugger/ramview.cpp
index 3f899b95e..3f899b95e 100644
--- a/src/citra_qt/ramview.cpp
+++ b/src/citra_qt/debugger/ramview.cpp
diff --git a/src/citra_qt/ramview.hxx b/src/citra_qt/debugger/ramview.hxx
index 1db1546aa..1db1546aa 100644
--- a/src/citra_qt/ramview.hxx
+++ b/src/citra_qt/debugger/ramview.hxx
diff --git a/src/citra_qt/cpu_regs.cpp b/src/citra_qt/debugger/registers.cpp
index 7e54e18b0..96ceed480 100644
--- a/src/citra_qt/cpu_regs.cpp
+++ b/src/citra_qt/debugger/registers.cpp
@@ -1,9 +1,9 @@
1#include "cpu_regs.hxx" 1#include "registers.hxx"
2 2
3#include "core/core.h" 3#include "core/core.h"
4#include "core/arm/interpreter/armdefs.h" 4#include "core/arm/arm_interface.h"
5 5
6GARM11RegsView::GARM11RegsView(QWidget* parent) : QDockWidget(parent) 6RegistersWidget::RegistersWidget(QWidget* parent) : QDockWidget(parent)
7{ 7{
8 cpu_regs_ui.setupUi(this); 8 cpu_regs_ui.setupUi(this);
9 9
@@ -37,7 +37,7 @@ GARM11RegsView::GARM11RegsView(QWidget* parent) : QDockWidget(parent)
37 CSPR->addChild(new QTreeWidgetItem(QStringList("N"))); 37 CSPR->addChild(new QTreeWidgetItem(QStringList("N")));
38} 38}
39 39
40void GARM11RegsView::OnCPUStepped() 40void RegistersWidget::OnCPUStepped()
41{ 41{
42 ARM_Interface* app_core = Core::g_app_core; 42 ARM_Interface* app_core = Core::g_app_core;
43 43
diff --git a/src/citra_qt/cpu_regs.hxx b/src/citra_qt/debugger/registers.hxx
index 27c194bde..318d95820 100644
--- a/src/citra_qt/cpu_regs.hxx
+++ b/src/citra_qt/debugger/registers.hxx
@@ -1,18 +1,16 @@
1#include "ui_cpu_regs.h" 1#include "../ui_registers.h"
2 2
3#include <QDockWidget> 3#include <QDockWidget>
4#include <QTreeWidgetItem> 4#include <QTreeWidgetItem>
5 5
6//#include "ui_gekko_regs.h"
7
8class QTreeWidget; 6class QTreeWidget;
9 7
10class GARM11RegsView : public QDockWidget 8class RegistersWidget : public QDockWidget
11{ 9{
12 Q_OBJECT 10 Q_OBJECT
13 11
14public: 12public:
15 GARM11RegsView(QWidget* parent = NULL); 13 RegistersWidget(QWidget* parent = NULL);
16 14
17public slots: 15public slots:
18 void OnCPUStepped(); 16 void OnCPUStepped();
diff --git a/src/citra_qt/cpu_regs.ui b/src/citra_qt/debugger/registers.ui
index 6537c9cd6..6537c9cd6 100644
--- a/src/citra_qt/cpu_regs.ui
+++ b/src/citra_qt/debugger/registers.ui