[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