[Lldb-commits] [lldb] r251111 - Fix arm lldb-server on aarch64 device

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Fri Oct 23 06:36:32 PDT 2015


Author: tberghammer
Date: Fri Oct 23 08:36:31 2015
New Revision: 251111

URL: http://llvm.org/viewvc/llvm-project?rev=251111&view=rev
Log:
Fix arm lldb-server on aarch64 device

* Use PTRACE_GETVFPREGS/PTRACE_SETVFPREGS to access the floating point
  registers instead of the old PTRACE_GETFPREGS/PTRACE_SETFPREGS. The
  new call is available since armv5.
* Work around a kernel issue in PTRACE_POKEUSER with reading out the full
  register set, modifying the neccessary value and then writing it back.

Modified:
    lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.cpp
    lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.h

Modified: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.cpp?rev=251111&r1=251110&r2=251111&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.cpp Fri Oct 23 08:36:31 2015
@@ -20,6 +20,10 @@
 
 #define REG_CONTEXT_SIZE (GetGPRSize() + sizeof (m_fpr))
 
+#ifndef PTRACE_GETVFPREGS
+  #define PTRACE_GETVFPREGS 27
+  #define PTRACE_SETVFPREGS 28
+#endif
 #ifndef PTRACE_GETHBPREGS
   #define PTRACE_GETHBPREGS 29
   #define PTRACE_SETHBPREGS 30
@@ -853,4 +857,45 @@ NativeRegisterContextLinux_arm::Calculat
     return reg_info->byte_offset - GetRegisterInfoAtIndex(m_reg_info.first_fpr)->byte_offset;
 }
 
+Error
+NativeRegisterContextLinux_arm::DoWriteRegisterValue(uint32_t offset,
+                                                     const char* reg_name,
+                                                     const RegisterValue &value)
+{
+    // PTRACE_POKEUSER don't work in the aarch64 liux kernel used on android devices (always return
+    // "Bad address"). To avoid using PTRACE_POKEUSER we read out the full GPR register set, modify
+    // the requested register and write it back. This approach is about 4 times slower but the
+    // performance overhead is negligible in comparision to processing time in lldb-server.
+    assert(offset % 4 == 0 && "Try to write a register with unaligned offset");
+    if (offset + sizeof(uint32_t) > sizeof(m_gpr_arm))
+        return Error("Register isn't fit into the size of the GPR area");
+
+    Error error = DoReadGPR(m_gpr_arm, sizeof(m_gpr_arm));
+    if (error.Fail())
+        return error;
+
+    m_gpr_arm[offset / sizeof(uint32_t)] = value.GetAsUInt32();
+    return DoWriteGPR(m_gpr_arm, sizeof(m_gpr_arm));
+}
+
+Error
+NativeRegisterContextLinux_arm::DoReadFPR(void *buf, size_t buf_size)
+{
+    return NativeProcessLinux::PtraceWrapper(PTRACE_GETVFPREGS,
+                                             m_thread.GetID(),
+                                             nullptr,
+                                             buf,
+                                             buf_size);
+}
+
+Error
+NativeRegisterContextLinux_arm::DoWriteFPR(void *buf, size_t buf_size)
+{
+    return NativeProcessLinux::PtraceWrapper(PTRACE_SETVFPREGS,
+                                             m_thread.GetID(),
+                                             nullptr,
+                                             buf,
+                                             buf_size);
+}
+
 #endif // defined(__arm__)

Modified: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.h?rev=251111&r1=251110&r2=251111&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.h (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_arm.h Fri Oct 23 08:36:31 2015
@@ -90,6 +90,17 @@ namespace process_linux {
         };
 
     protected:
+        Error
+        DoWriteRegisterValue(uint32_t offset,
+                             const char* reg_name,
+                             const RegisterValue &value) override;
+
+        Error
+        DoReadFPR(void *buf, size_t buf_size) override;
+
+        Error
+        DoWriteFPR(void *buf, size_t buf_size) override;
+
         void*
         GetGPRBuffer() override { return &m_gpr_arm; }
 




More information about the lldb-commits mailing list