GDBRemoteCommunicationClient.cpp revision 263367
1//===-- GDBRemoteCommunicationClient.cpp ------------------------*- C++ -*-===//
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
11#include "GDBRemoteCommunicationClient.h"
12
13// C Includes
14#include <sys/stat.h>
15
16// C++ Includes
17#include <sstream>
18
19// Other libraries and framework includes
20#include "llvm/ADT/Triple.h"
21#include "lldb/Interpreter/Args.h"
22#include "lldb/Core/ConnectionFileDescriptor.h"
23#include "lldb/Core/Log.h"
24#include "lldb/Core/State.h"
25#include "lldb/Core/StreamGDBRemote.h"
26#include "lldb/Core/StreamString.h"
27#include "lldb/Host/Endian.h"
28#include "lldb/Host/Host.h"
29#include "lldb/Host/TimeValue.h"
30
31// Project includes
32#include "Utility/StringExtractorGDBRemote.h"
33#include "ProcessGDBRemote.h"
34#include "ProcessGDBRemoteLog.h"
35#include "lldb/Host/Config.h"
36
37using namespace lldb;
38using namespace lldb_private;
39
40#ifdef LLDB_DISABLE_POSIX
41#define SIGSTOP 17
42#endif
43
44//----------------------------------------------------------------------
45// GDBRemoteCommunicationClient constructor
46//----------------------------------------------------------------------
47GDBRemoteCommunicationClient::GDBRemoteCommunicationClient(bool is_platform) :
48    GDBRemoteCommunication("gdb-remote.client", "gdb-remote.client.rx_packet", is_platform),
49    m_supports_not_sending_acks (eLazyBoolCalculate),
50    m_supports_thread_suffix (eLazyBoolCalculate),
51    m_supports_threads_in_stop_reply (eLazyBoolCalculate),
52    m_supports_vCont_all (eLazyBoolCalculate),
53    m_supports_vCont_any (eLazyBoolCalculate),
54    m_supports_vCont_c (eLazyBoolCalculate),
55    m_supports_vCont_C (eLazyBoolCalculate),
56    m_supports_vCont_s (eLazyBoolCalculate),
57    m_supports_vCont_S (eLazyBoolCalculate),
58    m_qHostInfo_is_valid (eLazyBoolCalculate),
59    m_qProcessInfo_is_valid (eLazyBoolCalculate),
60    m_supports_alloc_dealloc_memory (eLazyBoolCalculate),
61    m_supports_memory_region_info  (eLazyBoolCalculate),
62    m_supports_watchpoint_support_info  (eLazyBoolCalculate),
63    m_supports_detach_stay_stopped (eLazyBoolCalculate),
64    m_watchpoints_trigger_after_instruction(eLazyBoolCalculate),
65    m_attach_or_wait_reply(eLazyBoolCalculate),
66    m_prepare_for_reg_writing_reply (eLazyBoolCalculate),
67    m_supports_p (eLazyBoolCalculate),
68    m_supports_QSaveRegisterState (eLazyBoolCalculate),
69    m_supports_qProcessInfoPID (true),
70    m_supports_qfProcessInfo (true),
71    m_supports_qUserName (true),
72    m_supports_qGroupName (true),
73    m_supports_qThreadStopInfo (true),
74    m_supports_z0 (true),
75    m_supports_z1 (true),
76    m_supports_z2 (true),
77    m_supports_z3 (true),
78    m_supports_z4 (true),
79    m_supports_QEnvironment (true),
80    m_supports_QEnvironmentHexEncoded (true),
81    m_curr_tid (LLDB_INVALID_THREAD_ID),
82    m_curr_tid_run (LLDB_INVALID_THREAD_ID),
83    m_num_supported_hardware_watchpoints (0),
84    m_async_mutex (Mutex::eMutexTypeRecursive),
85    m_async_packet_predicate (false),
86    m_async_packet (),
87    m_async_response (),
88    m_async_signal (-1),
89    m_thread_id_to_used_usec_map (),
90    m_host_arch(),
91    m_process_arch(),
92    m_os_version_major (UINT32_MAX),
93    m_os_version_minor (UINT32_MAX),
94    m_os_version_update (UINT32_MAX),
95    m_os_build (),
96    m_os_kernel (),
97    m_hostname (),
98    m_default_packet_timeout (0)
99{
100}
101
102//----------------------------------------------------------------------
103// Destructor
104//----------------------------------------------------------------------
105GDBRemoteCommunicationClient::~GDBRemoteCommunicationClient()
106{
107    if (IsConnected())
108        Disconnect();
109}
110
111bool
112GDBRemoteCommunicationClient::HandshakeWithServer (Error *error_ptr)
113{
114    ResetDiscoverableSettings();
115
116    // Start the read thread after we send the handshake ack since if we
117    // fail to send the handshake ack, there is no reason to continue...
118    if (SendAck())
119    {
120        // The return value from QueryNoAckModeSupported() is true if the packet
121        // was sent and _any_ response (including UNIMPLEMENTED) was received),
122        // or false if no response was received. This quickly tells us if we have
123        // a live connection to a remote GDB server...
124        if (QueryNoAckModeSupported())
125        {
126            return true;
127        }
128        else
129        {
130            if (error_ptr)
131                error_ptr->SetErrorString("failed to get reply to handshake packet");
132        }
133    }
134    else
135    {
136        if (error_ptr)
137            error_ptr->SetErrorString("failed to send the handshake ack");
138    }
139    return false;
140}
141
142bool
143GDBRemoteCommunicationClient::QueryNoAckModeSupported ()
144{
145    if (m_supports_not_sending_acks == eLazyBoolCalculate)
146    {
147        m_send_acks = true;
148        m_supports_not_sending_acks = eLazyBoolNo;
149
150        StringExtractorGDBRemote response;
151        if (SendPacketAndWaitForResponse("QStartNoAckMode", response, false))
152        {
153            if (response.IsOKResponse())
154            {
155                m_send_acks = false;
156                m_supports_not_sending_acks = eLazyBoolYes;
157            }
158            return true;
159        }
160    }
161    return false;
162}
163
164void
165GDBRemoteCommunicationClient::GetListThreadsInStopReplySupported ()
166{
167    if (m_supports_threads_in_stop_reply == eLazyBoolCalculate)
168    {
169        m_supports_threads_in_stop_reply = eLazyBoolNo;
170
171        StringExtractorGDBRemote response;
172        if (SendPacketAndWaitForResponse("QListThreadsInStopReply", response, false))
173        {
174            if (response.IsOKResponse())
175                m_supports_threads_in_stop_reply = eLazyBoolYes;
176        }
177    }
178}
179
180bool
181GDBRemoteCommunicationClient::GetVAttachOrWaitSupported ()
182{
183    if (m_attach_or_wait_reply == eLazyBoolCalculate)
184    {
185        m_attach_or_wait_reply = eLazyBoolNo;
186
187        StringExtractorGDBRemote response;
188        if (SendPacketAndWaitForResponse("qVAttachOrWaitSupported", response, false))
189        {
190            if (response.IsOKResponse())
191                m_attach_or_wait_reply = eLazyBoolYes;
192        }
193    }
194    if (m_attach_or_wait_reply == eLazyBoolYes)
195        return true;
196    else
197        return false;
198}
199
200bool
201GDBRemoteCommunicationClient::GetSyncThreadStateSupported ()
202{
203    if (m_prepare_for_reg_writing_reply == eLazyBoolCalculate)
204    {
205        m_prepare_for_reg_writing_reply = eLazyBoolNo;
206
207        StringExtractorGDBRemote response;
208        if (SendPacketAndWaitForResponse("qSyncThreadStateSupported", response, false))
209        {
210            if (response.IsOKResponse())
211                m_prepare_for_reg_writing_reply = eLazyBoolYes;
212        }
213    }
214    if (m_prepare_for_reg_writing_reply == eLazyBoolYes)
215        return true;
216    else
217        return false;
218}
219
220
221void
222GDBRemoteCommunicationClient::ResetDiscoverableSettings()
223{
224    m_supports_not_sending_acks = eLazyBoolCalculate;
225    m_supports_thread_suffix = eLazyBoolCalculate;
226    m_supports_threads_in_stop_reply = eLazyBoolCalculate;
227    m_supports_vCont_c = eLazyBoolCalculate;
228    m_supports_vCont_C = eLazyBoolCalculate;
229    m_supports_vCont_s = eLazyBoolCalculate;
230    m_supports_vCont_S = eLazyBoolCalculate;
231    m_supports_p = eLazyBoolCalculate;
232    m_supports_QSaveRegisterState = eLazyBoolCalculate;
233    m_qHostInfo_is_valid = eLazyBoolCalculate;
234    m_qProcessInfo_is_valid = eLazyBoolCalculate;
235    m_supports_alloc_dealloc_memory = eLazyBoolCalculate;
236    m_supports_memory_region_info = eLazyBoolCalculate;
237    m_prepare_for_reg_writing_reply = eLazyBoolCalculate;
238    m_attach_or_wait_reply = eLazyBoolCalculate;
239
240    m_supports_qProcessInfoPID = true;
241    m_supports_qfProcessInfo = true;
242    m_supports_qUserName = true;
243    m_supports_qGroupName = true;
244    m_supports_qThreadStopInfo = true;
245    m_supports_z0 = true;
246    m_supports_z1 = true;
247    m_supports_z2 = true;
248    m_supports_z3 = true;
249    m_supports_z4 = true;
250    m_supports_QEnvironment = true;
251    m_supports_QEnvironmentHexEncoded = true;
252    m_host_arch.Clear();
253    m_process_arch.Clear();
254}
255
256
257bool
258GDBRemoteCommunicationClient::GetThreadSuffixSupported ()
259{
260    if (m_supports_thread_suffix == eLazyBoolCalculate)
261    {
262        StringExtractorGDBRemote response;
263        m_supports_thread_suffix = eLazyBoolNo;
264        if (SendPacketAndWaitForResponse("QThreadSuffixSupported", response, false))
265        {
266            if (response.IsOKResponse())
267                m_supports_thread_suffix = eLazyBoolYes;
268        }
269    }
270    return m_supports_thread_suffix;
271}
272bool
273GDBRemoteCommunicationClient::GetVContSupported (char flavor)
274{
275    if (m_supports_vCont_c == eLazyBoolCalculate)
276    {
277        StringExtractorGDBRemote response;
278        m_supports_vCont_any = eLazyBoolNo;
279        m_supports_vCont_all = eLazyBoolNo;
280        m_supports_vCont_c = eLazyBoolNo;
281        m_supports_vCont_C = eLazyBoolNo;
282        m_supports_vCont_s = eLazyBoolNo;
283        m_supports_vCont_S = eLazyBoolNo;
284        if (SendPacketAndWaitForResponse("vCont?", response, false))
285        {
286            const char *response_cstr = response.GetStringRef().c_str();
287            if (::strstr (response_cstr, ";c"))
288                m_supports_vCont_c = eLazyBoolYes;
289
290            if (::strstr (response_cstr, ";C"))
291                m_supports_vCont_C = eLazyBoolYes;
292
293            if (::strstr (response_cstr, ";s"))
294                m_supports_vCont_s = eLazyBoolYes;
295
296            if (::strstr (response_cstr, ";S"))
297                m_supports_vCont_S = eLazyBoolYes;
298
299            if (m_supports_vCont_c == eLazyBoolYes &&
300                m_supports_vCont_C == eLazyBoolYes &&
301                m_supports_vCont_s == eLazyBoolYes &&
302                m_supports_vCont_S == eLazyBoolYes)
303            {
304                m_supports_vCont_all = eLazyBoolYes;
305            }
306
307            if (m_supports_vCont_c == eLazyBoolYes ||
308                m_supports_vCont_C == eLazyBoolYes ||
309                m_supports_vCont_s == eLazyBoolYes ||
310                m_supports_vCont_S == eLazyBoolYes)
311            {
312                m_supports_vCont_any = eLazyBoolYes;
313            }
314        }
315    }
316
317    switch (flavor)
318    {
319    case 'a': return m_supports_vCont_any;
320    case 'A': return m_supports_vCont_all;
321    case 'c': return m_supports_vCont_c;
322    case 'C': return m_supports_vCont_C;
323    case 's': return m_supports_vCont_s;
324    case 'S': return m_supports_vCont_S;
325    default: break;
326    }
327    return false;
328}
329
330// Check if the target supports 'p' packet. It sends out a 'p'
331// packet and checks the response. A normal packet will tell us
332// that support is available.
333//
334// Takes a valid thread ID because p needs to apply to a thread.
335bool
336GDBRemoteCommunicationClient::GetpPacketSupported (lldb::tid_t tid)
337{
338    if (m_supports_p == eLazyBoolCalculate)
339    {
340        StringExtractorGDBRemote response;
341        m_supports_p = eLazyBoolNo;
342        char packet[256];
343        if (GetThreadSuffixSupported())
344            snprintf(packet, sizeof(packet), "p0;thread:%" PRIx64 ";", tid);
345        else
346            snprintf(packet, sizeof(packet), "p0");
347
348        if (SendPacketAndWaitForResponse(packet, response, false))
349        {
350            if (response.IsNormalResponse())
351                m_supports_p = eLazyBoolYes;
352        }
353    }
354    return m_supports_p;
355}
356
357size_t
358GDBRemoteCommunicationClient::SendPacketAndWaitForResponse
359(
360    const char *payload,
361    StringExtractorGDBRemote &response,
362    bool send_async
363)
364{
365    return SendPacketAndWaitForResponse (payload,
366                                         ::strlen (payload),
367                                         response,
368                                         send_async);
369}
370
371size_t
372GDBRemoteCommunicationClient::SendPacketAndWaitForResponse
373(
374    const char *payload,
375    size_t payload_length,
376    StringExtractorGDBRemote &response,
377    bool send_async
378)
379{
380    Mutex::Locker locker;
381    Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
382    size_t response_len = 0;
383    if (GetSequenceMutex (locker))
384    {
385        if (SendPacketNoLock (payload, payload_length))
386           response_len = WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ());
387        else
388        {
389            if (log)
390                log->Printf("error: failed to send '%*s'", (int) payload_length, payload);
391        }
392    }
393    else
394    {
395        if (send_async)
396        {
397            if (IsRunning())
398            {
399                Mutex::Locker async_locker (m_async_mutex);
400                m_async_packet.assign(payload, payload_length);
401                m_async_packet_predicate.SetValue (true, eBroadcastNever);
402
403                if (log)
404                    log->Printf ("async: async packet = %s", m_async_packet.c_str());
405
406                bool timed_out = false;
407                if (SendInterrupt(locker, 2, timed_out))
408                {
409                    if (m_interrupt_sent)
410                    {
411                        m_interrupt_sent = false;
412                        TimeValue timeout_time;
413                        timeout_time = TimeValue::Now();
414                        timeout_time.OffsetWithSeconds (m_packet_timeout);
415
416                        if (log)
417                            log->Printf ("async: sent interrupt");
418
419                        if (m_async_packet_predicate.WaitForValueEqualTo (false, &timeout_time, &timed_out))
420                        {
421                            if (log)
422                                log->Printf ("async: got response");
423
424                            // Swap the response buffer to avoid malloc and string copy
425                            response.GetStringRef().swap (m_async_response.GetStringRef());
426                            response_len = response.GetStringRef().size();
427                        }
428                        else
429                        {
430                            if (log)
431                                log->Printf ("async: timed out waiting for response");
432                        }
433
434                        // Make sure we wait until the continue packet has been sent again...
435                        if (m_private_is_running.WaitForValueEqualTo (true, &timeout_time, &timed_out))
436                        {
437                            if (log)
438                            {
439                                if (timed_out)
440                                    log->Printf ("async: timed out waiting for process to resume, but process was resumed");
441                                else
442                                    log->Printf ("async: async packet sent");
443                            }
444                        }
445                        else
446                        {
447                            if (log)
448                                log->Printf ("async: timed out waiting for process to resume");
449                        }
450                    }
451                    else
452                    {
453                        // We had a racy condition where we went to send the interrupt
454                        // yet we were able to get the lock, so the process must have
455                        // just stopped?
456                        if (log)
457                            log->Printf ("async: got lock without sending interrupt");
458                        // Send the packet normally since we got the lock
459                        if (SendPacketNoLock (payload, payload_length))
460                            response_len = WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ());
461                        else
462                        {
463                            if (log)
464                                log->Printf("error: failed to send '%*s'", (int) payload_length, payload);
465                        }
466                    }
467                }
468                else
469                {
470                    if (log)
471                        log->Printf ("async: failed to interrupt");
472                }
473            }
474            else
475            {
476                if (log)
477                    log->Printf ("async: not running, async is ignored");
478            }
479        }
480        else
481        {
482            if (log)
483                log->Printf("error: failed to get packet sequence mutex, not sending packet '%*s'", (int) payload_length, payload);
484        }
485    }
486    if (response_len == 0)
487    {
488        if (log)
489            log->Printf("error: failed to get response for '%*s'", (int) payload_length, payload);
490    }
491    return response_len;
492}
493
494static const char *end_delimiter = "--end--;";
495static const int end_delimiter_len = 8;
496
497std::string
498GDBRemoteCommunicationClient::HarmonizeThreadIdsForProfileData
499(   ProcessGDBRemote *process,
500    StringExtractorGDBRemote& profileDataExtractor
501)
502{
503    std::map<uint64_t, uint32_t> new_thread_id_to_used_usec_map;
504    std::stringstream final_output;
505    std::string name, value;
506
507    // Going to assuming thread_used_usec comes first, else bail out.
508    while (profileDataExtractor.GetNameColonValue(name, value))
509    {
510        if (name.compare("thread_used_id") == 0)
511        {
512            StringExtractor threadIDHexExtractor(value.c_str());
513            uint64_t thread_id = threadIDHexExtractor.GetHexMaxU64(false, 0);
514
515            bool has_used_usec = false;
516            uint32_t curr_used_usec = 0;
517            std::string usec_name, usec_value;
518            uint32_t input_file_pos = profileDataExtractor.GetFilePos();
519            if (profileDataExtractor.GetNameColonValue(usec_name, usec_value))
520            {
521                if (usec_name.compare("thread_used_usec") == 0)
522                {
523                    has_used_usec = true;
524                    curr_used_usec = strtoull(usec_value.c_str(), NULL, 0);
525                }
526                else
527                {
528                    // We didn't find what we want, it is probably
529                    // an older version. Bail out.
530                    profileDataExtractor.SetFilePos(input_file_pos);
531                }
532            }
533
534            if (has_used_usec)
535            {
536                uint32_t prev_used_usec = 0;
537                std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_used_usec_map.find(thread_id);
538                if (iterator != m_thread_id_to_used_usec_map.end())
539                {
540                    prev_used_usec = m_thread_id_to_used_usec_map[thread_id];
541                }
542
543                uint32_t real_used_usec = curr_used_usec - prev_used_usec;
544                // A good first time record is one that runs for at least 0.25 sec
545                bool good_first_time = (prev_used_usec == 0) && (real_used_usec > 250000);
546                bool good_subsequent_time = (prev_used_usec > 0) &&
547                    ((real_used_usec > 0) || (process->HasAssignedIndexIDToThread(thread_id)));
548
549                if (good_first_time || good_subsequent_time)
550                {
551                    // We try to avoid doing too many index id reservation,
552                    // resulting in fast increase of index ids.
553
554                    final_output << name << ":";
555                    int32_t index_id = process->AssignIndexIDToThread(thread_id);
556                    final_output << index_id << ";";
557
558                    final_output << usec_name << ":" << usec_value << ";";
559                }
560                else
561                {
562                    // Skip past 'thread_used_name'.
563                    std::string local_name, local_value;
564                    profileDataExtractor.GetNameColonValue(local_name, local_value);
565                }
566
567                // Store current time as previous time so that they can be compared later.
568                new_thread_id_to_used_usec_map[thread_id] = curr_used_usec;
569            }
570            else
571            {
572                // Bail out and use old string.
573                final_output << name << ":" << value << ";";
574            }
575        }
576        else
577        {
578            final_output << name << ":" << value << ";";
579        }
580    }
581    final_output << end_delimiter;
582    m_thread_id_to_used_usec_map = new_thread_id_to_used_usec_map;
583
584    return final_output.str();
585}
586
587StateType
588GDBRemoteCommunicationClient::SendContinuePacketAndWaitForResponse
589(
590    ProcessGDBRemote *process,
591    const char *payload,
592    size_t packet_length,
593    StringExtractorGDBRemote &response
594)
595{
596    m_curr_tid = LLDB_INVALID_THREAD_ID;
597    Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
598    if (log)
599        log->Printf ("GDBRemoteCommunicationClient::%s ()", __FUNCTION__);
600
601    Mutex::Locker locker(m_sequence_mutex);
602    StateType state = eStateRunning;
603
604    BroadcastEvent(eBroadcastBitRunPacketSent, NULL);
605    m_public_is_running.SetValue (true, eBroadcastNever);
606    // Set the starting continue packet into "continue_packet". This packet
607    // may change if we are interrupted and we continue after an async packet...
608    std::string continue_packet(payload, packet_length);
609
610    bool got_async_packet = false;
611
612    while (state == eStateRunning)
613    {
614        if (!got_async_packet)
615        {
616            if (log)
617                log->Printf ("GDBRemoteCommunicationClient::%s () sending continue packet: %s", __FUNCTION__, continue_packet.c_str());
618            if (SendPacketNoLock(continue_packet.c_str(), continue_packet.size()) == 0)
619                state = eStateInvalid;
620
621            m_private_is_running.SetValue (true, eBroadcastAlways);
622        }
623
624        got_async_packet = false;
625
626        if (log)
627            log->Printf ("GDBRemoteCommunicationClient::%s () WaitForPacket(%s)", __FUNCTION__, continue_packet.c_str());
628
629        if (WaitForPacketWithTimeoutMicroSecondsNoLock(response, UINT32_MAX))
630        {
631            if (response.Empty())
632                state = eStateInvalid;
633            else
634            {
635                const char stop_type = response.GetChar();
636                if (log)
637                    log->Printf ("GDBRemoteCommunicationClient::%s () got packet: %s", __FUNCTION__, response.GetStringRef().c_str());
638                switch (stop_type)
639                {
640                case 'T':
641                case 'S':
642                    {
643                        if (process->GetStopID() == 0)
644                        {
645                            if (process->GetID() == LLDB_INVALID_PROCESS_ID)
646                            {
647                                lldb::pid_t pid = GetCurrentProcessID ();
648                                if (pid != LLDB_INVALID_PROCESS_ID)
649                                    process->SetID (pid);
650                            }
651                            process->BuildDynamicRegisterInfo (true);
652                        }
653
654                        // Privately notify any internal threads that we have stopped
655                        // in case we wanted to interrupt our process, yet we might
656                        // send a packet and continue without returning control to the
657                        // user.
658                        m_private_is_running.SetValue (false, eBroadcastAlways);
659
660                        const uint8_t signo = response.GetHexU8 (UINT8_MAX);
661
662                        bool continue_after_async = m_async_signal != -1 || m_async_packet_predicate.GetValue();
663                        if (continue_after_async || m_interrupt_sent)
664                        {
665                            // We sent an interrupt packet to stop the inferior process
666                            // for an async signal or to send an async packet while running
667                            // but we might have been single stepping and received the
668                            // stop packet for the step instead of for the interrupt packet.
669                            // Typically when an interrupt is sent a SIGINT or SIGSTOP
670                            // is used, so if we get anything else, we need to try and
671                            // get another stop reply packet that may have been sent
672                            // due to sending the interrupt when the target is stopped
673                            // which will just re-send a copy of the last stop reply
674                            // packet. If we don't do this, then the reply for our
675                            // async packet will be the repeat stop reply packet and cause
676                            // a lot of trouble for us!
677                            if (signo != SIGINT && signo != SIGSTOP)
678                            {
679                                continue_after_async = false;
680
681                                // We didn't get a a SIGINT or SIGSTOP, so try for a
682                                // very brief time (1 ms) to get another stop reply
683                                // packet to make sure it doesn't get in the way
684                                StringExtractorGDBRemote extra_stop_reply_packet;
685                                uint32_t timeout_usec = 1000;
686                                if (WaitForPacketWithTimeoutMicroSecondsNoLock (extra_stop_reply_packet, timeout_usec))
687                                {
688                                    switch (extra_stop_reply_packet.GetChar())
689                                    {
690                                    case 'T':
691                                    case 'S':
692                                        // We did get an extra stop reply, which means
693                                        // our interrupt didn't stop the target so we
694                                        // shouldn't continue after the async signal
695                                        // or packet is sent...
696                                        continue_after_async = false;
697                                        break;
698                                    }
699                                }
700                            }
701                        }
702
703                        if (m_async_signal != -1)
704                        {
705                            if (log)
706                                log->Printf ("async: send signo = %s", Host::GetSignalAsCString (m_async_signal));
707
708                            // Save off the async signal we are supposed to send
709                            const int async_signal = m_async_signal;
710                            // Clear the async signal member so we don't end up
711                            // sending the signal multiple times...
712                            m_async_signal = -1;
713                            // Check which signal we stopped with
714                            if (signo == async_signal)
715                            {
716                                if (log)
717                                    log->Printf ("async: stopped with signal %s, we are done running", Host::GetSignalAsCString (signo));
718
719                                // We already stopped with a signal that we wanted
720                                // to stop with, so we are done
721                            }
722                            else
723                            {
724                                // We stopped with a different signal that the one
725                                // we wanted to stop with, so now we must resume
726                                // with the signal we want
727                                char signal_packet[32];
728                                int signal_packet_len = 0;
729                                signal_packet_len = ::snprintf (signal_packet,
730                                                                sizeof (signal_packet),
731                                                                "C%2.2x",
732                                                                async_signal);
733
734                                if (log)
735                                    log->Printf ("async: stopped with signal %s, resume with %s",
736                                                       Host::GetSignalAsCString (signo),
737                                                       Host::GetSignalAsCString (async_signal));
738
739                                // Set the continue packet to resume even if the
740                                // interrupt didn't cause our stop (ignore continue_after_async)
741                                continue_packet.assign(signal_packet, signal_packet_len);
742                                continue;
743                            }
744                        }
745                        else if (m_async_packet_predicate.GetValue())
746                        {
747                            Log * packet_log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PACKETS));
748
749                            // We are supposed to send an asynchronous packet while
750                            // we are running.
751                            m_async_response.Clear();
752                            if (m_async_packet.empty())
753                            {
754                                if (packet_log)
755                                    packet_log->Printf ("async: error: empty async packet");
756
757                            }
758                            else
759                            {
760                                if (packet_log)
761                                    packet_log->Printf ("async: sending packet");
762
763                                SendPacketAndWaitForResponse (&m_async_packet[0],
764                                                              m_async_packet.size(),
765                                                              m_async_response,
766                                                              false);
767                            }
768                            // Let the other thread that was trying to send the async
769                            // packet know that the packet has been sent and response is
770                            // ready...
771                            m_async_packet_predicate.SetValue(false, eBroadcastAlways);
772
773                            if (packet_log)
774                                packet_log->Printf ("async: sent packet, continue_after_async = %i", continue_after_async);
775
776                            // Set the continue packet to resume if our interrupt
777                            // for the async packet did cause the stop
778                            if (continue_after_async)
779                            {
780                                // Reverting this for now as it is causing deadlocks
781                                // in programs (<rdar://problem/11529853>). In the future
782                                // we should check our thread list and "do the right thing"
783                                // for new threads that show up while we stop and run async
784                                // packets. Setting the packet to 'c' to continue all threads
785                                // is the right thing to do 99.99% of the time because if a
786                                // thread was single stepping, and we sent an interrupt, we
787                                // will notice above that we didn't stop due to an interrupt
788                                // but stopped due to stepping and we would _not_ continue.
789                                continue_packet.assign (1, 'c');
790                                continue;
791                            }
792                        }
793                        // Stop with signal and thread info
794                        state = eStateStopped;
795                    }
796                    break;
797
798                case 'W':
799                case 'X':
800                    // process exited
801                    state = eStateExited;
802                    break;
803
804                case 'O':
805                    // STDOUT
806                    {
807                        got_async_packet = true;
808                        std::string inferior_stdout;
809                        inferior_stdout.reserve(response.GetBytesLeft () / 2);
810                        char ch;
811                        while ((ch = response.GetHexU8()) != '\0')
812                            inferior_stdout.append(1, ch);
813                        process->AppendSTDOUT (inferior_stdout.c_str(), inferior_stdout.size());
814                    }
815                    break;
816
817                case 'A':
818                    // Async miscellaneous reply. Right now, only profile data is coming through this channel.
819                    {
820                        got_async_packet = true;
821                        std::string input = response.GetStringRef().substr(1); // '1' to move beyond 'A'
822                        if (m_partial_profile_data.length() > 0)
823                        {
824                            m_partial_profile_data.append(input);
825                            input = m_partial_profile_data;
826                            m_partial_profile_data.clear();
827                        }
828
829                        size_t found, pos = 0, len = input.length();
830                        while ((found = input.find(end_delimiter, pos)) != std::string::npos)
831                        {
832                            StringExtractorGDBRemote profileDataExtractor(input.substr(pos, found).c_str());
833                            std::string profile_data = HarmonizeThreadIdsForProfileData(process, profileDataExtractor);
834                            process->BroadcastAsyncProfileData (profile_data);
835
836                            pos = found + end_delimiter_len;
837                        }
838
839                        if (pos < len)
840                        {
841                            // Last incomplete chunk.
842                            m_partial_profile_data = input.substr(pos);
843                        }
844                    }
845                    break;
846
847                case 'E':
848                    // ERROR
849                    state = eStateInvalid;
850                    break;
851
852                default:
853                    if (log)
854                        log->Printf ("GDBRemoteCommunicationClient::%s () unrecognized async packet", __FUNCTION__);
855                    state = eStateInvalid;
856                    break;
857                }
858            }
859        }
860        else
861        {
862            if (log)
863                log->Printf ("GDBRemoteCommunicationClient::%s () WaitForPacket(...) => false", __FUNCTION__);
864            state = eStateInvalid;
865        }
866    }
867    if (log)
868        log->Printf ("GDBRemoteCommunicationClient::%s () => %s", __FUNCTION__, StateAsCString(state));
869    response.SetFilePos(0);
870    m_private_is_running.SetValue (false, eBroadcastAlways);
871    m_public_is_running.SetValue (false, eBroadcastAlways);
872    return state;
873}
874
875bool
876GDBRemoteCommunicationClient::SendAsyncSignal (int signo)
877{
878    Mutex::Locker async_locker (m_async_mutex);
879    m_async_signal = signo;
880    bool timed_out = false;
881    Mutex::Locker locker;
882    if (SendInterrupt (locker, 1, timed_out))
883        return true;
884    m_async_signal = -1;
885    return false;
886}
887
888// This function takes a mutex locker as a parameter in case the GetSequenceMutex
889// actually succeeds. If it doesn't succeed in acquiring the sequence mutex
890// (the expected result), then it will send the halt packet. If it does succeed
891// then the caller that requested the interrupt will want to keep the sequence
892// locked down so that no one else can send packets while the caller has control.
893// This function usually gets called when we are running and need to stop the
894// target. It can also be used when we are running and and we need to do something
895// else (like read/write memory), so we need to interrupt the running process
896// (gdb remote protocol requires this), and do what we need to do, then resume.
897
898bool
899GDBRemoteCommunicationClient::SendInterrupt
900(
901    Mutex::Locker& locker,
902    uint32_t seconds_to_wait_for_stop,
903    bool &timed_out
904)
905{
906    timed_out = false;
907    Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS));
908
909    if (IsRunning())
910    {
911        // Only send an interrupt if our debugserver is running...
912        if (GetSequenceMutex (locker))
913        {
914            if (log)
915                log->Printf ("SendInterrupt () - got sequence mutex without having to interrupt");
916        }
917        else
918        {
919            // Someone has the mutex locked waiting for a response or for the
920            // inferior to stop, so send the interrupt on the down low...
921            char ctrl_c = '\x03';
922            ConnectionStatus status = eConnectionStatusSuccess;
923            size_t bytes_written = Write (&ctrl_c, 1, status, NULL);
924            if (log)
925                log->PutCString("send packet: \\x03");
926            if (bytes_written > 0)
927            {
928                m_interrupt_sent = true;
929                if (seconds_to_wait_for_stop)
930                {
931                    TimeValue timeout;
932                    if (seconds_to_wait_for_stop)
933                    {
934                        timeout = TimeValue::Now();
935                        timeout.OffsetWithSeconds (seconds_to_wait_for_stop);
936                    }
937                    if (m_private_is_running.WaitForValueEqualTo (false, &timeout, &timed_out))
938                    {
939                        if (log)
940                            log->PutCString ("SendInterrupt () - sent interrupt, private state stopped");
941                        return true;
942                    }
943                    else
944                    {
945                        if (log)
946                            log->Printf ("SendInterrupt () - sent interrupt, timed out wating for async thread resume");
947                    }
948                }
949                else
950                {
951                    if (log)
952                        log->Printf ("SendInterrupt () - sent interrupt, not waiting for stop...");
953                    return true;
954                }
955            }
956            else
957            {
958                if (log)
959                    log->Printf ("SendInterrupt () - failed to write interrupt");
960            }
961            return false;
962        }
963    }
964    else
965    {
966        if (log)
967            log->Printf ("SendInterrupt () - not running");
968    }
969    return true;
970}
971
972lldb::pid_t
973GDBRemoteCommunicationClient::GetCurrentProcessID ()
974{
975    StringExtractorGDBRemote response;
976    if (SendPacketAndWaitForResponse("qC", strlen("qC"), response, false))
977    {
978        if (response.GetChar() == 'Q')
979            if (response.GetChar() == 'C')
980                return response.GetHexMaxU32 (false, LLDB_INVALID_PROCESS_ID);
981    }
982    return LLDB_INVALID_PROCESS_ID;
983}
984
985bool
986GDBRemoteCommunicationClient::GetLaunchSuccess (std::string &error_str)
987{
988    error_str.clear();
989    StringExtractorGDBRemote response;
990    if (SendPacketAndWaitForResponse("qLaunchSuccess", strlen("qLaunchSuccess"), response, false))
991    {
992        if (response.IsOKResponse())
993            return true;
994        if (response.GetChar() == 'E')
995        {
996            // A string the describes what failed when launching...
997            error_str = response.GetStringRef().substr(1);
998        }
999        else
1000        {
1001            error_str.assign ("unknown error occurred launching process");
1002        }
1003    }
1004    else
1005    {
1006        error_str.assign ("timed out waiting for app to launch");
1007    }
1008    return false;
1009}
1010
1011int
1012GDBRemoteCommunicationClient::SendArgumentsPacket (const ProcessLaunchInfo &launch_info)
1013{
1014    // Since we don't get the send argv0 separate from the executable path, we need to
1015    // make sure to use the actual exectuable path found in the launch_info...
1016    std::vector<const char *> argv;
1017    FileSpec exe_file = launch_info.GetExecutableFile();
1018    std::string exe_path;
1019    const char *arg = NULL;
1020    const Args &launch_args = launch_info.GetArguments();
1021    if (exe_file)
1022        exe_path = exe_file.GetPath();
1023    else
1024    {
1025        arg = launch_args.GetArgumentAtIndex(0);
1026        if (arg)
1027            exe_path = arg;
1028    }
1029    if (!exe_path.empty())
1030    {
1031        argv.push_back(exe_path.c_str());
1032        for (uint32_t i=1; (arg = launch_args.GetArgumentAtIndex(i)) != NULL; ++i)
1033        {
1034            if (arg)
1035                argv.push_back(arg);
1036        }
1037    }
1038    if (!argv.empty())
1039    {
1040        StreamString packet;
1041        packet.PutChar('A');
1042        for (size_t i = 0, n = argv.size(); i < n; ++i)
1043        {
1044            arg = argv[i];
1045            const int arg_len = strlen(arg);
1046            if (i > 0)
1047                packet.PutChar(',');
1048            packet.Printf("%i,%i,", arg_len * 2, (int)i);
1049            packet.PutBytesAsRawHex8 (arg, arg_len);
1050        }
1051
1052        StringExtractorGDBRemote response;
1053        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1054        {
1055            if (response.IsOKResponse())
1056                return 0;
1057            uint8_t error = response.GetError();
1058            if (error)
1059                return error;
1060        }
1061    }
1062    return -1;
1063}
1064
1065int
1066GDBRemoteCommunicationClient::SendEnvironmentPacket (char const *name_equal_value)
1067{
1068    if (name_equal_value && name_equal_value[0])
1069    {
1070        StreamString packet;
1071        bool send_hex_encoding = false;
1072        for (const char *p = name_equal_value; *p != '\0' && send_hex_encoding == false; ++p)
1073        {
1074            if (isprint(*p))
1075            {
1076                switch (*p)
1077                {
1078                    case '$':
1079                    case '#':
1080                        send_hex_encoding = true;
1081                        break;
1082                    default:
1083                        break;
1084                }
1085            }
1086            else
1087            {
1088                // We have non printable characters, lets hex encode this...
1089                send_hex_encoding = true;
1090            }
1091        }
1092
1093        StringExtractorGDBRemote response;
1094        if (send_hex_encoding)
1095        {
1096            if (m_supports_QEnvironmentHexEncoded)
1097            {
1098                packet.PutCString("QEnvironmentHexEncoded:");
1099                packet.PutBytesAsRawHex8 (name_equal_value, strlen(name_equal_value));
1100                if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1101                {
1102                    if (response.IsOKResponse())
1103                        return 0;
1104                    uint8_t error = response.GetError();
1105                    if (error)
1106                        return error;
1107                    if (response.IsUnsupportedResponse())
1108                        m_supports_QEnvironmentHexEncoded = false;
1109                }
1110            }
1111
1112        }
1113        else if (m_supports_QEnvironment)
1114        {
1115            packet.Printf("QEnvironment:%s", name_equal_value);
1116            if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1117            {
1118                if (response.IsOKResponse())
1119                    return 0;
1120                uint8_t error = response.GetError();
1121                if (error)
1122                    return error;
1123                if (response.IsUnsupportedResponse())
1124                    m_supports_QEnvironment = false;
1125            }
1126        }
1127    }
1128    return -1;
1129}
1130
1131int
1132GDBRemoteCommunicationClient::SendLaunchArchPacket (char const *arch)
1133{
1134    if (arch && arch[0])
1135    {
1136        StreamString packet;
1137        packet.Printf("QLaunchArch:%s", arch);
1138        StringExtractorGDBRemote response;
1139        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1140        {
1141            if (response.IsOKResponse())
1142                return 0;
1143            uint8_t error = response.GetError();
1144            if (error)
1145                return error;
1146        }
1147    }
1148    return -1;
1149}
1150
1151bool
1152GDBRemoteCommunicationClient::GetOSVersion (uint32_t &major,
1153                                            uint32_t &minor,
1154                                            uint32_t &update)
1155{
1156    if (GetHostInfo ())
1157    {
1158        if (m_os_version_major != UINT32_MAX)
1159        {
1160            major = m_os_version_major;
1161            minor = m_os_version_minor;
1162            update = m_os_version_update;
1163            return true;
1164        }
1165    }
1166    return false;
1167}
1168
1169bool
1170GDBRemoteCommunicationClient::GetOSBuildString (std::string &s)
1171{
1172    if (GetHostInfo ())
1173    {
1174        if (!m_os_build.empty())
1175        {
1176            s = m_os_build;
1177            return true;
1178        }
1179    }
1180    s.clear();
1181    return false;
1182}
1183
1184
1185bool
1186GDBRemoteCommunicationClient::GetOSKernelDescription (std::string &s)
1187{
1188    if (GetHostInfo ())
1189    {
1190        if (!m_os_kernel.empty())
1191        {
1192            s = m_os_kernel;
1193            return true;
1194        }
1195    }
1196    s.clear();
1197    return false;
1198}
1199
1200bool
1201GDBRemoteCommunicationClient::GetHostname (std::string &s)
1202{
1203    if (GetHostInfo ())
1204    {
1205        if (!m_hostname.empty())
1206        {
1207            s = m_hostname;
1208            return true;
1209        }
1210    }
1211    s.clear();
1212    return false;
1213}
1214
1215ArchSpec
1216GDBRemoteCommunicationClient::GetSystemArchitecture ()
1217{
1218    if (GetHostInfo ())
1219        return m_host_arch;
1220    return ArchSpec();
1221}
1222
1223const lldb_private::ArchSpec &
1224GDBRemoteCommunicationClient::GetProcessArchitecture ()
1225{
1226    if (m_qProcessInfo_is_valid == eLazyBoolCalculate)
1227        GetCurrentProcessInfo ();
1228    return m_process_arch;
1229}
1230
1231
1232bool
1233GDBRemoteCommunicationClient::GetHostInfo (bool force)
1234{
1235    if (force || m_qHostInfo_is_valid == eLazyBoolCalculate)
1236    {
1237        m_qHostInfo_is_valid = eLazyBoolNo;
1238        StringExtractorGDBRemote response;
1239        if (SendPacketAndWaitForResponse ("qHostInfo", response, false))
1240        {
1241            if (response.IsNormalResponse())
1242            {
1243                std::string name;
1244                std::string value;
1245                uint32_t cpu = LLDB_INVALID_CPUTYPE;
1246                uint32_t sub = 0;
1247                std::string arch_name;
1248                std::string os_name;
1249                std::string vendor_name;
1250                std::string triple;
1251                uint32_t pointer_byte_size = 0;
1252                StringExtractor extractor;
1253                ByteOrder byte_order = eByteOrderInvalid;
1254                uint32_t num_keys_decoded = 0;
1255                while (response.GetNameColonValue(name, value))
1256                {
1257                    if (name.compare("cputype") == 0)
1258                    {
1259                        // exception type in big endian hex
1260                        cpu = Args::StringToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 0);
1261                        if (cpu != LLDB_INVALID_CPUTYPE)
1262                            ++num_keys_decoded;
1263                    }
1264                    else if (name.compare("cpusubtype") == 0)
1265                    {
1266                        // exception count in big endian hex
1267                        sub = Args::StringToUInt32 (value.c_str(), 0, 0);
1268                        if (sub != 0)
1269                            ++num_keys_decoded;
1270                    }
1271                    else if (name.compare("arch") == 0)
1272                    {
1273                        arch_name.swap (value);
1274                        ++num_keys_decoded;
1275                    }
1276                    else if (name.compare("triple") == 0)
1277                    {
1278                        // The triple comes as ASCII hex bytes since it contains '-' chars
1279                        extractor.GetStringRef().swap(value);
1280                        extractor.SetFilePos(0);
1281                        extractor.GetHexByteString (triple);
1282                        ++num_keys_decoded;
1283                    }
1284                    else if (name.compare("os_build") == 0)
1285                    {
1286                        extractor.GetStringRef().swap(value);
1287                        extractor.SetFilePos(0);
1288                        extractor.GetHexByteString (m_os_build);
1289                        ++num_keys_decoded;
1290                    }
1291                    else if (name.compare("hostname") == 0)
1292                    {
1293                        extractor.GetStringRef().swap(value);
1294                        extractor.SetFilePos(0);
1295                        extractor.GetHexByteString (m_hostname);
1296                        ++num_keys_decoded;
1297                    }
1298                    else if (name.compare("os_kernel") == 0)
1299                    {
1300                        extractor.GetStringRef().swap(value);
1301                        extractor.SetFilePos(0);
1302                        extractor.GetHexByteString (m_os_kernel);
1303                        ++num_keys_decoded;
1304                    }
1305                    else if (name.compare("ostype") == 0)
1306                    {
1307                        os_name.swap (value);
1308                        ++num_keys_decoded;
1309                    }
1310                    else if (name.compare("vendor") == 0)
1311                    {
1312                        vendor_name.swap(value);
1313                        ++num_keys_decoded;
1314                    }
1315                    else if (name.compare("endian") == 0)
1316                    {
1317                        ++num_keys_decoded;
1318                        if (value.compare("little") == 0)
1319                            byte_order = eByteOrderLittle;
1320                        else if (value.compare("big") == 0)
1321                            byte_order = eByteOrderBig;
1322                        else if (value.compare("pdp") == 0)
1323                            byte_order = eByteOrderPDP;
1324                        else
1325                            --num_keys_decoded;
1326                    }
1327                    else if (name.compare("ptrsize") == 0)
1328                    {
1329                        pointer_byte_size = Args::StringToUInt32 (value.c_str(), 0, 0);
1330                        if (pointer_byte_size != 0)
1331                            ++num_keys_decoded;
1332                    }
1333                    else if (name.compare("os_version") == 0)
1334                    {
1335                        Args::StringToVersion (value.c_str(),
1336                                               m_os_version_major,
1337                                               m_os_version_minor,
1338                                               m_os_version_update);
1339                        if (m_os_version_major != UINT32_MAX)
1340                            ++num_keys_decoded;
1341                    }
1342                    else if (name.compare("watchpoint_exceptions_received") == 0)
1343                    {
1344                        ++num_keys_decoded;
1345                        if (strcmp(value.c_str(),"before") == 0)
1346                            m_watchpoints_trigger_after_instruction = eLazyBoolNo;
1347                        else if (strcmp(value.c_str(),"after") == 0)
1348                            m_watchpoints_trigger_after_instruction = eLazyBoolYes;
1349                        else
1350                            --num_keys_decoded;
1351                    }
1352                    else if (name.compare("default_packet_timeout") == 0)
1353                    {
1354                        m_default_packet_timeout = Args::StringToUInt32(value.c_str(), 0);
1355                        if (m_default_packet_timeout > 0)
1356                        {
1357                            SetPacketTimeout(m_default_packet_timeout);
1358                            ++num_keys_decoded;
1359                        }
1360                    }
1361
1362                }
1363
1364                if (num_keys_decoded > 0)
1365                    m_qHostInfo_is_valid = eLazyBoolYes;
1366
1367                if (triple.empty())
1368                {
1369                    if (arch_name.empty())
1370                    {
1371                        if (cpu != LLDB_INVALID_CPUTYPE)
1372                        {
1373                            m_host_arch.SetArchitecture (eArchTypeMachO, cpu, sub);
1374                            if (pointer_byte_size)
1375                            {
1376                                assert (pointer_byte_size == m_host_arch.GetAddressByteSize());
1377                            }
1378                            if (byte_order != eByteOrderInvalid)
1379                            {
1380                                assert (byte_order == m_host_arch.GetByteOrder());
1381                            }
1382
1383                            if (!os_name.empty() && vendor_name.compare("apple") == 0 && os_name.find("darwin") == 0)
1384                            {
1385                                switch (m_host_arch.GetMachine())
1386                                {
1387                                case llvm::Triple::arm:
1388                                case llvm::Triple::thumb:
1389                                    os_name = "ios";
1390                                    break;
1391                                default:
1392                                    os_name = "macosx";
1393                                    break;
1394                                }
1395                            }
1396                            if (!vendor_name.empty())
1397                                m_host_arch.GetTriple().setVendorName (llvm::StringRef (vendor_name));
1398                            if (!os_name.empty())
1399                                m_host_arch.GetTriple().setOSName (llvm::StringRef (os_name));
1400
1401                        }
1402                    }
1403                    else
1404                    {
1405                        std::string triple;
1406                        triple += arch_name;
1407                        if (!vendor_name.empty() || !os_name.empty())
1408                        {
1409                            triple += '-';
1410                            if (vendor_name.empty())
1411                                triple += "unknown";
1412                            else
1413                                triple += vendor_name;
1414                            triple += '-';
1415                            if (os_name.empty())
1416                                triple += "unknown";
1417                            else
1418                                triple += os_name;
1419                        }
1420                        m_host_arch.SetTriple (triple.c_str());
1421
1422                        llvm::Triple &host_triple = m_host_arch.GetTriple();
1423                        if (host_triple.getVendor() == llvm::Triple::Apple && host_triple.getOS() == llvm::Triple::Darwin)
1424                        {
1425                            switch (m_host_arch.GetMachine())
1426                            {
1427                                case llvm::Triple::arm:
1428                                case llvm::Triple::thumb:
1429                                    host_triple.setOS(llvm::Triple::IOS);
1430                                    break;
1431                                default:
1432                                    host_triple.setOS(llvm::Triple::MacOSX);
1433                                    break;
1434                            }
1435                        }
1436                        if (pointer_byte_size)
1437                        {
1438                            assert (pointer_byte_size == m_host_arch.GetAddressByteSize());
1439                        }
1440                        if (byte_order != eByteOrderInvalid)
1441                        {
1442                            assert (byte_order == m_host_arch.GetByteOrder());
1443                        }
1444
1445                    }
1446                }
1447                else
1448                {
1449                    m_host_arch.SetTriple (triple.c_str());
1450                    if (pointer_byte_size)
1451                    {
1452                        assert (pointer_byte_size == m_host_arch.GetAddressByteSize());
1453                    }
1454                    if (byte_order != eByteOrderInvalid)
1455                    {
1456                        assert (byte_order == m_host_arch.GetByteOrder());
1457                    }
1458                }
1459            }
1460        }
1461    }
1462    return m_qHostInfo_is_valid == eLazyBoolYes;
1463}
1464
1465int
1466GDBRemoteCommunicationClient::SendAttach
1467(
1468    lldb::pid_t pid,
1469    StringExtractorGDBRemote& response
1470)
1471{
1472    if (pid != LLDB_INVALID_PROCESS_ID)
1473    {
1474        char packet[64];
1475        const int packet_len = ::snprintf (packet, sizeof(packet), "vAttach;%" PRIx64, pid);
1476        assert (packet_len < (int)sizeof(packet));
1477        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1478        {
1479            if (response.IsErrorResponse())
1480                return response.GetError();
1481            return 0;
1482        }
1483    }
1484    return -1;
1485}
1486
1487const lldb_private::ArchSpec &
1488GDBRemoteCommunicationClient::GetHostArchitecture ()
1489{
1490    if (m_qHostInfo_is_valid == eLazyBoolCalculate)
1491        GetHostInfo ();
1492    return m_host_arch;
1493}
1494
1495uint32_t
1496GDBRemoteCommunicationClient::GetHostDefaultPacketTimeout ()
1497{
1498    if (m_qHostInfo_is_valid == eLazyBoolCalculate)
1499        GetHostInfo ();
1500    return m_default_packet_timeout;
1501}
1502
1503addr_t
1504GDBRemoteCommunicationClient::AllocateMemory (size_t size, uint32_t permissions)
1505{
1506    if (m_supports_alloc_dealloc_memory != eLazyBoolNo)
1507    {
1508        m_supports_alloc_dealloc_memory = eLazyBoolYes;
1509        char packet[64];
1510        const int packet_len = ::snprintf (packet, sizeof(packet), "_M%" PRIx64 ",%s%s%s",
1511                                           (uint64_t)size,
1512                                           permissions & lldb::ePermissionsReadable ? "r" : "",
1513                                           permissions & lldb::ePermissionsWritable ? "w" : "",
1514                                           permissions & lldb::ePermissionsExecutable ? "x" : "");
1515        assert (packet_len < (int)sizeof(packet));
1516        StringExtractorGDBRemote response;
1517        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1518        {
1519            if (!response.IsErrorResponse())
1520                return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
1521        }
1522        else
1523        {
1524            m_supports_alloc_dealloc_memory = eLazyBoolNo;
1525        }
1526    }
1527    return LLDB_INVALID_ADDRESS;
1528}
1529
1530bool
1531GDBRemoteCommunicationClient::DeallocateMemory (addr_t addr)
1532{
1533    if (m_supports_alloc_dealloc_memory != eLazyBoolNo)
1534    {
1535        m_supports_alloc_dealloc_memory = eLazyBoolYes;
1536        char packet[64];
1537        const int packet_len = ::snprintf(packet, sizeof(packet), "_m%" PRIx64, (uint64_t)addr);
1538        assert (packet_len < (int)sizeof(packet));
1539        StringExtractorGDBRemote response;
1540        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1541        {
1542            if (response.IsOKResponse())
1543                return true;
1544        }
1545        else
1546        {
1547            m_supports_alloc_dealloc_memory = eLazyBoolNo;
1548        }
1549    }
1550    return false;
1551}
1552
1553Error
1554GDBRemoteCommunicationClient::Detach (bool keep_stopped)
1555{
1556    Error error;
1557
1558    if (keep_stopped)
1559    {
1560        if (m_supports_detach_stay_stopped == eLazyBoolCalculate)
1561        {
1562            char packet[64];
1563            const int packet_len = ::snprintf(packet, sizeof(packet), "qSupportsDetachAndStayStopped:");
1564            assert (packet_len < (int)sizeof(packet));
1565            StringExtractorGDBRemote response;
1566            if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1567            {
1568                m_supports_detach_stay_stopped = eLazyBoolYes;
1569            }
1570            else
1571            {
1572                m_supports_detach_stay_stopped = eLazyBoolNo;
1573            }
1574        }
1575
1576        if (m_supports_detach_stay_stopped == eLazyBoolNo)
1577        {
1578            error.SetErrorString("Stays stopped not supported by this target.");
1579            return error;
1580        }
1581        else
1582        {
1583            size_t num_sent = SendPacket ("D1", 2);
1584            if (num_sent == 0)
1585                error.SetErrorString ("Sending extended disconnect packet failed.");
1586        }
1587    }
1588    else
1589    {
1590        size_t num_sent = SendPacket ("D", 1);
1591        if (num_sent == 0)
1592            error.SetErrorString ("Sending disconnect packet failed.");
1593    }
1594    return error;
1595}
1596
1597Error
1598GDBRemoteCommunicationClient::GetMemoryRegionInfo (lldb::addr_t addr,
1599                                                  lldb_private::MemoryRegionInfo &region_info)
1600{
1601    Error error;
1602    region_info.Clear();
1603
1604    if (m_supports_memory_region_info != eLazyBoolNo)
1605    {
1606        m_supports_memory_region_info = eLazyBoolYes;
1607        char packet[64];
1608        const int packet_len = ::snprintf(packet, sizeof(packet), "qMemoryRegionInfo:%" PRIx64, (uint64_t)addr);
1609        assert (packet_len < (int)sizeof(packet));
1610        StringExtractorGDBRemote response;
1611        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1612        {
1613            std::string name;
1614            std::string value;
1615            addr_t addr_value;
1616            bool success = true;
1617            bool saw_permissions = false;
1618            while (success && response.GetNameColonValue(name, value))
1619            {
1620                if (name.compare ("start") == 0)
1621                {
1622                    addr_value = Args::StringToUInt64(value.c_str(), LLDB_INVALID_ADDRESS, 16, &success);
1623                    if (success)
1624                        region_info.GetRange().SetRangeBase(addr_value);
1625                }
1626                else if (name.compare ("size") == 0)
1627                {
1628                    addr_value = Args::StringToUInt64(value.c_str(), 0, 16, &success);
1629                    if (success)
1630                        region_info.GetRange().SetByteSize (addr_value);
1631                }
1632                else if (name.compare ("permissions") == 0 && region_info.GetRange().IsValid())
1633                {
1634                    saw_permissions = true;
1635                    if (region_info.GetRange().Contains (addr))
1636                    {
1637                        if (value.find('r') != std::string::npos)
1638                            region_info.SetReadable (MemoryRegionInfo::eYes);
1639                        else
1640                            region_info.SetReadable (MemoryRegionInfo::eNo);
1641
1642                        if (value.find('w') != std::string::npos)
1643                            region_info.SetWritable (MemoryRegionInfo::eYes);
1644                        else
1645                            region_info.SetWritable (MemoryRegionInfo::eNo);
1646
1647                        if (value.find('x') != std::string::npos)
1648                            region_info.SetExecutable (MemoryRegionInfo::eYes);
1649                        else
1650                            region_info.SetExecutable (MemoryRegionInfo::eNo);
1651                    }
1652                    else
1653                    {
1654                        // The reported region does not contain this address -- we're looking at an unmapped page
1655                        region_info.SetReadable (MemoryRegionInfo::eNo);
1656                        region_info.SetWritable (MemoryRegionInfo::eNo);
1657                        region_info.SetExecutable (MemoryRegionInfo::eNo);
1658                    }
1659                }
1660                else if (name.compare ("error") == 0)
1661                {
1662                    StringExtractorGDBRemote name_extractor;
1663                    // Swap "value" over into "name_extractor"
1664                    name_extractor.GetStringRef().swap(value);
1665                    // Now convert the HEX bytes into a string value
1666                    name_extractor.GetHexByteString (value);
1667                    error.SetErrorString(value.c_str());
1668                }
1669            }
1670
1671            // We got a valid address range back but no permissions -- which means this is an unmapped page
1672            if (region_info.GetRange().IsValid() && saw_permissions == false)
1673            {
1674                region_info.SetReadable (MemoryRegionInfo::eNo);
1675                region_info.SetWritable (MemoryRegionInfo::eNo);
1676                region_info.SetExecutable (MemoryRegionInfo::eNo);
1677            }
1678        }
1679        else
1680        {
1681            m_supports_memory_region_info = eLazyBoolNo;
1682        }
1683    }
1684
1685    if (m_supports_memory_region_info == eLazyBoolNo)
1686    {
1687        error.SetErrorString("qMemoryRegionInfo is not supported");
1688    }
1689    if (error.Fail())
1690        region_info.Clear();
1691    return error;
1692
1693}
1694
1695Error
1696GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num)
1697{
1698    Error error;
1699
1700    if (m_supports_watchpoint_support_info == eLazyBoolYes)
1701    {
1702        num = m_num_supported_hardware_watchpoints;
1703        return error;
1704    }
1705
1706    // Set num to 0 first.
1707    num = 0;
1708    if (m_supports_watchpoint_support_info != eLazyBoolNo)
1709    {
1710        char packet[64];
1711        const int packet_len = ::snprintf(packet, sizeof(packet), "qWatchpointSupportInfo:");
1712        assert (packet_len < (int)sizeof(packet));
1713        StringExtractorGDBRemote response;
1714        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1715        {
1716            m_supports_watchpoint_support_info = eLazyBoolYes;
1717            std::string name;
1718            std::string value;
1719            while (response.GetNameColonValue(name, value))
1720            {
1721                if (name.compare ("num") == 0)
1722                {
1723                    num = Args::StringToUInt32(value.c_str(), 0, 0);
1724                    m_num_supported_hardware_watchpoints = num;
1725                }
1726            }
1727        }
1728        else
1729        {
1730            m_supports_watchpoint_support_info = eLazyBoolNo;
1731        }
1732    }
1733
1734    if (m_supports_watchpoint_support_info == eLazyBoolNo)
1735    {
1736        error.SetErrorString("qWatchpointSupportInfo is not supported");
1737    }
1738    return error;
1739
1740}
1741
1742lldb_private::Error
1743GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num, bool& after)
1744{
1745    Error error(GetWatchpointSupportInfo(num));
1746    if (error.Success())
1747        error = GetWatchpointsTriggerAfterInstruction(after);
1748    return error;
1749}
1750
1751lldb_private::Error
1752GDBRemoteCommunicationClient::GetWatchpointsTriggerAfterInstruction (bool &after)
1753{
1754    Error error;
1755
1756    // we assume watchpoints will happen after running the relevant opcode
1757    // and we only want to override this behavior if we have explicitly
1758    // received a qHostInfo telling us otherwise
1759    if (m_qHostInfo_is_valid != eLazyBoolYes)
1760        after = true;
1761    else
1762        after = (m_watchpoints_trigger_after_instruction != eLazyBoolNo);
1763    return error;
1764}
1765
1766int
1767GDBRemoteCommunicationClient::SetSTDIN (char const *path)
1768{
1769    if (path && path[0])
1770    {
1771        StreamString packet;
1772        packet.PutCString("QSetSTDIN:");
1773        packet.PutBytesAsRawHex8(path, strlen(path));
1774
1775        StringExtractorGDBRemote response;
1776        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1777        {
1778            if (response.IsOKResponse())
1779                return 0;
1780            uint8_t error = response.GetError();
1781            if (error)
1782                return error;
1783        }
1784    }
1785    return -1;
1786}
1787
1788int
1789GDBRemoteCommunicationClient::SetSTDOUT (char const *path)
1790{
1791    if (path && path[0])
1792    {
1793        StreamString packet;
1794        packet.PutCString("QSetSTDOUT:");
1795        packet.PutBytesAsRawHex8(path, strlen(path));
1796
1797        StringExtractorGDBRemote response;
1798        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1799        {
1800            if (response.IsOKResponse())
1801                return 0;
1802            uint8_t error = response.GetError();
1803            if (error)
1804                return error;
1805        }
1806    }
1807    return -1;
1808}
1809
1810int
1811GDBRemoteCommunicationClient::SetSTDERR (char const *path)
1812{
1813    if (path && path[0])
1814    {
1815        StreamString packet;
1816        packet.PutCString("QSetSTDERR:");
1817        packet.PutBytesAsRawHex8(path, strlen(path));
1818
1819        StringExtractorGDBRemote response;
1820        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1821        {
1822            if (response.IsOKResponse())
1823                return 0;
1824            uint8_t error = response.GetError();
1825            if (error)
1826                return error;
1827        }
1828    }
1829    return -1;
1830}
1831
1832bool
1833GDBRemoteCommunicationClient::GetWorkingDir (std::string &cwd)
1834{
1835    StringExtractorGDBRemote response;
1836    if (SendPacketAndWaitForResponse ("qGetWorkingDir", response, false))
1837    {
1838        if (response.IsUnsupportedResponse())
1839            return false;
1840        if (response.IsErrorResponse())
1841            return false;
1842        response.GetHexByteString (cwd);
1843        return !cwd.empty();
1844    }
1845    return false;
1846}
1847
1848int
1849GDBRemoteCommunicationClient::SetWorkingDir (char const *path)
1850{
1851    if (path && path[0])
1852    {
1853        StreamString packet;
1854        packet.PutCString("QSetWorkingDir:");
1855        packet.PutBytesAsRawHex8(path, strlen(path));
1856
1857        StringExtractorGDBRemote response;
1858        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
1859        {
1860            if (response.IsOKResponse())
1861                return 0;
1862            uint8_t error = response.GetError();
1863            if (error)
1864                return error;
1865        }
1866    }
1867    return -1;
1868}
1869
1870int
1871GDBRemoteCommunicationClient::SetDisableASLR (bool enable)
1872{
1873    char packet[32];
1874    const int packet_len = ::snprintf (packet, sizeof (packet), "QSetDisableASLR:%i", enable ? 1 : 0);
1875    assert (packet_len < (int)sizeof(packet));
1876    StringExtractorGDBRemote response;
1877    if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1878    {
1879        if (response.IsOKResponse())
1880            return 0;
1881        uint8_t error = response.GetError();
1882        if (error)
1883            return error;
1884    }
1885    return -1;
1886}
1887
1888bool
1889GDBRemoteCommunicationClient::DecodeProcessInfoResponse (StringExtractorGDBRemote &response, ProcessInstanceInfo &process_info)
1890{
1891    if (response.IsNormalResponse())
1892    {
1893        std::string name;
1894        std::string value;
1895        StringExtractor extractor;
1896
1897        while (response.GetNameColonValue(name, value))
1898        {
1899            if (name.compare("pid") == 0)
1900            {
1901                process_info.SetProcessID (Args::StringToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0));
1902            }
1903            else if (name.compare("ppid") == 0)
1904            {
1905                process_info.SetParentProcessID (Args::StringToUInt32 (value.c_str(), LLDB_INVALID_PROCESS_ID, 0));
1906            }
1907            else if (name.compare("uid") == 0)
1908            {
1909                process_info.SetUserID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0));
1910            }
1911            else if (name.compare("euid") == 0)
1912            {
1913                process_info.SetEffectiveUserID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0));
1914            }
1915            else if (name.compare("gid") == 0)
1916            {
1917                process_info.SetGroupID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0));
1918            }
1919            else if (name.compare("egid") == 0)
1920            {
1921                process_info.SetEffectiveGroupID (Args::StringToUInt32 (value.c_str(), UINT32_MAX, 0));
1922            }
1923            else if (name.compare("triple") == 0)
1924            {
1925                // The triple comes as ASCII hex bytes since it contains '-' chars
1926                extractor.GetStringRef().swap(value);
1927                extractor.SetFilePos(0);
1928                extractor.GetHexByteString (value);
1929                process_info.GetArchitecture ().SetTriple (value.c_str());
1930            }
1931            else if (name.compare("name") == 0)
1932            {
1933                StringExtractor extractor;
1934                // The process name from ASCII hex bytes since we can't
1935                // control the characters in a process name
1936                extractor.GetStringRef().swap(value);
1937                extractor.SetFilePos(0);
1938                extractor.GetHexByteString (value);
1939                process_info.GetExecutableFile().SetFile (value.c_str(), false);
1940            }
1941        }
1942
1943        if (process_info.GetProcessID() != LLDB_INVALID_PROCESS_ID)
1944            return true;
1945    }
1946    return false;
1947}
1948
1949bool
1950GDBRemoteCommunicationClient::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info)
1951{
1952    process_info.Clear();
1953
1954    if (m_supports_qProcessInfoPID)
1955    {
1956        char packet[32];
1957        const int packet_len = ::snprintf (packet, sizeof (packet), "qProcessInfoPID:%" PRIu64, pid);
1958        assert (packet_len < (int)sizeof(packet));
1959        StringExtractorGDBRemote response;
1960        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
1961        {
1962            return DecodeProcessInfoResponse (response, process_info);
1963        }
1964        else
1965        {
1966            m_supports_qProcessInfoPID = false;
1967            return false;
1968        }
1969    }
1970    return false;
1971}
1972
1973bool
1974GDBRemoteCommunicationClient::GetCurrentProcessInfo ()
1975{
1976    if (m_qProcessInfo_is_valid == eLazyBoolYes)
1977        return true;
1978    if (m_qProcessInfo_is_valid == eLazyBoolNo)
1979        return false;
1980
1981    GetHostInfo ();
1982
1983    StringExtractorGDBRemote response;
1984    if (SendPacketAndWaitForResponse ("qProcessInfo", response, false))
1985    {
1986        if (response.IsNormalResponse())
1987        {
1988            std::string name;
1989            std::string value;
1990            uint32_t cpu = LLDB_INVALID_CPUTYPE;
1991            uint32_t sub = 0;
1992            std::string arch_name;
1993            std::string os_name;
1994            std::string vendor_name;
1995            std::string triple;
1996            uint32_t pointer_byte_size = 0;
1997            StringExtractor extractor;
1998            ByteOrder byte_order = eByteOrderInvalid;
1999            uint32_t num_keys_decoded = 0;
2000            while (response.GetNameColonValue(name, value))
2001            {
2002                if (name.compare("cputype") == 0)
2003                {
2004                    cpu = Args::StringToUInt32 (value.c_str(), LLDB_INVALID_CPUTYPE, 16);
2005                    if (cpu != LLDB_INVALID_CPUTYPE)
2006                        ++num_keys_decoded;
2007                }
2008                else if (name.compare("cpusubtype") == 0)
2009                {
2010                    sub = Args::StringToUInt32 (value.c_str(), 0, 16);
2011                    if (sub != 0)
2012                        ++num_keys_decoded;
2013                }
2014                else if (name.compare("ostype") == 0)
2015                {
2016                    os_name.swap (value);
2017                    ++num_keys_decoded;
2018                }
2019                else if (name.compare("vendor") == 0)
2020                {
2021                    vendor_name.swap(value);
2022                    ++num_keys_decoded;
2023                }
2024                else if (name.compare("endian") == 0)
2025                {
2026                    ++num_keys_decoded;
2027                    if (value.compare("little") == 0)
2028                        byte_order = eByteOrderLittle;
2029                    else if (value.compare("big") == 0)
2030                        byte_order = eByteOrderBig;
2031                    else if (value.compare("pdp") == 0)
2032                        byte_order = eByteOrderPDP;
2033                    else
2034                        --num_keys_decoded;
2035                }
2036                else if (name.compare("ptrsize") == 0)
2037                {
2038                    pointer_byte_size = Args::StringToUInt32 (value.c_str(), 0, 16);
2039                    if (pointer_byte_size != 0)
2040                        ++num_keys_decoded;
2041                }
2042            }
2043            if (num_keys_decoded > 0)
2044                m_qProcessInfo_is_valid = eLazyBoolYes;
2045            if (cpu != LLDB_INVALID_CPUTYPE && !os_name.empty() && !vendor_name.empty())
2046            {
2047                m_process_arch.SetArchitecture (eArchTypeMachO, cpu, sub);
2048                if (pointer_byte_size)
2049                {
2050                    assert (pointer_byte_size == m_process_arch.GetAddressByteSize());
2051                }
2052                m_host_arch.GetTriple().setVendorName (llvm::StringRef (vendor_name));
2053                m_host_arch.GetTriple().setOSName (llvm::StringRef (os_name));
2054                return true;
2055            }
2056        }
2057    }
2058    else
2059    {
2060        m_qProcessInfo_is_valid = eLazyBoolNo;
2061    }
2062
2063    return false;
2064}
2065
2066
2067uint32_t
2068GDBRemoteCommunicationClient::FindProcesses (const ProcessInstanceInfoMatch &match_info,
2069                                             ProcessInstanceInfoList &process_infos)
2070{
2071    process_infos.Clear();
2072
2073    if (m_supports_qfProcessInfo)
2074    {
2075        StreamString packet;
2076        packet.PutCString ("qfProcessInfo");
2077        if (!match_info.MatchAllProcesses())
2078        {
2079            packet.PutChar (':');
2080            const char *name = match_info.GetProcessInfo().GetName();
2081            bool has_name_match = false;
2082            if (name && name[0])
2083            {
2084                has_name_match = true;
2085                NameMatchType name_match_type = match_info.GetNameMatchType();
2086                switch (name_match_type)
2087                {
2088                case eNameMatchIgnore:
2089                    has_name_match = false;
2090                    break;
2091
2092                case eNameMatchEquals:
2093                    packet.PutCString ("name_match:equals;");
2094                    break;
2095
2096                case eNameMatchContains:
2097                    packet.PutCString ("name_match:contains;");
2098                    break;
2099
2100                case eNameMatchStartsWith:
2101                    packet.PutCString ("name_match:starts_with;");
2102                    break;
2103
2104                case eNameMatchEndsWith:
2105                    packet.PutCString ("name_match:ends_with;");
2106                    break;
2107
2108                case eNameMatchRegularExpression:
2109                    packet.PutCString ("name_match:regex;");
2110                    break;
2111                }
2112                if (has_name_match)
2113                {
2114                    packet.PutCString ("name:");
2115                    packet.PutBytesAsRawHex8(name, ::strlen(name));
2116                    packet.PutChar (';');
2117                }
2118            }
2119
2120            if (match_info.GetProcessInfo().ProcessIDIsValid())
2121                packet.Printf("pid:%" PRIu64 ";",match_info.GetProcessInfo().GetProcessID());
2122            if (match_info.GetProcessInfo().ParentProcessIDIsValid())
2123                packet.Printf("parent_pid:%" PRIu64 ";",match_info.GetProcessInfo().GetParentProcessID());
2124            if (match_info.GetProcessInfo().UserIDIsValid())
2125                packet.Printf("uid:%u;",match_info.GetProcessInfo().GetUserID());
2126            if (match_info.GetProcessInfo().GroupIDIsValid())
2127                packet.Printf("gid:%u;",match_info.GetProcessInfo().GetGroupID());
2128            if (match_info.GetProcessInfo().EffectiveUserIDIsValid())
2129                packet.Printf("euid:%u;",match_info.GetProcessInfo().GetEffectiveUserID());
2130            if (match_info.GetProcessInfo().EffectiveGroupIDIsValid())
2131                packet.Printf("egid:%u;",match_info.GetProcessInfo().GetEffectiveGroupID());
2132            if (match_info.GetProcessInfo().EffectiveGroupIDIsValid())
2133                packet.Printf("all_users:%u;",match_info.GetMatchAllUsers() ? 1 : 0);
2134            if (match_info.GetProcessInfo().GetArchitecture().IsValid())
2135            {
2136                const ArchSpec &match_arch = match_info.GetProcessInfo().GetArchitecture();
2137                const llvm::Triple &triple = match_arch.GetTriple();
2138                packet.PutCString("triple:");
2139                packet.PutCStringAsRawHex8(triple.getTriple().c_str());
2140                packet.PutChar (';');
2141            }
2142        }
2143        StringExtractorGDBRemote response;
2144        if (SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false))
2145        {
2146            do
2147            {
2148                ProcessInstanceInfo process_info;
2149                if (!DecodeProcessInfoResponse (response, process_info))
2150                    break;
2151                process_infos.Append(process_info);
2152                response.GetStringRef().clear();
2153                response.SetFilePos(0);
2154            } while (SendPacketAndWaitForResponse ("qsProcessInfo", strlen ("qsProcessInfo"), response, false));
2155        }
2156        else
2157        {
2158            m_supports_qfProcessInfo = false;
2159            return 0;
2160        }
2161    }
2162    return process_infos.GetSize();
2163
2164}
2165
2166bool
2167GDBRemoteCommunicationClient::GetUserName (uint32_t uid, std::string &name)
2168{
2169    if (m_supports_qUserName)
2170    {
2171        char packet[32];
2172        const int packet_len = ::snprintf (packet, sizeof (packet), "qUserName:%i", uid);
2173        assert (packet_len < (int)sizeof(packet));
2174        StringExtractorGDBRemote response;
2175        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
2176        {
2177            if (response.IsNormalResponse())
2178            {
2179                // Make sure we parsed the right number of characters. The response is
2180                // the hex encoded user name and should make up the entire packet.
2181                // If there are any non-hex ASCII bytes, the length won't match below..
2182                if (response.GetHexByteString (name) * 2 == response.GetStringRef().size())
2183                    return true;
2184            }
2185        }
2186        else
2187        {
2188            m_supports_qUserName = false;
2189            return false;
2190        }
2191    }
2192    return false;
2193
2194}
2195
2196bool
2197GDBRemoteCommunicationClient::GetGroupName (uint32_t gid, std::string &name)
2198{
2199    if (m_supports_qGroupName)
2200    {
2201        char packet[32];
2202        const int packet_len = ::snprintf (packet, sizeof (packet), "qGroupName:%i", gid);
2203        assert (packet_len < (int)sizeof(packet));
2204        StringExtractorGDBRemote response;
2205        if (SendPacketAndWaitForResponse (packet, packet_len, response, false))
2206        {
2207            if (response.IsNormalResponse())
2208            {
2209                // Make sure we parsed the right number of characters. The response is
2210                // the hex encoded group name and should make up the entire packet.
2211                // If there are any non-hex ASCII bytes, the length won't match below..
2212                if (response.GetHexByteString (name) * 2 == response.GetStringRef().size())
2213                    return true;
2214            }
2215        }
2216        else
2217        {
2218            m_supports_qGroupName = false;
2219            return false;
2220        }
2221    }
2222    return false;
2223}
2224
2225void
2226GDBRemoteCommunicationClient::TestPacketSpeed (const uint32_t num_packets)
2227{
2228    uint32_t i;
2229    TimeValue start_time, end_time;
2230    uint64_t total_time_nsec;
2231    float packets_per_second;
2232    if (SendSpeedTestPacket (0, 0))
2233    {
2234        for (uint32_t send_size = 0; send_size <= 1024; send_size *= 2)
2235        {
2236            for (uint32_t recv_size = 0; recv_size <= 1024; recv_size *= 2)
2237            {
2238                start_time = TimeValue::Now();
2239                for (i=0; i<num_packets; ++i)
2240                {
2241                    SendSpeedTestPacket (send_size, recv_size);
2242                }
2243                end_time = TimeValue::Now();
2244                total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() - start_time.GetAsNanoSecondsSinceJan1_1970();
2245                packets_per_second = (((float)num_packets)/(float)total_time_nsec) * (float)TimeValue::NanoSecPerSec;
2246                printf ("%u qSpeedTest(send=%-5u, recv=%-5u) in %" PRIu64 ".%9.9" PRIu64 " sec for %f packets/sec.\n",
2247                        num_packets,
2248                        send_size,
2249                        recv_size,
2250                        total_time_nsec / TimeValue::NanoSecPerSec,
2251                        total_time_nsec % TimeValue::NanoSecPerSec,
2252                        packets_per_second);
2253                if (recv_size == 0)
2254                    recv_size = 32;
2255            }
2256            if (send_size == 0)
2257                send_size = 32;
2258        }
2259    }
2260    else
2261    {
2262        start_time = TimeValue::Now();
2263        for (i=0; i<num_packets; ++i)
2264        {
2265            GetCurrentProcessID ();
2266        }
2267        end_time = TimeValue::Now();
2268        total_time_nsec = end_time.GetAsNanoSecondsSinceJan1_1970() - start_time.GetAsNanoSecondsSinceJan1_1970();
2269        packets_per_second = (((float)num_packets)/(float)total_time_nsec) * (float)TimeValue::NanoSecPerSec;
2270        printf ("%u 'qC' packets packets in 0x%" PRIu64 "%9.9" PRIu64 " sec for %f packets/sec.\n",
2271                num_packets,
2272                total_time_nsec / TimeValue::NanoSecPerSec,
2273                total_time_nsec % TimeValue::NanoSecPerSec,
2274                packets_per_second);
2275    }
2276}
2277
2278bool
2279GDBRemoteCommunicationClient::SendSpeedTestPacket (uint32_t send_size, uint32_t recv_size)
2280{
2281    StreamString packet;
2282    packet.Printf ("qSpeedTest:response_size:%i;data:", recv_size);
2283    uint32_t bytes_left = send_size;
2284    while (bytes_left > 0)
2285    {
2286        if (bytes_left >= 26)
2287        {
2288            packet.PutCString("abcdefghijklmnopqrstuvwxyz");
2289            bytes_left -= 26;
2290        }
2291        else
2292        {
2293            packet.Printf ("%*.*s;", bytes_left, bytes_left, "abcdefghijklmnopqrstuvwxyz");
2294            bytes_left = 0;
2295        }
2296    }
2297
2298    StringExtractorGDBRemote response;
2299    return SendPacketAndWaitForResponse (packet.GetData(), packet.GetSize(), response, false) > 0;
2300    return false;
2301}
2302
2303uint16_t
2304GDBRemoteCommunicationClient::LaunchGDBserverAndGetPort (lldb::pid_t &pid)
2305{
2306    pid = LLDB_INVALID_PROCESS_ID;
2307    StringExtractorGDBRemote response;
2308    StreamString stream;
2309    stream.PutCString("qLaunchGDBServer;");
2310    std::string hostname;
2311    if (Host::GetHostname (hostname))
2312    {
2313        // Make the GDB server we launch only accept connections from this host
2314        stream.Printf("host:%s;", hostname.c_str());
2315    }
2316    else
2317    {
2318        // Make the GDB server we launch accept connections from any host since we can't figure out the hostname
2319        stream.Printf("host:*;");
2320    }
2321    const char *packet = stream.GetData();
2322    int packet_len = stream.GetSize();
2323
2324    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2325    {
2326        std::string name;
2327        std::string value;
2328        uint16_t port = 0;
2329        while (response.GetNameColonValue(name, value))
2330        {
2331            if (name.compare("port") == 0)
2332                port = Args::StringToUInt32(value.c_str(), 0, 0);
2333            else if (name.compare("pid") == 0)
2334                pid = Args::StringToUInt64(value.c_str(), LLDB_INVALID_PROCESS_ID, 0);
2335        }
2336        return port;
2337    }
2338    return 0;
2339}
2340
2341bool
2342GDBRemoteCommunicationClient::KillSpawnedProcess (lldb::pid_t pid)
2343{
2344    StreamString stream;
2345    stream.Printf ("qKillSpawnedProcess:%" PRId64 , pid);
2346    const char *packet = stream.GetData();
2347    int packet_len = stream.GetSize();
2348
2349    StringExtractorGDBRemote response;
2350    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2351    {
2352        if (response.IsOKResponse())
2353            return true;
2354    }
2355    return false;
2356}
2357
2358bool
2359GDBRemoteCommunicationClient::SetCurrentThread (uint64_t tid)
2360{
2361    if (m_curr_tid == tid)
2362        return true;
2363
2364    char packet[32];
2365    int packet_len;
2366    if (tid == UINT64_MAX)
2367        packet_len = ::snprintf (packet, sizeof(packet), "Hg-1");
2368    else
2369        packet_len = ::snprintf (packet, sizeof(packet), "Hg%" PRIx64, tid);
2370    assert (packet_len + 1 < (int)sizeof(packet));
2371    StringExtractorGDBRemote response;
2372    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2373    {
2374        if (response.IsOKResponse())
2375        {
2376            m_curr_tid = tid;
2377            return true;
2378        }
2379    }
2380    return false;
2381}
2382
2383bool
2384GDBRemoteCommunicationClient::SetCurrentThreadForRun (uint64_t tid)
2385{
2386    if (m_curr_tid_run == tid)
2387        return true;
2388
2389    char packet[32];
2390    int packet_len;
2391    if (tid == UINT64_MAX)
2392        packet_len = ::snprintf (packet, sizeof(packet), "Hc-1");
2393    else
2394        packet_len = ::snprintf (packet, sizeof(packet), "Hc%" PRIx64, tid);
2395
2396    assert (packet_len + 1 < (int)sizeof(packet));
2397    StringExtractorGDBRemote response;
2398    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2399    {
2400        if (response.IsOKResponse())
2401        {
2402            m_curr_tid_run = tid;
2403            return true;
2404        }
2405    }
2406    return false;
2407}
2408
2409bool
2410GDBRemoteCommunicationClient::GetStopReply (StringExtractorGDBRemote &response)
2411{
2412    if (SendPacketAndWaitForResponse("?", 1, response, false))
2413        return response.IsNormalResponse();
2414    return false;
2415}
2416
2417bool
2418GDBRemoteCommunicationClient::GetThreadStopInfo (lldb::tid_t tid, StringExtractorGDBRemote &response)
2419{
2420    if (m_supports_qThreadStopInfo)
2421    {
2422        char packet[256];
2423        int packet_len = ::snprintf(packet, sizeof(packet), "qThreadStopInfo%" PRIx64, tid);
2424        assert (packet_len < (int)sizeof(packet));
2425        if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2426        {
2427            if (response.IsUnsupportedResponse())
2428                m_supports_qThreadStopInfo = false;
2429            else if (response.IsNormalResponse())
2430                return true;
2431            else
2432                return false;
2433        }
2434        else
2435        {
2436            m_supports_qThreadStopInfo = false;
2437        }
2438    }
2439    return false;
2440}
2441
2442
2443uint8_t
2444GDBRemoteCommunicationClient::SendGDBStoppointTypePacket (GDBStoppointType type, bool insert,  addr_t addr, uint32_t length)
2445{
2446    switch (type)
2447    {
2448    case eBreakpointSoftware:   if (!m_supports_z0) return UINT8_MAX; break;
2449    case eBreakpointHardware:   if (!m_supports_z1) return UINT8_MAX; break;
2450    case eWatchpointWrite:      if (!m_supports_z2) return UINT8_MAX; break;
2451    case eWatchpointRead:       if (!m_supports_z3) return UINT8_MAX; break;
2452    case eWatchpointReadWrite:  if (!m_supports_z4) return UINT8_MAX; break;
2453    }
2454
2455    char packet[64];
2456    const int packet_len = ::snprintf (packet,
2457                                       sizeof(packet),
2458                                       "%c%i,%" PRIx64 ",%x",
2459                                       insert ? 'Z' : 'z',
2460                                       type,
2461                                       addr,
2462                                       length);
2463
2464    assert (packet_len + 1 < (int)sizeof(packet));
2465    StringExtractorGDBRemote response;
2466    if (SendPacketAndWaitForResponse(packet, packet_len, response, true))
2467    {
2468        if (response.IsOKResponse())
2469            return 0;
2470        else if (response.IsErrorResponse())
2471            return response.GetError();
2472    }
2473    else
2474    {
2475        switch (type)
2476        {
2477            case eBreakpointSoftware:   m_supports_z0 = false; break;
2478            case eBreakpointHardware:   m_supports_z1 = false; break;
2479            case eWatchpointWrite:      m_supports_z2 = false; break;
2480            case eWatchpointRead:       m_supports_z3 = false; break;
2481            case eWatchpointReadWrite:  m_supports_z4 = false; break;
2482        }
2483    }
2484
2485    return UINT8_MAX;
2486}
2487
2488size_t
2489GDBRemoteCommunicationClient::GetCurrentThreadIDs (std::vector<lldb::tid_t> &thread_ids,
2490                                                   bool &sequence_mutex_unavailable)
2491{
2492    Mutex::Locker locker;
2493    thread_ids.clear();
2494
2495    if (GetSequenceMutex (locker, "ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex"))
2496    {
2497        sequence_mutex_unavailable = false;
2498        StringExtractorGDBRemote response;
2499
2500        for (SendPacketNoLock ("qfThreadInfo", strlen("qfThreadInfo")) && WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ());
2501             response.IsNormalResponse();
2502             SendPacketNoLock ("qsThreadInfo", strlen("qsThreadInfo")) && WaitForPacketWithTimeoutMicroSecondsNoLock (response, GetPacketTimeoutInMicroSeconds ()))
2503        {
2504            char ch = response.GetChar();
2505            if (ch == 'l')
2506                break;
2507            if (ch == 'm')
2508            {
2509                do
2510                {
2511                    tid_t tid = response.GetHexMaxU64(false, LLDB_INVALID_THREAD_ID);
2512
2513                    if (tid != LLDB_INVALID_THREAD_ID)
2514                    {
2515                        thread_ids.push_back (tid);
2516                    }
2517                    ch = response.GetChar();    // Skip the command separator
2518                } while (ch == ',');            // Make sure we got a comma separator
2519            }
2520        }
2521    }
2522    else
2523    {
2524#if defined (LLDB_CONFIGURATION_DEBUG)
2525        // assert(!"ProcessGDBRemote::UpdateThreadList() failed due to not getting the sequence mutex");
2526#else
2527        Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_PROCESS | GDBR_LOG_PACKETS));
2528        if (log)
2529            log->Printf("error: failed to get packet sequence mutex, not sending packet 'qfThreadInfo'");
2530#endif
2531        sequence_mutex_unavailable = true;
2532    }
2533    return thread_ids.size();
2534}
2535
2536lldb::addr_t
2537GDBRemoteCommunicationClient::GetShlibInfoAddr()
2538{
2539    if (!IsRunning())
2540    {
2541        StringExtractorGDBRemote response;
2542        if (SendPacketAndWaitForResponse("qShlibInfoAddr", ::strlen ("qShlibInfoAddr"), response, false))
2543        {
2544            if (response.IsNormalResponse())
2545                return response.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2546        }
2547    }
2548    return LLDB_INVALID_ADDRESS;
2549}
2550
2551lldb_private::Error
2552GDBRemoteCommunicationClient::RunShellCommand (const char *command,           // Shouldn't be NULL
2553                                               const char *working_dir,       // Pass NULL to use the current working directory
2554                                               int *status_ptr,               // Pass NULL if you don't want the process exit status
2555                                               int *signo_ptr,                // Pass NULL if you don't want the signal that caused the process to exit
2556                                               std::string *command_output,   // Pass NULL if you don't want the command output
2557                                               uint32_t timeout_sec)          // Timeout in seconds to wait for shell program to finish
2558{
2559    lldb_private::StreamString stream;
2560    stream.PutCString("qPlatform_shell:");
2561    stream.PutBytesAsRawHex8(command, strlen(command));
2562    stream.PutChar(',');
2563    stream.PutHex32(timeout_sec);
2564    if (working_dir && *working_dir)
2565    {
2566        stream.PutChar(',');
2567        stream.PutBytesAsRawHex8(working_dir, strlen(working_dir));
2568    }
2569    const char *packet = stream.GetData();
2570    int packet_len = stream.GetSize();
2571    StringExtractorGDBRemote response;
2572    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2573    {
2574        if (response.GetChar() != 'F')
2575            return Error("malformed reply");
2576        if (response.GetChar() != ',')
2577            return Error("malformed reply");
2578        uint32_t exitcode = response.GetHexMaxU32(false, UINT32_MAX);
2579        if (exitcode == UINT32_MAX)
2580            return Error("unable to run remote process");
2581        else if (status_ptr)
2582            *status_ptr = exitcode;
2583        if (response.GetChar() != ',')
2584            return Error("malformed reply");
2585        uint32_t signo = response.GetHexMaxU32(false, UINT32_MAX);
2586        if (signo_ptr)
2587            *signo_ptr = signo;
2588        if (response.GetChar() != ',')
2589            return Error("malformed reply");
2590        std::string output;
2591        response.GetEscapedBinaryData(output);
2592        if (command_output)
2593            command_output->assign(output);
2594        return Error();
2595    }
2596    return Error("unable to send packet");
2597}
2598
2599Error
2600GDBRemoteCommunicationClient::MakeDirectory (const char *path,
2601                                             uint32_t file_permissions)
2602{
2603    lldb_private::StreamString stream;
2604    stream.PutCString("qPlatform_mkdir:");
2605    stream.PutHex32(file_permissions);
2606    stream.PutChar(',');
2607    stream.PutBytesAsRawHex8(path, strlen(path));
2608    const char *packet = stream.GetData();
2609    int packet_len = stream.GetSize();
2610    StringExtractorGDBRemote response;
2611    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2612    {
2613        return Error(response.GetHexMaxU32(false, UINT32_MAX), eErrorTypePOSIX);
2614    }
2615    return Error();
2616
2617}
2618
2619Error
2620GDBRemoteCommunicationClient::SetFilePermissions (const char *path,
2621                                                  uint32_t file_permissions)
2622{
2623    lldb_private::StreamString stream;
2624    stream.PutCString("qPlatform_chmod:");
2625    stream.PutHex32(file_permissions);
2626    stream.PutChar(',');
2627    stream.PutBytesAsRawHex8(path, strlen(path));
2628    const char *packet = stream.GetData();
2629    int packet_len = stream.GetSize();
2630    StringExtractorGDBRemote response;
2631    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2632    {
2633        return Error(response.GetHexMaxU32(false, UINT32_MAX), eErrorTypePOSIX);
2634    }
2635    return Error();
2636
2637}
2638
2639static uint64_t
2640ParseHostIOPacketResponse (StringExtractorGDBRemote &response,
2641                           uint64_t fail_result,
2642                           Error &error)
2643{
2644    response.SetFilePos(0);
2645    if (response.GetChar() != 'F')
2646        return fail_result;
2647    int32_t result = response.GetS32 (-2);
2648    if (result == -2)
2649        return fail_result;
2650    if (response.GetChar() == ',')
2651    {
2652        int result_errno = response.GetS32 (-2);
2653        if (result_errno != -2)
2654            error.SetError(result_errno, eErrorTypePOSIX);
2655        else
2656            error.SetError(-1, eErrorTypeGeneric);
2657    }
2658    else
2659        error.Clear();
2660    return  result;
2661}
2662lldb::user_id_t
2663GDBRemoteCommunicationClient::OpenFile (const lldb_private::FileSpec& file_spec,
2664                                        uint32_t flags,
2665                                        mode_t mode,
2666                                        Error &error)
2667{
2668    lldb_private::StreamString stream;
2669    stream.PutCString("vFile:open:");
2670    std::string path (file_spec.GetPath());
2671    if (path.empty())
2672        return UINT64_MAX;
2673    stream.PutCStringAsRawHex8(path.c_str());
2674    stream.PutChar(',');
2675    const uint32_t posix_open_flags = File::ConvertOpenOptionsForPOSIXOpen(flags);
2676    stream.PutHex32(posix_open_flags);
2677    stream.PutChar(',');
2678    stream.PutHex32(mode);
2679    const char* packet = stream.GetData();
2680    int packet_len = stream.GetSize();
2681    StringExtractorGDBRemote response;
2682    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2683    {
2684        return ParseHostIOPacketResponse (response, UINT64_MAX, error);
2685    }
2686    return UINT64_MAX;
2687}
2688
2689bool
2690GDBRemoteCommunicationClient::CloseFile (lldb::user_id_t fd,
2691                                         Error &error)
2692{
2693    lldb_private::StreamString stream;
2694    stream.Printf("vFile:close:%i", (int)fd);
2695    const char* packet = stream.GetData();
2696    int packet_len = stream.GetSize();
2697    StringExtractorGDBRemote response;
2698    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2699    {
2700        return ParseHostIOPacketResponse (response, -1, error) == 0;
2701    }
2702    return false;
2703}
2704
2705// Extension of host I/O packets to get the file size.
2706lldb::user_id_t
2707GDBRemoteCommunicationClient::GetFileSize (const lldb_private::FileSpec& file_spec)
2708{
2709    lldb_private::StreamString stream;
2710    stream.PutCString("vFile:size:");
2711    std::string path (file_spec.GetPath());
2712    stream.PutCStringAsRawHex8(path.c_str());
2713    const char* packet = stream.GetData();
2714    int packet_len = stream.GetSize();
2715    StringExtractorGDBRemote response;
2716    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2717    {
2718        if (response.GetChar() != 'F')
2719            return UINT64_MAX;
2720        uint32_t retcode = response.GetHexMaxU64(false, UINT64_MAX);
2721        return retcode;
2722    }
2723    return UINT64_MAX;
2724}
2725
2726Error
2727GDBRemoteCommunicationClient::GetFilePermissions(const char *path, uint32_t &file_permissions)
2728{
2729    Error error;
2730    lldb_private::StreamString stream;
2731    stream.PutCString("vFile:mode:");
2732    stream.PutCStringAsRawHex8(path);
2733    const char* packet = stream.GetData();
2734    int packet_len = stream.GetSize();
2735    StringExtractorGDBRemote response;
2736    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2737    {
2738        if (response.GetChar() != 'F')
2739        {
2740            error.SetErrorStringWithFormat ("invalid response to '%s' packet", packet);
2741        }
2742        else
2743        {
2744            const uint32_t mode = response.GetS32(-1);
2745            if (mode == -1)
2746            {
2747                if (response.GetChar() == ',')
2748                {
2749                    int response_errno = response.GetS32(-1);
2750                    if (response_errno > 0)
2751                        error.SetError(response_errno, lldb::eErrorTypePOSIX);
2752                    else
2753                        error.SetErrorToGenericError();
2754                }
2755                else
2756                    error.SetErrorToGenericError();
2757            }
2758            else
2759            {
2760                file_permissions = mode & (S_IRWXU|S_IRWXG|S_IRWXO);
2761            }
2762        }
2763    }
2764    else
2765    {
2766        error.SetErrorStringWithFormat ("failed to send '%s' packet", packet);
2767    }
2768    return error;
2769}
2770
2771uint64_t
2772GDBRemoteCommunicationClient::ReadFile (lldb::user_id_t fd,
2773                                        uint64_t offset,
2774                                        void *dst,
2775                                        uint64_t dst_len,
2776                                        Error &error)
2777{
2778    lldb_private::StreamString stream;
2779    stream.Printf("vFile:pread:%i,%" PRId64 ",%" PRId64, (int)fd, dst_len, offset);
2780    const char* packet = stream.GetData();
2781    int packet_len = stream.GetSize();
2782    StringExtractorGDBRemote response;
2783    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2784    {
2785        if (response.GetChar() != 'F')
2786            return 0;
2787        uint32_t retcode = response.GetHexMaxU32(false, UINT32_MAX);
2788        if (retcode == UINT32_MAX)
2789            return retcode;
2790        const char next = (response.Peek() ? *response.Peek() : 0);
2791        if (next == ',')
2792            return 0;
2793        if (next == ';')
2794        {
2795            response.GetChar(); // skip the semicolon
2796            std::string buffer;
2797            if (response.GetEscapedBinaryData(buffer))
2798            {
2799                const uint64_t data_to_write = std::min<uint64_t>(dst_len, buffer.size());
2800                if (data_to_write > 0)
2801                    memcpy(dst, &buffer[0], data_to_write);
2802                return data_to_write;
2803            }
2804        }
2805    }
2806    return 0;
2807}
2808
2809uint64_t
2810GDBRemoteCommunicationClient::WriteFile (lldb::user_id_t fd,
2811                                         uint64_t offset,
2812                                         const void* src,
2813                                         uint64_t src_len,
2814                                         Error &error)
2815{
2816    lldb_private::StreamGDBRemote stream;
2817    stream.Printf("vFile:pwrite:%i,%" PRId64 ",", (int)fd, offset);
2818    stream.PutEscapedBytes(src, src_len);
2819    const char* packet = stream.GetData();
2820    int packet_len = stream.GetSize();
2821    StringExtractorGDBRemote response;
2822    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2823    {
2824        if (response.GetChar() != 'F')
2825        {
2826            error.SetErrorStringWithFormat("write file failed");
2827            return 0;
2828        }
2829        uint64_t bytes_written = response.GetU64(UINT64_MAX);
2830        if (bytes_written == UINT64_MAX)
2831        {
2832            error.SetErrorToGenericError();
2833            if (response.GetChar() == ',')
2834            {
2835                int response_errno = response.GetS32(-1);
2836                if (response_errno > 0)
2837                    error.SetError(response_errno, lldb::eErrorTypePOSIX);
2838            }
2839            return 0;
2840        }
2841        return bytes_written;
2842    }
2843    else
2844    {
2845        error.SetErrorString ("failed to send vFile:pwrite packet");
2846    }
2847    return 0;
2848}
2849
2850Error
2851GDBRemoteCommunicationClient::CreateSymlink (const char *src, const char *dst)
2852{
2853    Error error;
2854    lldb_private::StreamGDBRemote stream;
2855    stream.PutCString("vFile:symlink:");
2856    // the unix symlink() command reverses its parameters where the dst if first,
2857    // so we follow suit here
2858    stream.PutCStringAsRawHex8(dst);
2859    stream.PutChar(',');
2860    stream.PutCStringAsRawHex8(src);
2861    const char* packet = stream.GetData();
2862    int packet_len = stream.GetSize();
2863    StringExtractorGDBRemote response;
2864    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2865    {
2866        if (response.GetChar() == 'F')
2867        {
2868            uint32_t result = response.GetU32(UINT32_MAX);
2869            if (result != 0)
2870            {
2871                error.SetErrorToGenericError();
2872                if (response.GetChar() == ',')
2873                {
2874                    int response_errno = response.GetS32(-1);
2875                    if (response_errno > 0)
2876                        error.SetError(response_errno, lldb::eErrorTypePOSIX);
2877                }
2878            }
2879        }
2880        else
2881        {
2882            // Should have returned with 'F<result>[,<errno>]'
2883            error.SetErrorStringWithFormat("symlink failed");
2884        }
2885    }
2886    else
2887    {
2888        error.SetErrorString ("failed to send vFile:symlink packet");
2889    }
2890    return error;
2891}
2892
2893Error
2894GDBRemoteCommunicationClient::Unlink (const char *path)
2895{
2896    Error error;
2897    lldb_private::StreamGDBRemote stream;
2898    stream.PutCString("vFile:unlink:");
2899    // the unix symlink() command reverses its parameters where the dst if first,
2900    // so we follow suit here
2901    stream.PutCStringAsRawHex8(path);
2902    const char* packet = stream.GetData();
2903    int packet_len = stream.GetSize();
2904    StringExtractorGDBRemote response;
2905    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2906    {
2907        if (response.GetChar() == 'F')
2908        {
2909            uint32_t result = response.GetU32(UINT32_MAX);
2910            if (result != 0)
2911            {
2912                error.SetErrorToGenericError();
2913                if (response.GetChar() == ',')
2914                {
2915                    int response_errno = response.GetS32(-1);
2916                    if (response_errno > 0)
2917                        error.SetError(response_errno, lldb::eErrorTypePOSIX);
2918                }
2919            }
2920        }
2921        else
2922        {
2923            // Should have returned with 'F<result>[,<errno>]'
2924            error.SetErrorStringWithFormat("unlink failed");
2925        }
2926    }
2927    else
2928    {
2929        error.SetErrorString ("failed to send vFile:unlink packet");
2930    }
2931    return error;
2932}
2933
2934// Extension of host I/O packets to get whether a file exists.
2935bool
2936GDBRemoteCommunicationClient::GetFileExists (const lldb_private::FileSpec& file_spec)
2937{
2938    lldb_private::StreamString stream;
2939    stream.PutCString("vFile:exists:");
2940    std::string path (file_spec.GetPath());
2941    stream.PutCStringAsRawHex8(path.c_str());
2942    const char* packet = stream.GetData();
2943    int packet_len = stream.GetSize();
2944    StringExtractorGDBRemote response;
2945    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2946    {
2947        if (response.GetChar() != 'F')
2948            return false;
2949        if (response.GetChar() != ',')
2950            return false;
2951        bool retcode = (response.GetChar() != '0');
2952        return retcode;
2953    }
2954    return false;
2955}
2956
2957bool
2958GDBRemoteCommunicationClient::CalculateMD5 (const lldb_private::FileSpec& file_spec,
2959                                            uint64_t &high,
2960                                            uint64_t &low)
2961{
2962    lldb_private::StreamString stream;
2963    stream.PutCString("vFile:MD5:");
2964    std::string path (file_spec.GetPath());
2965    stream.PutCStringAsRawHex8(path.c_str());
2966    const char* packet = stream.GetData();
2967    int packet_len = stream.GetSize();
2968    StringExtractorGDBRemote response;
2969    if (SendPacketAndWaitForResponse(packet, packet_len, response, false))
2970    {
2971        if (response.GetChar() != 'F')
2972            return false;
2973        if (response.GetChar() != ',')
2974            return false;
2975        if (response.Peek() && *response.Peek() == 'x')
2976            return false;
2977        low = response.GetHexMaxU64(false, UINT64_MAX);
2978        high = response.GetHexMaxU64(false, UINT64_MAX);
2979        return true;
2980    }
2981    return false;
2982}
2983
2984bool
2985GDBRemoteCommunicationClient::ReadRegister(lldb::tid_t tid, uint32_t reg, StringExtractorGDBRemote &response)
2986{
2987    Mutex::Locker locker;
2988    if (GetSequenceMutex (locker, "Didn't get sequence mutex for p packet."))
2989    {
2990        const bool thread_suffix_supported = GetThreadSuffixSupported();
2991
2992        if (thread_suffix_supported || SetCurrentThread(tid))
2993        {
2994            char packet[64];
2995            int packet_len = 0;
2996            if (thread_suffix_supported)
2997                packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4" PRIx64 ";", reg, tid);
2998            else
2999                packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg);
3000            assert (packet_len < ((int)sizeof(packet) - 1));
3001            return SendPacketAndWaitForResponse(packet, response, false);
3002        }
3003    }
3004    return false;
3005
3006}
3007
3008
3009bool
3010GDBRemoteCommunicationClient::ReadAllRegisters (lldb::tid_t tid, StringExtractorGDBRemote &response)
3011{
3012    Mutex::Locker locker;
3013    if (GetSequenceMutex (locker, "Didn't get sequence mutex for g packet."))
3014    {
3015        const bool thread_suffix_supported = GetThreadSuffixSupported();
3016
3017        if (thread_suffix_supported || SetCurrentThread(tid))
3018        {
3019            char packet[64];
3020            int packet_len = 0;
3021            // Get all registers in one packet
3022            if (thread_suffix_supported)
3023                packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4" PRIx64 ";", tid);
3024            else
3025                packet_len = ::snprintf (packet, sizeof(packet), "g");
3026            assert (packet_len < ((int)sizeof(packet) - 1));
3027            return SendPacketAndWaitForResponse(packet, response, false);
3028        }
3029    }
3030    return false;
3031}
3032bool
3033GDBRemoteCommunicationClient::SaveRegisterState (lldb::tid_t tid, uint32_t &save_id)
3034{
3035    save_id = 0; // Set to invalid save ID
3036    if (m_supports_QSaveRegisterState == eLazyBoolNo)
3037        return false;
3038
3039    m_supports_QSaveRegisterState = eLazyBoolYes;
3040    Mutex::Locker locker;
3041    if (GetSequenceMutex (locker, "Didn't get sequence mutex for QSaveRegisterState."))
3042    {
3043        const bool thread_suffix_supported = GetThreadSuffixSupported();
3044        if (thread_suffix_supported || SetCurrentThread(tid))
3045        {
3046            char packet[256];
3047            if (thread_suffix_supported)
3048                ::snprintf (packet, sizeof(packet), "QSaveRegisterState;thread:%4.4" PRIx64 ";", tid);
3049            else
3050                ::strncpy (packet, "QSaveRegisterState", sizeof(packet));
3051
3052            StringExtractorGDBRemote response;
3053
3054            if (SendPacketAndWaitForResponse(packet, response, false))
3055            {
3056                if (response.IsUnsupportedResponse())
3057                {
3058                    // This packet isn't supported, don't try calling it again
3059                    m_supports_QSaveRegisterState = eLazyBoolNo;
3060                }
3061
3062                const uint32_t response_save_id = response.GetU32(0);
3063                if (response_save_id != 0)
3064                {
3065                    save_id = response_save_id;
3066                    return true;
3067                }
3068            }
3069        }
3070    }
3071    return false;
3072}
3073
3074bool
3075GDBRemoteCommunicationClient::RestoreRegisterState (lldb::tid_t tid, uint32_t save_id)
3076{
3077    // We use the "m_supports_QSaveRegisterState" variable here becuase the
3078    // QSaveRegisterState and QRestoreRegisterState packets must both be supported in
3079    // order to be useful
3080    if (m_supports_QSaveRegisterState == eLazyBoolNo)
3081        return false;
3082
3083    Mutex::Locker locker;
3084    if (GetSequenceMutex (locker, "Didn't get sequence mutex for QRestoreRegisterState."))
3085    {
3086        const bool thread_suffix_supported = GetThreadSuffixSupported();
3087        if (thread_suffix_supported || SetCurrentThread(tid))
3088        {
3089            char packet[256];
3090            if (thread_suffix_supported)
3091                ::snprintf (packet, sizeof(packet), "QRestoreRegisterState:%u;thread:%4.4" PRIx64 ";", save_id, tid);
3092            else
3093                ::snprintf (packet, sizeof(packet), "QRestoreRegisterState:%u" PRIx64 ";", save_id);
3094
3095            StringExtractorGDBRemote response;
3096
3097            if (SendPacketAndWaitForResponse(packet, response, false))
3098            {
3099                if (response.IsOKResponse())
3100                {
3101                    return true;
3102                }
3103                else if (response.IsUnsupportedResponse())
3104                {
3105                    // This packet isn't supported, don't try calling this packet or
3106                    // QSaveRegisterState again...
3107                    m_supports_QSaveRegisterState = eLazyBoolNo;
3108                }
3109            }
3110        }
3111    }
3112    return false;
3113}
3114