diff --git a/Source/Core/Core/PowerPC/GDBStub.cpp b/Source/Core/Core/PowerPC/GDBStub.cpp index 2eb67059df..98f04ba0cb 100644 --- a/Source/Core/Core/PowerPC/GDBStub.cpp +++ b/Source/Core/Core/PowerPC/GDBStub.cpp @@ -29,6 +29,7 @@ typedef SSIZE_T ssize_t; #include "Common/Logging/Log.h" #include "Common/SocketContext.h" #include "Common/StringUtil.h" +#include "Core/Config/MainSettings.h" #include "Core/Core.h" #include "Core/HW/CPU.h" #include "Core/HW/Memmap.h" @@ -67,6 +68,19 @@ constexpr int MACH_O_POWERPC_750 = 9; const s64 GDB_UPDATE_CYCLES = 100000; const char* QUERY_XFER_TARGET = "qXfer:features:read:target.xml:"; +const char* QUERY_XFER_MEMORY_MAP = "qXfer:memory-map:read::"; + +const char* TARGET_MEMORY_MAP_XML_NO_MMU = + "" + "" + "" + "" + ""; + +const char* TARGET_MEMORY_MAP_XML_WITH_MMU = + "" + "" + ""; const char* target_xml = "" "powerpc:750" @@ -567,21 +581,44 @@ static void HandleQuery() DEBUG_LOG_FMT(GDB_STUB, "gdb: query '{}'", CommandBufferAsString()); if (!strncmp((const char*)(s_cmd_bfr), "qAttached", strlen("qAttached"))) + { return SendReply("1"); + } if (!strcmp((const char*)(s_cmd_bfr), "qC")) + { return SendReply("QC1"); + } if (!strcmp((const char*)(s_cmd_bfr), "qfThreadInfo")) + { return SendReply("m1"); + } else if (!strcmp((const char*)(s_cmd_bfr), "qsThreadInfo")) + { return SendReply("l"); + } else if (!strncmp((const char*)(s_cmd_bfr), "qThreadExtraInfo", strlen("qThreadExtraInfo"))) + { return SendReply("00"); + } else if (!strncmp((const char*)(s_cmd_bfr), "qHostInfo", strlen("qHostInfo"))) + { return WriteHostInfo(); + } else if (!strncmp((const char*)(s_cmd_bfr), "qSupported", strlen("qSupported"))) - return SendReply("swbreak+;hwbreak+;qXfer:features:read+"); + { + return SendReply("swbreak+;hwbreak+;qXfer:features:read+;qXfer:memory-map:read+"); + } else if (!strncmp((const char*)(s_cmd_bfr), QUERY_XFER_TARGET, strlen(QUERY_XFER_TARGET))) + { return ProcessXFerCommand(target_xml, strlen(QUERY_XFER_TARGET)); + } + else if (!strncmp((const char*)(s_cmd_bfr), QUERY_XFER_MEMORY_MAP, strlen(QUERY_XFER_MEMORY_MAP))) + { + const char* memoryMapXml = TARGET_MEMORY_MAP_XML_NO_MMU; + if (Config::Get(Config::MAIN_MMU)) + memoryMapXml = TARGET_MEMORY_MAP_XML_WITH_MMU; + return ProcessXFerCommand(memoryMapXml, strlen(QUERY_XFER_MEMORY_MAP)); + } SendReply(""); }