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 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)));

Loading…
Cancel
Save