xref: /openbsd-src/gnu/llvm/lldb/tools/debugserver/source/RNBRemote.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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