[Lldb-commits] [lldb] r135557 - in /lldb/trunk/source/Plugins/Process/MacOSX-Kernel: CommunicationKDP.cpp CommunicationKDP.h RegisterContextKDP_arm.cpp RegisterContextKDP_i386.cpp RegisterContextKDP_i386.h RegisterContextKDP_x86_64.cpp RegisterContextKDP_x86_64.h

Greg Clayton gclayton at apple.com
Tue Jul 19 18:32:51 PDT 2011


Author: gclayton
Date: Tue Jul 19 20:32:50 2011
New Revision: 135557

URL: http://llvm.org/viewvc/llvm-project?rev=135557&view=rev
Log:
Added register reading support for ARM, i386 and x86_64.


Modified:
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_arm.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.h
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.cpp
    lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.h

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.cpp?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.cpp Tue Jul 19 20:32:50 2011
@@ -409,7 +409,6 @@
     DataExtractor reply_packet;
     if (SendRequestAndGetReply (command, request_sequence_id, request_packet, reply_packet))
     {
-        // Reset the sequence ID to zero for reattach
         uint32_t offset = 8;
         m_kdp_version_version = reply_packet.GetU32 (&offset);
         m_kdp_version_feature = reply_packet.GetU32 (&offset);
@@ -453,7 +452,6 @@
     DataExtractor reply_packet;
     if (SendRequestAndGetReply (command, request_sequence_id, request_packet, reply_packet))
     {
-        // Reset the sequence ID to zero for reattach
         uint32_t offset = 8;
         m_kdp_hostinfo_cpu_mask     = reply_packet.GetU32 (&offset);
         m_kdp_hostinfo_cpu_type     = reply_packet.GetU32 (&offset);
@@ -507,7 +505,6 @@
     DataExtractor reply_packet;
     if (SendRequestAndGetReply (command, request_sequence_id, request_packet, reply_packet))
     {
-        // Reset the sequence ID to zero for reattach
         uint32_t offset = 8;
         uint32_t kdp_error = reply_packet.GetU32 (&offset);
         uint32_t src_len = reply_packet.GetByteSize() - 12;
@@ -530,6 +527,41 @@
     return 0;
 }
 
+
+uint32_t
+CommunicationKDP::SendRequestWriteMemory (lldb::addr_t addr, 
+                                          const void *src, 
+                                          uint32_t src_len,
+                                          Error &error)
+{
+    PacketStreamType request_packet (Stream::eBinary, m_addr_byte_size, m_byte_order);
+    bool use_64 = (GetVersion() >= 11);
+    uint32_t command_addr_byte_size = use_64 ? 8 : 4;
+    const CommandType command = use_64 ? eCommandTypeWriteMemory64 : eCommandTypeWriteMemory;
+    // Size is header + address size + uint32_t length
+    const uint32_t command_length = 8 + command_addr_byte_size + 4;
+    const uint32_t request_sequence_id = m_request_sequence_id;
+    MakeRequestPacketHeader (command, request_packet, command_length);
+    request_packet.PutMaxHex64 (addr, command_addr_byte_size);
+    request_packet.PutHex32 (src_len);
+    request_packet.PutBytesAsRawHex8(src, src_len);
+
+    DataExtractor reply_packet;
+    if (SendRequestAndGetReply (command, request_sequence_id, request_packet, reply_packet))
+    {
+        uint32_t offset = 8;
+        uint32_t kdp_error = reply_packet.GetU32 (&offset);
+        if (kdp_error)
+            error.SetErrorStringWithFormat ("kdp write memory failed (error %u)", kdp_error);
+        else
+        {
+            error.Clear();
+            return src_len;
+        }
+    }
+    return 0;
+}
+
 const char *
 CommunicationKDP::GetCommandAsCString (uint8_t command)
 {
@@ -603,7 +635,16 @@
                 // Dump request reply packets
                 switch (command)
                 {
+                    // Commands that return a single 32 bit error
                     case eCommandTypeConnect:
+                    case eCommandTypeWriteMemory:
+                    case eCommandTypeWriteMemory64:
+                    case eCommandTypeBreakpointSet:
+                    case eCommandTypeBreakpointRemove:
+                    case eCommandTypeBreakpointSet64:
+                    case eCommandTypeBreakpointRemove64:
+                    case eCommandTypeWriteRegisters:
+                    case eCommandTypeLoad:
                         {
                             const uint32_t error = packet.GetU32 (&offset);
                             s.Printf(" (error=0x%8.8x)", error);
@@ -613,7 +654,12 @@
                     case eCommandTypeDisconnect:
                     case eCommandTypeReattach:
                     case eCommandTypeHostReboot:
+                    case eCommandTypeSuspend:
+                    case eCommandTypeResume:
+                    case eCommandTypeException:
+                    case eCommandTypeTermination:
                         // No return value for the reply, just the header to ack
+                        s.PutCString(" ()");
                         break;
 
                     case eCommandTypeHostInfo:
@@ -649,31 +695,36 @@
 
                     case eCommandTypeReadMemory:
                     case eCommandTypeReadMemory64:
-                    case eCommandTypeReadRegisters:
                         {
                             const uint32_t error = packet.GetU32 (&offset);
-                            const uint32_t count = packet.GetByteSize() - 12;
+                            const uint32_t count = packet.GetByteSize() - offset;
                             s.Printf(" (error = 0x%8.8x <0x%x>:\n", error, count); 
                             if (count > 0)
                                 DataExtractor::DumpHexBytes(&s, packet.GetData(&offset, count), count, 32, LLDB_INVALID_ADDRESS);
                         }
                         break;
 
+                    case eCommandTypeReadRegisters:
+                        {
+                            const uint32_t error = packet.GetU32 (&offset);
+                            const uint32_t count = packet.GetByteSize() - offset;
+                            s.Printf(" (error = 0x%8.8x <0x%x> regs:\n", error, count); 
+                            if (count > 0)
+                                packet.Dump (&s,                        // Stream to dump to
+                                             offset,                    // Offset within "packet"
+                                             eFormatHex,                // Format to use
+                                             m_addr_byte_size,          // Size of each item in bytes
+                                             count / m_addr_byte_size,  // Number of items
+                                             16 / m_addr_byte_size,     // Number per line
+                                             LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
+                                             0, 0);                     // No bitfields
+                        }
+                        break;
+
                     case eCommandTypeMaxBytes:
-                    case eCommandTypeWriteMemory:
-                    case eCommandTypeWriteRegisters:
-                    case eCommandTypeLoad:
                     case eCommandTypeImagePath:
-                    case eCommandTypeSuspend:
-                    case eCommandTypeResume:
-                    case eCommandTypeException:
-                    case eCommandTypeTermination:
-                    case eCommandTypeBreakpointSet:
-                    case eCommandTypeBreakpointRemove:
-                    case eCommandTypeWriteMemory64:
-                    case eCommandTypeBreakpointSet64:
-                    case eCommandTypeBreakpointRemove64:
                     case eCommandTypeKernelVersion:
+                        s.Printf(" (add support for dumping this packet reply!!!"); 
                         break;
                     
                 } 
@@ -707,6 +758,16 @@
                         }
                         break;
 
+                    case eCommandTypeWriteMemory:
+                        {
+                            const uint32_t addr = packet.GetU32 (&offset);
+                            const uint32_t size = packet.GetU32 (&offset);
+                            s.Printf(" (addr = 0x%8.8x, size=%u, bytes:\n", addr, size);
+                            if (size > 0)
+                                DataExtractor::DumpHexBytes(&s, packet.GetData(&offset, size), size, 32, addr);
+                        }
+                        break;
+
                     case eCommandTypeReadMemory64:
                         {
                             const uint64_t addr = packet.GetU64 (&offset);
@@ -715,6 +776,16 @@
                         }
                         break;
 
+                    case eCommandTypeWriteMemory64:
+                        {
+                            const uint64_t addr = packet.GetU64 (&offset);
+                            const uint32_t size = packet.GetU32 (&offset);
+                            s.Printf(" (addr = 0x%16.16llx, size=%u, bytes:", addr, size);
+                            if (size > 0)
+                                DataExtractor::DumpHexBytes(&s, packet.GetData(&offset, size), size, 32, addr);
+                        }
+                        break;
+
                     case eCommandTypeReadRegisters:
                         {
                             const uint32_t cpu = packet.GetU32 (&offset);
@@ -723,9 +794,26 @@
                         }
                         break;
 
-                    case eCommandTypeMaxBytes:
-                    case eCommandTypeWriteMemory:
                     case eCommandTypeWriteRegisters:
+                        {
+                            const uint32_t cpu = packet.GetU32 (&offset);
+                            const uint32_t flavor = packet.GetU32 (&offset);
+                            const uint32_t nbytes = packet.GetByteSize() - offset;
+                            s.Printf(" (cpu = %u, flavor=%u, regs:\n", cpu, flavor);
+                            if (nbytes > 0)
+                                packet.Dump (&s,                        // Stream to dump to
+                                             offset,                    // Offset within "packet"
+                                             eFormatHex,                // Format to use
+                                             m_addr_byte_size,          // Size of each item in bytes
+                                             nbytes / m_addr_byte_size, // Number of items
+                                             16 / m_addr_byte_size,     // Number per line
+                                             LLDB_INVALID_ADDRESS,      // Don't show addresses before each line
+                                             0, 0);                     // No bitfields
+                        }
+                        break;
+
+                    case eCommandTypeMaxBytes:
+
                     case eCommandTypeLoad:
                     case eCommandTypeImagePath:
                     case eCommandTypeSuspend:
@@ -743,10 +831,10 @@
                         }
                         break;
 
-                    case eCommandTypeWriteMemory64:
                     case eCommandTypeBreakpointSet64:
                     case eCommandTypeBreakpointRemove64:
                     case eCommandTypeKernelVersion:
+                        
                         break;
                 }
             }
@@ -790,7 +878,6 @@
     DataExtractor reply_packet;
     if (SendRequestAndGetReply (command, request_sequence_id, request_packet, reply_packet))
     {
-        // Reset the sequence ID to zero for reattach
         uint32_t offset = 8;
         uint32_t kdp_error = reply_packet.GetU32 (&offset);
         uint32_t src_len = reply_packet.GetByteSize() - 12;

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/CommunicationKDP.h Tue Jul 19 20:32:50 2011
@@ -156,21 +156,22 @@
     
     uint32_t
     SendRequestReadMemory (lldb::addr_t addr, 
-                           void *buf, 
-                           uint32_t size,
+                           void *dst, 
+                           uint32_t dst_size,
                            lldb_private::Error &error);
 
     uint32_t
+    SendRequestWriteMemory (lldb::addr_t addr, 
+                            const void *src, 
+                            uint32_t src_len,
+                            lldb_private::Error &error);
+
+    uint32_t
     SendRequestReadRegisters (uint32_t cpu,
                               uint32_t flavor,
                               void *dst, 
                               uint32_t dst_size,
                               lldb_private::Error &error);
-//    size_t
-//    SendRequestWriteMemory (lldb::addr_t addr, 
-//                            const void *buf, 
-//                            size_t size,
-//                            lldb_private::Error &error);
     
     uint32_t
     GetVersion ();

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_arm.cpp?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_arm.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_arm.cpp Tue Jul 19 20:32:50 2011
@@ -20,7 +20,7 @@
 using namespace lldb_private;
 
 
-RegisterContextKDP_arm::RegisterContextKDP_arm(ThreadKDP &thread, uint32_t concrete_frame_idx) :
+RegisterContextKDP_arm::RegisterContextKDP_arm (ThreadKDP &thread, uint32_t concrete_frame_idx) :
     RegisterContextDarwin_arm (thread, concrete_frame_idx),
     m_kdp_thread (thread)
 {
@@ -34,10 +34,7 @@
 RegisterContextKDP_arm::DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
 {
     Error error;
-    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, 
-                                                                                  GPRRegSet, 
-                                                                                  &gpr, sizeof(gpr), 
-                                                                                  error))
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, GPRRegSet, &gpr, sizeof(gpr), error))
     {
         if (error.Success())
             return 0;
@@ -48,18 +45,36 @@
 int
 RegisterContextKDP_arm::DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
 {
+    Error error;
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, FPURegSet, &fpu, sizeof(fpu), error))
+    {
+        if (error.Success())
+            return 0;
+    }
     return -1;
 }
 
 int
 RegisterContextKDP_arm::DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
 {
+    Error error;
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, EXCRegSet, &exc, sizeof(exc), error))
+    {
+        if (error.Success())
+            return 0;
+    }
     return -1;
 }
 
 int
 RegisterContextKDP_arm::DoReadDBG (lldb::tid_t tid, int flavor, DBG &dbg)
 {
+    Error error;
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, DBGRegSet, &dbg, sizeof(dbg), error))
+    {
+        if (error.Success())
+            return 0;
+    }
     return -1;
 }
 

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.cpp?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.cpp Tue Jul 19 20:32:50 2011
@@ -9,19 +9,20 @@
 
 
 // C Includes
-#include <mach/thread_act.h>
-
 // C++ Includes
 // Other libraries and framework includes
 // Project includes
 #include "RegisterContextKDP_i386.h"
+#include "ProcessKDP.h"
+#include "ThreadKDP.h"
 
 using namespace lldb;
 using namespace lldb_private;
 
 
-RegisterContextKDP_i386::RegisterContextKDP_i386(Thread &thread, uint32_t concrete_frame_idx) :
-    RegisterContextDarwin_i386 (thread, concrete_frame_idx)
+RegisterContextKDP_i386::RegisterContextKDP_i386 (ThreadKDP &thread, uint32_t concrete_frame_idx) :
+    RegisterContextDarwin_i386 (thread, concrete_frame_idx),
+    m_kdp_thread (thread)
 {
 }
 
@@ -32,22 +33,37 @@
 int
 RegisterContextKDP_i386::DoReadGPR (lldb::tid_t tid, int flavor, GPR &gpr)
 {
-    mach_msg_type_number_t count = GPRWordCount;
-    return ::thread_get_state(tid, flavor, (thread_state_t)&gpr, &count);
+    Error error;
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, GPRRegSet, &gpr, sizeof(gpr), error))
+    {
+        if (error.Success())
+            return 0;
+    }
+    return -1;
 }
 
 int
 RegisterContextKDP_i386::DoReadFPU (lldb::tid_t tid, int flavor, FPU &fpu)
 {
-    mach_msg_type_number_t count = FPUWordCount;
-    return ::thread_get_state(tid, flavor, (thread_state_t)&fpu, &count);
+    Error error;
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, FPURegSet, &fpu, sizeof(fpu), error))
+    {
+        if (error.Success())
+            return 0;
+    }
+    return -1;
 }
 
 int
 RegisterContextKDP_i386::DoReadEXC (lldb::tid_t tid, int flavor, EXC &exc)
 {
-    mach_msg_type_number_t count = EXCWordCount;
-    return ::thread_get_state(tid, flavor, (thread_state_t)&exc, &count);
+    Error error;
+    if (m_kdp_thread.GetKDPProcess().GetCommunication().SendRequestReadRegisters (tid, EXCRegSet, &exc, sizeof(exc), error))
+    {
+        if (error.Success())
+            return 0;
+    }
+    return -1;
 }
 
 int

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.h?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_i386.h Tue Jul 19 20:32:50 2011
@@ -16,10 +16,12 @@
 // Project includes
 #include "Plugins/Process/Utility/RegisterContextDarwin_i386.h"
 
+class ThreadKDP;
+
 class RegisterContextKDP_i386 : public RegisterContextDarwin_i386
 {
 public:
-    RegisterContextKDP_i386 (lldb_private::Thread &thread, 
+    RegisterContextKDP_i386 (ThreadKDP &thread, 
                              uint32_t concrete_frame_idx);
     
     virtual
@@ -44,6 +46,8 @@
     
     int
     DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc);
+    
+    ThreadKDP &m_kdp_thread;
 };
 
 #endif  // liblldb_RegisterContextKDP_i386_h_

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.cpp?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.cpp (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.cpp Tue Jul 19 20:32:50 2011
@@ -9,19 +9,20 @@
 
 
 // C Includes
-#include <mach/thread_act.h>
-
 // C++ Includes
 // Other libraries and framework includes
 // Project includes
 #include "RegisterContextKDP_x86_64.h"
+#include "ProcessKDP.h"
+#include "ThreadKDP.h"
 
 using namespace lldb;
 using namespace lldb_private;
 
 
-RegisterContextKDP_x86_64::RegisterContextKDP_x86_64(Thread &thread, uint32_t concrete_frame_idx) :
-    RegisterContextDarwin_x86_64 (thread, concrete_frame_idx)
+RegisterContextKDP_x86_64::RegisterContextKDP_x86_64 (ThreadKDP &thread, uint32_t concrete_frame_idx) :
+    RegisterContextDarwin_x86_64 (thread, concrete_frame_idx),
+    m_kdp_thread (thread)
 {
 }
 

Modified: lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.h?rev=135557&r1=135556&r2=135557&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.h (original)
+++ lldb/trunk/source/Plugins/Process/MacOSX-Kernel/RegisterContextKDP_x86_64.h Tue Jul 19 20:32:50 2011
@@ -16,11 +16,13 @@
 // Project includes
 #include "Plugins/Process/Utility/RegisterContextDarwin_x86_64.h"
 
+class ThreadKDP;
+
 class RegisterContextKDP_x86_64 : public RegisterContextDarwin_x86_64
 {
 public:
     
-    RegisterContextKDP_x86_64 (lldb_private::Thread &thread, 
+    RegisterContextKDP_x86_64 (ThreadKDP &thread, 
                                uint32_t concrete_frame_idx);
     
     virtual
@@ -45,6 +47,8 @@
     
     int
     DoWriteEXC (lldb::tid_t tid, int flavor, const EXC &exc);
+    
+    ThreadKDP &m_kdp_thread;
 };
 
 #endif  // liblldb_RegisterContextKDP_x86_64_h_





More information about the lldb-commits mailing list