diff options
Diffstat (limited to 'source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp')
-rw-r--r-- | source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp | 127 |
1 files changed, 63 insertions, 64 deletions
diff --git a/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp b/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp index 926c7aff3603..7f8223f7752e 100644 --- a/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp +++ b/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.cpp @@ -1,4 +1,4 @@ -//===-- RegisterContextCorePOSIX_x86_64.cpp ---------------------*- C++ -*-===// +//===-- RegisterContextPOSIXCore_x86_64.cpp ---------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,93 +7,92 @@ // //===----------------------------------------------------------------------===// +#include "RegisterContextPOSIXCore_x86_64.h" #include "lldb/Core/DataExtractor.h" #include "lldb/Core/RegisterValue.h" #include "lldb/Target/Thread.h" -#include "RegisterContextPOSIXCore_x86_64.h" using namespace lldb_private; -RegisterContextCorePOSIX_x86_64::RegisterContextCorePOSIX_x86_64(Thread &thread, - RegisterInfoInterface *register_info, - const DataExtractor &gpregset, - const DataExtractor &fpregset) - : RegisterContextPOSIX_x86 (thread, 0, register_info) -{ - size_t size, len; - - size = GetGPRSize(); - m_gpregset = new uint8_t[size]; - len = gpregset.ExtractBytes (0, size, lldb::eByteOrderLittle, m_gpregset); - assert(len == size); -} +RegisterContextCorePOSIX_x86_64::RegisterContextCorePOSIX_x86_64( + Thread &thread, RegisterInfoInterface *register_info, + const DataExtractor &gpregset, const DataExtractor &fpregset) + : RegisterContextPOSIX_x86(thread, 0, register_info) { + size_t size, len; + + size = GetGPRSize(); + m_gpregset.reset(new uint8_t[size]); + len = + gpregset.ExtractBytes(0, size, lldb::eByteOrderLittle, m_gpregset.get()); + if (len != size) + m_gpregset.reset(); -RegisterContextCorePOSIX_x86_64::~RegisterContextCorePOSIX_x86_64() -{ - delete [] m_gpregset; + size = sizeof(FXSAVE); + m_fpregset.reset(new uint8_t[size]); + len = + fpregset.ExtractBytes(0, size, lldb::eByteOrderLittle, m_fpregset.get()); + if (len != size) + m_fpregset.reset(); } -bool -RegisterContextCorePOSIX_x86_64::ReadGPR() -{ - return m_gpregset != NULL; +bool RegisterContextCorePOSIX_x86_64::ReadGPR() { + return m_gpregset != nullptr; } -bool -RegisterContextCorePOSIX_x86_64::ReadFPR() -{ - return false; +bool RegisterContextCorePOSIX_x86_64::ReadFPR() { + return m_fpregset != nullptr; } -bool -RegisterContextCorePOSIX_x86_64::WriteGPR() -{ - assert(0); - return false; +bool RegisterContextCorePOSIX_x86_64::WriteGPR() { + assert(0); + return false; } -bool -RegisterContextCorePOSIX_x86_64::WriteFPR() -{ - assert(0); - return false; +bool RegisterContextCorePOSIX_x86_64::WriteFPR() { + assert(0); + return false; } -bool -RegisterContextCorePOSIX_x86_64::ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) -{ - switch (reg_info->byte_size) - { - case 4: - value = *(uint32_t *)(m_gpregset + reg_info->byte_offset); - return true; - case 8: - value = *(uint64_t *)(m_gpregset + reg_info->byte_offset); - return true; - } +bool RegisterContextCorePOSIX_x86_64::ReadRegister(const RegisterInfo *reg_info, + RegisterValue &value) { + const uint8_t *src; + size_t offset; + const size_t fxsave_offset = reg_info->byte_offset - GetFXSAVEOffset(); + // make the offset relative to the beginning of the FXSAVE structure + // because this is the data that we have (not the entire UserArea) + + if (m_gpregset && reg_info->byte_offset < GetGPRSize()) { + src = m_gpregset.get(); + offset = reg_info->byte_offset; + } else if (m_fpregset && fxsave_offset < sizeof(FXSAVE)) { + src = m_fpregset.get(); + offset = fxsave_offset; + } else { return false; + } + + Error error; + value.SetFromMemoryData(reg_info, src + offset, reg_info->byte_size, + lldb::eByteOrderLittle, error); + + return error.Success(); } -bool -RegisterContextCorePOSIX_x86_64::ReadAllRegisterValues(lldb::DataBufferSP &data_sp) -{ - return false; +bool RegisterContextCorePOSIX_x86_64::ReadAllRegisterValues( + lldb::DataBufferSP &data_sp) { + return false; } -bool -RegisterContextCorePOSIX_x86_64::WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) -{ - return false; +bool RegisterContextCorePOSIX_x86_64::WriteRegister( + const RegisterInfo *reg_info, const RegisterValue &value) { + return false; } -bool -RegisterContextCorePOSIX_x86_64::WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) -{ - return false; +bool RegisterContextCorePOSIX_x86_64::WriteAllRegisterValues( + const lldb::DataBufferSP &data_sp) { + return false; } -bool -RegisterContextCorePOSIX_x86_64::HardwareSingleStep(bool enable) -{ - return false; +bool RegisterContextCorePOSIX_x86_64::HardwareSingleStep(bool enable) { + return false; } |