Home | History | Annotate | Download | only in MacOSX-Kernel
      1 //===-- CommunicationKDP.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 "CommunicationKDP.h"
     12 
     13 // C Includes
     14 #include <errno.h>
     15 #include <limits.h>
     16 #include <string.h>
     17 
     18 // C++ Includes
     19 #include "llvm/Support/MachO.h"
     20 
     21 // Other libraries and framework includes
     22 #include "lldb/Core/DataBufferHeap.h"
     23 #include "lldb/Core/DataExtractor.h"
     24 #include "lldb/Core/Log.h"
     25 #include "lldb/Core/State.h"
     26 #include "lldb/Core/UUID.h"
     27 #include "lldb/Host/FileSpec.h"
     28 #include "lldb/Host/Host.h"
     29 #include "lldb/Host/TimeValue.h"
     30 #include "lldb/Target/Process.h"
     31 
     32 // Project includes
     33 #include "ProcessKDPLog.h"
     34 
     35 using namespace lldb;
     36 using namespace lldb_private;
     37 
     38 //----------------------------------------------------------------------
     39 // CommunicationKDP constructor
     40 //----------------------------------------------------------------------
     41 CommunicationKDP::CommunicationKDP (const char *comm_name) :
     42     Communication(comm_name),
     43     m_addr_byte_size (4),
     44     m_byte_order (eByteOrderLittle),
     45     m_packet_timeout (5),
     46     m_sequence_mutex (Mutex::eMutexTypeRecursive),
     47     m_is_running (false),
     48     m_session_key (0u),
     49     m_request_sequence_id (0u),
     50     m_exception_sequence_id (0u),
     51     m_kdp_version_version (0u),
     52     m_kdp_version_feature (0u),
     53     m_kdp_hostinfo_cpu_mask (0u),
     54     m_kdp_hostinfo_cpu_type (0u),
     55     m_kdp_hostinfo_cpu_subtype (0u)
     56 {
     57 }
     58 
     59 //----------------------------------------------------------------------
     60 // Destructor
     61 //----------------------------------------------------------------------
     62 CommunicationKDP::~CommunicationKDP()
     63 {
     64     if (IsConnected())
     65     {
     66         Disconnect();
     67     }
     68 }
     69 
     70 bool
     71 CommunicationKDP::SendRequestPacket (const PacketStreamType &request_packet)
     72 {
     73     Mutex::Locker locker(m_sequence_mutex);
     74     return SendRequestPacketNoLock (request_packet);
     75 }
     76 
     77 #if 0
     78 typedef struct {
     79 	uint8_t     request;	// Either: CommandType | ePacketTypeRequest, or CommandType | ePacketTypeReply
     80 	uint8_t     sequence;
     81 	uint16_t    length;		// Length of entire packet including this header
     82 	uint32_t	key;		// Session key
     83 } kdp_hdr_t;
     84 #endif
     85 
     86 void
     87 CommunicationKDP::MakeRequestPacketHeader (CommandType request_type,
     88                                            PacketStreamType &request_packet,
     89                                            uint16_t request_length)
     90 {
     91     request_packet.Clear();
     92     request_packet.PutHex8 (request_type | ePacketTypeRequest); // Set the request type
     93     request_packet.PutHex8 (m_request_sequence_id++);           // Sequence number
     94     request_packet.PutHex16 (request_length);                   // Length of the packet including this header
     95     request_packet.PutHex32 (m_session_key);                    // Session key
     96 }
     97 
     98 bool
     99 CommunicationKDP::SendRequestAndGetReply (const CommandType command,
    100                                           const PacketStreamType &request_packet,
    101                                           DataExtractor &reply_packet)
    102 {
    103     if (IsRunning())
    104     {
    105         Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PACKETS));
    106         if (log)
    107         {
    108             PacketStreamType log_strm;
    109             DumpPacket (log_strm, request_packet.GetData(), request_packet.GetSize());
    110             log->Printf("error: kdp running, not sending packet: %.*s", (uint32_t)log_strm.GetSize(), log_strm.GetData());
    111         }
    112         return false;
    113     }
    114 
    115     Mutex::Locker locker(m_sequence_mutex);
    116 #ifdef LLDB_CONFIGURATION_DEBUG
    117     // NOTE: this only works for packets that are in native endian byte order
    118     assert (request_packet.GetSize() == *((uint16_t *)(request_packet.GetData() + 2)));
    119 #endif
    120     lldb::offset_t offset = 1;
    121     const uint32_t num_retries = 3;
    122     for (uint32_t i=0; i<num_retries; ++i)
    123     {
    124         if (SendRequestPacketNoLock(request_packet))
    125         {
    126             const uint8_t request_sequence_id = (uint8_t)request_packet.GetData()[1];
    127             while (1)
    128             {
    129                 if (WaitForPacketWithTimeoutMicroSecondsNoLock (reply_packet, GetPacketTimeoutInMicroSeconds ()))
    130                 {
    131                     offset = 0;
    132                     const uint8_t reply_command = reply_packet.GetU8 (&offset);
    133                     const uint8_t reply_sequence_id = reply_packet.GetU8 (&offset);
    134                     if (request_sequence_id == reply_sequence_id)
    135                     {
    136                         // The sequent ID was correct, now verify we got the response we were looking for
    137                         if ((reply_command & eCommandTypeMask) == command)
    138                         {
    139                             // Success
    140                             if (command == KDP_RESUMECPUS)
    141                                 m_is_running.SetValue(true, eBroadcastAlways);
    142                             return true;
    143                         }
    144                         else
    145                         {
    146                             // Failed to get the correct response, bail
    147                             reply_packet.Clear();
    148                             return false;
    149                         }
    150                     }
    151                     else if (reply_sequence_id > request_sequence_id)
    152                     {
    153                         // Sequence ID was greater than the sequence ID of the packet we sent, something
    154                         // is really wrong...
    155                         reply_packet.Clear();
    156                         return false;
    157                     }
    158                     else
    159                     {
    160                         // The reply sequence ID was less than our current packet's sequence ID
    161                         // so we should keep trying to get a response because this was a response
    162                         // for a previous packet that we must have retried.
    163                     }
    164                 }
    165                 else
    166                 {
    167                     // Break and retry sending the packet as we didn't get a response due to timeout
    168                     break;
    169                 }
    170             }
    171         }
    172     }
    173     reply_packet.Clear();
    174     return false;
    175 }
    176 
    177 bool
    178 CommunicationKDP::SendRequestPacketNoLock (const PacketStreamType &request_packet)
    179 {
    180     if (IsConnected())
    181     {
    182         const char *packet_data = request_packet.GetData();
    183         const size_t packet_size = request_packet.GetSize();
    184 
    185         Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PACKETS));
    186         if (log)
    187         {
    188             PacketStreamType log_strm;
    189             DumpPacket (log_strm, packet_data, packet_size);
    190             log->Printf("%.*s", (uint32_t)log_strm.GetSize(), log_strm.GetData());
    191         }
    192         ConnectionStatus status = eConnectionStatusSuccess;
    193 
    194         size_t bytes_written = Write (packet_data,
    195                                       packet_size,
    196                                       status,
    197                                       NULL);
    198 
    199         if (bytes_written == packet_size)
    200             return true;
    201 
    202         if (log)
    203             log->Printf ("error: failed to send packet entire packet %" PRIu64 " of %" PRIu64 " bytes sent", (uint64_t)bytes_written, (uint64_t)packet_size);
    204     }
    205     return false;
    206 }
    207 
    208 bool
    209 CommunicationKDP::GetSequenceMutex (Mutex::Locker& locker)
    210 {
    211     return locker.TryLock (m_sequence_mutex);
    212 }
    213 
    214 
    215 bool
    216 CommunicationKDP::WaitForNotRunningPrivate (const TimeValue *timeout_ptr)
    217 {
    218     return m_is_running.WaitForValueEqualTo (false, timeout_ptr, NULL);
    219 }
    220 
    221 size_t
    222 CommunicationKDP::WaitForPacketWithTimeoutMicroSeconds (DataExtractor &packet, uint32_t timeout_usec)
    223 {
    224     Mutex::Locker locker(m_sequence_mutex);
    225     return WaitForPacketWithTimeoutMicroSecondsNoLock (packet, timeout_usec);
    226 }
    227 
    228 size_t
    229 CommunicationKDP::WaitForPacketWithTimeoutMicroSecondsNoLock (DataExtractor &packet, uint32_t timeout_usec)
    230 {
    231     uint8_t buffer[8192];
    232     Error error;
    233 
    234     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PACKETS | KDP_LOG_VERBOSE));
    235 
    236     // Check for a packet from our cache first without trying any reading...
    237     if (CheckForPacket (NULL, 0, packet))
    238         return packet.GetByteSize();
    239 
    240     bool timed_out = false;
    241     while (IsConnected() && !timed_out)
    242     {
    243         lldb::ConnectionStatus status = eConnectionStatusNoConnection;
    244         size_t bytes_read = Read (buffer, sizeof(buffer), timeout_usec, status, &error);
    245 
    246         if (log)
    247             log->Printf ("%s: Read (buffer, (sizeof(buffer), timeout_usec = 0x%x, status = %s, error = %s) => bytes_read = %" PRIu64,
    248                          __PRETTY_FUNCTION__,
    249                          timeout_usec,
    250                          Communication::ConnectionStatusAsCString (status),
    251                          error.AsCString(),
    252                          (uint64_t)bytes_read);
    253 
    254         if (bytes_read > 0)
    255         {
    256             if (CheckForPacket (buffer, bytes_read, packet))
    257                 return packet.GetByteSize();
    258         }
    259         else
    260         {
    261             switch (status)
    262             {
    263             case eConnectionStatusTimedOut:
    264                 timed_out = true;
    265                 break;
    266             case eConnectionStatusSuccess:
    267                 //printf ("status = success but error = %s\n", error.AsCString("<invalid>"));
    268                 break;
    269 
    270             case eConnectionStatusEndOfFile:
    271             case eConnectionStatusNoConnection:
    272             case eConnectionStatusLostConnection:
    273             case eConnectionStatusError:
    274                 Disconnect();
    275                 break;
    276             }
    277         }
    278     }
    279     packet.Clear ();
    280     return 0;
    281 }
    282 
    283 bool
    284 CommunicationKDP::CheckForPacket (const uint8_t *src, size_t src_len, DataExtractor &packet)
    285 {
    286     // Put the packet data into the buffer in a thread safe fashion
    287     Mutex::Locker locker(m_bytes_mutex);
    288 
    289     Log *log (ProcessKDPLog::GetLogIfAllCategoriesSet (KDP_LOG_PACKETS));
    290 
    291     if (src && src_len > 0)
    292     {
    293         if (log && log->GetVerbose())
    294         {
    295             PacketStreamType log_strm;
    296             DataExtractor::DumpHexBytes (&log_strm, src, src_len, UINT32_MAX, LLDB_INVALID_ADDRESS);
    297             log->Printf ("CommunicationKDP::%s adding %u bytes: %s",
    298                          __FUNCTION__,
    299                          (uint32_t)src_len,
    300                          log_strm.GetData());
    301         }
    302         m_bytes.append ((const char *)src, src_len);
    303     }
    304 
    305     // Make sure we at least have enough bytes for a packet header
    306     const size_t bytes_available = m_bytes.size();
    307     if (bytes_available >= 8)
    308     {
    309         packet.SetData (&m_bytes[0], bytes_available, m_byte_order);
    310         lldb::offset_t offset = 0;
    311         uint8_t reply_command = packet.GetU8(&offset);
    312         switch (reply_command)
    313         {
    314         case ePacketTypeRequest | KDP_EXCEPTION:
    315         case ePacketTypeRequest | KDP_TERMINATION:
    316             // We got an exception request, so be sure to send an ACK
    317             {
    318                 PacketStreamType request_ack_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    319                 // Set the reply but and make the ACK packet
    320                 request_ack_packet.PutHex8 (reply_command | ePacketTypeReply);
    321                 request_ack_packet.PutHex8 (packet.GetU8(&offset));
    322                 request_ack_packet.PutHex16 (packet.GetU16(&offset));
    323                 request_ack_packet.PutHex32 (packet.GetU32(&offset));
    324                 m_is_running.SetValue(false, eBroadcastAlways);
    325                 // Ack to the exception or termination
    326                 SendRequestPacketNoLock (request_ack_packet);
    327             }
    328             // Fall through to case below to get packet contents
    329         case ePacketTypeReply | KDP_CONNECT:
    330         case ePacketTypeReply | KDP_DISCONNECT:
    331         case ePacketTypeReply | KDP_HOSTINFO:
    332         case ePacketTypeReply | KDP_VERSION:
    333         case ePacketTypeReply | KDP_MAXBYTES:
    334         case ePacketTypeReply | KDP_READMEM:
    335         case ePacketTypeReply | KDP_WRITEMEM:
    336         case ePacketTypeReply | KDP_READREGS:
    337         case ePacketTypeReply | KDP_WRITEREGS:
    338         case ePacketTypeReply | KDP_LOAD:
    339         case ePacketTypeReply | KDP_IMAGEPATH:
    340         case ePacketTypeReply | KDP_SUSPEND:
    341         case ePacketTypeReply | KDP_RESUMECPUS:
    342         case ePacketTypeReply | KDP_BREAKPOINT_SET:
    343         case ePacketTypeReply | KDP_BREAKPOINT_REMOVE:
    344         case ePacketTypeReply | KDP_REGIONS:
    345         case ePacketTypeReply | KDP_REATTACH:
    346         case ePacketTypeReply | KDP_HOSTREBOOT:
    347         case ePacketTypeReply | KDP_READMEM64:
    348         case ePacketTypeReply | KDP_WRITEMEM64:
    349         case ePacketTypeReply | KDP_BREAKPOINT_SET64:
    350         case ePacketTypeReply | KDP_BREAKPOINT_REMOVE64:
    351         case ePacketTypeReply | KDP_KERNELVERSION:
    352         case ePacketTypeReply | KDP_READPHYSMEM64:
    353         case ePacketTypeReply | KDP_WRITEPHYSMEM64:
    354         case ePacketTypeReply | KDP_READIOPORT:
    355         case ePacketTypeReply | KDP_WRITEIOPORT:
    356         case ePacketTypeReply | KDP_READMSR64:
    357         case ePacketTypeReply | KDP_WRITEMSR64:
    358         case ePacketTypeReply | KDP_DUMPINFO:
    359             {
    360                 offset = 2;
    361                 const uint16_t length = packet.GetU16 (&offset);
    362                 if (length <= bytes_available)
    363                 {
    364                     // We have an entire packet ready, we need to copy the data
    365                     // bytes into a buffer that will be owned by the packet and
    366                     // erase the bytes from our communcation buffer "m_bytes"
    367                     packet.SetData (DataBufferSP (new DataBufferHeap (&m_bytes[0], length)));
    368                     m_bytes.erase (0, length);
    369 
    370                     if (log)
    371                     {
    372                         PacketStreamType log_strm;
    373                         DumpPacket (log_strm, packet);
    374 
    375                         log->Printf("%.*s", (uint32_t)log_strm.GetSize(), log_strm.GetData());
    376                     }
    377                     return true;
    378                 }
    379             }
    380             break;
    381 
    382         default:
    383             // Unrecognized reply command byte, erase this byte and try to get back on track
    384             if (log)
    385                 log->Printf ("CommunicationKDP::%s: tossing junk byte: 0x%2.2x",
    386                              __FUNCTION__,
    387                              (uint8_t)m_bytes[0]);
    388             m_bytes.erase(0, 1);
    389             break;
    390         }
    391     }
    392     packet.Clear();
    393     return false;
    394 }
    395 
    396 
    397 bool
    398 CommunicationKDP::SendRequestConnect (uint16_t reply_port,
    399                                       uint16_t exc_port,
    400                                       const char *greeting)
    401 {
    402     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    403     if (greeting == NULL)
    404         greeting = "";
    405 
    406     const CommandType command = KDP_CONNECT;
    407     // Length is 82 uint16_t and the length of the greeting C string with the terminating NULL
    408     const uint32_t command_length = 8 + 2 + 2 + ::strlen(greeting) + 1;
    409     MakeRequestPacketHeader (command, request_packet, command_length);
    410     // Always send connect ports as little endian
    411     request_packet.SetByteOrder (eByteOrderLittle);
    412     request_packet.PutHex16 (reply_port);
    413     request_packet.PutHex16 (exc_port);
    414     request_packet.SetByteOrder (m_byte_order);
    415     request_packet.PutCString (greeting);
    416     DataExtractor reply_packet;
    417     return SendRequestAndGetReply (command, request_packet, reply_packet);
    418 }
    419 
    420 void
    421 CommunicationKDP::ClearKDPSettings ()
    422 {
    423     m_request_sequence_id = 0;
    424     m_kdp_version_version = 0;
    425     m_kdp_version_feature = 0;
    426     m_kdp_hostinfo_cpu_mask = 0;
    427     m_kdp_hostinfo_cpu_type = 0;
    428     m_kdp_hostinfo_cpu_subtype = 0;
    429 }
    430 
    431 bool
    432 CommunicationKDP::SendRequestReattach (uint16_t reply_port)
    433 {
    434     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    435     const CommandType command = KDP_REATTACH;
    436     // Length is 8 bytes for the header plus 2 bytes for the reply UDP port
    437     const uint32_t command_length = 8 + 2;
    438     MakeRequestPacketHeader (command, request_packet, command_length);
    439     // Always send connect ports as little endian
    440     request_packet.SetByteOrder (eByteOrderLittle);
    441     request_packet.PutHex16(reply_port);
    442     request_packet.SetByteOrder (m_byte_order);
    443     DataExtractor reply_packet;
    444     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    445     {
    446         // Reset the sequence ID to zero for reattach
    447         ClearKDPSettings ();
    448         lldb::offset_t offset = 4;
    449         m_session_key = reply_packet.GetU32 (&offset);
    450         return true;
    451     }
    452     return false;
    453 }
    454 
    455 uint32_t
    456 CommunicationKDP::GetVersion ()
    457 {
    458     if (!VersionIsValid())
    459         SendRequestVersion();
    460     return m_kdp_version_version;
    461 }
    462 
    463 uint32_t
    464 CommunicationKDP::GetFeatureFlags ()
    465 {
    466     if (!VersionIsValid())
    467         SendRequestVersion();
    468     return m_kdp_version_feature;
    469 }
    470 
    471 bool
    472 CommunicationKDP::SendRequestVersion ()
    473 {
    474     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    475     const CommandType command = KDP_VERSION;
    476     const uint32_t command_length = 8;
    477     MakeRequestPacketHeader (command, request_packet, command_length);
    478     DataExtractor reply_packet;
    479     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    480     {
    481         lldb::offset_t offset = 8;
    482         m_kdp_version_version = reply_packet.GetU32 (&offset);
    483         m_kdp_version_feature = reply_packet.GetU32 (&offset);
    484         return true;
    485     }
    486     return false;
    487 }
    488 
    489 #if 0 // Disable KDP_IMAGEPATH for now, it seems to hang the KDP connection...
    490 const char *
    491 CommunicationKDP::GetImagePath ()
    492 {
    493     if (m_image_path.empty())
    494         SendRequestImagePath();
    495     return m_image_path.c_str();
    496 }
    497 
    498 bool
    499 CommunicationKDP::SendRequestImagePath ()
    500 {
    501     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    502     const CommandType command = KDP_IMAGEPATH;
    503     const uint32_t command_length = 8;
    504     MakeRequestPacketHeader (command, request_packet, command_length);
    505     DataExtractor reply_packet;
    506     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    507     {
    508         const char *path = reply_packet.PeekCStr(8);
    509         if (path && path[0])
    510             m_kernel_version.assign (path);
    511         return true;
    512     }
    513     return false;
    514 }
    515 #endif
    516 
    517 uint32_t
    518 CommunicationKDP::GetCPUMask ()
    519 {
    520     if (!HostInfoIsValid())
    521         SendRequestHostInfo();
    522     return m_kdp_hostinfo_cpu_mask;
    523 }
    524 
    525 uint32_t
    526 CommunicationKDP::GetCPUType ()
    527 {
    528     if (!HostInfoIsValid())
    529         SendRequestHostInfo();
    530     return m_kdp_hostinfo_cpu_type;
    531 }
    532 
    533 uint32_t
    534 CommunicationKDP::GetCPUSubtype ()
    535 {
    536     if (!HostInfoIsValid())
    537         SendRequestHostInfo();
    538     return m_kdp_hostinfo_cpu_subtype;
    539 }
    540 
    541 lldb_private::UUID
    542 CommunicationKDP::GetUUID ()
    543 {
    544     UUID uuid;
    545     if (GetKernelVersion() == NULL)
    546         return uuid;
    547 
    548     if (m_kernel_version.find("UUID=") == std::string::npos)
    549         return uuid;
    550 
    551     size_t p = m_kernel_version.find("UUID=") + strlen ("UUID=");
    552     std::string uuid_str = m_kernel_version.substr(p, 36);
    553     if (uuid_str.size() < 32)
    554         return uuid;
    555 
    556     if (uuid.SetFromCString (uuid_str.c_str()) == 0)
    557     {
    558         UUID invalid_uuid;
    559         return invalid_uuid;
    560     }
    561 
    562     return uuid;
    563 }
    564 
    565 bool
    566 CommunicationKDP::RemoteIsEFI ()
    567 {
    568     if (GetKernelVersion() == NULL)
    569         return false;
    570     if (strncmp (m_kernel_version.c_str(), "EFI", 3) == 0)
    571         return true;
    572     else
    573         return false;
    574 }
    575 
    576 bool
    577 CommunicationKDP::RemoteIsDarwinKernel ()
    578 {
    579     if (GetKernelVersion() == NULL)
    580         return false;
    581     if (m_kernel_version.find("Darwin Kernel") != std::string::npos)
    582         return true;
    583     else
    584         return false;
    585 }
    586 
    587 lldb::addr_t
    588 CommunicationKDP::GetLoadAddress ()
    589 {
    590     if (GetKernelVersion() == NULL)
    591         return LLDB_INVALID_ADDRESS;
    592 
    593     if (m_kernel_version.find("stext=") == std::string::npos)
    594         return LLDB_INVALID_ADDRESS;
    595     size_t p = m_kernel_version.find("stext=") + strlen ("stext=");
    596     if (m_kernel_version[p] != '0' || m_kernel_version[p + 1] != 'x')
    597         return LLDB_INVALID_ADDRESS;
    598 
    599     addr_t kernel_load_address;
    600     errno = 0;
    601     kernel_load_address = ::strtoul (m_kernel_version.c_str() + p, NULL, 16);
    602     if (errno != 0 || kernel_load_address == 0)
    603         return LLDB_INVALID_ADDRESS;
    604 
    605     return kernel_load_address;
    606 }
    607 
    608 bool
    609 CommunicationKDP::SendRequestHostInfo ()
    610 {
    611     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    612     const CommandType command = KDP_HOSTINFO;
    613     const uint32_t command_length = 8;
    614     MakeRequestPacketHeader (command, request_packet, command_length);
    615     DataExtractor reply_packet;
    616     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    617     {
    618         lldb::offset_t offset = 8;
    619         m_kdp_hostinfo_cpu_mask     = reply_packet.GetU32 (&offset);
    620         m_kdp_hostinfo_cpu_type     = reply_packet.GetU32 (&offset);
    621         m_kdp_hostinfo_cpu_subtype  = reply_packet.GetU32 (&offset);
    622 
    623         ArchSpec kernel_arch;
    624         kernel_arch.SetArchitecture (eArchTypeMachO,
    625                                      m_kdp_hostinfo_cpu_type,
    626                                      m_kdp_hostinfo_cpu_subtype);
    627 
    628         m_addr_byte_size = kernel_arch.GetAddressByteSize();
    629         m_byte_order = kernel_arch.GetByteOrder();
    630         return true;
    631     }
    632     return false;
    633 }
    634 
    635 const char *
    636 CommunicationKDP::GetKernelVersion ()
    637 {
    638     if (m_kernel_version.empty())
    639         SendRequestKernelVersion ();
    640     return m_kernel_version.c_str();
    641 }
    642 
    643 bool
    644 CommunicationKDP::SendRequestKernelVersion ()
    645 {
    646     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    647     const CommandType command = KDP_KERNELVERSION;
    648     const uint32_t command_length = 8;
    649     MakeRequestPacketHeader (command, request_packet, command_length);
    650     DataExtractor reply_packet;
    651     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    652     {
    653         const char *kernel_version_cstr = reply_packet.PeekCStr(8);
    654         if (kernel_version_cstr && kernel_version_cstr[0])
    655             m_kernel_version.assign (kernel_version_cstr);
    656         return true;
    657     }
    658     return false;
    659 }
    660 
    661 bool
    662 CommunicationKDP::SendRequestDisconnect ()
    663 {
    664     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    665     const CommandType command = KDP_DISCONNECT;
    666     const uint32_t command_length = 8;
    667     MakeRequestPacketHeader (command, request_packet, command_length);
    668     DataExtractor reply_packet;
    669     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    670     {
    671         // Are we supposed to get a reply for disconnect?
    672     }
    673     ClearKDPSettings ();
    674     return true;
    675 }
    676 
    677 uint32_t
    678 CommunicationKDP::SendRequestReadMemory (lldb::addr_t addr,
    679                                          void *dst,
    680                                          uint32_t dst_len,
    681                                          Error &error)
    682 {
    683     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    684     bool use_64 = (GetVersion() >= 11);
    685     uint32_t command_addr_byte_size = use_64 ? 8 : 4;
    686     const CommandType command = use_64 ? KDP_READMEM64 : KDP_READMEM;
    687     // Size is header + address size + uint32_t length
    688     const uint32_t command_length = 8 + command_addr_byte_size + 4;
    689     MakeRequestPacketHeader (command, request_packet, command_length);
    690     request_packet.PutMaxHex64 (addr, command_addr_byte_size);
    691     request_packet.PutHex32 (dst_len);
    692     DataExtractor reply_packet;
    693     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    694     {
    695         lldb::offset_t offset = 8;
    696         uint32_t kdp_error = reply_packet.GetU32 (&offset);
    697         uint32_t src_len = reply_packet.GetByteSize() - 12;
    698 
    699         if (src_len > 0)
    700         {
    701             const void *src = reply_packet.GetData(&offset, src_len);
    702             if (src)
    703             {
    704                 ::memcpy (dst, src, src_len);
    705                 error.Clear();
    706                 return src_len;
    707             }
    708         }
    709         if (kdp_error)
    710             error.SetErrorStringWithFormat ("kdp read memory failed (error %u)", kdp_error);
    711         else
    712             error.SetErrorString ("kdp read memory failed");
    713     }
    714     else
    715     {
    716         error.SetErrorString ("failed to send packet");
    717     }
    718     return 0;
    719 }
    720 
    721 
    722 uint32_t
    723 CommunicationKDP::SendRequestWriteMemory (lldb::addr_t addr,
    724                                           const void *src,
    725                                           uint32_t src_len,
    726                                           Error &error)
    727 {
    728     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    729     bool use_64 = (GetVersion() >= 11);
    730     uint32_t command_addr_byte_size = use_64 ? 8 : 4;
    731     const CommandType command = use_64 ? KDP_WRITEMEM64 : KDP_WRITEMEM;
    732     // Size is header + address size + uint32_t length
    733     const uint32_t command_length = 8 + command_addr_byte_size + 4 + src_len;
    734     MakeRequestPacketHeader (command, request_packet, command_length);
    735     request_packet.PutMaxHex64 (addr, command_addr_byte_size);
    736     request_packet.PutHex32 (src_len);
    737     request_packet.PutRawBytes(src, src_len);
    738 
    739     DataExtractor reply_packet;
    740     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    741     {
    742         lldb::offset_t offset = 8;
    743         uint32_t kdp_error = reply_packet.GetU32 (&offset);
    744         if (kdp_error)
    745             error.SetErrorStringWithFormat ("kdp write memory failed (error %u)", kdp_error);
    746         else
    747         {
    748             error.Clear();
    749             return src_len;
    750         }
    751     }
    752     else
    753     {
    754         error.SetErrorString ("failed to send packet");
    755     }
    756     return 0;
    757 }
    758 
    759 bool
    760 CommunicationKDP::SendRawRequest (uint8_t command_byte,
    761                                   const void *src,  // Raw packet payload bytes
    762                                   uint32_t src_len, // Raw packet payload length
    763                                   DataExtractor &reply_packet,
    764                                   Error &error)
    765 {
    766     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
    767     // Size is header + address size + uint32_t length
    768     const uint32_t command_length = 8 + src_len;
    769     const CommandType command = (CommandType)command_byte;
    770     MakeRequestPacketHeader (command, request_packet, command_length);
    771     request_packet.PutRawBytes(src, src_len);
    772 
    773     if (SendRequestAndGetReply (command, request_packet, reply_packet))
    774     {
    775         lldb::offset_t offset = 8;
    776         uint32_t kdp_error = reply_packet.GetU32 (&offset);
    777         if (kdp_error  && (command_byte != KDP_DUMPINFO))
    778             error.SetErrorStringWithFormat ("request packet 0x%8.8x failed (error %u)", command_byte, kdp_error);
    779         else
    780         {
    781             error.Clear();
    782             return true;
    783         }
    784     }
    785     else
    786     {
    787         error.SetErrorString ("failed to send packet");
    788     }
    789     return false;
    790 }
    791 
    792 
    793 const char *
    794 CommunicationKDP::GetCommandAsCString (uint8_t command)
    795 {
    796     switch (command)
    797     {
    798     case KDP_CONNECT:               return "KDP_CONNECT";
    799     case KDP_DISCONNECT:            return "KDP_DISCONNECT";
    800     case KDP_HOSTINFO:              return "KDP_HOSTINFO";
    801     case KDP_VERSION:               return "KDP_VERSION";
    802     case KDP_MAXBYTES:              return "KDP_MAXBYTES";
    803     case KDP_READMEM:               return "KDP_READMEM";
    804     case KDP_WRITEMEM:              return "KDP_WRITEMEM";
    805     case KDP_READREGS:              return "KDP_READREGS";
    806     case KDP_WRITEREGS:             return "KDP_WRITEREGS";
    807     case KDP_LOAD:                  return "KDP_LOAD";
    808     case KDP_IMAGEPATH:             return "KDP_IMAGEPATH";
    809     case KDP_SUSPEND:               return "KDP_SUSPEND";
    810     case KDP_RESUMECPUS:            return "KDP_RESUMECPUS";
    811     case KDP_EXCEPTION:             return "KDP_EXCEPTION";
    812     case KDP_TERMINATION:           return "KDP_TERMINATION";
    813     case KDP_BREAKPOINT_SET:        return "KDP_BREAKPOINT_SET";
    814     case KDP_BREAKPOINT_REMOVE:     return "KDP_BREAKPOINT_REMOVE";
    815     case KDP_REGIONS:               return "KDP_REGIONS";
    816     case KDP_REATTACH:              return "KDP_REATTACH";
    817     case KDP_HOSTREBOOT:            return "KDP_HOSTREBOOT";
    818     case KDP_READMEM64:             return "KDP_READMEM64";
    819     case KDP_WRITEMEM64:            return "KDP_WRITEMEM64";
    820     case KDP_BREAKPOINT_SET64:      return "KDP_BREAKPOINT64_SET";
    821     case KDP_BREAKPOINT_REMOVE64:   return "KDP_BREAKPOINT64_REMOVE";
    822     case KDP_KERNELVERSION:         return "KDP_KERNELVERSION";
    823     case KDP_READPHYSMEM64:         return "KDP_READPHYSMEM64";
    824     case KDP_WRITEPHYSMEM64:        return "KDP_WRITEPHYSMEM64";
    825     case KDP_READIOPORT:            return "KDP_READIOPORT";
    826     case KDP_WRITEIOPORT:           return "KDP_WRITEIOPORT";
    827     case KDP_READMSR64:             return "KDP_READMSR64";
    828     case KDP_WRITEMSR64:            return "KDP_WRITEMSR64";
    829     case KDP_DUMPINFO:              return "KDP_DUMPINFO";
    830     }
    831     return NULL;
    832 }
    833 
    834 void
    835 CommunicationKDP::DumpPacket (Stream &s, const void *data, uint32_t data_len)
    836 {
    837     DataExtractor extractor (data, data_len, m_byte_order, m_addr_byte_size);
    838     DumpPacket (s, extractor);
    839 }
    840 
    841 void
    842 CommunicationKDP::DumpPacket (Stream &s, const DataExtractor& packet)
    843 {
    844     const char *error_desc = NULL;
    845     if (packet.GetByteSize() < 8)
    846     {
    847         error_desc = "error: invalid packet (too short): ";
    848     }
    849     else
    850     {
    851         lldb::offset_t offset = 0;
    852         const uint8_t first_packet_byte = packet.GetU8 (&offset);
    853         const uint8_t sequence_id = packet.GetU8 (&offset);
    854         const uint16_t length = packet.GetU16 (&offset);
    855         const uint32_t key = packet.GetU32 (&offset);
    856         const CommandType command = ExtractCommand (first_packet_byte);
    857         const char *command_name = GetCommandAsCString (command);
    858         if (command_name)
    859         {
    860             const bool is_reply = ExtractIsReply(first_packet_byte);
    861             s.Printf ("(running=%i) %s %24s: 0x%2.2x 0x%2.2x 0x%4.4x 0x%8.8x ",
    862                       IsRunning(),
    863                       is_reply ? "<--" : "-->",
    864                       command_name,
    865                       first_packet_byte,
    866                       sequence_id,
    867                       length,
    868                       key);
    869 
    870             if (is_reply)
    871             {
    872                 // Dump request reply packets
    873                 switch (command)
    874                 {
    875                     // Commands that return a single 32 bit error
    876                     case KDP_CONNECT:
    877                     case KDP_WRITEMEM:
    878                     case KDP_WRITEMEM64:
    879                     case KDP_BREAKPOINT_SET:
    880                     case KDP_BREAKPOINT_REMOVE:
    881                     case KDP_BREAKPOINT_SET64:
    882                     case KDP_BREAKPOINT_REMOVE64:
    883                     case KDP_WRITEREGS:
    884                     case KDP_LOAD:
    885                     case KDP_WRITEIOPORT:
    886                     case KDP_WRITEMSR64:
    887                         {
    888                             const uint32_t error = packet.GetU32 (&offset);
    889                             s.Printf(" (error=0x%8.8x)", error);
    890                         }
    891                         break;
    892 
    893                     case KDP_DISCONNECT:
    894                     case KDP_REATTACH:
    895                     case KDP_HOSTREBOOT:
    896                     case KDP_SUSPEND:
    897                     case KDP_RESUMECPUS:
    898                     case KDP_EXCEPTION:
    899                     case KDP_TERMINATION:
    900                         // No return value for the reply, just the header to ack
    901                         s.PutCString(" ()");
    902                         break;
    903 
    904                     case KDP_HOSTINFO:
    905                         {
    906                             const uint32_t cpu_mask = packet.GetU32 (&offset);
    907                             const uint32_t cpu_type = packet.GetU32 (&offset);
    908                             const uint32_t cpu_subtype = packet.GetU32 (&offset);
    909                             s.Printf(" (cpu_mask=0x%8.8x, cpu_type=0x%8.8x, cpu_subtype=0x%8.8x)", cpu_mask, cpu_type, cpu_subtype);
    910                         }
    911                         break;
    912 
    913                     case KDP_VERSION:
    914                         {
    915                             const uint32_t version = packet.GetU32 (&offset);
    916                             const uint32_t feature = packet.GetU32 (&offset);
    917                             s.Printf(" (version=0x%8.8x, feature=0x%8.8x)", version, feature);
    918                         }
    919                         break;
    920 
    921                     case KDP_REGIONS:
    922                         {
    923                             const uint32_t region_count = packet.GetU32 (&offset);
    924                             s.Printf(" (count = %u", region_count);
    925                             for (uint32_t i=0; i<region_count; ++i)
    926                             {
    927                                 const addr_t region_addr = packet.GetPointer (&offset);
    928                                 const uint32_t region_size = packet.GetU32 (&offset);
    929                                 const uint32_t region_prot = packet.GetU32 (&offset);
    930                                 s.Printf("\n\tregion[%" PRIu64 "] = { range = [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 "), size = 0x%8.8x, prot = %s }", region_addr, region_addr, region_addr + region_size, region_size, GetPermissionsAsCString (region_prot));
    931                             }
    932                         }
    933                         break;
    934 
    935                     case KDP_READMEM:
    936                     case KDP_READMEM64:
    937                     case KDP_READPHYSMEM64:
    938                         {
    939                             const uint32_t error = packet.GetU32 (&offset);
    940                             const uint32_t count = packet.GetByteSize() - offset;
    941                             s.Printf(" (error = 0x%8.8x:\n", error);
    942                             if (count > 0)
    943                                 packet.Dump (&s,                        // Stream to dump to
    944                                              offset,                    // Offset within "packet"
    945                                              eFormatBytesWithASCII,     // Format to use
    946                                              1,                         // Size of each item in bytes
    947                                              count,                     // Number of items
    948                                              16,                        // Number per line
    949                                              m_last_read_memory_addr,   // Don't show addresses before each line
    950                                              0, 0);                     // No bitfields
    951                         }
    952                         break;
    953 
    954                     case KDP_READREGS:
    955                         {
    956                             const uint32_t error = packet.GetU32 (&offset);
    957                             const uint32_t count = packet.GetByteSize() - offset;
    958                             s.Printf(" (error = 0x%8.8x regs:\n", error);
    959                             if (count > 0)
    960                                 packet.Dump (&s,                        // Stream to dump to
    961                                              offset,                    // Offset within "packet"
    962                                              eFormatHex,                // Format to use
    963                                              m_addr_byte_size,          // Size of each item in bytes
    964                                              count / m_addr_byte_size,  // Number of items
    965                                              16 / m_addr_byte_size,     // Number per line
    966                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
    967                                              0, 0);                     // No bitfields
    968                         }
    969                         break;
    970 
    971                     case KDP_KERNELVERSION:
    972                         {
    973                             const char *kernel_version = packet.PeekCStr(8);
    974                             s.Printf(" (version = \"%s\")", kernel_version);
    975                         }
    976                         break;
    977 
    978                     case KDP_MAXBYTES:
    979                         {
    980                             const uint32_t max_bytes = packet.GetU32 (&offset);
    981                             s.Printf(" (max_bytes = 0x%8.8x (%u))", max_bytes, max_bytes);
    982                         }
    983                         break;
    984                     case KDP_IMAGEPATH:
    985                         {
    986                             const char *path = packet.GetCStr(&offset);
    987                             s.Printf(" (path = \"%s\")", path);
    988                         }
    989                         break;
    990 
    991                     case KDP_READIOPORT:
    992                     case KDP_READMSR64:
    993                         {
    994                             const uint32_t error = packet.GetU32 (&offset);
    995                             const uint32_t count = packet.GetByteSize() - offset;
    996                             s.Printf(" (error = 0x%8.8x io:\n", error);
    997                             if (count > 0)
    998                                 packet.Dump (&s,                        // Stream to dump to
    999                                              offset,                    // Offset within "packet"
   1000                                              eFormatHex,                // Format to use
   1001                                              1,                         // Size of each item in bytes
   1002                                              count,                     // Number of items
   1003                                              16,                        // Number per line
   1004                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
   1005                                              0, 0);                     // No bitfields
   1006                         }
   1007                         break;
   1008                     case KDP_DUMPINFO:
   1009                         {
   1010                             const uint32_t count = packet.GetByteSize() - offset;
   1011                             s.Printf(" (count = %u, bytes = \n", count);
   1012                             if (count > 0)
   1013                                 packet.Dump (&s,                        // Stream to dump to
   1014                                              offset,                    // Offset within "packet"
   1015                                              eFormatHex,                // Format to use
   1016                                              1,                         // Size of each item in bytes
   1017                                              count,                     // Number of items
   1018                                              16,                        // Number per line
   1019                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
   1020                                              0, 0);                     // No bitfields
   1021 
   1022                         }
   1023                         break;
   1024 
   1025                     default:
   1026                         s.Printf(" (add support for dumping this packet reply!!!");
   1027                         break;
   1028 
   1029                 }
   1030             }
   1031             else
   1032             {
   1033                 // Dump request packets
   1034                 switch (command)
   1035                 {
   1036                     case KDP_CONNECT:
   1037                         {
   1038                             const uint16_t reply_port = packet.GetU16 (&offset);
   1039                             const uint16_t exc_port = packet.GetU16 (&offset);
   1040                             s.Printf(" (reply_port = %u, exc_port = %u, greeting = \"%s\")", reply_port, exc_port, packet.GetCStr(&offset));
   1041                         }
   1042                         break;
   1043 
   1044                     case KDP_DISCONNECT:
   1045                     case KDP_HOSTREBOOT:
   1046                     case KDP_HOSTINFO:
   1047                     case KDP_VERSION:
   1048                     case KDP_REGIONS:
   1049                     case KDP_KERNELVERSION:
   1050                     case KDP_MAXBYTES:
   1051                     case KDP_IMAGEPATH:
   1052                     case KDP_SUSPEND:
   1053                         // No args, just the header in the request...
   1054                         s.PutCString(" ()");
   1055                         break;
   1056 
   1057                     case KDP_RESUMECPUS:
   1058                         {
   1059                             const uint32_t cpu_mask = packet.GetU32 (&offset);
   1060                             s.Printf(" (cpu_mask = 0x%8.8x)", cpu_mask);
   1061                         }
   1062                         break;
   1063 
   1064                     case KDP_READMEM:
   1065                         {
   1066                             const uint32_t addr = packet.GetU32 (&offset);
   1067                             const uint32_t size = packet.GetU32 (&offset);
   1068                             s.Printf(" (addr = 0x%8.8x, size = %u)", addr, size);
   1069                             m_last_read_memory_addr = addr;
   1070                         }
   1071                         break;
   1072 
   1073                     case KDP_WRITEMEM:
   1074                         {
   1075                             const uint32_t addr = packet.GetU32 (&offset);
   1076                             const uint32_t size = packet.GetU32 (&offset);
   1077                             s.Printf(" (addr = 0x%8.8x, size = %u, bytes = \n", addr, size);
   1078                             if (size > 0)
   1079                                 DataExtractor::DumpHexBytes(&s, packet.GetData(&offset, size), size, 32, addr);
   1080                         }
   1081                         break;
   1082 
   1083                     case KDP_READMEM64:
   1084                         {
   1085                             const uint64_t addr = packet.GetU64 (&offset);
   1086                             const uint32_t size = packet.GetU32 (&offset);
   1087                             s.Printf(" (addr = 0x%16.16" PRIx64 ", size = %u)", addr, size);
   1088                             m_last_read_memory_addr = addr;
   1089                         }
   1090                         break;
   1091 
   1092                     case KDP_READPHYSMEM64:
   1093                         {
   1094                             const uint64_t addr = packet.GetU64 (&offset);
   1095                             const uint32_t size = packet.GetU32 (&offset);
   1096                             const uint32_t lcpu = packet.GetU16 (&offset);
   1097                             s.Printf(" (addr = 0x%16.16llx, size = %u, lcpu = %u)", addr, size, lcpu);
   1098                             m_last_read_memory_addr = addr;
   1099                         }
   1100                         break;
   1101 
   1102                     case KDP_WRITEMEM64:
   1103                         {
   1104                             const uint64_t addr = packet.GetU64 (&offset);
   1105                             const uint32_t size = packet.GetU32 (&offset);
   1106                             s.Printf(" (addr = 0x%16.16" PRIx64 ", size = %u, bytes = \n", addr, size);
   1107                             if (size > 0)
   1108                                 DataExtractor::DumpHexBytes(&s, packet.GetData(&offset, size), size, 32, addr);
   1109                         }
   1110                         break;
   1111 
   1112                     case KDP_WRITEPHYSMEM64:
   1113                         {
   1114                             const uint64_t addr = packet.GetU64 (&offset);
   1115                             const uint32_t size = packet.GetU32 (&offset);
   1116                             const uint32_t lcpu = packet.GetU16 (&offset);
   1117                             s.Printf(" (addr = 0x%16.16llx, size = %u, lcpu = %u, bytes = \n", addr, size, lcpu);
   1118                             if (size > 0)
   1119                                 DataExtractor::DumpHexBytes(&s, packet.GetData(&offset, size), size, 32, addr);
   1120                         }
   1121                         break;
   1122 
   1123                     case KDP_READREGS:
   1124                         {
   1125                             const uint32_t cpu = packet.GetU32 (&offset);
   1126                             const uint32_t flavor = packet.GetU32 (&offset);
   1127                             s.Printf(" (cpu = %u, flavor = %u)", cpu, flavor);
   1128                         }
   1129                         break;
   1130 
   1131                     case KDP_WRITEREGS:
   1132                         {
   1133                             const uint32_t cpu = packet.GetU32 (&offset);
   1134                             const uint32_t flavor = packet.GetU32 (&offset);
   1135                             const uint32_t nbytes = packet.GetByteSize() - offset;
   1136                             s.Printf(" (cpu = %u, flavor = %u, regs = \n", cpu, flavor);
   1137                             if (nbytes > 0)
   1138                                 packet.Dump (&s,                        // Stream to dump to
   1139                                              offset,                    // Offset within "packet"
   1140                                              eFormatHex,                // Format to use
   1141                                              m_addr_byte_size,          // Size of each item in bytes
   1142                                              nbytes / m_addr_byte_size, // Number of items
   1143                                              16 / m_addr_byte_size,     // Number per line
   1144                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
   1145                                              0, 0);                     // No bitfields
   1146                         }
   1147                         break;
   1148 
   1149 
   1150                     case KDP_BREAKPOINT_SET:
   1151                     case KDP_BREAKPOINT_REMOVE:
   1152                         {
   1153                             const uint32_t addr = packet.GetU32 (&offset);
   1154                             s.Printf(" (addr = 0x%8.8x)", addr);
   1155                         }
   1156                         break;
   1157 
   1158                     case KDP_BREAKPOINT_SET64:
   1159                     case KDP_BREAKPOINT_REMOVE64:
   1160                         {
   1161                             const uint64_t addr = packet.GetU64 (&offset);
   1162                             s.Printf(" (addr = 0x%16.16" PRIx64 ")", addr);
   1163                         }
   1164                         break;
   1165 
   1166 
   1167                     case KDP_LOAD:
   1168                         {
   1169                             const char *path = packet.GetCStr(&offset);
   1170                             s.Printf(" (path = \"%s\")", path);
   1171                         }
   1172                         break;
   1173 
   1174                     case KDP_EXCEPTION:
   1175                         {
   1176                             const uint32_t count = packet.GetU32 (&offset);
   1177 
   1178                             for (uint32_t i=0; i<count; ++i)
   1179                             {
   1180                                 const uint32_t cpu = packet.GetU32 (&offset);
   1181                                 const uint32_t exc = packet.GetU32 (&offset);
   1182                                 const uint32_t code = packet.GetU32 (&offset);
   1183                                 const uint32_t subcode = packet.GetU32 (&offset);
   1184                                 const char *exc_cstr = NULL;
   1185                                 switch (exc)
   1186                                 {
   1187                                     case 1:  exc_cstr = "EXC_BAD_ACCESS"; break;
   1188                                     case 2:  exc_cstr = "EXC_BAD_INSTRUCTION"; break;
   1189                                     case 3:  exc_cstr = "EXC_ARITHMETIC"; break;
   1190                                     case 4:  exc_cstr = "EXC_EMULATION"; break;
   1191                                     case 5:  exc_cstr = "EXC_SOFTWARE"; break;
   1192                                     case 6:  exc_cstr = "EXC_BREAKPOINT"; break;
   1193                                     case 7:  exc_cstr = "EXC_SYSCALL"; break;
   1194                                     case 8:  exc_cstr = "EXC_MACH_SYSCALL"; break;
   1195                                     case 9:  exc_cstr = "EXC_RPC_ALERT"; break;
   1196                                     case 10: exc_cstr = "EXC_CRASH"; break;
   1197                                     default:
   1198                                         break;
   1199                                 }
   1200 
   1201                                 s.Printf ("{ cpu = 0x%8.8x, exc = %s (%u), code = %u (0x%8.8x), subcode = %u (0x%8.8x)} ",
   1202                                           cpu, exc_cstr, exc, code, code, subcode, subcode);
   1203                             }
   1204                         }
   1205                         break;
   1206 
   1207                     case KDP_TERMINATION:
   1208                         {
   1209                             const uint32_t term_code = packet.GetU32 (&offset);
   1210                             const uint32_t exit_code = packet.GetU32 (&offset);
   1211                             s.Printf(" (term_code = 0x%8.8x (%u), exit_code = 0x%8.8x (%u))", term_code, term_code, exit_code, exit_code);
   1212                         }
   1213                         break;
   1214 
   1215                     case KDP_REATTACH:
   1216                         {
   1217                             const uint16_t reply_port = packet.GetU16 (&offset);
   1218                             s.Printf(" (reply_port = %u)", reply_port);
   1219                         }
   1220                         break;
   1221 
   1222                     case KDP_READMSR64:
   1223                         {
   1224                             const uint32_t address = packet.GetU32 (&offset);
   1225                             const uint16_t lcpu = packet.GetU16 (&offset);
   1226                             s.Printf(" (address=0x%8.8x, lcpu=0x%4.4x)", address, lcpu);
   1227                         }
   1228                         break;
   1229 
   1230                     case KDP_WRITEMSR64:
   1231                         {
   1232                             const uint32_t address = packet.GetU32 (&offset);
   1233                             const uint16_t lcpu = packet.GetU16 (&offset);
   1234                             const uint32_t nbytes = packet.GetByteSize() - offset;
   1235                             s.Printf(" (address=0x%8.8x, lcpu=0x%4.4x, nbytes=0x%8.8x)", lcpu, address, nbytes);
   1236                             if (nbytes > 0)
   1237                                 packet.Dump (&s,                        // Stream to dump to
   1238                                              offset,                    // Offset within "packet"
   1239                                              eFormatHex,                // Format to use
   1240                                              1,                         // Size of each item in bytes
   1241                                              nbytes,                    // Number of items
   1242                                              16,                        // Number per line
   1243                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
   1244                                              0, 0);                     // No bitfields
   1245                         }
   1246                         break;
   1247 
   1248                     case KDP_READIOPORT:
   1249                         {
   1250                             const uint16_t lcpu = packet.GetU16 (&offset);
   1251                             const uint16_t address = packet.GetU16 (&offset);
   1252                             const uint16_t nbytes = packet.GetU16 (&offset);
   1253                             s.Printf(" (lcpu=0x%4.4x, address=0x%4.4x, nbytes=%u)", lcpu, address, nbytes);
   1254                         }
   1255                         break;
   1256 
   1257                     case KDP_WRITEIOPORT:
   1258                          {
   1259                             const uint16_t lcpu = packet.GetU16 (&offset);
   1260                             const uint16_t address = packet.GetU16 (&offset);
   1261                             const uint16_t nbytes = packet.GetU16 (&offset);
   1262                             s.Printf(" (lcpu = %u, addr = 0x%4.4x, nbytes = %u, bytes = \n", lcpu, address, nbytes);
   1263                             if (nbytes > 0)
   1264                                 packet.Dump (&s,                        // Stream to dump to
   1265                                              offset,                    // Offset within "packet"
   1266                                              eFormatHex,                // Format to use
   1267                                              1,                         // Size of each item in bytes
   1268                                              nbytes,                    // Number of items
   1269                                              16,                        // Number per line
   1270                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
   1271                                              0, 0);                     // No bitfields
   1272                         }
   1273                         break;
   1274 
   1275                     case KDP_DUMPINFO:
   1276                         {
   1277                             const uint32_t count = packet.GetByteSize() - offset;
   1278                             s.Printf(" (count = %u, bytes = \n", count);
   1279                             if (count > 0)
   1280                                 packet.Dump (&s,                        // Stream to dump to
   1281                                              offset,                    // Offset within "packet"
   1282                                              eFormatHex,                // Format to use
   1283                                              1,                         // Size of each item in bytes
   1284                                              count,                     // Number of items
   1285                                              16,                        // Number per line
   1286                                              LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
   1287                                              0, 0);                     // No bitfields
   1288 
   1289                         }
   1290                         break;
   1291 
   1292                }
   1293             }
   1294         }
   1295         else
   1296         {
   1297             error_desc = "error: invalid packet command: ";
   1298         }
   1299     }
   1300 
   1301     if (error_desc)
   1302     {
   1303         s.PutCString (error_desc);
   1304 
   1305         packet.Dump (&s,                    // Stream to dump to
   1306                      0,                     // Offset into "packet"
   1307                      eFormatBytes,          // Dump as hex bytes
   1308                      1,                     // Size of each item is 1 for single bytes
   1309                      packet.GetByteSize(),  // Number of bytes
   1310                      UINT32_MAX,            // Num bytes per line
   1311                      LLDB_INVALID_ADDRESS,  // Base address
   1312                      0, 0);                 // Bitfield info set to not do anything bitfield related
   1313     }
   1314 }
   1315 
   1316 uint32_t
   1317 CommunicationKDP::SendRequestReadRegisters (uint32_t cpu,
   1318                                             uint32_t flavor,
   1319                                             void *dst,
   1320                                             uint32_t dst_len,
   1321                                             Error &error)
   1322 {
   1323     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
   1324     const CommandType command = KDP_READREGS;
   1325     // Size is header + 4 byte cpu and 4 byte flavor
   1326     const uint32_t command_length = 8 + 4 + 4;
   1327     MakeRequestPacketHeader (command, request_packet, command_length);
   1328     request_packet.PutHex32 (cpu);
   1329     request_packet.PutHex32 (flavor);
   1330     DataExtractor reply_packet;
   1331     if (SendRequestAndGetReply (command, request_packet, reply_packet))
   1332     {
   1333         lldb::offset_t offset = 8;
   1334         uint32_t kdp_error = reply_packet.GetU32 (&offset);
   1335         uint32_t src_len = reply_packet.GetByteSize() - 12;
   1336 
   1337         if (src_len > 0)
   1338         {
   1339             const uint32_t bytes_to_copy = std::min<uint32_t>(src_len, dst_len);
   1340             const void *src = reply_packet.GetData(&offset, bytes_to_copy);
   1341             if (src)
   1342             {
   1343                 ::memcpy (dst, src, bytes_to_copy);
   1344                 error.Clear();
   1345                 // Return the number of bytes we could have returned regardless if
   1346                 // we copied them or not, just so we know when things don't match up
   1347                 return src_len;
   1348             }
   1349         }
   1350         if (kdp_error)
   1351             error.SetErrorStringWithFormat("failed to read kdp registers for cpu %u flavor %u (error %u)", cpu, flavor, kdp_error);
   1352         else
   1353             error.SetErrorStringWithFormat("failed to read kdp registers for cpu %u flavor %u", cpu, flavor);
   1354     }
   1355     else
   1356     {
   1357         error.SetErrorString ("failed to send packet");
   1358     }
   1359     return 0;
   1360 }
   1361 
   1362 uint32_t
   1363 CommunicationKDP::SendRequestWriteRegisters (uint32_t cpu,
   1364                                              uint32_t flavor,
   1365                                              const void *src,
   1366                                              uint32_t src_len,
   1367                                              Error &error)
   1368 {
   1369     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
   1370     const CommandType command = KDP_WRITEREGS;
   1371     // Size is header + 4 byte cpu and 4 byte flavor
   1372     const uint32_t command_length = 8 + 4 + 4 + src_len;
   1373     MakeRequestPacketHeader (command, request_packet, command_length);
   1374     request_packet.PutHex32 (cpu);
   1375     request_packet.PutHex32 (flavor);
   1376     request_packet.Write(src, src_len);
   1377     DataExtractor reply_packet;
   1378     if (SendRequestAndGetReply (command, request_packet, reply_packet))
   1379     {
   1380         lldb::offset_t offset = 8;
   1381         uint32_t kdp_error = reply_packet.GetU32 (&offset);
   1382         if (kdp_error == 0)
   1383             return src_len;
   1384         error.SetErrorStringWithFormat("failed to read kdp registers for cpu %u flavor %u (error %u)", cpu, flavor, kdp_error);
   1385     }
   1386     else
   1387     {
   1388         error.SetErrorString ("failed to send packet");
   1389     }
   1390     return 0;
   1391 }
   1392 
   1393 
   1394 bool
   1395 CommunicationKDP::SendRequestResume ()
   1396 {
   1397     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
   1398     const CommandType command = KDP_RESUMECPUS;
   1399     const uint32_t command_length = 12;
   1400     MakeRequestPacketHeader (command, request_packet, command_length);
   1401     request_packet.PutHex32(GetCPUMask());
   1402 
   1403     DataExtractor reply_packet;
   1404     if (SendRequestAndGetReply (command, request_packet, reply_packet))
   1405         return true;
   1406     return false;
   1407 }
   1408 
   1409 bool
   1410 CommunicationKDP::SendRequestBreakpoint (bool set, addr_t addr)
   1411 {
   1412     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
   1413     bool use_64 = (GetVersion() >= 11);
   1414     uint32_t command_addr_byte_size = use_64 ? 8 : 4;
   1415     const CommandType command = set ? (use_64 ? KDP_BREAKPOINT_SET64    : KDP_BREAKPOINT_SET   ):
   1416                                       (use_64 ? KDP_BREAKPOINT_REMOVE64 : KDP_BREAKPOINT_REMOVE);
   1417 
   1418     const uint32_t command_length = 8 + command_addr_byte_size;
   1419     MakeRequestPacketHeader (command, request_packet, command_length);
   1420     request_packet.PutMaxHex64 (addr, command_addr_byte_size);
   1421 
   1422     DataExtractor reply_packet;
   1423     if (SendRequestAndGetReply (command, request_packet, reply_packet))
   1424     {
   1425         lldb::offset_t offset = 8;
   1426         uint32_t kdp_error = reply_packet.GetU32 (&offset);
   1427         if (kdp_error == 0)
   1428             return true;
   1429     }
   1430     return false;
   1431 }
   1432 
   1433 bool
   1434 CommunicationKDP::SendRequestSuspend ()
   1435 {
   1436     PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
   1437     const CommandType command = KDP_SUSPEND;
   1438     const uint32_t command_length = 8;
   1439     MakeRequestPacketHeader (command, request_packet, command_length);
   1440     DataExtractor reply_packet;
   1441     if (SendRequestAndGetReply (command, request_packet, reply_packet))
   1442         return true;
   1443     return false;
   1444 }
   1445 
   1446