1 //===-- RegisterContextThreadMemory.cpp -------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Target/OperatingSystem.h"
11 #include "lldb/Target/Process.h"
12 #include "lldb/Target/Thread.h"
13 #include "lldb/Utility/Status.h"
14 #include "lldb/lldb-private.h"
16 #include "RegisterContextThreadMemory.h"
19 using namespace lldb_private;
21 RegisterContextThreadMemory::RegisterContextThreadMemory(
22 Thread &thread, lldb::addr_t register_data_addr)
23 : RegisterContext(thread, 0), m_thread_wp(thread.shared_from_this()),
24 m_reg_ctx_sp(), m_register_data_addr(register_data_addr), m_stop_id(0) {}
26 RegisterContextThreadMemory::~RegisterContextThreadMemory() {}
28 void RegisterContextThreadMemory::UpdateRegisterContext() {
29 ThreadSP thread_sp(m_thread_wp.lock());
31 ProcessSP process_sp(thread_sp->GetProcess());
34 const uint32_t stop_id = process_sp->GetModID().GetStopID();
35 if (m_stop_id != stop_id) {
40 ThreadSP backing_thread_sp(thread_sp->GetBackingThread());
41 if (backing_thread_sp) {
42 m_reg_ctx_sp = backing_thread_sp->GetRegisterContext();
44 OperatingSystem *os = process_sp->GetOperatingSystem();
45 if (os->IsOperatingSystemPluginThread(thread_sp))
46 m_reg_ctx_sp = os->CreateRegisterContextForThread(
47 thread_sp.get(), m_register_data_addr);
58 //------------------------------------------------------------------
59 // Subclasses must override these functions
60 //------------------------------------------------------------------
61 void RegisterContextThreadMemory::InvalidateAllRegisters() {
62 UpdateRegisterContext();
64 m_reg_ctx_sp->InvalidateAllRegisters();
67 size_t RegisterContextThreadMemory::GetRegisterCount() {
68 UpdateRegisterContext();
70 return m_reg_ctx_sp->GetRegisterCount();
75 RegisterContextThreadMemory::GetRegisterInfoAtIndex(size_t reg) {
76 UpdateRegisterContext();
78 return m_reg_ctx_sp->GetRegisterInfoAtIndex(reg);
82 size_t RegisterContextThreadMemory::GetRegisterSetCount() {
83 UpdateRegisterContext();
85 return m_reg_ctx_sp->GetRegisterSetCount();
89 const RegisterSet *RegisterContextThreadMemory::GetRegisterSet(size_t reg_set) {
90 UpdateRegisterContext();
92 return m_reg_ctx_sp->GetRegisterSet(reg_set);
96 bool RegisterContextThreadMemory::ReadRegister(const RegisterInfo *reg_info,
97 RegisterValue ®_value) {
98 UpdateRegisterContext();
100 return m_reg_ctx_sp->ReadRegister(reg_info, reg_value);
104 bool RegisterContextThreadMemory::WriteRegister(
105 const RegisterInfo *reg_info, const RegisterValue ®_value) {
106 UpdateRegisterContext();
108 return m_reg_ctx_sp->WriteRegister(reg_info, reg_value);
112 bool RegisterContextThreadMemory::ReadAllRegisterValues(
113 lldb::DataBufferSP &data_sp) {
114 UpdateRegisterContext();
116 return m_reg_ctx_sp->ReadAllRegisterValues(data_sp);
120 bool RegisterContextThreadMemory::WriteAllRegisterValues(
121 const lldb::DataBufferSP &data_sp) {
122 UpdateRegisterContext();
124 return m_reg_ctx_sp->WriteAllRegisterValues(data_sp);
128 bool RegisterContextThreadMemory::CopyFromRegisterContext(
129 lldb::RegisterContextSP reg_ctx_sp) {
130 UpdateRegisterContext();
132 return m_reg_ctx_sp->CopyFromRegisterContext(reg_ctx_sp);
136 uint32_t RegisterContextThreadMemory::ConvertRegisterKindToRegisterNumber(
137 lldb::RegisterKind kind, uint32_t num) {
138 UpdateRegisterContext();
140 return m_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(kind, num);
144 uint32_t RegisterContextThreadMemory::NumSupportedHardwareBreakpoints() {
145 UpdateRegisterContext();
147 return m_reg_ctx_sp->NumSupportedHardwareBreakpoints();
151 uint32_t RegisterContextThreadMemory::SetHardwareBreakpoint(lldb::addr_t addr,
153 UpdateRegisterContext();
155 return m_reg_ctx_sp->SetHardwareBreakpoint(addr, size);
159 bool RegisterContextThreadMemory::ClearHardwareBreakpoint(uint32_t hw_idx) {
160 UpdateRegisterContext();
162 return m_reg_ctx_sp->ClearHardwareBreakpoint(hw_idx);
166 uint32_t RegisterContextThreadMemory::NumSupportedHardwareWatchpoints() {
167 UpdateRegisterContext();
169 return m_reg_ctx_sp->NumSupportedHardwareWatchpoints();
173 uint32_t RegisterContextThreadMemory::SetHardwareWatchpoint(lldb::addr_t addr,
177 UpdateRegisterContext();
179 return m_reg_ctx_sp->SetHardwareWatchpoint(addr, size, read, write);
183 bool RegisterContextThreadMemory::ClearHardwareWatchpoint(uint32_t hw_index) {
184 UpdateRegisterContext();
186 return m_reg_ctx_sp->ClearHardwareWatchpoint(hw_index);
190 bool RegisterContextThreadMemory::HardwareSingleStep(bool enable) {
191 UpdateRegisterContext();
193 return m_reg_ctx_sp->HardwareSingleStep(enable);
197 Status RegisterContextThreadMemory::ReadRegisterValueFromMemory(
198 const lldb_private::RegisterInfo *reg_info, lldb::addr_t src_addr,
199 uint32_t src_len, RegisterValue ®_value) {
200 UpdateRegisterContext();
202 return m_reg_ctx_sp->ReadRegisterValueFromMemory(reg_info, src_addr,
205 error.SetErrorString("invalid register context");
209 Status RegisterContextThreadMemory::WriteRegisterValueToMemory(
210 const lldb_private::RegisterInfo *reg_info, lldb::addr_t dst_addr,
211 uint32_t dst_len, const RegisterValue ®_value) {
212 UpdateRegisterContext();
214 return m_reg_ctx_sp->WriteRegisterValueToMemory(reg_info, dst_addr, dst_len,
217 error.SetErrorString("invalid register context");