[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