1061da546Spatrick 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick // 9061da546Spatrick // Created by Greg Clayton on 12/12/07. 10061da546Spatrick // 11061da546Spatrick //===----------------------------------------------------------------------===// 12061da546Spatrick 13dda28197Spatrick #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_RNBREMOTE_H 14dda28197Spatrick #define LLDB_TOOLS_DEBUGSERVER_SOURCE_RNBREMOTE_H 15061da546Spatrick 16061da546Spatrick #include "DNB.h" 17061da546Spatrick #include "PThreadMutex.h" 18061da546Spatrick #include "RNBContext.h" 19061da546Spatrick #include "RNBDefs.h" 20061da546Spatrick #include "RNBSocket.h" 21061da546Spatrick #include <deque> 22061da546Spatrick #include <map> 23061da546Spatrick #include <string> 24061da546Spatrick #include <vector> 25061da546Spatrick 26061da546Spatrick class RNBSocket; 27061da546Spatrick class RNBContext; 28061da546Spatrick class PThreadEvents; 29061da546Spatrick 30061da546Spatrick enum event_loop_mode { debug_nub, gdb_remote_protocol, done }; 31061da546Spatrick 32061da546Spatrick enum class compression_types { zlib_deflate, lz4, lzma, lzfse, none }; 33061da546Spatrick 34061da546Spatrick class RNBRemote { 35061da546Spatrick public: 36061da546Spatrick enum PacketEnum { 37061da546Spatrick invalid_packet = 0, 38061da546Spatrick ack, // '+' 39061da546Spatrick nack, // '-' 40061da546Spatrick halt, // ^C (async halt) 41061da546Spatrick use_extended_mode, // '!' 42061da546Spatrick why_halted, // '?' 43061da546Spatrick set_argv, // 'A' 44061da546Spatrick set_bp, // 'B' 45061da546Spatrick cont, // 'c' 46061da546Spatrick continue_with_sig, // 'C' 47061da546Spatrick detach, // 'D' 48061da546Spatrick read_general_regs, // 'g' 49061da546Spatrick write_general_regs, // 'G' 50061da546Spatrick set_thread, // 'H' 51061da546Spatrick step_inferior_one_cycle, // 'i' 52061da546Spatrick signal_and_step_inf_one_cycle, // 'I' 53061da546Spatrick kill, // 'k' 54061da546Spatrick read_memory, // 'm' 55061da546Spatrick write_memory, // 'M' 56061da546Spatrick read_register, // 'p' 57061da546Spatrick write_register, // 'P' 58061da546Spatrick restart, // 'R' 59061da546Spatrick single_step, // 's' 60061da546Spatrick single_step_with_sig, // 'S' 61061da546Spatrick search_mem_backwards, // 't' 62061da546Spatrick thread_alive_p, // 'T' 63061da546Spatrick vattach, // 'vAttach;pid' 64061da546Spatrick vattachwait, // 'vAttachWait:XX...' where XX is one or more hex encoded 65061da546Spatrick // process name ASCII bytes 66061da546Spatrick vattachorwait, // 'vAttachOrWait:XX...' where XX is one or more hex encoded 67061da546Spatrick // process name ASCII bytes 68061da546Spatrick vattachname, // 'vAttachName:XX...' where XX is one or more hex encoded 69061da546Spatrick // process name ASCII bytes 70061da546Spatrick vcont, // 'vCont' 71061da546Spatrick vcont_list_actions, // 'vCont?' 72061da546Spatrick read_data_from_memory, // 'x' 73061da546Spatrick write_data_to_memory, // 'X' 74061da546Spatrick insert_mem_bp, // 'Z0' 75061da546Spatrick remove_mem_bp, // 'z0' 76061da546Spatrick insert_hardware_bp, // 'Z1' 77061da546Spatrick remove_hardware_bp, // 'z1' 78061da546Spatrick insert_write_watch_bp, // 'Z2' 79061da546Spatrick remove_write_watch_bp, // 'z2' 80061da546Spatrick insert_read_watch_bp, // 'Z3' 81061da546Spatrick remove_read_watch_bp, // 'z3' 82061da546Spatrick insert_access_watch_bp, // 'Z4' 83061da546Spatrick remove_access_watch_bp, // 'z4' 84061da546Spatrick 85061da546Spatrick query_monitor, // 'qRcmd' 86061da546Spatrick query_current_thread_id, // 'qC' 87061da546Spatrick query_get_pid, // 'qGetPid' 88061da546Spatrick query_echo, // 'qEcho' 89061da546Spatrick query_thread_ids_first, // 'qfThreadInfo' 90061da546Spatrick query_thread_ids_subsequent, // 'qsThreadInfo' 91061da546Spatrick query_thread_extra_info, // 'qThreadExtraInfo' 92061da546Spatrick query_thread_stop_info, // 'qThreadStopInfo' 93061da546Spatrick query_image_offsets, // 'qOffsets' 94061da546Spatrick query_symbol_lookup, // 'qSymbol' 95061da546Spatrick query_launch_success, // 'qLaunchSuccess' 96061da546Spatrick query_register_info, // 'qRegisterInfo' 97061da546Spatrick query_shlib_notify_info_addr, // 'qShlibInfoAddr' 98061da546Spatrick query_step_packet_supported, // 'qStepPacketSupported' 99061da546Spatrick query_supported_features, // 'qSupported' 100061da546Spatrick query_vattachorwait_supported, // 'qVAttachOrWaitSupported' 101061da546Spatrick query_sync_thread_state_supported, // 'QSyncThreadState' 102061da546Spatrick query_host_info, // 'qHostInfo' 103061da546Spatrick query_gdb_server_version, // 'qGDBServerVersion' 104061da546Spatrick query_process_info, // 'qProcessInfo' 105061da546Spatrick json_query_thread_extended_info, // 'jThreadExtendedInfo' 106061da546Spatrick json_query_get_loaded_dynamic_libraries_infos, // 'jGetLoadedDynamicLibrariesInfos' 107061da546Spatrick json_query_threads_info, // 'jThreadsInfo' 108061da546Spatrick json_query_get_shared_cache_info, // 'jGetSharedCacheInfo' 109061da546Spatrick pass_signals_to_inferior, // 'QPassSignals' 110061da546Spatrick start_noack_mode, // 'QStartNoAckMode' 111061da546Spatrick prefix_reg_packets_with_tid, // 'QPrefixRegisterPacketsWithThreadID 112061da546Spatrick set_logging_mode, // 'QSetLogging:' 113*f6aab3d8Srobert set_ignored_exceptions, // 'QSetIgnoredExceptions' 114061da546Spatrick set_max_packet_size, // 'QSetMaxPacketSize:' 115061da546Spatrick set_max_payload_size, // 'QSetMaxPayloadSize:' 116061da546Spatrick set_environment_variable, // 'QEnvironment:' 117061da546Spatrick set_environment_variable_hex, // 'QEnvironmentHexEncoded:' 118061da546Spatrick set_launch_arch, // 'QLaunchArch:' 119061da546Spatrick set_disable_aslr, // 'QSetDisableASLR:' 120061da546Spatrick set_stdin, // 'QSetSTDIN:' 121061da546Spatrick set_stdout, // 'QSetSTDOUT:' 122061da546Spatrick set_stderr, // 'QSetSTDERR:' 123061da546Spatrick set_working_dir, // 'QSetWorkingDir:' 124061da546Spatrick set_list_threads_in_stop_reply, // 'QListThreadsInStopReply:' 125061da546Spatrick sync_thread_state, // 'QSyncThreadState:' 126061da546Spatrick memory_region_info, // 'qMemoryRegionInfo:' 127061da546Spatrick get_profile_data, // 'qGetProfileData' 128061da546Spatrick set_enable_profiling, // 'QSetEnableAsyncProfiling' 129061da546Spatrick enable_compression, // 'QEnableCompression:' 130061da546Spatrick watchpoint_support_info, // 'qWatchpointSupportInfo:' 131061da546Spatrick allocate_memory, // '_M' 132061da546Spatrick deallocate_memory, // '_m' 133061da546Spatrick set_process_event, // 'QSetProcessEvent:' 134061da546Spatrick save_register_state, // '_g' 135061da546Spatrick restore_register_state, // '_G' 136061da546Spatrick speed_test, // 'qSpeedTest:' 137061da546Spatrick set_detach_on_error, // 'QSetDetachOnError:' 138061da546Spatrick query_transfer, // 'qXfer:' 139*f6aab3d8Srobert json_query_dyld_process_state, // 'jGetDyldProcessState' 140061da546Spatrick unknown_type 141061da546Spatrick }; 142061da546Spatrick 143061da546Spatrick typedef rnb_err_t (RNBRemote::*HandlePacketCallback)(const char *p); 144061da546Spatrick 145061da546Spatrick RNBRemote(); 146061da546Spatrick ~RNBRemote(); 147061da546Spatrick 148061da546Spatrick void Initialize(); 149061da546Spatrick 150061da546Spatrick bool InitializeRegisters(bool force = false); 151061da546Spatrick 152061da546Spatrick rnb_err_t HandleAsyncPacket(PacketEnum *type = NULL); 153061da546Spatrick rnb_err_t HandleReceivedPacket(PacketEnum *type = NULL); 154061da546Spatrick GetContinueThread()155061da546Spatrick nub_thread_t GetContinueThread() const { return m_continue_thread; } 156061da546Spatrick SetContinueThread(nub_thread_t tid)157061da546Spatrick void SetContinueThread(nub_thread_t tid) { m_continue_thread = tid; } 158061da546Spatrick GetCurrentThread()159061da546Spatrick nub_thread_t GetCurrentThread() const { 160061da546Spatrick if (m_thread == 0 || m_thread == (nub_thread_t)-1) 161061da546Spatrick return DNBProcessGetCurrentThread(m_ctx.ProcessID()); 162061da546Spatrick return m_thread; 163061da546Spatrick } 164061da546Spatrick SetCurrentThread(nub_thread_t tid)165061da546Spatrick void SetCurrentThread(nub_thread_t tid) { 166061da546Spatrick DNBProcessSetCurrentThread(m_ctx.ProcessID(), tid); 167061da546Spatrick m_thread = tid; 168061da546Spatrick } 169061da546Spatrick 170061da546Spatrick static void *ThreadFunctionReadRemoteData(void *arg); 171061da546Spatrick void StartReadRemoteDataThread(); 172061da546Spatrick void StopReadRemoteDataThread(); 173061da546Spatrick 174061da546Spatrick void NotifyThatProcessStopped(void); 175061da546Spatrick 176061da546Spatrick rnb_err_t HandlePacket_A(const char *p); 177061da546Spatrick rnb_err_t HandlePacket_H(const char *p); 178061da546Spatrick rnb_err_t HandlePacket_qC(const char *p); 179061da546Spatrick rnb_err_t HandlePacket_qRcmd(const char *p); 180061da546Spatrick rnb_err_t HandlePacket_qGetPid(const char *p); 181061da546Spatrick rnb_err_t HandlePacket_qEcho(const char *p); 182061da546Spatrick rnb_err_t HandlePacket_qLaunchSuccess(const char *p); 183061da546Spatrick rnb_err_t HandlePacket_qRegisterInfo(const char *p); 184061da546Spatrick rnb_err_t HandlePacket_qShlibInfoAddr(const char *p); 185061da546Spatrick rnb_err_t HandlePacket_qStepPacketSupported(const char *p); 186061da546Spatrick rnb_err_t HandlePacket_qVAttachOrWaitSupported(const char *p); 187061da546Spatrick rnb_err_t HandlePacket_qSyncThreadStateSupported(const char *p); 188061da546Spatrick rnb_err_t HandlePacket_qThreadInfo(const char *p); 189061da546Spatrick rnb_err_t HandlePacket_jThreadExtendedInfo(const char *p); 190061da546Spatrick rnb_err_t HandlePacket_jGetLoadedDynamicLibrariesInfos(const char *p); 191061da546Spatrick rnb_err_t HandlePacket_jThreadsInfo(const char *p); 192061da546Spatrick rnb_err_t HandlePacket_jGetSharedCacheInfo(const char *p); 193061da546Spatrick rnb_err_t HandlePacket_qThreadExtraInfo(const char *p); 194061da546Spatrick rnb_err_t HandlePacket_qThreadStopInfo(const char *p); 195061da546Spatrick rnb_err_t HandlePacket_qHostInfo(const char *p); 196061da546Spatrick rnb_err_t HandlePacket_qGDBServerVersion(const char *p); 197061da546Spatrick rnb_err_t HandlePacket_qProcessInfo(const char *p); 198061da546Spatrick rnb_err_t HandlePacket_qSymbol(const char *p); 199061da546Spatrick rnb_err_t HandlePacket_QStartNoAckMode(const char *p); 200061da546Spatrick rnb_err_t HandlePacket_QThreadSuffixSupported(const char *p); 201061da546Spatrick rnb_err_t HandlePacket_QSetLogging(const char *p); 202*f6aab3d8Srobert rnb_err_t HandlePacket_QSetIgnoredExceptions(const char *p); 203061da546Spatrick rnb_err_t HandlePacket_QSetDisableASLR(const char *p); 204061da546Spatrick rnb_err_t HandlePacket_QSetSTDIO(const char *p); 205061da546Spatrick rnb_err_t HandlePacket_QSetWorkingDir(const char *p); 206061da546Spatrick rnb_err_t HandlePacket_QSetMaxPayloadSize(const char *p); 207061da546Spatrick rnb_err_t HandlePacket_QSetMaxPacketSize(const char *p); 208061da546Spatrick rnb_err_t HandlePacket_QEnvironment(const char *p); 209061da546Spatrick rnb_err_t HandlePacket_QEnvironmentHexEncoded(const char *p); 210061da546Spatrick rnb_err_t HandlePacket_QLaunchArch(const char *p); 211061da546Spatrick rnb_err_t HandlePacket_QListThreadsInStopReply(const char *p); 212061da546Spatrick rnb_err_t HandlePacket_QSyncThreadState(const char *p); 213061da546Spatrick rnb_err_t HandlePacket_QPrefixRegisterPacketsWithThreadID(const char *p); 214061da546Spatrick rnb_err_t HandlePacket_QSetProcessEvent(const char *p); 215061da546Spatrick rnb_err_t HandlePacket_last_signal(const char *p); 216061da546Spatrick rnb_err_t HandlePacket_m(const char *p); 217061da546Spatrick rnb_err_t HandlePacket_M(const char *p); 218061da546Spatrick rnb_err_t HandlePacket_x(const char *p); 219061da546Spatrick rnb_err_t HandlePacket_X(const char *p); 220061da546Spatrick rnb_err_t HandlePacket_g(const char *p); 221061da546Spatrick rnb_err_t HandlePacket_G(const char *p); 222061da546Spatrick rnb_err_t HandlePacket_z(const char *p); 223061da546Spatrick rnb_err_t HandlePacket_T(const char *p); 224061da546Spatrick rnb_err_t HandlePacket_p(const char *p); 225061da546Spatrick rnb_err_t HandlePacket_P(const char *p); 226061da546Spatrick rnb_err_t HandlePacket_c(const char *p); 227061da546Spatrick rnb_err_t HandlePacket_C(const char *p); 228061da546Spatrick rnb_err_t HandlePacket_D(const char *p); 229061da546Spatrick rnb_err_t HandlePacket_k(const char *p); 230061da546Spatrick rnb_err_t HandlePacket_s(const char *p); 231061da546Spatrick rnb_err_t HandlePacket_S(const char *p); 232061da546Spatrick rnb_err_t HandlePacket_qSupported(const char *p); 233061da546Spatrick rnb_err_t HandlePacket_v(const char *p); 234061da546Spatrick rnb_err_t HandlePacket_UNIMPLEMENTED(const char *p); 235061da546Spatrick rnb_err_t HandlePacket_ILLFORMED(const char *file, int line, const char *p, 236061da546Spatrick const char *description); 237061da546Spatrick rnb_err_t HandlePacket_AllocateMemory(const char *p); 238061da546Spatrick rnb_err_t HandlePacket_DeallocateMemory(const char *p); 239061da546Spatrick rnb_err_t HandlePacket_SaveRegisterState(const char *p); 240061da546Spatrick rnb_err_t HandlePacket_RestoreRegisterState(const char *p); 241061da546Spatrick rnb_err_t HandlePacket_MemoryRegionInfo(const char *p); 242061da546Spatrick rnb_err_t HandlePacket_GetProfileData(const char *p); 243061da546Spatrick rnb_err_t HandlePacket_SetEnableAsyncProfiling(const char *p); 244061da546Spatrick rnb_err_t HandlePacket_QEnableCompression(const char *p); 245061da546Spatrick rnb_err_t HandlePacket_WatchpointSupportInfo(const char *p); 246061da546Spatrick rnb_err_t HandlePacket_qSpeedTest(const char *p); 247061da546Spatrick rnb_err_t HandlePacket_qXfer(const char *p); 248061da546Spatrick rnb_err_t HandlePacket_stop_process(const char *p); 249061da546Spatrick rnb_err_t HandlePacket_QSetDetachOnError(const char *p); 250*f6aab3d8Srobert rnb_err_t HandlePacket_jGetDyldProcessState(const char *p); 251061da546Spatrick rnb_err_t SendStopReplyPacketForThread(nub_thread_t tid); 252061da546Spatrick rnb_err_t SendHexEncodedBytePacket(const char *header, const void *buf, 253061da546Spatrick size_t buf_len, const char *footer); 254061da546Spatrick rnb_err_t SendSTDOUTPacket(char *buf, nub_size_t buf_size); 255061da546Spatrick rnb_err_t SendSTDERRPacket(char *buf, nub_size_t buf_size); 256061da546Spatrick void FlushSTDIO(); 257061da546Spatrick void SendAsyncProfileData(); 258061da546Spatrick rnb_err_t SendAsyncProfileDataPacket(char *buf, nub_size_t buf_size); 259061da546Spatrick rnb_err_t SendAsyncJSONPacket(const JSONGenerator::Dictionary &dictionary); 260061da546Spatrick Context()261061da546Spatrick RNBContext &Context() { return m_ctx; } Comm()262061da546Spatrick RNBSocket &Comm() { return m_comm; } 263061da546Spatrick 264061da546Spatrick private: 265061da546Spatrick RNBRemote(const RNBRemote &) = delete; 266061da546Spatrick 267061da546Spatrick protected: 268061da546Spatrick rnb_err_t GetCommData(); 269061da546Spatrick void CommDataReceived(const std::string &data); 270061da546Spatrick struct Packet { 271061da546Spatrick typedef std::vector<Packet> collection; 272061da546Spatrick typedef collection::iterator iterator; 273061da546Spatrick typedef collection::const_iterator const_iterator; 274061da546Spatrick PacketEnum type; 275061da546Spatrick HandlePacketCallback normal; // Function to call when inferior is halted 276061da546Spatrick HandlePacketCallback async; // Function to call when inferior is running 277061da546Spatrick std::string abbrev; 278061da546Spatrick std::string printable_name; 279061da546Spatrick IsPlatformPacketPacket280061da546Spatrick bool IsPlatformPacket() const { 281061da546Spatrick switch (type) { 282061da546Spatrick case set_logging_mode: 283061da546Spatrick case query_host_info: 284061da546Spatrick return true; 285061da546Spatrick default: 286061da546Spatrick break; 287061da546Spatrick } 288061da546Spatrick return false; 289061da546Spatrick } PacketPacket290061da546Spatrick Packet() 291061da546Spatrick : type(invalid_packet), normal(NULL), async(NULL), abbrev(), 292061da546Spatrick printable_name() {} 293061da546Spatrick PacketPacket294061da546Spatrick Packet(PacketEnum in_type, HandlePacketCallback in_normal, 295061da546Spatrick HandlePacketCallback in_async, const char *in_abbrev, 296061da546Spatrick const char *in_printable_name) 297061da546Spatrick : type(in_type), normal(in_normal), async(in_async), abbrev(in_abbrev), 298061da546Spatrick printable_name(in_printable_name) {} 299061da546Spatrick }; 300061da546Spatrick 301061da546Spatrick struct DispatchQueueOffsets { 302061da546Spatrick uint16_t dqo_version; 303061da546Spatrick uint16_t dqo_label; 304061da546Spatrick uint16_t dqo_label_size; 305061da546Spatrick uint16_t dqo_flags; 306061da546Spatrick uint16_t dqo_flags_size; 307061da546Spatrick uint16_t dqo_serialnum; 308061da546Spatrick uint16_t dqo_serialnum_size; 309061da546Spatrick uint16_t dqo_width; 310061da546Spatrick uint16_t dqo_width_size; 311061da546Spatrick uint16_t dqo_running; 312061da546Spatrick uint16_t dqo_running_size; 313061da546Spatrick uint16_t dqo_suspend_cnt; // version 5 and later, starting with Mac OS X 314061da546Spatrick // 10.10/iOS 8 315061da546Spatrick uint16_t dqo_suspend_cnt_size; // version 5 and later, starting with Mac OS 316061da546Spatrick // X 10.10/iOS 8 317061da546Spatrick uint16_t dqo_target_queue; // version 5 and later, starting with Mac OS X 318061da546Spatrick // 10.10/iOS 8 319061da546Spatrick uint16_t dqo_target_queue_size; // version 5 and later, starting with Mac OS 320061da546Spatrick // X 10.10/iOS 8 321061da546Spatrick uint16_t 322061da546Spatrick dqo_priority; // version 5 and later, starting with Mac OS X 10.10/iOS 8 323061da546Spatrick uint16_t dqo_priority_size; // version 5 and later, starting with Mac OS X 324061da546Spatrick // 10.10/iOS 8 325061da546Spatrick DispatchQueueOffsetsDispatchQueueOffsets326061da546Spatrick DispatchQueueOffsets() { Clear(); } 327061da546Spatrick ClearDispatchQueueOffsets328061da546Spatrick void Clear() { 329061da546Spatrick dqo_version = UINT16_MAX; 330061da546Spatrick dqo_label = UINT16_MAX; 331061da546Spatrick dqo_label_size = UINT16_MAX; 332061da546Spatrick dqo_flags = UINT16_MAX; 333061da546Spatrick dqo_flags_size = UINT16_MAX; 334061da546Spatrick dqo_serialnum = UINT16_MAX; 335061da546Spatrick dqo_serialnum_size = UINT16_MAX; 336061da546Spatrick dqo_width = UINT16_MAX; 337061da546Spatrick dqo_width_size = UINT16_MAX; 338061da546Spatrick dqo_running = UINT16_MAX; 339061da546Spatrick dqo_running_size = UINT16_MAX; 340061da546Spatrick dqo_suspend_cnt = UINT16_MAX; 341061da546Spatrick dqo_suspend_cnt_size = UINT16_MAX; 342061da546Spatrick dqo_target_queue = UINT16_MAX; 343061da546Spatrick dqo_target_queue_size = UINT16_MAX; 344061da546Spatrick dqo_priority = UINT16_MAX; 345061da546Spatrick dqo_priority_size = UINT16_MAX; 346061da546Spatrick } 347061da546Spatrick IsValidDispatchQueueOffsets348061da546Spatrick bool IsValid() const { return dqo_version != UINT16_MAX; } 349061da546Spatrick 350061da546Spatrick void GetThreadQueueInfo(nub_process_t pid, nub_addr_t dispatch_qaddr, 351061da546Spatrick nub_addr_t &dispatch_queue_t, 352061da546Spatrick std::string &queue_name, uint64_t &queue_width, 353061da546Spatrick uint64_t &queue_serialnum) const; 354061da546Spatrick }; 355061da546Spatrick 356061da546Spatrick rnb_err_t GetPacket(std::string &packet_data, RNBRemote::Packet &packet_info, 357061da546Spatrick bool wait); 358061da546Spatrick rnb_err_t SendPacket(const std::string &); 359061da546Spatrick std::string CompressString(const std::string &); 360061da546Spatrick 361061da546Spatrick void CreatePacketTable(); 362061da546Spatrick rnb_err_t GetPacketPayload(std::string &); 363061da546Spatrick 364061da546Spatrick nub_thread_t ExtractThreadIDFromThreadSuffix(const char *p); 365061da546Spatrick 366061da546Spatrick void EnableCompressionNextSendPacket(compression_types); 367061da546Spatrick 368061da546Spatrick compression_types GetCompressionType(); 369061da546Spatrick 370061da546Spatrick const DispatchQueueOffsets *GetDispatchQueueOffsets(); 371061da546Spatrick 372061da546Spatrick JSONGenerator::ObjectSP 373061da546Spatrick GetJSONThreadsInfo(bool threads_with_valid_stop_info_only); 374061da546Spatrick 375061da546Spatrick RNBContext m_ctx; // process context 376061da546Spatrick RNBSocket m_comm; // communication port 377061da546Spatrick std::string m_arch; 378061da546Spatrick nub_thread_t m_continue_thread; // thread to continue; 0 for any, -1 for all 379061da546Spatrick nub_thread_t m_thread; // thread for other ops; 0 for any, -1 for all 380061da546Spatrick PThreadMutex m_mutex; // Mutex that protects 381061da546Spatrick DispatchQueueOffsets m_dispatch_queue_offsets; 382061da546Spatrick nub_addr_t m_dispatch_queue_offsets_addr; 383061da546Spatrick uint32_t m_qSymbol_index; 384061da546Spatrick uint32_t m_packets_recvd; 385061da546Spatrick Packet::collection m_packets; 386061da546Spatrick std::deque<std::string> m_rx_packets; 387061da546Spatrick std::string m_rx_partial_data; // For packets that may come in more than one 388061da546Spatrick // batch, anything left over can be left here 389061da546Spatrick pthread_t m_rx_pthread; 390061da546Spatrick uint32_t 391061da546Spatrick m_max_payload_size; // the maximum sized payload we should send to gdb 392061da546Spatrick bool m_extended_mode; // are we in extended mode? 393061da546Spatrick bool m_noack_mode; // are we in no-ack mode? 394061da546Spatrick bool m_thread_suffix_supported; // Set to true if the 'p', 'P', 'g', and 'G' 395061da546Spatrick // packets should be prefixed with the thread 396061da546Spatrick // ID and colon: 397061da546Spatrick // "$pRR;thread:TTTT;" instead of "$pRR" 398061da546Spatrick // "$PRR=VVVVVVVV;thread:TTTT;" instead of "$PRR=VVVVVVVV" 399061da546Spatrick // "$g;thread:TTTT" instead of "$g" 400061da546Spatrick // "$GVVVVVVVVVVVVVV;thread:TTTT;#00 instead of "$GVVVVVVVVVVVVVV" 401061da546Spatrick bool m_list_threads_in_stop_reply; 402061da546Spatrick 403061da546Spatrick size_t m_compression_minsize; // only packets larger than this size will be 404061da546Spatrick // compressed 405061da546Spatrick bool m_enable_compression_next_send_packet; 406061da546Spatrick 407061da546Spatrick compression_types m_compression_mode; 408061da546Spatrick }; 409061da546Spatrick 410061da546Spatrick /* We translate the /usr/include/mach/exception_types.h exception types 411061da546Spatrick (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses 412061da546Spatrick in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS). These hard 413061da546Spatrick coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb 414061da546Spatrick values in its include/gdb/signals.h. */ 415061da546Spatrick 416061da546Spatrick #define TARGET_EXC_BAD_ACCESS 0x91 417061da546Spatrick #define TARGET_EXC_BAD_INSTRUCTION 0x92 418061da546Spatrick #define TARGET_EXC_ARITHMETIC 0x93 419061da546Spatrick #define TARGET_EXC_EMULATION 0x94 420061da546Spatrick #define TARGET_EXC_SOFTWARE 0x95 421061da546Spatrick #define TARGET_EXC_BREAKPOINT 0x96 422061da546Spatrick 423061da546Spatrick /* Generally speaking, you can't assume gdb can receive more than 399 bytes 424061da546Spatrick at a time with a random gdb. This bufsize constant is only specifying 425061da546Spatrick how many bytes gdb can *receive* from debugserver -- it tells us nothing 426061da546Spatrick about how many bytes gdb might try to send in a single packet. */ 427061da546Spatrick #define DEFAULT_GDB_REMOTE_PROTOCOL_BUFSIZE 399 428061da546Spatrick 429dda28197Spatrick #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_RNBREMOTE_H 430