130fdc8d8SChris Lattner //===-- StringExtractorGDBRemote.cpp ----------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner // C Includes 11ad65c051SStephen Wilson #include <string.h> 12ad65c051SStephen Wilson 1330fdc8d8SChris Lattner // C++ Includes 1430fdc8d8SChris Lattner // Other libraries and framework includes 1530fdc8d8SChris Lattner // Project includes 16ad65c051SStephen Wilson #include "Utility/StringExtractorGDBRemote.h" 1730fdc8d8SChris Lattner 18576d8834SGreg Clayton StringExtractorGDBRemote::ResponseType 19b9c1b51eSKate Stone StringExtractorGDBRemote::GetResponseType() const { 2030fdc8d8SChris Lattner if (m_packet.empty()) 2130fdc8d8SChris Lattner return eUnsupported; 2230fdc8d8SChris Lattner 23b9c1b51eSKate Stone switch (m_packet[0]) { 2430fdc8d8SChris Lattner case 'E': 25b9c1b51eSKate Stone if (m_packet.size() == 3 && isxdigit(m_packet[1]) && isxdigit(m_packet[2])) 2630fdc8d8SChris Lattner return eError; 2730fdc8d8SChris Lattner break; 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner case 'O': 3030fdc8d8SChris Lattner if (m_packet.size() == 2 && m_packet[1] == 'K') 3130fdc8d8SChris Lattner return eOK; 3230fdc8d8SChris Lattner break; 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner case '+': 3530fdc8d8SChris Lattner if (m_packet.size() == 1) 3630fdc8d8SChris Lattner return eAck; 3730fdc8d8SChris Lattner break; 3830fdc8d8SChris Lattner 3930fdc8d8SChris Lattner case '-': 4030fdc8d8SChris Lattner if (m_packet.size() == 1) 4130fdc8d8SChris Lattner return eNack; 4230fdc8d8SChris Lattner break; 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner return eResponse; 4530fdc8d8SChris Lattner } 4630fdc8d8SChris Lattner 47576d8834SGreg Clayton StringExtractorGDBRemote::ServerPacketType 48b9c1b51eSKate Stone StringExtractorGDBRemote::GetServerPacketType() const { 49b9c1b51eSKate Stone #define PACKET_MATCHES(s) \ 50b9c1b51eSKate Stone ((packet_size == (sizeof(s) - 1)) && (strcmp((packet_cstr), (s)) == 0)) 51b9c1b51eSKate Stone #define PACKET_STARTS_WITH(s) \ 52b9c1b51eSKate Stone ((packet_size >= (sizeof(s) - 1)) && \ 53b9c1b51eSKate Stone ::strncmp(packet_cstr, s, (sizeof(s) - 1)) == 0) 548b82f087SGreg Clayton 55576d8834SGreg Clayton // Empty is not a supported packet... 56576d8834SGreg Clayton if (m_packet.empty()) 57576d8834SGreg Clayton return eServerPacketType_invalid; 58576d8834SGreg Clayton 598b82f087SGreg Clayton const size_t packet_size = m_packet.size(); 60576d8834SGreg Clayton const char *packet_cstr = m_packet.c_str(); 61b9c1b51eSKate Stone switch (m_packet[0]) { 6278baa197SEwan Crawford 6378baa197SEwan Crawford case '%': 6478baa197SEwan Crawford return eServerPacketType_notify; 6578baa197SEwan Crawford 66d314e810SGreg Clayton case '\x03': 67b9c1b51eSKate Stone if (packet_size == 1) 68b9c1b51eSKate Stone return eServerPacketType_interrupt; 69d314e810SGreg Clayton break; 70d314e810SGreg Clayton 71576d8834SGreg Clayton case '-': 72b9c1b51eSKate Stone if (packet_size == 1) 73b9c1b51eSKate Stone return eServerPacketType_nack; 74576d8834SGreg Clayton break; 75576d8834SGreg Clayton 76576d8834SGreg Clayton case '+': 77b9c1b51eSKate Stone if (packet_size == 1) 78b9c1b51eSKate Stone return eServerPacketType_ack; 79576d8834SGreg Clayton break; 80576d8834SGreg Clayton 818b82f087SGreg Clayton case 'A': 828b82f087SGreg Clayton return eServerPacketType_A; 838b82f087SGreg Clayton 841cb6496eSGreg Clayton case 'Q': 850fefa676SJean-Daniel Dupas 86b9c1b51eSKate Stone switch (packet_cstr[1]) { 878b82f087SGreg Clayton case 'E': 88b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QEnvironment:")) 89b9c1b51eSKate Stone return eServerPacketType_QEnvironment; 90b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QEnvironmentHexEncoded:")) 91b9c1b51eSKate Stone return eServerPacketType_QEnvironmentHexEncoded; 928b82f087SGreg Clayton break; 938b82f087SGreg Clayton 94*4a705e7eSPavel Labath case 'P': 95*4a705e7eSPavel Labath if (PACKET_STARTS_WITH("QPassSignals:")) 96*4a705e7eSPavel Labath return eServerPacketType_QPassSignals; 97*4a705e7eSPavel Labath 988b82f087SGreg Clayton case 'S': 99b9c1b51eSKate Stone if (PACKET_MATCHES("QStartNoAckMode")) 100b9c1b51eSKate Stone return eServerPacketType_QStartNoAckMode; 101b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSaveRegisterState")) 102b9c1b51eSKate Stone return eServerPacketType_QSaveRegisterState; 103b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetDisableASLR:")) 104b9c1b51eSKate Stone return eServerPacketType_QSetDisableASLR; 105b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetDetachOnError:")) 106b9c1b51eSKate Stone return eServerPacketType_QSetDetachOnError; 107b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetSTDIN:")) 108b9c1b51eSKate Stone return eServerPacketType_QSetSTDIN; 109b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetSTDOUT:")) 110b9c1b51eSKate Stone return eServerPacketType_QSetSTDOUT; 111b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetSTDERR:")) 112b9c1b51eSKate Stone return eServerPacketType_QSetSTDERR; 113b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetWorkingDir:")) 114b9c1b51eSKate Stone return eServerPacketType_QSetWorkingDir; 115b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetLogging:")) 116b9c1b51eSKate Stone return eServerPacketType_QSetLogging; 117b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetMaxPacketSize:")) 118b9c1b51eSKate Stone return eServerPacketType_QSetMaxPacketSize; 119b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetMaxPayloadSize:")) 120b9c1b51eSKate Stone return eServerPacketType_QSetMaxPayloadSize; 121b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSetEnableAsyncProfiling;")) 122b9c1b51eSKate Stone return eServerPacketType_QSetEnableAsyncProfiling; 123b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QSyncThreadState:")) 124b9c1b51eSKate Stone return eServerPacketType_QSyncThreadState; 1258b82f087SGreg Clayton break; 1260fefa676SJean-Daniel Dupas 127e0f8f574SDaniel Malea case 'L': 128b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QLaunchArch:")) 129b9c1b51eSKate Stone return eServerPacketType_QLaunchArch; 130b9c1b51eSKate Stone if (PACKET_MATCHES("QListThreadsInStopReply")) 131b9c1b51eSKate Stone return eServerPacketType_QListThreadsInStopReply; 1320fefa676SJean-Daniel Dupas break; 1330fefa676SJean-Daniel Dupas 1340fefa676SJean-Daniel Dupas case 'R': 135b9c1b51eSKate Stone if (PACKET_STARTS_WITH("QRestoreRegisterState:")) 136b9c1b51eSKate Stone return eServerPacketType_QRestoreRegisterState; 1370fefa676SJean-Daniel Dupas break; 1380fefa676SJean-Daniel Dupas 1390fefa676SJean-Daniel Dupas case 'T': 140b9c1b51eSKate Stone if (PACKET_MATCHES("QThreadSuffixSupported")) 141b9c1b51eSKate Stone return eServerPacketType_QThreadSuffixSupported; 142e0f8f574SDaniel Malea break; 1438b82f087SGreg Clayton } 1441cb6496eSGreg Clayton break; 1451cb6496eSGreg Clayton 146576d8834SGreg Clayton case 'q': 147b9c1b51eSKate Stone switch (packet_cstr[1]) { 1488b82f087SGreg Clayton case 's': 149b9c1b51eSKate Stone if (PACKET_MATCHES("qsProcessInfo")) 150b9c1b51eSKate Stone return eServerPacketType_qsProcessInfo; 151b9c1b51eSKate Stone if (PACKET_MATCHES("qsThreadInfo")) 152b9c1b51eSKate Stone return eServerPacketType_qsThreadInfo; 1538b82f087SGreg Clayton break; 1548b82f087SGreg Clayton 1558b82f087SGreg Clayton case 'f': 156b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qfProcessInfo")) 157b9c1b51eSKate Stone return eServerPacketType_qfProcessInfo; 158b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qfThreadInfo")) 159b9c1b51eSKate Stone return eServerPacketType_qfThreadInfo; 1608b82f087SGreg Clayton break; 1618b82f087SGreg Clayton 1628b82f087SGreg Clayton case 'C': 163b9c1b51eSKate Stone if (packet_size == 2) 164b9c1b51eSKate Stone return eServerPacketType_qC; 1658b82f087SGreg Clayton break; 1668b82f087SGreg Clayton 167420562aaSGreg Clayton case 'E': 168b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qEcho:")) 169b9c1b51eSKate Stone return eServerPacketType_qEcho; 170420562aaSGreg Clayton break; 171420562aaSGreg Clayton 172783bfc8cSTamas Berghammer case 'F': 173b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qFileLoadAddress:")) 174b9c1b51eSKate Stone return eServerPacketType_qFileLoadAddress; 175783bfc8cSTamas Berghammer break; 176783bfc8cSTamas Berghammer 1778b82f087SGreg Clayton case 'G': 178b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qGroupName:")) 179b9c1b51eSKate Stone return eServerPacketType_qGroupName; 180b9c1b51eSKate Stone if (PACKET_MATCHES("qGetWorkingDir")) 181b9c1b51eSKate Stone return eServerPacketType_qGetWorkingDir; 182b9c1b51eSKate Stone if (PACKET_MATCHES("qGetPid")) 183b9c1b51eSKate Stone return eServerPacketType_qGetPid; 184b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qGetProfileData;")) 185b9c1b51eSKate Stone return eServerPacketType_qGetProfileData; 186b9c1b51eSKate Stone if (PACKET_MATCHES("qGDBServerVersion")) 187b9c1b51eSKate Stone return eServerPacketType_qGDBServerVersion; 1888b82f087SGreg Clayton break; 1898b82f087SGreg Clayton 1908b82f087SGreg Clayton case 'H': 191b9c1b51eSKate Stone if (PACKET_MATCHES("qHostInfo")) 192b9c1b51eSKate Stone return eServerPacketType_qHostInfo; 1938b82f087SGreg Clayton break; 1948b82f087SGreg Clayton 195e0f8f574SDaniel Malea case 'K': 196b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qKillSpawnedProcess")) 197b9c1b51eSKate Stone return eServerPacketType_qKillSpawnedProcess; 198e0f8f574SDaniel Malea break; 199e0f8f574SDaniel Malea 2008b82f087SGreg Clayton case 'L': 201b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qLaunchGDBServer")) 202b9c1b51eSKate Stone return eServerPacketType_qLaunchGDBServer; 203b9c1b51eSKate Stone if (PACKET_MATCHES("qLaunchSuccess")) 204b9c1b51eSKate Stone return eServerPacketType_qLaunchSuccess; 2058b82f087SGreg Clayton break; 2068b82f087SGreg Clayton 2070fefa676SJean-Daniel Dupas case 'M': 208b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qMemoryRegionInfo:")) 209b9c1b51eSKate Stone return eServerPacketType_qMemoryRegionInfo; 210b9c1b51eSKate Stone if (PACKET_MATCHES("qMemoryRegionInfo")) 211b9c1b51eSKate Stone return eServerPacketType_qMemoryRegionInfoSupported; 212b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qModuleInfo:")) 213b9c1b51eSKate Stone return eServerPacketType_qModuleInfo; 2140fefa676SJean-Daniel Dupas break; 2150fefa676SJean-Daniel Dupas 2168b82f087SGreg Clayton case 'P': 217b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qProcessInfoPID:")) 218b9c1b51eSKate Stone return eServerPacketType_qProcessInfoPID; 219b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qPlatform_shell:")) 220b9c1b51eSKate Stone return eServerPacketType_qPlatform_shell; 221b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qPlatform_mkdir:")) 222b9c1b51eSKate Stone return eServerPacketType_qPlatform_mkdir; 223b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qPlatform_chmod:")) 224b9c1b51eSKate Stone return eServerPacketType_qPlatform_chmod; 225b9c1b51eSKate Stone if (PACKET_MATCHES("qProcessInfo")) 226b9c1b51eSKate Stone return eServerPacketType_qProcessInfo; 2278b82f087SGreg Clayton break; 2288b82f087SGreg Clayton 229ccd6cffbSTamas Berghammer case 'Q': 230b9c1b51eSKate Stone if (PACKET_MATCHES("qQueryGDBServer")) 231b9c1b51eSKate Stone return eServerPacketType_qQueryGDBServer; 232ccd6cffbSTamas Berghammer break; 233ccd6cffbSTamas Berghammer 2340fefa676SJean-Daniel Dupas case 'R': 235b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qRcmd,")) 236b9c1b51eSKate Stone return eServerPacketType_qRcmd; 237b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qRegisterInfo")) 238b9c1b51eSKate Stone return eServerPacketType_qRegisterInfo; 2390fefa676SJean-Daniel Dupas break; 240e0f8f574SDaniel Malea 2418b82f087SGreg Clayton case 'S': 242b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qSpeedTest:")) 243b9c1b51eSKate Stone return eServerPacketType_qSpeedTest; 244b9c1b51eSKate Stone if (PACKET_MATCHES("qShlibInfoAddr")) 245b9c1b51eSKate Stone return eServerPacketType_qShlibInfoAddr; 246b9c1b51eSKate Stone if (PACKET_MATCHES("qStepPacketSupported")) 247b9c1b51eSKate Stone return eServerPacketType_qStepPacketSupported; 248b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qSupported")) 249b9c1b51eSKate Stone return eServerPacketType_qSupported; 250b9c1b51eSKate Stone if (PACKET_MATCHES("qSyncThreadStateSupported")) 251b9c1b51eSKate Stone return eServerPacketType_qSyncThreadStateSupported; 2520fefa676SJean-Daniel Dupas break; 2530fefa676SJean-Daniel Dupas 2540fefa676SJean-Daniel Dupas case 'T': 255b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qThreadExtraInfo,")) 256b9c1b51eSKate Stone return eServerPacketType_qThreadExtraInfo; 257b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qThreadStopInfo")) 258b9c1b51eSKate Stone return eServerPacketType_qThreadStopInfo; 2598b82f087SGreg Clayton break; 2608b82f087SGreg Clayton 2618b82f087SGreg Clayton case 'U': 262b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qUserName:")) 263b9c1b51eSKate Stone return eServerPacketType_qUserName; 2648b82f087SGreg Clayton break; 2650fefa676SJean-Daniel Dupas 2660fefa676SJean-Daniel Dupas case 'V': 267b9c1b51eSKate Stone if (PACKET_MATCHES("qVAttachOrWaitSupported")) 268b9c1b51eSKate Stone return eServerPacketType_qVAttachOrWaitSupported; 2690fefa676SJean-Daniel Dupas break; 2700fefa676SJean-Daniel Dupas 2710fefa676SJean-Daniel Dupas case 'W': 272b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qWatchpointSupportInfo:")) 273b9c1b51eSKate Stone return eServerPacketType_qWatchpointSupportInfo; 274b9c1b51eSKate Stone if (PACKET_MATCHES("qWatchpointSupportInfo")) 275b9c1b51eSKate Stone return eServerPacketType_qWatchpointSupportInfoSupported; 2760fefa676SJean-Daniel Dupas break; 277af245d11STodd Fiala 278af245d11STodd Fiala case 'X': 279b9c1b51eSKate Stone if (PACKET_STARTS_WITH("qXfer:auxv:read::")) 280b9c1b51eSKate Stone return eServerPacketType_qXfer_auxv_read; 281af245d11STodd Fiala break; 2828b82f087SGreg Clayton } 283576d8834SGreg Clayton break; 28498d0a4b3SChaoren Lin 28598d0a4b3SChaoren Lin case 'j': 2862f1fbaebSPavel Labath if (PACKET_STARTS_WITH("jModulesInfo:")) 2872f1fbaebSPavel Labath return eServerPacketType_jModulesInfo; 288b9c1b51eSKate Stone if (PACKET_MATCHES("jSignalsInfo")) 289b9c1b51eSKate Stone return eServerPacketType_jSignalsInfo; 290b9c1b51eSKate Stone if (PACKET_MATCHES("jThreadsInfo")) 291b9c1b51eSKate Stone return eServerPacketType_jThreadsInfo; 292cec91ef9SGreg Clayton break; 29398d0a4b3SChaoren Lin 294e0f8f574SDaniel Malea case 'v': 295b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vFile:")) { 296b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vFile:open:")) 297b9c1b51eSKate Stone return eServerPacketType_vFile_open; 298b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:close:")) 299b9c1b51eSKate Stone return eServerPacketType_vFile_close; 300b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:pread")) 301b9c1b51eSKate Stone return eServerPacketType_vFile_pread; 302b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:pwrite")) 303b9c1b51eSKate Stone return eServerPacketType_vFile_pwrite; 304b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:size")) 305b9c1b51eSKate Stone return eServerPacketType_vFile_size; 306b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:exists")) 307b9c1b51eSKate Stone return eServerPacketType_vFile_exists; 308b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:stat")) 309b9c1b51eSKate Stone return eServerPacketType_vFile_stat; 310b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:mode")) 311b9c1b51eSKate Stone return eServerPacketType_vFile_mode; 312b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:MD5")) 313b9c1b51eSKate Stone return eServerPacketType_vFile_md5; 314b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:symlink")) 315b9c1b51eSKate Stone return eServerPacketType_vFile_symlink; 316b9c1b51eSKate Stone else if (PACKET_STARTS_WITH("vFile:unlink")) 317b9c1b51eSKate Stone return eServerPacketType_vFile_unlink; 318e0f8f574SDaniel Malea 3190fefa676SJean-Daniel Dupas } else { 320b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vAttach;")) 321b9c1b51eSKate Stone return eServerPacketType_vAttach; 322b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vAttachWait;")) 323b9c1b51eSKate Stone return eServerPacketType_vAttachWait; 324b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vAttachOrWait;")) 325b9c1b51eSKate Stone return eServerPacketType_vAttachOrWait; 326b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vAttachName;")) 327b9c1b51eSKate Stone return eServerPacketType_vAttachName; 328b9c1b51eSKate Stone if (PACKET_STARTS_WITH("vCont;")) 329b9c1b51eSKate Stone return eServerPacketType_vCont; 330b9c1b51eSKate Stone if (PACKET_MATCHES("vCont?")) 331b9c1b51eSKate Stone return eServerPacketType_vCont_actions; 332e0f8f574SDaniel Malea } 333e0f8f574SDaniel Malea break; 3340fefa676SJean-Daniel Dupas case '_': 335b9c1b51eSKate Stone switch (packet_cstr[1]) { 3360fefa676SJean-Daniel Dupas case 'M': 3370fefa676SJean-Daniel Dupas return eServerPacketType__M; 3380fefa676SJean-Daniel Dupas 3390fefa676SJean-Daniel Dupas case 'm': 3400fefa676SJean-Daniel Dupas return eServerPacketType__m; 3410fefa676SJean-Daniel Dupas } 3420fefa676SJean-Daniel Dupas break; 3430fefa676SJean-Daniel Dupas 3440fefa676SJean-Daniel Dupas case '?': 345b9c1b51eSKate Stone if (packet_size == 1) 346b9c1b51eSKate Stone return eServerPacketType_stop_reason; 3470fefa676SJean-Daniel Dupas break; 3480fefa676SJean-Daniel Dupas 3490fefa676SJean-Daniel Dupas case 'c': 3500fefa676SJean-Daniel Dupas return eServerPacketType_c; 3510fefa676SJean-Daniel Dupas 3520fefa676SJean-Daniel Dupas case 'C': 3530fefa676SJean-Daniel Dupas return eServerPacketType_C; 3540fefa676SJean-Daniel Dupas 3550fefa676SJean-Daniel Dupas case 'D': 356b9c1b51eSKate Stone if (packet_size == 1) 357b9c1b51eSKate Stone return eServerPacketType_D; 3580fefa676SJean-Daniel Dupas break; 3590fefa676SJean-Daniel Dupas 3600fefa676SJean-Daniel Dupas case 'g': 361b9c1b51eSKate Stone if (packet_size == 1) 362b9c1b51eSKate Stone return eServerPacketType_g; 3630fefa676SJean-Daniel Dupas break; 3640fefa676SJean-Daniel Dupas 3650fefa676SJean-Daniel Dupas case 'G': 3660fefa676SJean-Daniel Dupas return eServerPacketType_G; 3670fefa676SJean-Daniel Dupas 3680fefa676SJean-Daniel Dupas case 'H': 3690fefa676SJean-Daniel Dupas return eServerPacketType_H; 3700fefa676SJean-Daniel Dupas 371e0be425aSVince Harron case 'I': 372e0be425aSVince Harron return eServerPacketType_I; 373e0be425aSVince Harron 3740fefa676SJean-Daniel Dupas case 'k': 375b9c1b51eSKate Stone if (packet_size == 1) 376b9c1b51eSKate Stone return eServerPacketType_k; 3770fefa676SJean-Daniel Dupas break; 3780fefa676SJean-Daniel Dupas 3790fefa676SJean-Daniel Dupas case 'm': 3800fefa676SJean-Daniel Dupas return eServerPacketType_m; 3810fefa676SJean-Daniel Dupas 3820fefa676SJean-Daniel Dupas case 'M': 3830fefa676SJean-Daniel Dupas return eServerPacketType_M; 3840fefa676SJean-Daniel Dupas 3850fefa676SJean-Daniel Dupas case 'p': 3860fefa676SJean-Daniel Dupas return eServerPacketType_p; 3870fefa676SJean-Daniel Dupas 3880fefa676SJean-Daniel Dupas case 'P': 3890fefa676SJean-Daniel Dupas return eServerPacketType_P; 3900fefa676SJean-Daniel Dupas 3910fefa676SJean-Daniel Dupas case 's': 392b9c1b51eSKate Stone if (packet_size == 1) 393b9c1b51eSKate Stone return eServerPacketType_s; 3940fefa676SJean-Daniel Dupas break; 3950fefa676SJean-Daniel Dupas 3960fefa676SJean-Daniel Dupas case 'S': 3970fefa676SJean-Daniel Dupas return eServerPacketType_S; 3980fefa676SJean-Daniel Dupas 3993bf11256SPavel Labath case 'x': 4003bf11256SPavel Labath return eServerPacketType_x; 4013bf11256SPavel Labath 4023bf11256SPavel Labath case 'X': 4033bf11256SPavel Labath return eServerPacketType_X; 4043bf11256SPavel Labath 4050fefa676SJean-Daniel Dupas case 'T': 4060fefa676SJean-Daniel Dupas return eServerPacketType_T; 4070fefa676SJean-Daniel Dupas 4080fefa676SJean-Daniel Dupas case 'z': 4090fefa676SJean-Daniel Dupas if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4') 4100fefa676SJean-Daniel Dupas return eServerPacketType_z; 4110fefa676SJean-Daniel Dupas break; 4120fefa676SJean-Daniel Dupas 4130fefa676SJean-Daniel Dupas case 'Z': 4140fefa676SJean-Daniel Dupas if (packet_cstr[1] >= '0' && packet_cstr[1] <= '4') 4150fefa676SJean-Daniel Dupas return eServerPacketType_Z; 4160fefa676SJean-Daniel Dupas break; 417576d8834SGreg Clayton } 418576d8834SGreg Clayton return eServerPacketType_unimplemented; 419576d8834SGreg Clayton } 420576d8834SGreg Clayton 421b9c1b51eSKate Stone bool StringExtractorGDBRemote::IsOKResponse() const { 422576d8834SGreg Clayton return GetResponseType() == eOK; 42330fdc8d8SChris Lattner } 42430fdc8d8SChris Lattner 425b9c1b51eSKate Stone bool StringExtractorGDBRemote::IsUnsupportedResponse() const { 426576d8834SGreg Clayton return GetResponseType() == eUnsupported; 42730fdc8d8SChris Lattner } 42830fdc8d8SChris Lattner 429b9c1b51eSKate Stone bool StringExtractorGDBRemote::IsNormalResponse() const { 430576d8834SGreg Clayton return GetResponseType() == eResponse; 43130fdc8d8SChris Lattner } 43230fdc8d8SChris Lattner 433b9c1b51eSKate Stone bool StringExtractorGDBRemote::IsErrorResponse() const { 434b9c1b51eSKate Stone return GetResponseType() == eError && m_packet.size() == 3 && 435b9c1b51eSKate Stone isxdigit(m_packet[1]) && isxdigit(m_packet[2]); 43630fdc8d8SChris Lattner } 43730fdc8d8SChris Lattner 438b9c1b51eSKate Stone uint8_t StringExtractorGDBRemote::GetError() { 439b9c1b51eSKate Stone if (GetResponseType() == eError) { 44030fdc8d8SChris Lattner SetFilePos(1); 44130fdc8d8SChris Lattner return GetHexU8(255); 44230fdc8d8SChris Lattner } 44330fdc8d8SChris Lattner return 0; 44430fdc8d8SChris Lattner } 445e0f8f574SDaniel Malea 446b9c1b51eSKate Stone size_t StringExtractorGDBRemote::GetEscapedBinaryData(std::string &str) { 447b9c1b51eSKate Stone // Just get the data bytes in the string as 448b9c1b51eSKate Stone // GDBRemoteCommunication::CheckForPacket() 449b9c1b51eSKate Stone // already removes any 0x7d escaped characters. If any 0x7d characters are 450b9c1b51eSKate Stone // left in 451109534cbSGreg Clayton // the packet, then they are supposed to be there... 452e0f8f574SDaniel Malea str.clear(); 453109534cbSGreg Clayton const size_t bytes_left = GetBytesLeft(); 454b9c1b51eSKate Stone if (bytes_left > 0) { 455109534cbSGreg Clayton str.assign(m_packet, m_index, bytes_left); 456109534cbSGreg Clayton m_index += bytes_left; 457e0f8f574SDaniel Malea } 458e0f8f574SDaniel Malea return str.size(); 459e0f8f574SDaniel Malea } 460e0f8f574SDaniel Malea 461830c81d5SGreg Clayton static bool 462b9c1b51eSKate Stone OKErrorNotSupportedResponseValidator(void *, 463b9c1b51eSKate Stone const StringExtractorGDBRemote &response) { 464b9c1b51eSKate Stone switch (response.GetResponseType()) { 465830c81d5SGreg Clayton case StringExtractorGDBRemote::eOK: 466830c81d5SGreg Clayton case StringExtractorGDBRemote::eError: 467830c81d5SGreg Clayton case StringExtractorGDBRemote::eUnsupported: 468830c81d5SGreg Clayton return true; 469830c81d5SGreg Clayton 470830c81d5SGreg Clayton case StringExtractorGDBRemote::eAck: 471830c81d5SGreg Clayton case StringExtractorGDBRemote::eNack: 472830c81d5SGreg Clayton case StringExtractorGDBRemote::eResponse: 473830c81d5SGreg Clayton break; 474830c81d5SGreg Clayton } 475830c81d5SGreg Clayton return false; 476830c81d5SGreg Clayton } 477830c81d5SGreg Clayton 478b9c1b51eSKate Stone static bool JSONResponseValidator(void *, 479b9c1b51eSKate Stone const StringExtractorGDBRemote &response) { 480b9c1b51eSKate Stone switch (response.GetResponseType()) { 481830c81d5SGreg Clayton case StringExtractorGDBRemote::eUnsupported: 482830c81d5SGreg Clayton case StringExtractorGDBRemote::eError: 483830c81d5SGreg Clayton return true; // Accept unsupported or EXX as valid responses 484830c81d5SGreg Clayton 485830c81d5SGreg Clayton case StringExtractorGDBRemote::eOK: 486830c81d5SGreg Clayton case StringExtractorGDBRemote::eAck: 487830c81d5SGreg Clayton case StringExtractorGDBRemote::eNack: 488830c81d5SGreg Clayton break; 489830c81d5SGreg Clayton 490830c81d5SGreg Clayton case StringExtractorGDBRemote::eResponse: 491830c81d5SGreg Clayton // JSON that is returned in from JSON query packets is currently always 492830c81d5SGreg Clayton // either a dictionary which starts with a '{', or an array which 493830c81d5SGreg Clayton // starts with a '['. This is a quick validator to just make sure the 494830c81d5SGreg Clayton // response could be valid JSON without having to validate all of the 495830c81d5SGreg Clayton // JSON content. 496b9c1b51eSKate Stone switch (response.GetStringRef()[0]) { 497b9c1b51eSKate Stone case '{': 498b9c1b51eSKate Stone return true; 499b9c1b51eSKate Stone case '[': 500b9c1b51eSKate Stone return true; 501830c81d5SGreg Clayton default: 502830c81d5SGreg Clayton break; 503830c81d5SGreg Clayton } 504830c81d5SGreg Clayton break; 505830c81d5SGreg Clayton } 506830c81d5SGreg Clayton return false; 507830c81d5SGreg Clayton } 508830c81d5SGreg Clayton 509830c81d5SGreg Clayton static bool 510b9c1b51eSKate Stone ASCIIHexBytesResponseValidator(void *, 511b9c1b51eSKate Stone const StringExtractorGDBRemote &response) { 512b9c1b51eSKate Stone switch (response.GetResponseType()) { 513830c81d5SGreg Clayton case StringExtractorGDBRemote::eUnsupported: 514830c81d5SGreg Clayton case StringExtractorGDBRemote::eError: 515830c81d5SGreg Clayton return true; // Accept unsupported or EXX as valid responses 516830c81d5SGreg Clayton 517830c81d5SGreg Clayton case StringExtractorGDBRemote::eOK: 518830c81d5SGreg Clayton case StringExtractorGDBRemote::eAck: 519830c81d5SGreg Clayton case StringExtractorGDBRemote::eNack: 520830c81d5SGreg Clayton break; 521830c81d5SGreg Clayton 522b9c1b51eSKate Stone case StringExtractorGDBRemote::eResponse: { 523830c81d5SGreg Clayton uint32_t valid_count = 0; 524b9c1b51eSKate Stone for (const char ch : response.GetStringRef()) { 525b9c1b51eSKate Stone if (!isxdigit(ch)) { 526830c81d5SGreg Clayton return false; 527830c81d5SGreg Clayton } 528830c81d5SGreg Clayton if (++valid_count >= 16) 529b9c1b51eSKate Stone break; // Don't validate all the characters in case the packet is very 530b9c1b51eSKate Stone // large 531830c81d5SGreg Clayton } 532830c81d5SGreg Clayton return true; 533b9c1b51eSKate Stone } break; 534830c81d5SGreg Clayton } 535830c81d5SGreg Clayton return false; 536830c81d5SGreg Clayton } 537830c81d5SGreg Clayton 538b9c1b51eSKate Stone void StringExtractorGDBRemote::CopyResponseValidator( 539b9c1b51eSKate Stone const StringExtractorGDBRemote &rhs) { 540830c81d5SGreg Clayton m_validator = rhs.m_validator; 541830c81d5SGreg Clayton m_validator_baton = rhs.m_validator_baton; 542830c81d5SGreg Clayton } 543830c81d5SGreg Clayton 544b9c1b51eSKate Stone void StringExtractorGDBRemote::SetResponseValidator( 545b9c1b51eSKate Stone ResponseValidatorCallback callback, void *baton) { 546830c81d5SGreg Clayton m_validator = callback; 547830c81d5SGreg Clayton m_validator_baton = baton; 548830c81d5SGreg Clayton } 549830c81d5SGreg Clayton 550b9c1b51eSKate Stone void StringExtractorGDBRemote::SetResponseValidatorToOKErrorNotSupported() { 551830c81d5SGreg Clayton m_validator = OKErrorNotSupportedResponseValidator; 552830c81d5SGreg Clayton m_validator_baton = nullptr; 553830c81d5SGreg Clayton } 554830c81d5SGreg Clayton 555b9c1b51eSKate Stone void StringExtractorGDBRemote::SetResponseValidatorToASCIIHexBytes() { 556830c81d5SGreg Clayton m_validator = ASCIIHexBytesResponseValidator; 557830c81d5SGreg Clayton m_validator_baton = nullptr; 558830c81d5SGreg Clayton } 559830c81d5SGreg Clayton 560b9c1b51eSKate Stone void StringExtractorGDBRemote::SetResponseValidatorToJSON() { 561830c81d5SGreg Clayton m_validator = JSONResponseValidator; 562830c81d5SGreg Clayton m_validator_baton = nullptr; 563830c81d5SGreg Clayton } 564830c81d5SGreg Clayton 565b9c1b51eSKate Stone bool StringExtractorGDBRemote::ValidateResponse() const { 566830c81d5SGreg Clayton // If we have a validator callback, try to validate the callback 567830c81d5SGreg Clayton if (m_validator) 568830c81d5SGreg Clayton return m_validator(m_validator_baton, *this); 569830c81d5SGreg Clayton else 570830c81d5SGreg Clayton return true; // No validator, so response is valid 571830c81d5SGreg Clayton } 572