RNBRemote.h revision bcf07b37b3e3cd37ac74cc42c12009f130f185a3
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- RNBRemote.h ---------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Created by Greg Clayton on 12/12/07. 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __RNBRemote_h__ 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __RNBRemote_h__ 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "RNBDefs.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNB.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "RNBContext.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "RNBSocket.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PThreadMutex.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string> 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector> 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <deque> 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map> 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass RNBSocket; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass RNBContext; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass PThreadEvents; 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerenum event_loop_mode { debug_nub, gdb_remote_protocol, done }; 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass RNBRemote 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef enum { 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner invalid_packet = 0, 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ack, // '+' 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nack, // '-' 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner halt, // ^C (async halt) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner use_extended_mode, // '!' 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner why_halted, // '?' 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_argv, // 'A' 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_bp, // 'B' 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cont, // 'c' 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner continue_with_sig, // 'C' 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner detach, // 'D' 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner read_general_regs, // 'g' 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner write_general_regs, // 'G' 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_thread, // 'H' 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner step_inferior_one_cycle, // 'i' 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner signal_and_step_inf_one_cycle, // 'I' 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner kill, // 'k' 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner read_memory, // 'm' 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner write_memory, // 'M' 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner read_register, // 'p' 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner write_register, // 'P' 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner restart, // 'R' 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner single_step, // 's' 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner single_step_with_sig, // 'S' 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner search_mem_backwards, // 't' 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner thread_alive_p, // 'T' 64c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton vattach, // 'vAttach;pid' 65c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton vattachwait, // 'vAttachWait:XX...' where XX is one or more hex encoded process name ASCII bytes 66c1d3775eb2494c6e88ebee44c7d49beefcb3bb6aGreg Clayton vattachname, // 'vAttachName:XX...' where XX is one or more hex encoded process name ASCII bytes 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner vcont, // 'vCont' 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner vcont_list_actions, // 'vCont?' 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner write_data_to_memory, // 'X' 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner insert_mem_bp, // 'Z0' 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner remove_mem_bp, // 'z0' 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner insert_hardware_bp, // 'Z1' 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner remove_hardware_bp, // 'z1' 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner insert_write_watch_bp, // 'Z2' 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner remove_write_watch_bp, // 'z2' 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner insert_read_watch_bp, // 'Z3' 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner remove_read_watch_bp, // 'z3' 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner insert_access_watch_bp, // 'Z4' 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner remove_access_watch_bp, // 'z4' 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_current_thread_id, // 'qC' 82d05213b79411eb12bcd75f07d33f5245c07edb0dJason Molenda query_get_pid, // 'qGetPid' 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_memory_crc, // 'qCRC:' 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_thread_ids_first, // 'qfThreadInfo' 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_thread_ids_subsequent, // 'qsThreadInfo' 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_thread_extra_info, // 'qThreadExtraInfo' 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_thread_stop_info, // 'qThreadStopInfo' 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_image_offsets, // 'qOffsets' 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_symbol_lookup, // 'gSymbols' 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_launch_success, // 'qLaunchSuccess' 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_register_info, // 'qRegisterInfo' 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_shlib_notify_info_addr, // 'qShlibInfoAddr' 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_step_packet_supported, // 'qStepPacketSupported' 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner query_host_info, // 'qHostInfo' 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pass_signals_to_inferior, // 'QPassSignals' 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner start_noack_mode, // 'QStartNoAckMode' 97c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton prefix_reg_packets_with_tid, // 'QPrefixRegisterPacketsWithThreadID 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_logging_mode, // 'QSetLogging:' 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_max_packet_size, // 'QSetMaxPacketSize:' 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_max_payload_size, // 'QSetMaxPayloadSize:' 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner set_environment_variable, // 'QEnvironment:' 10204f081d0572d046456009ce8273ab2ff0a985219Jason Molenda set_environment_variable_hex, // 'QEnvironmentHexEncoded:' 103a4582404fa50f89485e69a17281673147217d64fGreg Clayton set_launch_arch, // 'QLaunchArch:' 1040a7f75f9e375911ca91a884968b0efa36f18588dGreg Clayton set_disable_aslr, // 'QSetDisableASLR:' 105a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton set_stdin, // 'QSetSTDIN:' 106a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton set_stdout, // 'QSetSTDOUT:' 107a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton set_stderr, // 'QSetSTDERR:' 108a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton set_working_dir, // 'QSetWorkingDir:' 109bcf07b37b3e3cd37ac74cc42c12009f130f185a3Jason Molenda memory_region_info, // 'qMemoryRegionInfo:' 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner allocate_memory, // '_M' 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner deallocate_memory, // '_m' 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner unknown_type, 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } PacketEnum; 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef rnb_err_t (RNBRemote::*HandlePacketCallback)(const char *p); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 118a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton RNBRemote (); 11920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton ~RNBRemote (); 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton void Initialize(); 12220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton 12320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton bool InitializeRegisters (); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandleAsyncPacket(PacketEnum *type = NULL); 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandleReceivedPacket(PacketEnum *type = NULL); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_thread_t GetContinueThread () const 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_continue_thread; 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetContinueThread (nub_thread_t tid) 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_continue_thread = tid; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_thread_t GetCurrentThread () const 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_thread == 0 || m_thread == -1) 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return DNBProcessGetCurrentThread (m_ctx.ProcessID()); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_thread; 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void SetCurrentThread (nub_thread_t tid) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DNBProcessSetCurrentThread (m_ctx.ProcessID(), tid); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread = tid; 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static void* ThreadFunctionReadRemoteData(void *arg); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void StartReadRemoteDataThread (); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void StopReadRemoteDataThread (); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void NotifyThatProcessStopped (void); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_A (const char *p); 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_H (const char *p); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qC (const char *p); 160d05213b79411eb12bcd75f07d33f5245c07edb0dJason Molenda rnb_err_t HandlePacket_qGetPid (const char *p); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qLaunchSuccess (const char *p); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qRegisterInfo (const char *p); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qShlibInfoAddr (const char *p); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qStepPacketSupported (const char *p); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qThreadInfo (const char *p); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qThreadExtraInfo (const char *p); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qThreadStopInfo (const char *p); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_qHostInfo (const char *p); 169c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QStartNoAckMode (const char *p); 170c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QThreadSuffixSupported (const char *p); 171c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QSetLogging (const char *p); 172c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QSetDisableASLR (const char *p); 173a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton rnb_err_t HandlePacket_QSetSTDIO (const char *p); 174a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton rnb_err_t HandlePacket_QSetWorkingDir (const char *p); 175c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QSetMaxPayloadSize (const char *p); 176c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QSetMaxPacketSize (const char *p); 177c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QEnvironment (const char *p); 17804f081d0572d046456009ce8273ab2ff0a985219Jason Molenda rnb_err_t HandlePacket_QEnvironmentHexEncoded (const char *p); 179a4582404fa50f89485e69a17281673147217d64fGreg Clayton rnb_err_t HandlePacket_QLaunchArch (const char *p); 180c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton rnb_err_t HandlePacket_QPrefixRegisterPacketsWithThreadID (const char *p); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_last_signal (const char *p); 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_m (const char *p); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_M (const char *p); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_X (const char *p); 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_g (const char *p); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_G (const char *p); 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_z (const char *p); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_T (const char *p); 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_p (const char *p); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_P (const char *p); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_c (const char *p); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_C (const char *p); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_D (const char *p); 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_k (const char *p); 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_s (const char *p); 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_S (const char *p); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_v (const char *p); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_UNIMPLEMENTED (const char *p); 199db2bab463047edba4b01da1fcaf70f15e778095eGreg Clayton rnb_err_t HandlePacket_ILLFORMED (const char *file, int line, const char *p, const char *description); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_AllocateMemory (const char *p); 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_DeallocateMemory (const char *p); 202bcf07b37b3e3cd37ac74cc42c12009f130f185a3Jason Molenda rnb_err_t HandlePacket_MemoryRegionInfo (const char *p); 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t HandlePacket_stop_process (const char *p); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t SendStopReplyPacketForThread (nub_thread_t tid); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t SendHexEncodedBytePacket (const char *header, const void *buf, size_t buf_len, const char *footer); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t SendSTDOUTPacket (char *buf, nub_size_t buf_size); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t SendSTDERRPacket (char *buf, nub_size_t buf_size); 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void FlushSTDIO (); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RNBContext& Context() { return m_ctx; } 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RNBSocket& Comm() { return m_comm; } 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton void 216a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton SetUseNativeRegisters (bool b) 217a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton { 218a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton m_use_native_regs = b; 219a2f7423310044cf76d8d52aa9153b7fd8b226b49Greg Clayton } 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Outlaw some contructors 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RNBRemote (const RNBRemote &); 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t GetCommData (); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void CommDataReceived(const std::string& data); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner struct Packet 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<Packet> collection; 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::iterator iterator; 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef collection::const_iterator const_iterator; 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PacketEnum type; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePacketCallback normal; // Function to call when inferior is halted 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePacketCallback async; // Function to call when inferior is running 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string abbrev; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string printable_name; 2384fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton 2394fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton bool 2404fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton IsPlatformPacket () const 2414fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton { 2424fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton switch (type) 2434fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton { 2444fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton case set_logging_mode: 2454fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton case query_host_info: 2464fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton return true; 247e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton default: 248e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton break; 2494fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton } 2504fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton return false; 2514fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton } 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Packet() : 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type(invalid_packet), 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner normal (NULL), 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner async (NULL), 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner abbrev (), 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner printable_name () 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Packet( PacketEnum in_type, 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePacketCallback in_normal, 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner HandlePacketCallback in_async, 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *in_abbrev, 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *in_printable_name) : 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner type (in_type), 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner normal (in_normal), 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner async (in_async), 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner abbrev (in_abbrev), 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner printable_name (in_printable_name) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t GetPacket (std::string &packet_data, RNBRemote::Packet& packet_info, bool wait); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t SendPacket (const std::string &); 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void CreatePacketTable (); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner rnb_err_t GetPacketPayload (std::string &); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 281c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton nub_thread_t 282c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton ExtractThreadIDFromThreadSuffix (const char *p); 283c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // gdb can send multiple Z/z packets for the same address and 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these calls must be ref counted. 286fa1502444821fb699b14883bd24188c85a8793e0Johnny Chen struct Breakpoint 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Breakpoint(nub_break_t breakID) : 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakID(breakID), 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_refCount(1) 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Breakpoint() : 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakID(INVALID_NUB_BREAK_ID), 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_refCount(0) 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Breakpoint(const Breakpoint& rhs) : 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_breakID(rhs.m_breakID), 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_refCount(rhs.m_refCount) 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_break_t BreakID() const { return m_breakID; } 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t RefCount() const { return m_refCount; } 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Release() { if (m_refCount > 0) --m_refCount; } 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void Retain() { ++m_refCount; } 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_break_t m_breakID; 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_refCount; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::map<nub_addr_t, Breakpoint> BreakpointMap; 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef BreakpointMap::iterator BreakpointMapIter; 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef BreakpointMap::const_iterator BreakpointMapConstIter; 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RNBContext m_ctx; // process context 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RNBSocket m_comm; // communication port 31920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton std::string m_arch; 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_thread_t m_continue_thread; // thread to continue; 0 for any, -1 for all 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nub_thread_t m_thread; // thread for other ops; 0 for any, -1 for all 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PThreadMutex m_mutex; // Mutex that protects 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_packets_recvd; 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Packet::collection m_packets; 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::deque<std::string> m_rx_packets; 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string m_rx_partial_data; // For packets that may come in more than one batch, anything left over can be left here 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pthread_t m_rx_pthread; 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointMap m_breakpoints; 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner BreakpointMap m_watchpoints; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t m_max_payload_size; // the maximum sized payload we should send to gdb 33120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton bool m_extended_mode:1, // are we in extended mode? 33220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton m_noack_mode:1, // are we in no-ack mode? 333c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton m_noack_mode_just_enabled:1, // Did we just enable this and need to compute one more checksum? 334c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton m_use_native_regs:1, // Use native registers by querying DNB layer for register definitions? 335c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton m_thread_suffix_supported:1; // Set to true if the 'p', 'P', 'g', and 'G' packets should be prefixed with the thread ID and colon: 336c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton // "$pRR;thread:TTTT;" instead of "$pRR" 337c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton // "$PRR=VVVVVVVV;thread:TTTT;" instead of "$PRR=VVVVVVVV" 338c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton // "$g;thread:TTTT" instead of "$g" 339c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton // "$GVVVVVVVVVVVVVV;thread:TTTT;#00 instead of "$GVVVVVVVVVVVVVV" 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/* We translate the /usr/include/mach/exception_types.h exception types 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (e.g. EXC_BAD_ACCESS) to the fake BSD signal numbers that gdb uses 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner in include/gdb/signals.h (e.g. TARGET_EXC_BAD_ACCESS). These hard 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner coded values for TARGET_EXC_BAD_ACCESS et al must match the gdb 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner values in its include/gdb/signals.h. */ 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_BAD_ACCESS 0x91 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_BAD_INSTRUCTION 0x92 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_ARITHMETIC 0x93 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_EMULATION 0x94 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_SOFTWARE 0x95 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define TARGET_EXC_BREAKPOINT 0x96 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/* Generally speaking, you can't assume gdb can receive more than 399 bytes 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner at a time with a random gdb. This bufsize constant is only specifying 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner how many bytes gdb can *receive* from debugserver -- it tells us nothing 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner about how many bytes gdb might try to send in a single packet. */ 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEFAULT_GDB_REMOTE_PROTOCOL_BUFSIZE 399 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // #ifndef __RNBRemote_h__ 362