diff options
Diffstat (limited to 'lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_mips64.cpp')
| -rw-r--r-- | lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_mips64.cpp | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_mips64.cpp b/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_mips64.cpp index 8e722c09314c..d93b7fd33815 100644 --- a/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_mips64.cpp +++ b/lldb/source/Plugins/Process/FreeBSD/NativeRegisterContextFreeBSD_mips64.cpp @@ -15,6 +15,7 @@ #include "lldb/Utility/Status.h" #include "Plugins/Process/FreeBSD/NativeProcessFreeBSD.h" +#include "Plugins/Process/Utility/lldb-mips-freebsd-register-enums.h" // clang-format off #include <sys/param.h> @@ -59,11 +60,32 @@ uint32_t NativeRegisterContextFreeBSD_mips64::GetUserRegisterCount() const { return count; } +llvm::Optional<NativeRegisterContextFreeBSD_mips64::RegSetKind> +NativeRegisterContextFreeBSD_mips64::GetSetForNativeRegNum( + uint32_t reg_num) const { + switch (GetRegisterInfoInterface().GetTargetArchitecture().GetMachine()) { + case llvm::Triple::mips64: + if (reg_num >= k_first_gpr_mips64 && reg_num <= k_last_gpr_mips64) + return GPRegSet; + if (reg_num >= k_first_fpr_mips64 && reg_num <= k_last_fpr_mips64) + return FPRegSet; + break; + default: + llvm_unreachable("Unhandled target architecture."); + } + + llvm_unreachable("Register does not belong to any register set"); +} + Status NativeRegisterContextFreeBSD_mips64::ReadRegisterSet(RegSetKind set) { switch (set) { case GPRegSet: return NativeProcessFreeBSD::PtraceWrapper(PT_GETREGS, m_thread.GetID(), m_reg_data.data()); + case FPRegSet: + return NativeProcessFreeBSD::PtraceWrapper( + PT_GETFPREGS, m_thread.GetID(), + m_reg_data.data() + GetRegisterInfo().GetGPRSize()); } llvm_unreachable("NativeRegisterContextFreeBSD_mips64::ReadRegisterSet"); } @@ -73,6 +95,10 @@ Status NativeRegisterContextFreeBSD_mips64::WriteRegisterSet(RegSetKind set) { case GPRegSet: return NativeProcessFreeBSD::PtraceWrapper(PT_SETREGS, m_thread.GetID(), m_reg_data.data()); + case FPRegSet: + return NativeProcessFreeBSD::PtraceWrapper( + PT_SETFPREGS, m_thread.GetID(), + m_reg_data.data() + GetRegisterInfo().GetGPRSize()); } llvm_unreachable("NativeRegisterContextFreeBSD_mips64::WriteRegisterSet"); } @@ -94,7 +120,16 @@ NativeRegisterContextFreeBSD_mips64::ReadRegister(const RegisterInfo *reg_info, ? reg_info->name : "<unknown register>"); - RegSetKind set = GPRegSet; + llvm::Optional<RegSetKind> opt_set = GetSetForNativeRegNum(reg); + if (!opt_set) { + // This is likely an internal register for lldb use only and should not be + // directly queried. + error.SetErrorStringWithFormat("register \"%s\" is in unrecognized set", + reg_info->name); + return error; + } + + RegSetKind set = opt_set.getValue(); error = ReadRegisterSet(set); if (error.Fail()) return error; @@ -119,7 +154,16 @@ Status NativeRegisterContextFreeBSD_mips64::WriteRegister( ? reg_info->name : "<unknown register>"); - RegSetKind set = GPRegSet; + llvm::Optional<RegSetKind> opt_set = GetSetForNativeRegNum(reg); + if (!opt_set) { + // This is likely an internal register for lldb use only and should not be + // directly queried. + error.SetErrorStringWithFormat("register \"%s\" is in unrecognized set", + reg_info->name); + return error; + } + + RegSetKind set = opt_set.getValue(); error = ReadRegisterSet(set); if (error.Fail()) return error; @@ -139,6 +183,10 @@ Status NativeRegisterContextFreeBSD_mips64::ReadAllRegisterValues( if (error.Fail()) return error; + error = ReadRegisterSet(FPRegSet); + if (error.Fail()) + return error; + data_sp.reset(new DataBufferHeap(m_reg_data.size(), 0)); uint8_t *dst = data_sp->GetBytes(); ::memcpy(dst, m_reg_data.data(), m_reg_data.size()); @@ -175,7 +223,11 @@ Status NativeRegisterContextFreeBSD_mips64::WriteAllRegisterValues( } ::memcpy(m_reg_data.data(), src, m_reg_data.size()); - return WriteRegisterSet(GPRegSet); + error = WriteRegisterSet(GPRegSet); + if (error.Fail()) + return error; + + return WriteRegisterSet(FPRegSet); } llvm::Error NativeRegisterContextFreeBSD_mips64::CopyHardwareWatchpointsFrom( |
