This revision was automatically updated to reflect the committed changes. Closed by commit rL288038: Fix floating point register reads x86_64 linux on targets with no AVX support (authored by labath).
Changed prior to commit: https://reviews.llvm.org/D27161?vs=79388&id=79405#toc Repository: rL LLVM https://reviews.llvm.org/D27161 Files: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp Index: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp =================================================================== --- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp +++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp @@ -20,6 +20,8 @@ #include "Plugins/Process/Utility/RegisterContextLinux_i386.h" #include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h" +#include <linux/elf.h> + using namespace lldb_private; using namespace lldb_private::process_linux; @@ -218,6 +220,12 @@ #define NT_PRXFPREG 0x46e62b7f #endif +// On x86_64 NT_PRFPREG is used to access the FXSAVE area. On i386, we need to +// use NT_PRXFPREG. +static inline unsigned int fxsr_regset(const ArchSpec &arch) { + return arch.GetAddressByteSize() == 8 ? NT_PRFPREG : NT_PRXFPREG; +} + // ---------------------------------------------------------------------------- // Required MPX define. // ---------------------------------------------------------------------------- @@ -852,8 +860,9 @@ Error NativeRegisterContextLinux_x86_64::WriteFPR() { switch (m_xstate_type) { case XStateType::FXSAVE: - return WriteRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave), - NT_PRXFPREG); + return WriteRegisterSet( + &m_iovec, sizeof(m_fpr.xstate.xsave), + fxsr_regset(GetRegisterInfoInterface().GetTargetArchitecture())); case XStateType::XSAVE: return WriteRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave), NT_X86_XSTATE); @@ -957,7 +966,9 @@ return error; } } - error = ReadRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave), NT_PRXFPREG); + error = ReadRegisterSet( + &m_iovec, sizeof(m_fpr.xstate.xsave), + fxsr_regset(GetRegisterInfoInterface().GetTargetArchitecture())); if (!error.Fail()) { m_xstate_type = XStateType::FXSAVE; return error;
Index: lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp =================================================================== --- lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp +++ lldb/trunk/source/Plugins/Process/Linux/NativeRegisterContextLinux_x86_64.cpp @@ -20,6 +20,8 @@ #include "Plugins/Process/Utility/RegisterContextLinux_i386.h" #include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h" +#include <linux/elf.h> + using namespace lldb_private; using namespace lldb_private::process_linux; @@ -218,6 +220,12 @@ #define NT_PRXFPREG 0x46e62b7f #endif +// On x86_64 NT_PRFPREG is used to access the FXSAVE area. On i386, we need to +// use NT_PRXFPREG. +static inline unsigned int fxsr_regset(const ArchSpec &arch) { + return arch.GetAddressByteSize() == 8 ? NT_PRFPREG : NT_PRXFPREG; +} + // ---------------------------------------------------------------------------- // Required MPX define. // ---------------------------------------------------------------------------- @@ -852,8 +860,9 @@ Error NativeRegisterContextLinux_x86_64::WriteFPR() { switch (m_xstate_type) { case XStateType::FXSAVE: - return WriteRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave), - NT_PRXFPREG); + return WriteRegisterSet( + &m_iovec, sizeof(m_fpr.xstate.xsave), + fxsr_regset(GetRegisterInfoInterface().GetTargetArchitecture())); case XStateType::XSAVE: return WriteRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave), NT_X86_XSTATE); @@ -957,7 +966,9 @@ return error; } } - error = ReadRegisterSet(&m_iovec, sizeof(m_fpr.xstate.xsave), NT_PRXFPREG); + error = ReadRegisterSet( + &m_iovec, sizeof(m_fpr.xstate.xsave), + fxsr_regset(GetRegisterInfoInterface().GetTargetArchitecture())); if (!error.Fail()) { m_xstate_type = XStateType::FXSAVE; return error;
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits