1 //===-- StringExtractorGDBRemote.h ------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
10 #define LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
11 
12 #include "lldb/Utility/Status.h"
13 #include "lldb/Utility/StringExtractor.h"
14 #include "llvm/ADT/StringRef.h"
15 
16 #include <string>
17 
18 #include <cstddef>
19 #include <cstdint>
20 
21 class StringExtractorGDBRemote : public StringExtractor {
22 public:
23   typedef bool (*ResponseValidatorCallback)(
24       void *baton, const StringExtractorGDBRemote &response);
25 
26   StringExtractorGDBRemote() = default;
27 
28   StringExtractorGDBRemote(llvm::StringRef str)
29       : StringExtractor(str), m_validator(nullptr) {}
30 
31   StringExtractorGDBRemote(const char *cstr)
32       : StringExtractor(cstr), m_validator(nullptr) {}
33 
34   bool ValidateResponse() const;
35 
36   void CopyResponseValidator(const StringExtractorGDBRemote &rhs);
37 
38   void SetResponseValidator(ResponseValidatorCallback callback, void *baton);
39 
40   void SetResponseValidatorToOKErrorNotSupported();
41 
42   void SetResponseValidatorToASCIIHexBytes();
43 
44   void SetResponseValidatorToJSON();
45 
46   enum ServerPacketType {
47     eServerPacketType_nack = 0,
48     eServerPacketType_ack,
49     eServerPacketType_invalid,
50     eServerPacketType_unimplemented,
51     eServerPacketType_interrupt, // CTRL+c packet or "\x03"
52     eServerPacketType_A,         // Program arguments packet
53     eServerPacketType_qfProcessInfo,
54     eServerPacketType_qsProcessInfo,
55     eServerPacketType_qC,
56     eServerPacketType_qEcho,
57     eServerPacketType_qGroupName,
58     eServerPacketType_qHostInfo,
59     eServerPacketType_qLaunchGDBServer,
60     eServerPacketType_qQueryGDBServer,
61     eServerPacketType_qKillSpawnedProcess,
62     eServerPacketType_qLaunchSuccess,
63     eServerPacketType_qModuleInfo,
64     eServerPacketType_qProcessInfoPID,
65     eServerPacketType_qSpeedTest,
66     eServerPacketType_qUserName,
67     eServerPacketType_qGetWorkingDir,
68     eServerPacketType_qFileLoadAddress,
69     eServerPacketType_QEnvironment,
70     eServerPacketType_QEnableErrorStrings,
71     eServerPacketType_QLaunchArch,
72     eServerPacketType_QSetDisableASLR,
73     eServerPacketType_QSetDetachOnError,
74     eServerPacketType_QSetSTDIN,
75     eServerPacketType_QSetSTDOUT,
76     eServerPacketType_QSetSTDERR,
77     eServerPacketType_QSetWorkingDir,
78     eServerPacketType_QStartNoAckMode,
79     eServerPacketType_qPathComplete,
80     eServerPacketType_qPlatform_shell,
81     eServerPacketType_qPlatform_mkdir,
82     eServerPacketType_qPlatform_chmod,
83     eServerPacketType_vFile_open,
84     eServerPacketType_vFile_close,
85     eServerPacketType_vFile_pread,
86     eServerPacketType_vFile_pwrite,
87     eServerPacketType_vFile_size,
88     eServerPacketType_vFile_mode,
89     eServerPacketType_vFile_exists,
90     eServerPacketType_vFile_md5,
91     eServerPacketType_vFile_fstat,
92     eServerPacketType_vFile_stat,
93     eServerPacketType_vFile_symlink,
94     eServerPacketType_vFile_unlink,
95     // debug server packages
96     eServerPacketType_QEnvironmentHexEncoded,
97     eServerPacketType_QListThreadsInStopReply,
98     eServerPacketType_QPassSignals,
99     eServerPacketType_QRestoreRegisterState,
100     eServerPacketType_QSaveRegisterState,
101     eServerPacketType_QSetLogging,
102     eServerPacketType_QSetMaxPacketSize,
103     eServerPacketType_QSetMaxPayloadSize,
104     eServerPacketType_QSetEnableAsyncProfiling,
105     eServerPacketType_QSyncThreadState,
106     eServerPacketType_QThreadSuffixSupported,
107 
108     eServerPacketType_jThreadsInfo,
109     eServerPacketType_qsThreadInfo,
110     eServerPacketType_qfThreadInfo,
111     eServerPacketType_qGetPid,
112     eServerPacketType_qGetProfileData,
113     eServerPacketType_qGDBServerVersion,
114     eServerPacketType_qMemoryRegionInfo,
115     eServerPacketType_qMemoryRegionInfoSupported,
116     eServerPacketType_qProcessInfo,
117     eServerPacketType_qRcmd,
118     eServerPacketType_qRegisterInfo,
119     eServerPacketType_qShlibInfoAddr,
120     eServerPacketType_qStepPacketSupported,
121     eServerPacketType_qSupported,
122     eServerPacketType_qSyncThreadStateSupported,
123     eServerPacketType_qThreadExtraInfo,
124     eServerPacketType_qThreadStopInfo,
125     eServerPacketType_qVAttachOrWaitSupported,
126     eServerPacketType_qWatchpointSupportInfo,
127     eServerPacketType_qWatchpointSupportInfoSupported,
128     eServerPacketType_qXfer,
129 
130     eServerPacketType_jSignalsInfo,
131     eServerPacketType_jModulesInfo,
132 
133     eServerPacketType_vAttach,
134     eServerPacketType_vAttachWait,
135     eServerPacketType_vAttachOrWait,
136     eServerPacketType_vAttachName,
137     eServerPacketType_vCont,
138     eServerPacketType_vCont_actions, // vCont?
139     eServerPacketType_vKill,
140     eServerPacketType_vRun,
141 
142     eServerPacketType_stop_reason, // '?'
143 
144     eServerPacketType_c,
145     eServerPacketType_C,
146     eServerPacketType_D,
147     eServerPacketType_g,
148     eServerPacketType_G,
149     eServerPacketType_H,
150     eServerPacketType_I, // stdin notification
151     eServerPacketType_k,
152     eServerPacketType_m,
153     eServerPacketType_M,
154     eServerPacketType_p,
155     eServerPacketType_P,
156     eServerPacketType_s,
157     eServerPacketType_S,
158     eServerPacketType_T,
159     eServerPacketType_x,
160     eServerPacketType_X,
161     eServerPacketType_Z,
162     eServerPacketType_z,
163 
164     eServerPacketType__M,
165     eServerPacketType__m,
166     eServerPacketType_notify, // '%' notification
167 
168     eServerPacketType_jLLDBTraceSupported,
169     eServerPacketType_jLLDBTraceStart,
170     eServerPacketType_jLLDBTraceStop,
171     eServerPacketType_jLLDBTraceGetState,
172     eServerPacketType_jLLDBTraceGetBinaryData,
173 
174     eServerPacketType_qMemTags, // read memory tags
175     eServerPacketType_QMemTags, // write memory tags
176 
177     eServerPacketType_qLLDBSaveCore,
178     eServerPacketType_QSetIgnoredExceptions,
179     eServerPacketType_QNonStop,
180     eServerPacketType_vStopped,
181     eServerPacketType_vCtrlC,
182     eServerPacketType_vStdio,
183   };
184 
185   ServerPacketType GetServerPacketType() const;
186 
187   enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse };
188 
189   ResponseType GetResponseType() const;
190 
191   bool IsOKResponse() const;
192 
193   bool IsUnsupportedResponse() const;
194 
195   bool IsNormalResponse() const;
196 
197   bool IsErrorResponse() const;
198 
199   // Returns zero if the packet isn't a EXX packet where XX are two hex digits.
200   // Otherwise the error encoded in XX is returned.
201   uint8_t GetError();
202 
203   lldb_private::Status GetStatus();
204 
205   size_t GetEscapedBinaryData(std::string &str);
206 
207   static constexpr lldb::pid_t AllProcesses = UINT64_MAX;
208   static constexpr lldb::tid_t AllThreads = UINT64_MAX;
209 
210   // Read thread-id from the packet.  If the packet is valid, returns
211   // the pair (PID, TID), otherwise returns llvm::None.  If the packet
212   // does not list a PID, default_pid is used.
213   llvm::Optional<std::pair<lldb::pid_t, lldb::tid_t>>
214   GetPidTid(lldb::pid_t default_pid);
215 
216 protected:
217   ResponseValidatorCallback m_validator = nullptr;
218   void *m_validator_baton;
219 };
220 
221 #endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H
222