src/platform/qt/GDBController.cpp (view raw)
1/* Copyright (c) 2013-2014 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "GDBController.h"
7
8#include "GameController.h"
9
10using namespace QGBA;
11
12GDBController::GDBController(GameController* controller, QObject* parent)
13 : QObject(parent)
14 , m_gameController(controller)
15 , m_port(2345)
16 , m_bindAddress({ IPV4, 0 })
17{
18 GDBStubCreate(&m_gdbStub);
19}
20
21ushort GDBController::port() {
22 return m_port;
23}
24
25bool GDBController::isAttached() {
26 return m_gameController->debugger() == &m_gdbStub.d;
27}
28
29void GDBController::setPort(ushort port) {
30 m_port = port;
31}
32
33void GDBController::setBindAddress(uint32_t bindAddress) {
34 m_bindAddress.version = IPV4;
35 m_bindAddress.ipv4 = htonl(bindAddress);
36}
37
38void GDBController::attach() {
39 if (isAttached()) {
40 return;
41 }
42 m_gameController->setDebugger(&m_gdbStub.d);
43 if (m_gameController->isLoaded()) {
44 ARMDebuggerEnter(&m_gdbStub.d, DEBUGGER_ENTER_ATTACHED, 0);
45 } else {
46 connect(m_gameController, &GameController::gameStarted, [this] () {
47 disconnect(m_gameController);
48 ARMDebuggerEnter(&m_gdbStub.d, DEBUGGER_ENTER_ATTACHED, 0);
49 });
50 }
51}
52
53void GDBController::detach() {
54 if (!isAttached()) {
55 return;
56 }
57 m_gameController->threadInterrupt();
58 GDBStubShutdown(&m_gdbStub);
59 m_gameController->setDebugger(nullptr);
60 m_gameController->threadContinue();
61}
62
63void GDBController::listen() {
64 m_gameController->threadInterrupt();
65 if (!isAttached()) {
66 attach();
67 }
68 if (GDBStubListen(&m_gdbStub, m_port, &m_bindAddress)) {
69 emit listening();
70 } else {
71 detach();
72 emit listenFailed();
73 }
74 m_gameController->threadContinue();
75}