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 <stddef.h> 19 #include <stdint.h> 20 21 class StringExtractorGDBRemote : public StringExtractor { 22 public: 23 typedef bool (*ResponseValidatorCallback)( 24 void *baton, const StringExtractorGDBRemote &response); 25 StringExtractorGDBRemote()26 StringExtractorGDBRemote() : StringExtractor(), m_validator(nullptr) {} 27 StringExtractorGDBRemote(llvm::StringRef str)28 StringExtractorGDBRemote(llvm::StringRef str) 29 : StringExtractor(str), m_validator(nullptr) {} 30 StringExtractorGDBRemote(const char * cstr)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_qPlatform_shell, 80 eServerPacketType_qPlatform_mkdir, 81 eServerPacketType_qPlatform_chmod, 82 eServerPacketType_vFile_open, 83 eServerPacketType_vFile_close, 84 eServerPacketType_vFile_pread, 85 eServerPacketType_vFile_pwrite, 86 eServerPacketType_vFile_size, 87 eServerPacketType_vFile_mode, 88 eServerPacketType_vFile_exists, 89 eServerPacketType_vFile_md5, 90 eServerPacketType_vFile_stat, 91 eServerPacketType_vFile_symlink, 92 eServerPacketType_vFile_unlink, 93 // debug server packages 94 eServerPacketType_QEnvironmentHexEncoded, 95 eServerPacketType_QListThreadsInStopReply, 96 eServerPacketType_QPassSignals, 97 eServerPacketType_QRestoreRegisterState, 98 eServerPacketType_QSaveRegisterState, 99 eServerPacketType_QSetLogging, 100 eServerPacketType_QSetMaxPacketSize, 101 eServerPacketType_QSetMaxPayloadSize, 102 eServerPacketType_QSetEnableAsyncProfiling, 103 eServerPacketType_QSyncThreadState, 104 eServerPacketType_QThreadSuffixSupported, 105 106 eServerPacketType_jThreadsInfo, 107 eServerPacketType_qsThreadInfo, 108 eServerPacketType_qfThreadInfo, 109 eServerPacketType_qGetPid, 110 eServerPacketType_qGetProfileData, 111 eServerPacketType_qGDBServerVersion, 112 eServerPacketType_qMemoryRegionInfo, 113 eServerPacketType_qMemoryRegionInfoSupported, 114 eServerPacketType_qProcessInfo, 115 eServerPacketType_qRcmd, 116 eServerPacketType_qRegisterInfo, 117 eServerPacketType_qShlibInfoAddr, 118 eServerPacketType_qStepPacketSupported, 119 eServerPacketType_qSupported, 120 eServerPacketType_qSyncThreadStateSupported, 121 eServerPacketType_qThreadExtraInfo, 122 eServerPacketType_qThreadStopInfo, 123 eServerPacketType_qVAttachOrWaitSupported, 124 eServerPacketType_qWatchpointSupportInfo, 125 eServerPacketType_qWatchpointSupportInfoSupported, 126 eServerPacketType_qXfer, 127 128 eServerPacketType_jSignalsInfo, 129 eServerPacketType_jModulesInfo, 130 131 eServerPacketType_vAttach, 132 eServerPacketType_vAttachWait, 133 eServerPacketType_vAttachOrWait, 134 eServerPacketType_vAttachName, 135 eServerPacketType_vCont, 136 eServerPacketType_vCont_actions, // vCont? 137 138 eServerPacketType_stop_reason, // '?' 139 140 eServerPacketType_c, 141 eServerPacketType_C, 142 eServerPacketType_D, 143 eServerPacketType_g, 144 eServerPacketType_G, 145 eServerPacketType_H, 146 eServerPacketType_I, // stdin notification 147 eServerPacketType_k, 148 eServerPacketType_m, 149 eServerPacketType_M, 150 eServerPacketType_p, 151 eServerPacketType_P, 152 eServerPacketType_s, 153 eServerPacketType_S, 154 eServerPacketType_T, 155 eServerPacketType_x, 156 eServerPacketType_X, 157 eServerPacketType_Z, 158 eServerPacketType_z, 159 160 eServerPacketType__M, 161 eServerPacketType__m, 162 eServerPacketType_notify, // '%' notification 163 164 eServerPacketType_jTraceStart, 165 eServerPacketType_jTraceBufferRead, 166 eServerPacketType_jTraceMetaRead, 167 eServerPacketType_jTraceStop, 168 eServerPacketType_jTraceConfigRead, 169 }; 170 171 ServerPacketType GetServerPacketType() const; 172 173 enum ResponseType { eUnsupported = 0, eAck, eNack, eError, eOK, eResponse }; 174 175 ResponseType GetResponseType() const; 176 177 bool IsOKResponse() const; 178 179 bool IsUnsupportedResponse() const; 180 181 bool IsNormalResponse() const; 182 183 bool IsErrorResponse() const; 184 185 // Returns zero if the packet isn't a EXX packet where XX are two hex digits. 186 // Otherwise the error encoded in XX is returned. 187 uint8_t GetError(); 188 189 lldb_private::Status GetStatus(); 190 191 size_t GetEscapedBinaryData(std::string &str); 192 193 protected: 194 ResponseValidatorCallback m_validator; 195 void *m_validator_baton; 196 }; 197 198 #endif // LLDB_UTILITY_STRINGEXTRACTORGDBREMOTE_H 199