GDBServer: Fix stop reply acknowledgements

Acknowledge step and continue packets when they are received, then send
the eventual stop reply without another leading ACK. This avoids
emitting two acknowledgements for a single resume packet and prevents
external system resumes from producing stray protocol ACKs.
pull/3782/head
Stenzek 2 months ago
parent d92fe3dacf
commit f04e08b245
No known key found for this signature in database

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

Loading…
Cancel
Save