xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.cpp (revision d314e810a70e9104c8d30d9b0719bc5a3dc0acab)
1 //===-- GDBRemoteCommunicationServer.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 "GDBRemoteCommunicationServer.h"
12 
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 #include "llvm/ADT/Triple.h"
17 #include "lldb/Interpreter/Args.h"
18 #include "lldb/Core/ConnectionFileDescriptor.h"
19 #include "lldb/Core/Log.h"
20 #include "lldb/Core/State.h"
21 #include "lldb/Core/StreamString.h"
22 #include "lldb/Host/Host.h"
23 #include "lldb/Host/TimeValue.h"
24 
25 // Project includes
26 #include "Utility/StringExtractorGDBRemote.h"
27 #include "ProcessGDBRemote.h"
28 #include "ProcessGDBRemoteLog.h"
29 
30 using namespace lldb;
31 using namespace lldb_private;
32 
33 //----------------------------------------------------------------------
34 // GDBRemoteCommunicationServer constructor
35 //----------------------------------------------------------------------
36 GDBRemoteCommunicationServer::GDBRemoteCommunicationServer() :
37     GDBRemoteCommunication ("gdb-remote.server", "gdb-remote.server.rx_packet"),
38     m_async_thread (LLDB_INVALID_HOST_THREAD),
39     m_send_acks (true)
40 {
41 }
42 
43 //----------------------------------------------------------------------
44 // Destructor
45 //----------------------------------------------------------------------
46 GDBRemoteCommunicationServer::~GDBRemoteCommunicationServer()
47 {
48 }
49 
50 
51 //void *
52 //GDBRemoteCommunicationServer::AsyncThread (void *arg)
53 //{
54 //    GDBRemoteCommunicationServer *server = (GDBRemoteCommunicationServer*) arg;
55 //
56 //    LogSP log;// (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
57 //    if (log)
58 //        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread starting...", __FUNCTION__, arg, process->GetID());
59 //
60 //    StringExtractorGDBRemote packet;
61 //
62 //    while ()
63 //    {
64 //        if (packet.
65 //    }
66 //
67 //    if (log)
68 //        log->Printf ("ProcessGDBRemote::%s (arg = %p, pid = %i) thread exiting...", __FUNCTION__, arg, process->GetID());
69 //
70 //    process->m_async_thread = LLDB_INVALID_HOST_THREAD;
71 //    return NULL;
72 //}
73 //
74 bool
75 GDBRemoteCommunicationServer::GetPacketAndSendResponse (const TimeValue* timeout_ptr,
76                                                         bool &interrupt,
77                                                         bool &quit)
78 {
79     StringExtractorGDBRemote packet;
80     if (WaitForPacketNoLock (packet, timeout_ptr))
81     {
82         const StringExtractorGDBRemote::ServerPacketType packet_type = packet.GetServerPacketType ();
83         switch (packet_type)
84         {
85         case StringExtractorGDBRemote::eServerPacketType_nack:
86         case StringExtractorGDBRemote::eServerPacketType_ack:
87             break;
88 
89         case StringExtractorGDBRemote::eServerPacketType_invalid:
90             quit = true;
91             break;
92 
93         case StringExtractorGDBRemote::eServerPacketType_interrupt:
94             interrupt = true;
95             break;
96 
97         case StringExtractorGDBRemote::eServerPacketType_unimplemented:
98             return SendUnimplementedResponse () > 0;
99 
100         case StringExtractorGDBRemote::eServerPacketType_qHostInfo:
101             return Handle_qHostInfo ();
102         }
103         return true;
104     }
105     return false;
106 }
107 
108 size_t
109 GDBRemoteCommunicationServer::SendUnimplementedResponse ()
110 {
111     return SendPacket ("");
112 }
113 
114 
115 bool
116 GDBRemoteCommunicationServer::Handle_qHostInfo ()
117 {
118     StreamString response;
119 
120     // $cputype:16777223;cpusubtype:3;ostype:Darwin;vendor:apple;endian:little;ptrsize:8;#00
121 
122     ArchSpec host_arch (Host::GetArchitecture ());
123 
124     const llvm::Triple &host_triple = host_arch.GetTriple();
125     const llvm::StringRef arch_name (host_triple.getArchName());
126     const llvm::StringRef vendor_name (host_triple.getOSName());
127     const llvm::StringRef os_name (host_triple.getVendorName());
128     response.Printf ("arch:%.*s;ostype:%.*s;vendor:%.*s;ptrsize:%u",
129                      (int)arch_name.size(), arch_name.data(),
130                      (int)os_name.size(), os_name.data(),
131                      (int)vendor_name.size(), vendor_name.data(),
132                      host_arch.GetAddressByteSize());
133 
134     switch (lldb::endian::InlHostByteOrder())
135     {
136     case eByteOrderBig:     response.PutCString ("endian:big;"); break;
137     case eByteOrderLittle:  response.PutCString ("endian:little;"); break;
138     case eByteOrderPDP:     response.PutCString ("endian:pdp;"); break;
139     default:                response.PutCString ("endian:unknown;"); break;
140     }
141 
142     return SendPacket (response.GetString().c_str(),response.GetString().size()) > 0;
143 }
144