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