1 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 // Created by Greg Clayton on 12/12/07. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef __RNBRemote_h__ 15 #define __RNBRemote_h__ 16 17 #include "RNBDefs.h" 18 #include "DNB.h" 19 #include "RNBContext.h" 20 #include "RNBSocket.h" 21 #include "PThreadMutex.h" 22 #include <string> 23 #include <vector> 24 #include <deque> 25 #include <map> 26 27 class RNBSocket; 28 class RNBContext; 29 class PThreadEvents; 30 31 enum event_loop_mode { debug_nub, gdb_remote_protocol, done }; 32 33 enum class compression_types { zlib_deflate, lz4, lzma, lzfse, none }; 34 35 class RNBRemote 36 { 37 public: 38 39 typedef enum { 40 invalid_packet = 0, 41 ack, // '+' 42 nack, // '-' 43 halt, // ^C (async halt) 44 use_extended_mode, // '!' 45 why_halted, // '?' 46 set_argv, // 'A' 47 set_bp, // 'B' 48 cont, // 'c' 49 continue_with_sig, // 'C' 50 detach, // 'D' 51 read_general_regs, // 'g' 52 write_general_regs, // 'G' 53 set_thread, // 'H' 54 step_inferior_one_cycle, // 'i' 55 signal_and_step_inf_one_cycle, // 'I' 56 kill, // 'k' 57 read_memory, // 'm' 58 write_memory, // 'M' 59 read_register, // 'p' 60 write_register, // 'P' 61 restart, // 'R' 62 single_step, // 's' 63 single_step_with_sig, // 'S' 64 search_mem_backwards, // 't' 65 thread_alive_p, // 'T' 66 vattach, // 'vAttach;pid' 67 vattachwait, // 'vAttachWait:XX...' where XX is one or more hex encoded process name ASCII bytes 68 vattachorwait, // 'vAttachOrWait:XX...' where XX is one or more hex encoded process name ASCII bytes 69 vattachname, // 'vAttachName:XX...' where XX is one or more hex encoded process name ASCII bytes 70 vcont, // 'vCont' 71 vcont_list_actions, // 'vCont?' 72 read_data_from_memory, // 'x' 73 write_data_to_memory, // 'X' 74 insert_mem_bp, // 'Z0' 75 remove_mem_bp, // 'z0' 76 insert_hardware_bp, // 'Z1' 77 remove_hardware_bp, // 'z1' 78 insert_write_watch_bp, // 'Z2' 79 remove_write_watch_bp, // 'z2' 80 insert_read_watch_bp, // 'Z3' 81 remove_read_watch_bp, // 'z3' 82 insert_access_watch_bp, // 'Z4' 83 remove_access_watch_bp, // 'z4' 84 85 query_monitor, // 'qRcmd' 86 query_current_thread_id, // 'qC' 87 query_get_pid, // 'qGetPid' 88 query_echo, // 'qEcho' 89 query_thread_ids_first, // 'qfThreadInfo' 90 query_thread_ids_subsequent, // 'qsThreadInfo' 91 query_thread_extra_info, // 'qThreadExtraInfo' 92 query_thread_stop_info, // 'qThreadStopInfo' 93 query_image_offsets, // 'qOffsets' 94 query_symbol_lookup, // 'qSymbol' 95 query_launch_success, // 'qLaunchSuccess' 96 query_register_info, // 'qRegisterInfo' 97 query_shlib_notify_info_addr, // 'qShlibInfoAddr' 98 query_step_packet_supported, // 'qStepPacketSupported' 99 query_supported_features, // 'qSupported' 100 query_vattachorwait_supported, // 'qVAttachOrWaitSupported' 101 query_sync_thread_state_supported,// 'QSyncThreadState' 102 query_host_info, // 'qHostInfo' 103 query_gdb_server_version, // 'qGDBServerVersion' 104 query_process_info, // 'qProcessInfo' 105 json_query_thread_extended_info,// 'jThreadExtendedInfo' 106 json_query_get_loaded_dynamic_libraries_infos, // 'jGetLoadedDynamicLibrariesInfos' 107 json_query_threads_info, // 'jThreadsInfo' 108 pass_signals_to_inferior, // 'QPassSignals' 109 start_noack_mode, // 'QStartNoAckMode' 110 prefix_reg_packets_with_tid, // 'QPrefixRegisterPacketsWithThreadID 111 set_logging_mode, // 'QSetLogging:' 112 set_max_packet_size, // 'QSetMaxPacketSize:' 113 set_max_payload_size, // 'QSetMaxPayloadSize:' 114 set_environment_variable, // 'QEnvironment:' 115 set_environment_variable_hex, // 'QEnvironmentHexEncoded:' 116 set_launch_arch, // 'QLaunchArch:' 117 set_disable_aslr, // 'QSetDisableASLR:' 118 set_stdin, // 'QSetSTDIN:' 119 set_stdout, // 'QSetSTDOUT:' 120 set_stderr, // 'QSetSTDERR:' 121 set_working_dir, // 'QSetWorkingDir:' 122 set_list_threads_in_stop_reply, // 'QListThreadsInStopReply:' 123 sync_thread_state, // 'QSyncThreadState:' 124 memory_region_info, // 'qMemoryRegionInfo:' 125 get_profile_data, // 'qGetProfileData' 126 set_enable_profiling, // 'QSetEnableAsyncProfiling' 127 enable_compression, // 'QEnableCompression:' 128 watchpoint_support_info, // 'qWatchpointSupportInfo:' 129 allocate_memory, // '_M' 130 deallocate_memory, // '_m' 131 set_process_event, // 'QSetProcessEvent:' 132 save_register_state, // '_g' 133 restore_register_state, // '_G' 134 speed_test, // 'qSpeedTest:' 135 set_detach_on_error, // 'QSetDetachOnError:' 136 query_transfer, // 'qXfer:' 137 unknown_type 138 } PacketEnum; 139 140 typedef rnb_err_t (RNBRemote::*HandlePacketCallback)(const char *p); 141 142 RNBRemote (); 143 ~RNBRemote (); 144 145 void Initialize(); 146 147 bool InitializeRegisters (bool force = false); 148 149 rnb_err_t HandleAsyncPacket(PacketEnum *type = NULL); 150 rnb_err_t HandleReceivedPacket(PacketEnum *type = NULL); 151 152 nub_thread_t GetContinueThread () const 153 { 154 return m_continue_thread; 155 } 156 157 void SetContinueThread (nub_thread_t tid) 158 { 159 m_continue_thread = tid; 160 } 161 162 nub_thread_t GetCurrentThread () const 163 { 164 if (m_thread == 0 || m_thread == -1) 165 return DNBProcessGetCurrentThread (m_ctx.ProcessID()); 166 return m_thread; 167 } 168 169 void SetCurrentThread (nub_thread_t tid) 170 { 171 DNBProcessSetCurrentThread (m_ctx.ProcessID(), tid); 172 m_thread = tid; 173 } 174 175 static void* ThreadFunctionReadRemoteData(void *arg); 176 void StartReadRemoteDataThread (); 177 void StopReadRemoteDataThread (); 178 179 void NotifyThatProcessStopped (void); 180 181 rnb_err_t HandlePacket_A (const char *p); 182 rnb_err_t HandlePacket_H (const char *p); 183 rnb_err_t HandlePacket_qC (const char *p); 184 rnb_err_t HandlePacket_qRcmd (const char *p); 185 rnb_err_t HandlePacket_qGetPid (const char *p); 186 rnb_err_t HandlePacket_qEcho (const char *p); 187 rnb_err_t HandlePacket_qLaunchSuccess (const char *p); 188 rnb_err_t HandlePacket_qRegisterInfo (const char *p); 189 rnb_err_t HandlePacket_qShlibInfoAddr (const char *p); 190 rnb_err_t HandlePacket_qStepPacketSupported (const char *p); 191 rnb_err_t HandlePacket_qVAttachOrWaitSupported (const char *p); 192 rnb_err_t HandlePacket_qSyncThreadStateSupported (const char *p); 193 rnb_err_t HandlePacket_qThreadInfo (const char *p); 194 rnb_err_t HandlePacket_jThreadExtendedInfo (const char *p); 195 rnb_err_t HandlePacket_jGetLoadedDynamicLibrariesInfos (const char *p); 196 rnb_err_t HandlePacket_jThreadsInfo (const char *p); 197 rnb_err_t HandlePacket_qThreadExtraInfo (const char *p); 198 rnb_err_t HandlePacket_qThreadStopInfo (const char *p); 199 rnb_err_t HandlePacket_qHostInfo (const char *p); 200 rnb_err_t HandlePacket_qGDBServerVersion (const char *p); 201 rnb_err_t HandlePacket_qProcessInfo (const char *p); 202 rnb_err_t HandlePacket_qSymbol (const char *p); 203 rnb_err_t HandlePacket_QStartNoAckMode (const char *p); 204 rnb_err_t HandlePacket_QThreadSuffixSupported (const char *p); 205 rnb_err_t HandlePacket_QSetLogging (const char *p); 206 rnb_err_t HandlePacket_QSetDisableASLR (const char *p); 207 rnb_err_t HandlePacket_QSetSTDIO (const char *p); 208 rnb_err_t HandlePacket_QSetWorkingDir (const char *p); 209 rnb_err_t HandlePacket_QSetMaxPayloadSize (const char *p); 210 rnb_err_t HandlePacket_QSetMaxPacketSize (const char *p); 211 rnb_err_t HandlePacket_QEnvironment (const char *p); 212 rnb_err_t HandlePacket_QEnvironmentHexEncoded (const char *p); 213 rnb_err_t HandlePacket_QLaunchArch (const char *p); 214 rnb_err_t HandlePacket_QListThreadsInStopReply (const char *p); 215 rnb_err_t HandlePacket_QSyncThreadState (const char *p); 216 rnb_err_t HandlePacket_QPrefixRegisterPacketsWithThreadID (const char *p); 217 rnb_err_t HandlePacket_QSetProcessEvent (const char *p); 218 rnb_err_t HandlePacket_last_signal (const char *p); 219 rnb_err_t HandlePacket_m (const char *p); 220 rnb_err_t HandlePacket_M (const char *p); 221 rnb_err_t HandlePacket_x (const char *p); 222 rnb_err_t HandlePacket_X (const char *p); 223 rnb_err_t HandlePacket_g (const char *p); 224 rnb_err_t HandlePacket_G (const char *p); 225 rnb_err_t HandlePacket_z (const char *p); 226 rnb_err_t HandlePacket_T (const char *p); 227 rnb_err_t HandlePacket_p (const char *p); 228 rnb_err_t HandlePacket_P (const char *p); 229 rnb_err_t HandlePacket_c (const char *p); 230 rnb_err_t HandlePacket_C (const char *p); 231 rnb_err_t HandlePacket_D (const char *p); 232 rnb_err_t HandlePacket_k (const char *p); 233 rnb_err_t HandlePacket_s (const char *p); 234 rnb_err_t HandlePacket_S (const char *p); 235 rnb_err_t HandlePacket_qSupported (const char *p); 236 rnb_err_t HandlePacket_v (const char *p); 237 rnb_err_t HandlePacket_UNIMPLEMENTED (const char *p); 238 rnb_err_t HandlePacket_ILLFORMED (const char *file, int line, const char *p, const char *description); 239 rnb_err_t HandlePacket_AllocateMemory (const char *p); 240 rnb_err_t HandlePacket_DeallocateMemory (const char *p); 241 rnb_err_t HandlePacket_SaveRegisterState (const char *p); 242 rnb_err_t HandlePacket_RestoreRegisterState (const char *p); 243 rnb_err_t HandlePacket_MemoryRegionInfo (const char *p); 244 rnb_err_t HandlePacket_GetProfileData(const char *p); 245 rnb_err_t HandlePacket_SetEnableAsyncProfiling(const char *p); 246 rnb_err_t HandlePacket_QEnableCompression(const char *p); 247 rnb_err_t HandlePacket_WatchpointSupportInfo (const char *p); 248 rnb_err_t HandlePacket_qSpeedTest (const char *p); 249 rnb_err_t HandlePacket_qXfer (const char *p); 250 rnb_err_t HandlePacket_stop_process (const char *p); 251 rnb_err_t HandlePacket_QSetDetachOnError (const char *p); 252 253 rnb_err_t SendStopReplyPacketForThread (nub_thread_t tid); 254 rnb_err_t SendHexEncodedBytePacket (const char *header, const void *buf, size_t buf_len, const char *footer); 255 rnb_err_t SendSTDOUTPacket (char *buf, nub_size_t buf_size); 256 rnb_err_t SendSTDERRPacket (char *buf, nub_size_t buf_size); 257 void FlushSTDIO (); 258 void SendAsyncProfileData (); 259 rnb_err_t SendAsyncProfileDataPacket (char *buf, nub_size_t buf_size); 260 261 RNBContext& Context() { return m_ctx; } 262 RNBSocket& Comm() { return m_comm; } 263 264 private: 265 // Outlaw some constructors 266 RNBRemote (const RNBRemote &); 267 268 protected: 269 270 rnb_err_t GetCommData (); 271 void CommDataReceived(const std::string& data); 272 struct Packet 273 { 274 typedef std::vector<Packet> collection; 275 typedef collection::iterator iterator; 276 typedef collection::const_iterator const_iterator; 277 PacketEnum type; 278 HandlePacketCallback normal; // Function to call when inferior is halted 279 HandlePacketCallback async; // Function to call when inferior is running 280 std::string abbrev; 281 std::string printable_name; 282 283 bool 284 IsPlatformPacket () const 285 { 286 switch (type) 287 { 288 case set_logging_mode: 289 case query_host_info: 290 return true; 291 default: 292 break; 293 } 294 return false; 295 } 296 Packet() : 297 type(invalid_packet), 298 normal (NULL), 299 async (NULL), 300 abbrev (), 301 printable_name () 302 { 303 } 304 305 Packet( PacketEnum in_type, 306 HandlePacketCallback in_normal, 307 HandlePacketCallback in_async, 308 const char *in_abbrev, 309 const char *in_printable_name) : 310 type (in_type), 311 normal (in_normal), 312 async (in_async), 313 abbrev (in_abbrev), 314 printable_name (in_printable_name) 315 { 316 } 317 }; 318 319 320 struct DispatchQueueOffsets 321 { 322 uint16_t dqo_version; 323 uint16_t dqo_label; 324 uint16_t dqo_label_size; 325 uint16_t dqo_flags; 326 uint16_t dqo_flags_size; 327 uint16_t dqo_serialnum; 328 uint16_t dqo_serialnum_size; 329 uint16_t dqo_width; 330 uint16_t dqo_width_size; 331 uint16_t dqo_running; 332 uint16_t dqo_running_size; 333 uint16_t dqo_suspend_cnt; // version 5 and later, starting with Mac OS X 10.10/iOS 8 334 uint16_t dqo_suspend_cnt_size; // version 5 and later, starting with Mac OS X 10.10/iOS 8 335 uint16_t dqo_target_queue; // version 5 and later, starting with Mac OS X 10.10/iOS 8 336 uint16_t dqo_target_queue_size; // version 5 and later, starting with Mac OS X 10.10/iOS 8 337 uint16_t dqo_priority; // version 5 and later, starting with Mac OS X 10.10/iOS 8 338 uint16_t dqo_priority_size; // version 5 and later, starting with Mac OS X 10.10/iOS 8 339 340 DispatchQueueOffsets () 341 { 342 Clear(); 343 } 344 345 void 346 Clear() 347 { 348 dqo_version = UINT16_MAX; 349 dqo_label = UINT16_MAX; 350 dqo_label_size = UINT16_MAX; 351 dqo_flags = UINT16_MAX; 352 dqo_flags_size = UINT16_MAX; 353 dqo_serialnum = UINT16_MAX; 354 dqo_serialnum_size = UINT16_MAX; 355 dqo_width = UINT16_MAX; 356 dqo_width_size = UINT16_MAX; 357 dqo_running = UINT16_MAX; 358 dqo_running_size = UINT16_MAX; 359 dqo_suspend_cnt = UINT16_MAX; 360 dqo_suspend_cnt_size = UINT16_MAX; 361 dqo_target_queue = UINT16_MAX; 362 dqo_target_queue_size = UINT16_MAX; 363 dqo_priority = UINT16_MAX; 364 dqo_priority_size = UINT16_MAX; 365 } 366 367 bool 368 IsValid () const 369 { 370 return dqo_version != UINT16_MAX; 371 } 372 373 void 374 GetThreadQueueInfo (nub_process_t pid, 375 nub_addr_t dispatch_qaddr, 376 std::string &queue_name, 377 uint64_t &queue_width, 378 uint64_t &queue_serialnum) const; 379 }; 380 381 rnb_err_t GetPacket (std::string &packet_data, RNBRemote::Packet& packet_info, bool wait); 382 rnb_err_t SendPacket (const std::string &); 383 std::string CompressString (const std::string &); 384 385 void CreatePacketTable (); 386 rnb_err_t GetPacketPayload (std::string &); 387 388 nub_thread_t 389 ExtractThreadIDFromThreadSuffix (const char *p); 390 391 void 392 EnableCompressionNextSendPacket (compression_types); 393 394 compression_types 395 GetCompressionType (); 396 397 const DispatchQueueOffsets * 398 GetDispatchQueueOffsets(); 399 400 RNBContext m_ctx; // process context 401 RNBSocket m_comm; // communication port 402 std::string m_arch; 403 nub_thread_t m_continue_thread; // thread to continue; 0 for any, -1 for all 404 nub_thread_t m_thread; // thread for other ops; 0 for any, -1 for all 405 PThreadMutex m_mutex; // Mutex that protects 406 DispatchQueueOffsets m_dispatch_queue_offsets; 407 nub_addr_t m_dispatch_queue_offsets_addr; 408 uint32_t m_qSymbol_index; 409 uint32_t m_packets_recvd; 410 Packet::collection m_packets; 411 std::deque<std::string> m_rx_packets; 412 std::string m_rx_partial_data; // For packets that may come in more than one batch, anything left over can be left here 413 pthread_t m_rx_pthread; 414 uint32_t m_max_payload_size; // the maximum sized payload we should send to gdb 415 bool m_extended_mode; // are we in extended mode? 416 bool m_noack_mode; // are we in no-ack mode? 417 bool m_thread_suffix_supported; // Set to true if the 'p', 'P', 'g', and 'G' packets should be prefixed with the thread ID and colon: 418 // "$pRR;thread:TTTT;" instead of "$pRR" 419 // "$PRR=VVVVVVVV;thread:TTTT;" instead of "$PRR=VVVVVVVV" 420 // "$g;thread:TTTT" instead of "$g" 421 // "$GVVVVVVVVVVVVVV;thread:TTTT;#00 instead of "$GVVVVVVVVVVVVVV" 422 bool m_list_threads_in_stop_reply; 423 424 size_t m_compression_minsize; // only packets larger than this size will be compressed 425 bool m_enable_compression_next_send_packet; 426 427 compression_types m_compression_mode; 428 }; 429 430 /* We translate the /usr/include/mach/exception_types.h exception types 431 (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses 432 in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS). These hard 433 coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb 434 values in its include/gdb/signals.h. */ 435 436 #define TARGET_EXC_BAD_ACCESS 0x91 437 #define TARGET_EXC_BAD_INSTRUCTION 0x92 438 #define TARGET_EXC_ARITHMETIC 0x93 439 #define TARGET_EXC_EMULATION 0x94 440 #define TARGET_EXC_SOFTWARE 0x95 441 #define TARGET_EXC_BREAKPOINT 0x96 442 443 /* Generally speaking, you can't assume gdb can receive more than 399 bytes 444 at a time with a random gdb. This bufsize constant is only specifying 445 how many bytes gdb can *receive* from debugserver -- it tells us nothing 446 about how many bytes gdb might try to send in a single packet. */ 447 #define DEFAULT_GDB_REMOTE_PROTOCOL_BUFSIZE 399 448 449 #endif // #ifndef __RNBRemote_h__ 450