diff --git a/src/core/gdbstub/gdbstub.cpp b/src/core/gdbstub/gdbstub.cpp index 225f92d694..f6f5c41542 100644 --- a/src/core/gdbstub/gdbstub.cpp +++ b/src/core/gdbstub/gdbstub.cpp @@ -1035,12 +1035,6 @@ void HandlePacket() { return; } - if (HasHioRequest()) { - const auto reply = BuildHioRequestPacket(); - SendReply(reply.data()); - return; - } - if (!IsDataAvailable()) { return; } @@ -1059,8 +1053,12 @@ void HandlePacket() { case 'c': case 'C': case 's': - // - ; + if (HasHioRequest()) { + // Really, this request needs to get sent _after_ the step or continue + // began, but not sure how to schedule that... + const auto request_packet = BuildHioRequestPacket(); + SendReply(request_packet.data()); + } } switch (command_buffer[0]) { diff --git a/src/core/gdbstub/hio.cpp b/src/core/gdbstub/hio.cpp index b66fe09aa8..7e3c6d61ef 100644 --- a/src/core/gdbstub/hio.cpp +++ b/src/core/gdbstub/hio.cpp @@ -36,12 +36,15 @@ void SetHioRequest(const VAddr addr) { auto& memory = Core::System::GetInstance().Memory(); memory.ReadBlock(*process, addr, ¤t_hio_request, sizeof(PackedGdbHioRequest)); - // TODO read + check request magic header - - current_hio_request_addr = addr; - sent_request = false; - - LOG_DEBUG(Debug_GDBStub, "HIO request initiated"); + if (std::string_view{current_hio_request.magic} != "GDB") { + LOG_WARNING(Debug_GDBStub, "Invalid HIO request sent by application"); + current_hio_request_addr = 0; + current_hio_request = {}; + } else { + current_hio_request_addr = addr; + sent_request = false; + LOG_DEBUG(Debug_GDBStub, "HIO request initiated"); + } } bool HandleHioReply(const u8* const command_buffer, const u32 command_length) { @@ -132,41 +135,37 @@ bool HasHioRequest() { } std::string BuildHioRequestPacket() { - char buf[256 + 1]; - char tmp[32 + 1]; + std::stringstream packet; + // TODO:use the IntToGdbHex funcs instead std::hex ? + packet << "F" << current_hio_request.function_name << std::hex; + u32 nStr = 0; - // TODO: c++ify this and use the IntToGdbHex funcs instead of snprintf - - snprintf(buf, 256, "F%s", current_hio_request.function_name); - for (u32 i = 0; i < 8 && current_hio_request.param_format[i] != 0; i++) { switch (current_hio_request.param_format[i]) { case 'i': case 'I': case 'p': - snprintf(tmp, 32, ",%x", (u32)current_hio_request.parameters[i]); + packet << "," << (u32)current_hio_request.parameters[i]; break; case 'l': case 'L': - snprintf(tmp, 32, ",%llx", current_hio_request.parameters[i]); + packet << "," << current_hio_request.parameters[i]; break; case 's': - snprintf(tmp, 32, ",%x/%zx", (u32)current_hio_request.parameters[i], - current_hio_request.string_lengths[nStr++]); + packet << "," << (u32)current_hio_request.parameters[i] << "/" + << current_hio_request.string_lengths[nStr++]; break; default: - tmp[0] = 0; + packet << '\0'; break; } - strcat(buf, tmp); } - auto packet = std::string{buf, strlen(buf)}; - LOG_DEBUG(Debug_GDBStub, "HIO request packet: {}", packet); + LOG_DEBUG(Debug_GDBStub, "HIO request packet: {}", packet.str()); sent_request = true; - return packet; + return packet.str(); } } // namespace GDBStub