[Lldb-commits] [lldb] r234986 - Fix breakpoint trap opcode detection for arm linux
Tamas Berghammer
tberghammer at google.com
Wed Apr 15 02:38:49 PDT 2015
Author: tberghammer
Date: Wed Apr 15 04:38:48 2015
New Revision: 234986
URL: http://llvm.org/viewvc/llvm-project?rev=234986&view=rev
Log:
Fix breakpoint trap opcode detection for arm linux
Modified:
lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp
lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp
lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h
Modified: lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp?rev=234986&r1=234985&r2=234986&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Platform/Linux/PlatformLinux.cpp Wed Apr 15 04:38:48 2015
@@ -583,8 +583,7 @@ PlatformLinux::GetSoftwareBreakpointTrap
addr_class = bp_loc_sp->GetAddress ().GetAddressClass ();
if (addr_class == eAddressClassCodeAlternateISA
- || (addr_class == eAddressClassUnknown
- && bp_loc_sp->GetAddress().GetOffset() & 1))
+ || (addr_class == eAddressClassUnknown && (bp_site->GetLoadAddress() & 1)))
{
trap_opcode = g_thumb_breakpoint_opcode;
trap_opcode_size = sizeof(g_thumb_breakpoint_opcode);
Modified: lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp?rev=234986&r1=234985&r2=234986&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp Wed Apr 15 04:38:48 2015
@@ -3189,7 +3189,7 @@ NativeProcessLinux::GetArchitecture (Arc
}
Error
-NativeProcessLinux::GetSoftwareBreakpointSize (NativeRegisterContextSP context_sp, uint32_t &actual_opcode_size)
+NativeProcessLinux::GetSoftwareBreakpointPCOffset (NativeRegisterContextSP context_sp, uint32_t &actual_opcode_size)
{
// FIXME put this behind a breakpoint protocol class that can be
// set per architecture. Need ARM, MIPS support here.
@@ -3202,6 +3202,10 @@ NativeProcessLinux::GetSoftwareBreakpoin
actual_opcode_size = static_cast<uint32_t> (sizeof(g_aarch64_opcode));
return Error ();
+ case llvm::Triple::arm:
+ actual_opcode_size = 0; // On arm the PC don't get updated for breakpoint hits
+ return Error ();
+
case llvm::Triple::x86:
case llvm::Triple::x86_64:
actual_opcode_size = static_cast<uint32_t> (sizeof(g_i386_opcode));
@@ -3223,14 +3227,20 @@ NativeProcessLinux::SetBreakpoint (lldb:
}
Error
-NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint, size_t &actual_opcode_size, const uint8_t *&trap_opcode_bytes)
+NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint,
+ size_t &actual_opcode_size,
+ const uint8_t *&trap_opcode_bytes)
{
- // FIXME put this behind a breakpoint protocol class that can be
- // set per architecture. Need ARM, MIPS support here.
+ // FIXME put this behind a breakpoint protocol class that can be set per
+ // architecture. Need MIPS support here.
static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 };
+ // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
+ // linux kernel does otherwise.
+ static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 };
static const uint8_t g_i386_opcode [] = { 0xCC };
static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d };
static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 };
+ static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde };
switch (m_arch.GetMachine ())
{
@@ -3239,6 +3249,22 @@ NativeProcessLinux::GetSoftwareBreakpoin
actual_opcode_size = sizeof(g_aarch64_opcode);
return Error ();
+ case llvm::Triple::arm:
+ switch (trap_opcode_size_hint)
+ {
+ case 2:
+ trap_opcode_bytes = g_thumb_breakpoint_opcode;
+ actual_opcode_size = sizeof(g_thumb_breakpoint_opcode);
+ return Error ();
+ case 4:
+ trap_opcode_bytes = g_arm_breakpoint_opcode;
+ actual_opcode_size = sizeof(g_arm_breakpoint_opcode);
+ return Error ();
+ default:
+ assert(false && "Unrecognised trap opcode size hint!");
+ return Error ("Unrecognised trap opcode size hint!");
+ }
+
case llvm::Triple::x86:
case llvm::Triple::x86_64:
trap_opcode_bytes = g_i386_opcode;
@@ -3858,7 +3884,7 @@ NativeProcessLinux::FixupBreakpointPCAsN
}
uint32_t breakpoint_size = 0;
- error = GetSoftwareBreakpointSize (context_sp, breakpoint_size);
+ error = GetSoftwareBreakpointPCOffset (context_sp, breakpoint_size);
if (error.Fail ())
{
if (log)
Modified: lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h?rev=234986&r1=234985&r2=234986&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.h Wed Apr 15 04:38:48 2015
@@ -365,7 +365,7 @@ namespace process_linux {
GetOrCreateThread (lldb::tid_t thread_id, bool &created);
Error
- GetSoftwareBreakpointSize (NativeRegisterContextSP context_sp, uint32_t &actual_opcode_size);
+ GetSoftwareBreakpointPCOffset (NativeRegisterContextSP context_sp, uint32_t &actual_opcode_size);
Error
FixupBreakpointPCAsNeeded (NativeThreadProtocolSP &thread_sp);
More information about the lldb-commits
mailing list