mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Handle changes pointed out in comments on PR
This commit is contained in:
		
							parent
							
								
									d1f73c424f
								
							
						
					
					
						commit
						a5ab8accc2
					
				
					 3 changed files with 36 additions and 65 deletions
				
			
		|  | @ -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() | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
|  |  | ||||||
|  | @ -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(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue