diff --git a/src/core/gdb_server.cpp b/src/core/gdb_server.cpp index 2f96a09f6..c2e8db49e 100644 --- a/src/core/gdb_server.cpp +++ b/src/core/gdb_server.cpp @@ -35,6 +35,8 @@ public: void OnSystemPaused(); void OnSystemResumed(); + void SendAck(); + void SendReply(std::string_view reply = std::string_view()); void SendReplyWithAck(std::string_view reply = std::string_view()); protected: @@ -302,6 +304,7 @@ bool GDBServer::Cmd$M(ClientSocket* client, std::string_view data) /// Single step. bool GDBServer::Cmd$s(ClientSocket* client, std::string_view data) { + client->SendAck(); System::SingleStepCPU(); return true; } @@ -515,6 +518,7 @@ void GDBServer::ClientSocket::OnRead() else if (GDBServer::IsPacketContinue(current_packet)) { DEV_LOG("{} > Continue request", GetRemoteAddress().ToString()); + SendAck(); System::PauseSystem(false); packet_complete = true; break; @@ -563,18 +567,24 @@ void GDBServer::ClientSocket::OnSystemPaused() m_seen_resume = false; - // Generate a stop reply packet, insert '?' command to generate it. - SendReplyWithAck("S05"); + SendReply("S05"); } void GDBServer::ClientSocket::OnSystemResumed() { m_seen_resume = true; +} - // Send ack, in case GDB sent a continue request. +void GDBServer::ClientSocket::SendAck() +{ SendPacket("+"); } +void GDBServer::ClientSocket::SendReply(std::string_view reply) +{ + SendPacket(SmallString::from_format("${}#{:02x}", reply, ComputeChecksum(reply))); +} + void GDBServer::ClientSocket::SendReplyWithAck(std::string_view reply) { SendPacket(SmallString::from_format("+${}#{:02x}", reply, ComputeChecksum(reply)));