diff options
Diffstat (limited to 'lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp | 114 |
1 files changed, 113 insertions, 1 deletions
diff --git a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp index e9586a84a74..de24872ae22 100644 --- a/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp @@ -762,6 +762,47 @@ namespace #endif } +#if defined (__arm64__) || defined (__aarch64__) + //------------------------------------------------------------------------------ + /// @class ReadDBGROperation + /// @brief Implements NativeProcessLinux::ReadDBGR. + class ReadDBGROperation : public Operation + { + public: + ReadDBGROperation(lldb::tid_t tid, unsigned int &count_wp, unsigned int &count_bp) + : m_tid(tid), + m_count_wp(count_wp), + m_count_bp(count_bp) + { } + + void Execute(NativeProcessLinux *monitor) override; + + private: + lldb::tid_t m_tid; + unsigned int &m_count_wp; + unsigned int &m_count_bp; + }; + + void + ReadDBGROperation::Execute(NativeProcessLinux *monitor) + { + int regset = NT_ARM_HW_WATCH; + struct iovec ioVec; + struct user_hwdebug_state dreg_state; + + ioVec.iov_base = &dreg_state; + ioVec.iov_len = sizeof (dreg_state); + + PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, ioVec.iov_len, m_error); + + m_count_wp = dreg_state.dbg_info & 0xff; + regset = NT_ARM_HW_BREAK; + + PTRACE(PTRACE_GETREGSET, m_tid, ®set, &ioVec, ioVec.iov_len, m_error); + m_count_bp = dreg_state.dbg_info & 0xff; + } +#endif + //------------------------------------------------------------------------------ /// @class ReadRegisterSetOperation /// @brief Implements NativeProcessLinux::ReadRegisterSet. @@ -853,6 +894,57 @@ namespace #endif } +#if defined (__arm64__) || defined (__aarch64__) + //------------------------------------------------------------------------------ + /// @class WriteDBGROperation + /// @brief Implements NativeProcessLinux::WriteFPR. + class WriteDBGROperation : public Operation + { + public: + WriteDBGROperation(lldb::tid_t tid, lldb::addr_t *addr_buf, + uint32_t *cntrl_buf, int type, int count) + : m_tid(tid), + m_address(addr_buf), + m_control(cntrl_buf), + m_type(type), + m_count(count) + { } + + void Execute(NativeProcessLinux *monitor) override; + + private: + lldb::tid_t m_tid; + lldb::addr_t * m_address; + uint32_t * m_control; + int m_type; + int m_count; + }; + + void + WriteDBGROperation::Execute(NativeProcessLinux *monitor) + { + struct iovec ioVec; + struct user_hwdebug_state dreg_state; + + memset (&dreg_state, 0, sizeof (dreg_state)); + ioVec.iov_len = (__builtin_offsetof (struct user_hwdebug_state, dbg_regs[m_count - 1]) + + sizeof (dreg_state.dbg_regs [m_count - 1])); + + if (m_type == 0) + m_type = NT_ARM_HW_WATCH; + else + m_type = NT_ARM_HW_BREAK; + + for (int i = 0; i < m_count; i++) + { + dreg_state.dbg_regs[i].addr = m_address[i]; + dreg_state.dbg_regs[i].ctrl = m_control[i]; + } + + PTRACE(PTRACE_SETREGSET, m_tid, &m_type, &ioVec, ioVec.iov_len, m_error); + } +#endif + //------------------------------------------------------------------------------ /// @class WriteRegisterSetOperation /// @brief Implements NativeProcessLinux::WriteRegisterSet. @@ -2436,7 +2528,7 @@ NativeProcessLinux::MonitorSIGTRAP(const siginfo_t *info, lldb::pid_t pid) { // If a watchpoint was hit, report it uint32_t wp_index; - Error error = thread_sp->GetRegisterContext()->GetWatchpointHitIndex(wp_index); + Error error = thread_sp->GetRegisterContext()->GetWatchpointHitIndex(wp_index, (lldb::addr_t)info->si_addr); if (error.Fail() && log) log->Printf("NativeProcessLinux::%s() " "received error while checking for watchpoint hits, " @@ -3841,6 +3933,26 @@ NativeProcessLinux::ReadRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, return op.GetError(); } +#if defined (__arm64__) || defined (__aarch64__) + +Error +NativeProcessLinux::ReadHardwareDebugInfo (lldb::tid_t tid, unsigned int &watch_count , unsigned int &break_count) +{ + ReadDBGROperation op(tid, watch_count, break_count); + m_monitor_up->DoOperation(&op); + return op.GetError(); +} + +Error +NativeProcessLinux::WriteHardwareDebugRegs (lldb::tid_t tid, lldb::addr_t *addr_buf, uint32_t *cntrl_buf, int type, int count) +{ + WriteDBGROperation op(tid, addr_buf, cntrl_buf, type, count); + m_monitor_up->DoOperation(&op); + return op.GetError(); +} + +#endif + Error NativeProcessLinux::WriteGPR(lldb::tid_t tid, void *buf, size_t buf_size) { |