diff options
Diffstat (limited to 'source/Plugins/Process/elf-core')
5 files changed, 47 insertions, 6 deletions
diff --git a/source/Plugins/Process/elf-core/ProcessElfCore.cpp b/source/Plugins/Process/elf-core/ProcessElfCore.cpp index fb39d73..ead9595 100644 --- a/source/Plugins/Process/elf-core/ProcessElfCore.cpp +++ b/source/Plugins/Process/elf-core/ProcessElfCore.cpp @@ -412,7 +412,8 @@ enum { NT_FPREGSET, NT_PRPSINFO, NT_THRMISC = 7, - NT_PROCSTAT_AUXV = 16 + NT_PROCSTAT_AUXV = 16, + NT_PPC_VMX = 0x100 }; } @@ -538,6 +539,9 @@ ProcessElfCore::ParseThreadContextsFromNoteSegment(const elf::ELFProgramHeader * // FIXME: FreeBSD sticks an int at the beginning of the note m_auxv = DataExtractor(segment_data, note_start + 4, note_size - 4); break; + case FREEBSD::NT_PPC_VMX: + thread_data->vregset = note_data; + break; default: break; } diff --git a/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp b/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp index 15b1b44..d12df21 100644 --- a/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp +++ b/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.cpp @@ -18,7 +18,8 @@ using namespace lldb_private; RegisterContextCorePOSIX_powerpc::RegisterContextCorePOSIX_powerpc(Thread &thread, RegisterInfoInterface *register_info, const DataExtractor &gpregset, - const DataExtractor &fpregset) + const DataExtractor &fpregset, + const DataExtractor &vregset) : RegisterContextPOSIX_powerpc(thread, 0, register_info) { m_gpr_buffer.reset(new DataBufferHeap(gpregset.GetDataStart(), gpregset.GetByteSize())); @@ -27,6 +28,9 @@ RegisterContextCorePOSIX_powerpc::RegisterContextCorePOSIX_powerpc(Thread &threa m_fpr_buffer.reset(new DataBufferHeap(fpregset.GetDataStart(), fpregset.GetByteSize())); m_fpr.SetData(m_fpr_buffer); m_fpr.SetByteOrder(fpregset.GetByteOrder()); + m_vec_buffer.reset(new DataBufferHeap(vregset.GetDataStart(), vregset.GetByteSize())); + m_vec.SetData(m_vec_buffer); + m_vec.SetByteOrder(fpregset.GetByteOrder()); } RegisterContextCorePOSIX_powerpc::~RegisterContextCorePOSIX_powerpc() @@ -46,6 +50,12 @@ RegisterContextCorePOSIX_powerpc::ReadFPR() } bool +RegisterContextCorePOSIX_powerpc::ReadVMX() +{ + return true; +} + +bool RegisterContextCorePOSIX_powerpc::WriteGPR() { assert(0); @@ -60,16 +70,31 @@ RegisterContextCorePOSIX_powerpc::WriteFPR() } bool +RegisterContextCorePOSIX_powerpc::WriteVMX() +{ + assert(0); + return false; +} + +bool RegisterContextCorePOSIX_powerpc::ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) { lldb::offset_t offset = reg_info->byte_offset; - if (reg_info->name[0] == 'f') { + if (IsFPR(reg_info->kinds[lldb::eRegisterKindLLDB])) { uint64_t v = m_fpr.GetMaxU64(&offset, reg_info->byte_size); if (offset == reg_info->byte_offset + reg_info->byte_size) { value = v; return true; } + } else if (IsVMX(reg_info->kinds[lldb::eRegisterKindLLDB])) { + uint32_t v[4]; + offset = m_vec.CopyData(offset, reg_info->byte_size, &v); + if (offset == reg_info->byte_size) + { + value.SetBytes(v, reg_info->byte_size, m_vec.GetByteOrder()); + return true; + } } else { uint64_t v = m_gpr.GetMaxU64(&offset, reg_info->byte_size); if (offset == reg_info->byte_offset + reg_info->byte_size) diff --git a/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h b/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h index e657558..a359060 100644 --- a/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h +++ b/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_powerpc.h @@ -20,7 +20,8 @@ public: RegisterContextCorePOSIX_powerpc (lldb_private::Thread &thread, lldb_private::RegisterInfoInterface *register_info, const lldb_private::DataExtractor &gpregset, - const lldb_private::DataExtractor &fpregset); + const lldb_private::DataExtractor &fpregset, + const lldb_private::DataExtractor &vregset); ~RegisterContextCorePOSIX_powerpc(); @@ -47,16 +48,24 @@ protected: ReadFPR(); bool + ReadVMX(); + + bool WriteGPR(); bool WriteFPR(); + bool + WriteVMX(); + private: lldb::DataBufferSP m_gpr_buffer; lldb::DataBufferSP m_fpr_buffer; + lldb::DataBufferSP m_vec_buffer; lldb_private::DataExtractor m_gpr; lldb_private::DataExtractor m_fpr; + lldb_private::DataExtractor m_vec; }; #endif // #ifndef liblldb_RegisterContextCorePOSIX_powerpc_H_ diff --git a/source/Plugins/Process/elf-core/ThreadElfCore.cpp b/source/Plugins/Process/elf-core/ThreadElfCore.cpp index d62bcfc..b16335f 100644 --- a/source/Plugins/Process/elf-core/ThreadElfCore.cpp +++ b/source/Plugins/Process/elf-core/ThreadElfCore.cpp @@ -38,7 +38,8 @@ ThreadElfCore::ThreadElfCore (Process &process, tid_t tid, m_thread_reg_ctx_sp (), m_signo(td.signo), m_gpregset_data(td.gpregset), - m_fpregset_data(td.fpregset) + m_fpregset_data(td.fpregset), + m_vregset_data(td.vregset) { } @@ -148,7 +149,7 @@ ThreadElfCore::CreateRegisterContextForFrame (StackFrame *frame) break; case llvm::Triple::ppc: case llvm::Triple::ppc64: - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_powerpc (*this, reg_interface, m_gpregset_data, m_fpregset_data)); + m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_powerpc (*this, reg_interface, m_gpregset_data, m_fpregset_data, m_vregset_data)); break; case llvm::Triple::x86: case llvm::Triple::x86_64: diff --git a/source/Plugins/Process/elf-core/ThreadElfCore.h b/source/Plugins/Process/elf-core/ThreadElfCore.h index f1f00cf..50502c1 100644 --- a/source/Plugins/Process/elf-core/ThreadElfCore.h +++ b/source/Plugins/Process/elf-core/ThreadElfCore.h @@ -111,6 +111,7 @@ struct ThreadData { lldb_private::DataExtractor gpregset; lldb_private::DataExtractor fpregset; + lldb_private::DataExtractor vregset; int signo; std::string name; }; @@ -170,6 +171,7 @@ protected: lldb_private::DataExtractor m_gpregset_data; lldb_private::DataExtractor m_fpregset_data; + lldb_private::DataExtractor m_vregset_data; virtual bool CalculateStopInfo(); |