Skip to content

Commit 357cc04

Browse files
committed
GdbServer: Splits Multi-letter v command handler
Just breaks out the two commands we support and leaves TODOs for implementing the remaining commands. NFC
1 parent 7c6e836 commit 357cc04

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

Source/Tools/LinuxEmulation/LinuxSyscalls/GdbServer.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ desc: Provides a gdb interface to the guest state
1616
#include <iomanip>
1717
#include <memory>
1818
#include <optional>
19+
#include <string_view>
1920

2021
#include <Common/FEXServerClient.h>
2122
#include <FEXCore/Config/Config.h>
@@ -1003,7 +1004,7 @@ GdbServer::HandledPacketType GdbServer::CommandQueryThreadAlive(const fextl::str
10031004
return {"OK", HandledPacketType::TYPE_ACK};
10041005
}
10051006

1006-
GdbServer::HandledPacketType GdbServer::CommandMultiLetterV(const fextl::string& packet) {
1007+
GdbServer::HandledPacketType GdbServer::HandlevFile(const fextl::string& packet) {
10071008
const auto match = [&](const fextl::string& str) -> std::optional<fextl::istringstream> {
10081009
if (packet.rfind(str, 0) == 0) {
10091010
auto ss = fextl::istringstream(packet);
@@ -1074,10 +1075,26 @@ GdbServer::HandledPacketType GdbServer::CommandMultiLetterV(const fextl::string&
10741075
data.resize(ret);
10751076
return {F_data(ret, data), HandledPacketType::TYPE_ACK};
10761077
}
1078+
1079+
return {"", HandledPacketType::TYPE_ACK};
1080+
}
1081+
1082+
GdbServer::HandledPacketType GdbServer::HandlevCont(const fextl::string& packet) {
1083+
const auto match = [&](const fextl::string& str) -> std::optional<fextl::istringstream> {
1084+
if (packet.rfind(str, 0) == 0) {
1085+
auto ss = fextl::istringstream(packet);
1086+
ss.seekg(str.size());
1087+
return ss;
1088+
}
1089+
return std::nullopt;
1090+
};
1091+
1092+
std::optional<fextl::istringstream> ss;
10771093
if ((ss = match("vCont?"))) {
10781094
return {"vCont;c;t;s;r", HandledPacketType::TYPE_ACK}; // We support continue, step and terminate
10791095
// FIXME: We also claim to support continue with signal... because it's compulsory
10801096
}
1097+
10811098
if ((ss = match("vCont;"))) {
10821099
char action {};
10831100
int thread {};
@@ -1095,6 +1112,26 @@ GdbServer::HandledPacketType GdbServer::CommandMultiLetterV(const fextl::string&
10951112

10961113
return ThreadAction(action, thread);
10971114
}
1115+
1116+
return {"", HandledPacketType::TYPE_ACK};
1117+
}
1118+
1119+
GdbServer::HandledPacketType GdbServer::CommandMultiLetterV(const fextl::string& packet) {
1120+
// TODO: vAttach
1121+
if (packet.starts_with("vCont")) {
1122+
return HandlevCont(packet);
1123+
}
1124+
1125+
// TODO: vCtrlC
1126+
1127+
if (packet.starts_with("vFile")) {
1128+
return HandlevFile(packet);
1129+
}
1130+
1131+
// TODO: vKill
1132+
// TODO: vRun
1133+
// TODO: vStopped
1134+
10981135
return {"", HandledPacketType::TYPE_ACK};
10991136
}
11001137

Source/Tools/LinuxEmulation/LinuxSyscalls/GdbServer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ class GdbServer {
9797
HandledPacketType XferCommandAuxv(const fextl::string& annex, int offset, int length);
9898
HandledPacketType handleXfer(const fextl::string& packet);
9999

100+
HandledPacketType HandlevFile(const fextl::string& packet);
101+
HandledPacketType HandlevCont(const fextl::string& packet);
102+
100103
// Command handlers
101104
HandledPacketType CommandEnableExtendedMode(const fextl::string& packet);
102105
HandledPacketType CommandQueryHalted(const fextl::string& packet);

0 commit comments

Comments
 (0)