1 //===-- CommunicationKDP.h --------------------------------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_COMMUNICATIONKDP_H
10 #define LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_COMMUNICATIONKDP_H
16 #include "lldb/Core/Communication.h"
17 #include "lldb/Utility/Listener.h"
18 #include "lldb/Utility/Predicate.h"
19 #include "lldb/Utility/StreamBuffer.h"
20 #include "lldb/lldb-private.h"
22 class CommunicationKDP
: public lldb_private::Communication
{
24 const static uint32_t kMaxPacketSize
= 1200;
25 const static uint32_t kMaxDataSize
= 1024;
26 typedef lldb_private::StreamBuffer
<4096> PacketStreamType
;
44 KDP_BREAKPOINT_REMOVE
,
51 KDP_BREAKPOINT_REMOVE64
,
62 enum { KDP_FEATURE_BP
= (1u << 0) };
65 KDP_PROTERR_SUCCESS
= 0,
66 KDP_PROTERR_ALREADY_CONNECTED
,
67 KDP_PROTERR_BAD_NBYTES
,
72 ePacketTypeRequest
= 0x00u
,
73 ePacketTypeReply
= 0x80u
,
74 ePacketTypeMask
= 0x80u
,
75 eCommandTypeMask
= 0x7fu
77 // Constructors and Destructors
78 CommunicationKDP(const char *comm_name
);
80 ~CommunicationKDP() override
;
82 bool SendRequestPacket(const PacketStreamType
&request_packet
);
84 // Wait for a packet within 'nsec' seconds
86 WaitForPacketWithTimeoutMicroSeconds(lldb_private::DataExtractor
&response
,
89 bool GetSequenceMutex(std::unique_lock
<std::recursive_mutex
> &lock
);
91 bool CheckForPacket(const uint8_t *src
, size_t src_len
,
92 lldb_private::DataExtractor
&packet
);
93 bool IsRunning() const { return m_is_running
.GetValue(); }
95 // Set the global packet timeout.
97 // For clients, this is the timeout that gets used when sending
98 // packets and waiting for responses. For servers, this might not
99 // get used, and if it doesn't this should be moved to the
100 // CommunicationKDPClient.
101 std::chrono::seconds
SetPacketTimeout(std::chrono::seconds packet_timeout
) {
102 const auto old_packet_timeout
= m_packet_timeout
;
103 m_packet_timeout
= packet_timeout
;
104 return old_packet_timeout
;
107 std::chrono::seconds
GetPacketTimeout() const { return m_packet_timeout
; }
109 // Public Request Packets
110 bool SendRequestConnect(uint16_t reply_port
, uint16_t exc_port
,
111 const char *greeting
);
113 bool SendRequestReattach(uint16_t reply_port
);
115 bool SendRequestDisconnect();
117 uint32_t SendRequestReadMemory(lldb::addr_t addr
, void *dst
,
119 lldb_private::Status
&error
);
121 uint32_t SendRequestWriteMemory(lldb::addr_t addr
, const void *src
,
123 lldb_private::Status
&error
);
125 bool SendRawRequest(uint8_t command_byte
, const void *src
, uint32_t src_len
,
126 lldb_private::DataExtractor
&reply
,
127 lldb_private::Status
&error
);
129 uint32_t SendRequestReadRegisters(uint32_t cpu
, uint32_t flavor
, void *dst
,
131 lldb_private::Status
&error
);
133 uint32_t SendRequestWriteRegisters(uint32_t cpu
, uint32_t flavor
,
134 const void *src
, uint32_t src_size
,
135 lldb_private::Status
&error
);
137 const char *GetKernelVersion();
139 // Disable KDP_IMAGEPATH for now, it seems to hang the KDP connection...
143 uint32_t GetVersion();
145 uint32_t GetFeatureFlags();
147 bool LocalBreakpointsAreSupported() {
148 return (GetFeatureFlags() & KDP_FEATURE_BP
) != 0;
151 uint32_t GetCPUMask();
153 uint32_t GetCPUType();
155 uint32_t GetCPUSubtype();
157 lldb_private::UUID
GetUUID();
161 bool RemoteIsDarwinKernel();
163 lldb::addr_t
GetLoadAddress();
165 bool SendRequestResume();
167 bool SendRequestSuspend();
169 bool SendRequestBreakpoint(bool set
, lldb::addr_t addr
);
172 bool SendRequestPacketNoLock(const PacketStreamType
&request_packet
);
174 size_t WaitForPacketWithTimeoutMicroSecondsNoLock(
175 lldb_private::DataExtractor
&response
, uint32_t timeout_usec
);
177 bool WaitForNotRunningPrivate(const std::chrono::microseconds
&timeout
);
179 void MakeRequestPacketHeader(CommandType request_type
,
180 PacketStreamType
&request_packet
,
181 uint16_t request_length
);
183 // Protected Request Packets (use public accessors which will cache
185 bool SendRequestVersion();
187 bool SendRequestHostInfo();
189 bool SendRequestKernelVersion();
191 // Disable KDP_IMAGEPATH for now, it seems to hang the KDP connection...
193 // SendRequestImagePath ();
195 void DumpPacket(lldb_private::Stream
&s
, const void *data
, uint32_t data_len
);
197 void DumpPacket(lldb_private::Stream
&s
,
198 const lldb_private::DataExtractor
&extractor
);
200 bool VersionIsValid() const { return m_kdp_version_version
!= 0; }
202 bool HostInfoIsValid() const { return m_kdp_hostinfo_cpu_type
!= 0; }
204 bool ExtractIsReply(uint8_t first_packet_byte
) const {
205 // TODO: handle big endian...
206 return (first_packet_byte
& ePacketTypeMask
) != 0;
209 CommandType
ExtractCommand(uint8_t first_packet_byte
) const {
210 // TODO: handle big endian...
211 return (CommandType
)(first_packet_byte
& eCommandTypeMask
);
214 static const char *GetCommandAsCString(uint8_t command
);
216 void ClearKDPSettings();
218 bool SendRequestAndGetReply(const CommandType command
,
219 const PacketStreamType
&request_packet
,
220 lldb_private::DataExtractor
&reply_packet
);
221 // Classes that inherit from CommunicationKDP can see and modify these
222 uint32_t m_addr_byte_size
;
223 lldb::ByteOrder m_byte_order
;
225 std::recursive_mutex m_bytes_mutex
;
226 std::chrono::seconds m_packet_timeout
;
227 std::recursive_mutex m_sequence_mutex
; // Restrict access to sending/receiving
228 // packets to a single thread at a time
229 lldb_private::Predicate
<bool> m_is_running
;
230 uint32_t m_session_key
;
231 uint8_t m_request_sequence_id
;
232 uint8_t m_exception_sequence_id
;
233 uint32_t m_kdp_version_version
;
234 uint32_t m_kdp_version_feature
;
235 uint32_t m_kdp_hostinfo_cpu_mask
;
236 uint32_t m_kdp_hostinfo_cpu_type
;
237 uint32_t m_kdp_hostinfo_cpu_subtype
;
238 std::string m_kernel_version
;
239 // std::string m_image_path; // Disable KDP_IMAGEPATH for now, it seems to
240 // hang the KDP connection...
241 lldb::addr_t m_last_read_memory_addr
; // Last memory read address for logging
243 // For CommunicationKDP only
244 CommunicationKDP(const CommunicationKDP
&) = delete;
245 const CommunicationKDP
&operator=(const CommunicationKDP
&) = delete;
248 #endif // LLDB_SOURCE_PLUGINS_PROCESS_MACOSX_KERNEL_COMMUNICATIONKDP_H