forked from ShuriZma/suyu
1
0
Fork 0

Handle changes pointed out in comments on PR

This commit is contained in:
polaris- 2015-10-21 22:19:55 -04:00
parent d1f73c424f
commit a5ab8accc2
3 changed files with 36 additions and 65 deletions

View File

@ -23,6 +23,7 @@
#include "core/settings.h" #include "core/settings.h"
#include "core/system.h" #include "core/system.h"
#include "core/core.h" #include "core/core.h"
#include "core/gdbstub/gdbstub.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "citra/config.h" #include "citra/config.h"
@ -30,8 +31,6 @@
#include "video_core/video_core.h" #include "video_core/video_core.h"
#include "core/gdbstub/gdbstub.h"
static void PrintHelp() static void PrintHelp()
{ {

View File

@ -44,12 +44,11 @@
#include "core/settings.h" #include "core/settings.h"
#include "core/system.h" #include "core/system.h"
#include "core/arm/disassembler/load_symbol_map.h" #include "core/arm/disassembler/load_symbol_map.h"
#include "core/gdbstub/gdbstub.h"
#include "core/loader/loader.h" #include "core/loader/loader.h"
#include "video_core/video_core.h" #include "video_core/video_core.h"
#include "core/gdbstub/gdbstub.h"
GMainWindow::GMainWindow() : emu_thread(nullptr) GMainWindow::GMainWindow() : emu_thread(nullptr)
{ {
Pica::g_debug_context = Pica::DebugContext::Construct(); Pica::g_debug_context = Pica::DebugContext::Construct();

View File

@ -20,18 +20,18 @@
#include <iphlpapi.h> #include <iphlpapi.h>
#define SHUT_RDWR 2 #define SHUT_RDWR 2
#else #else
#include <unistd.h>
#include <sys/select.h> #include <sys/select.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/un.h> #include <sys/un.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <unistd.h>
#endif #endif
#include "common/logging/log.h" #include "common/logging/log.h"
#include "common/string_util.h" #include "common/string_util.h"
#include <core/arm/arm_interface.h>
#include "core/core.h" #include "core/core.h"
#include "core/memory.h" #include "core/memory.h"
#include "core/arm/arm_interface.h"
#include "gdbstub.h" #include "gdbstub.h"
const int GDB_BUFFER_SIZE = 10000; const int GDB_BUFFER_SIZE = 10000;
@ -67,8 +67,7 @@ static u8 command_buffer[GDB_BUFFER_SIZE];
static u32 command_length; static u32 command_length;
static u32 latest_signal = 0; static u32 latest_signal = 0;
static u32 send_signal = 0; static bool step_break = false;
static u32 step_break = 0;
static bool memory_break = false; static bool memory_break = false;
// Binding to a port within the reserved ports range (0-1023) requires root permissions, // Binding to a port within the reserved ports range (0-1023) requires root permissions,
@ -356,33 +355,21 @@ static void HandleSetThread() {
SendReply("E01"); SendReply("E01");
} }
/// Create and send signal packet.
static void HandleSignal() {
std::string buffer = Common::StringFromFormat("T%02x%02x:%08x;%02x:%08x;", latest_signal, 15, htonl(Core::g_app_core->GetPC()), 13, htonl(Core::g_app_core->GetReg(13)));
LOG_DEBUG(Debug_GDBStub, "Response: %s", buffer.c_str());
SendReply(buffer.c_str());
}
/** /**
* Set signal and send packet to client through HandleSignal if signal flag is set using SendSignal. * Send signal packet to client.
* *
* @param signal Signal to be sent to client. * @param signal Signal to be sent to client.
*/ */
int SendSignal(u32 signal) { void SendSignal(u32 signal) {
if (gdbserver_socket == -1) { if (gdbserver_socket == -1) {
return 1; return;
} }
latest_signal = signal; latest_signal = signal;
if (send_signal) { std::string buffer = Common::StringFromFormat("T%02x%02x:%08x;%02x:%08x;", latest_signal, 15, htonl(Core::g_app_core->GetPC()), 13, htonl(Core::g_app_core->GetReg(13)));
HandleSignal(); LOG_DEBUG(Debug_GDBStub, "Response: %s", buffer.c_str());
send_signal = 0; SendReply(buffer.c_str());
}
return 0;
} }
/// Read command from gdb client. /// Read command from gdb client.
@ -397,7 +384,6 @@ static void ReadCommand() {
} else if (c == 0x03) { } else if (c == 0x03) {
LOG_INFO(Debug_GDBStub, "gdb: found break command\n"); LOG_INFO(Debug_GDBStub, "gdb: found break command\n");
halt_loop = true; halt_loop = true;
send_signal = 1;
SendSignal(SIGTRAP); SendSignal(SIGTRAP);
return; return;
} else if (c != GDB_STUB_START) { } else if (c != GDB_STUB_START) {
@ -566,17 +552,14 @@ static void WriteRegisters() {
static void ReadMemory() { static void ReadMemory() {
static u8 reply[GDB_BUFFER_SIZE - 4]; static u8 reply[GDB_BUFFER_SIZE - 4];
int i = 1; auto start_offset = command_buffer+1;
auto addr_pos = std::find(start_offset, command_buffer+command_length, ',');
PAddr addr = 0; PAddr addr = 0;
while (command_buffer[i] != ',') { HexToMem((u8*)&addr, start_offset, (addr_pos - start_offset) / 2);
addr = (addr << 4) | HexCharToValue(command_buffer[i++]);
}
i++;
start_offset = addr_pos+1;
u32 len = 0; u32 len = 0;
while (i < command_length) { HexToMem((u8*)&len, start_offset, ((command_buffer + command_length) - start_offset) / 2);
len = (len << 4) | HexCharToValue(command_buffer[i++]);
}
if (len * 2 > sizeof(reply)) { if (len * 2 > sizeof(reply)) {
SendReply("E01"); SendReply("E01");
@ -594,31 +577,28 @@ static void ReadMemory() {
/// Modify location in memory with data received from the gdb client. /// Modify location in memory with data received from the gdb client.
static void WriteMemory() { static void WriteMemory() {
int i = 1; auto start_offset = command_buffer+1;
auto addr_pos = std::find(start_offset, command_buffer+command_length, ',');
PAddr addr = 0; PAddr addr = 0;
while (command_buffer[i] != ',') { HexToMem((u8*)&addr, start_offset, (addr_pos - start_offset) / 2);
addr = (addr << 4) | HexCharToValue(command_buffer[i++]);
}
i++;
start_offset = addr_pos+1;
auto len_pos = std::find(start_offset, command_buffer+command_length, ':');
u32 len = 0; u32 len = 0;
while (command_buffer[i] != ':') { HexToMem((u8*)&len, start_offset, (len_pos - start_offset) / 2);
len = (len << 4) | HexCharToValue(command_buffer[i++]);
}
u8* dst = Memory::GetPointer(addr); u8* dst = Memory::GetPointer(addr);
if (!dst) { if (!dst) {
return SendReply("E00"); return SendReply("E00");
} }
HexToMem(dst, command_buffer + i + 1, len); HexToMem(dst, len_pos + 1, len);
SendReply("OK"); SendReply("OK");
} }
void Break(bool is_memory_break) { void Break(bool is_memory_break) {
if (!halt_loop) { if (!halt_loop) {
halt_loop = true; halt_loop = true;
send_signal = 1;
SendSignal(SIGTRAP); SendSignal(SIGTRAP);
} }
@ -629,8 +609,7 @@ void Break(bool is_memory_break) {
static void Step() { static void Step() {
step_loop = true; step_loop = true;
halt_loop = true; halt_loop = true;
send_signal = 1; step_break = true;
step_break = 1;
SendSignal(SIGTRAP); SendSignal(SIGTRAP);
} }
@ -645,7 +624,7 @@ bool IsMemoryBreak() {
/// Tell the CPU to continue executing. /// Tell the CPU to continue executing.
static void Continue() { static void Continue() {
memory_break = false; memory_break = false;
step_break = 0; step_break = false;
step_loop = false; step_loop = false;
halt_loop = false; halt_loop = false;
} }
@ -694,17 +673,14 @@ static void AddBreakpoint() {
return SendReply("E01"); return SendReply("E01");
} }
int i = 3; auto start_offset = command_buffer+3;
auto addr_pos = std::find(start_offset, command_buffer+command_length, ',');
PAddr addr = 0; PAddr addr = 0;
while (command_buffer[i] != ',') { HexToMem((u8*)&addr, start_offset, (addr_pos - start_offset) / 2);
addr = addr << 4 | HexCharToValue(command_buffer[i++]);
}
i++;
start_offset = addr_pos+1;
u32 len = 0; u32 len = 0;
while (i < command_length) { HexToMem((u8*)&len, start_offset, ((command_buffer + command_length) - start_offset) / 2);
len = len << 4 | HexCharToValue(command_buffer[i++]);
}
if (type == BreakpointType::Access) { if (type == BreakpointType::Access) {
// Access is made up of Read and Write types, so add both breakpoints // Access is made up of Read and Write types, so add both breakpoints
@ -747,17 +723,14 @@ static void RemoveBreakpoint() {
return SendReply("E01"); return SendReply("E01");
} }
int i = 3; auto start_offset = command_buffer+3;
auto addr_pos = std::find(start_offset, command_buffer+command_length, ',');
PAddr addr = 0; PAddr addr = 0;
while (command_buffer[i] != ',') { HexToMem((u8*)&addr, start_offset, (addr_pos - start_offset) / 2);
addr = (addr << 4) | HexCharToValue(command_buffer[i++]);
}
i++;
start_offset = addr_pos+1;
u32 len = 0; u32 len = 0;
while (i < command_length) { HexToMem((u8*)&len, start_offset, ((command_buffer + command_length) - start_offset) / 2);
len = (len << 4) | HexCharToValue(command_buffer[i++]);
}
if (type == BreakpointType::Access) { if (type == BreakpointType::Access) {
// Access is made up of Read and Write types, so add both breakpoints // Access is made up of Read and Write types, so add both breakpoints
@ -795,7 +768,7 @@ void HandlePacket() {
HandleSetThread(); HandleSetThread();
break; break;
case '?': case '?':
HandleSignal(); SendSignal(latest_signal);
break; break;
case 'k': case 'k':
Shutdown(); Shutdown();