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/lldb-private.h"
11 #include "lldb/Core/Error.h"
12 #include "lldb/Target/OperatingSystem.h"
13 #include "lldb/Target/Process.h"
14 #include "lldb/Target/Thread.h"
16 #include "RegisterContextThreadMemory.h"
19 using namespace lldb_private;
21 RegisterContextThreadMemory::RegisterContextThreadMemory (Thread &thread,
22 lldb::addr_t register_data_addr) :
23 RegisterContext (thread, 0),
24 m_thread_wp (thread.shared_from_this()),
26 m_register_data_addr (register_data_addr),
31 RegisterContextThreadMemory::~RegisterContextThreadMemory()
36 RegisterContextThreadMemory::UpdateRegisterContext ()
38 ThreadSP thread_sp (m_thread_wp.lock());
41 ProcessSP process_sp (thread_sp->GetProcess());
45 const uint32_t stop_id = process_sp->GetModID().GetStopID();
46 if (m_stop_id != stop_id)
53 ThreadSP backing_thread_sp (thread_sp->GetBackingThread());
54 if (backing_thread_sp)
56 m_reg_ctx_sp = backing_thread_sp->GetRegisterContext();
60 OperatingSystem *os = process_sp->GetOperatingSystem ();
61 if (os->IsOperatingSystemPluginThread (thread_sp))
62 m_reg_ctx_sp = os->CreateRegisterContextForThread (thread_sp.get(), LLDB_INVALID_ADDRESS);
77 //------------------------------------------------------------------
78 // Subclasses must override these functions
79 //------------------------------------------------------------------
81 RegisterContextThreadMemory::InvalidateAllRegisters ()
83 UpdateRegisterContext ();
85 m_reg_ctx_sp->InvalidateAllRegisters();
89 RegisterContextThreadMemory::GetRegisterCount ()
91 UpdateRegisterContext ();
93 return m_reg_ctx_sp->GetRegisterCount();
98 RegisterContextThreadMemory::GetRegisterInfoAtIndex (size_t reg)
100 UpdateRegisterContext ();
102 return m_reg_ctx_sp->GetRegisterInfoAtIndex(reg);
107 RegisterContextThreadMemory::GetRegisterSetCount ()
109 UpdateRegisterContext ();
111 return m_reg_ctx_sp->GetRegisterSetCount();
116 RegisterContextThreadMemory::GetRegisterSet (size_t reg_set)
118 UpdateRegisterContext ();
120 return m_reg_ctx_sp->GetRegisterSet(reg_set);
125 RegisterContextThreadMemory::ReadRegister (const RegisterInfo *reg_info, RegisterValue ®_value)
127 UpdateRegisterContext ();
129 return m_reg_ctx_sp->ReadRegister(reg_info, reg_value);
134 RegisterContextThreadMemory::WriteRegister (const RegisterInfo *reg_info, const RegisterValue ®_value)
136 UpdateRegisterContext ();
138 return m_reg_ctx_sp->WriteRegister (reg_info, reg_value);
143 RegisterContextThreadMemory::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
145 UpdateRegisterContext ();
147 return m_reg_ctx_sp->ReadAllRegisterValues(data_sp);
152 RegisterContextThreadMemory::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp)
154 UpdateRegisterContext ();
156 return m_reg_ctx_sp->WriteAllRegisterValues (data_sp);
161 RegisterContextThreadMemory::CopyFromRegisterContext (lldb::RegisterContextSP reg_ctx_sp)
163 UpdateRegisterContext ();
165 return m_reg_ctx_sp->CopyFromRegisterContext(reg_ctx_sp);
170 RegisterContextThreadMemory::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num)
172 UpdateRegisterContext ();
174 return m_reg_ctx_sp->ConvertRegisterKindToRegisterNumber(kind, num);
179 RegisterContextThreadMemory::NumSupportedHardwareBreakpoints ()
181 UpdateRegisterContext ();
183 return m_reg_ctx_sp->NumSupportedHardwareBreakpoints();
188 RegisterContextThreadMemory::SetHardwareBreakpoint (lldb::addr_t addr, size_t size)
190 UpdateRegisterContext ();
192 return m_reg_ctx_sp->SetHardwareBreakpoint(addr, size);
197 RegisterContextThreadMemory::ClearHardwareBreakpoint (uint32_t hw_idx)
199 UpdateRegisterContext ();
201 return m_reg_ctx_sp->ClearHardwareBreakpoint (hw_idx);
206 RegisterContextThreadMemory::NumSupportedHardwareWatchpoints ()
208 UpdateRegisterContext ();
210 return m_reg_ctx_sp->NumSupportedHardwareWatchpoints();
215 RegisterContextThreadMemory::SetHardwareWatchpoint (lldb::addr_t addr, size_t size, bool read, bool write)
217 UpdateRegisterContext ();
219 return m_reg_ctx_sp->SetHardwareWatchpoint(addr, size, read, write);
224 RegisterContextThreadMemory::ClearHardwareWatchpoint (uint32_t hw_index)
226 UpdateRegisterContext ();
228 return m_reg_ctx_sp->ClearHardwareWatchpoint(hw_index);
233 RegisterContextThreadMemory::HardwareSingleStep (bool enable)
235 UpdateRegisterContext ();
237 return m_reg_ctx_sp->HardwareSingleStep(enable);
242 RegisterContextThreadMemory::ReadRegisterValueFromMemory (const lldb_private::RegisterInfo *reg_info, lldb::addr_t src_addr, uint32_t src_len, RegisterValue ®_value)
244 UpdateRegisterContext ();
246 return m_reg_ctx_sp->ReadRegisterValueFromMemory (reg_info, src_addr, src_len, reg_value);
248 error.SetErrorString("invalid register context");
253 RegisterContextThreadMemory::WriteRegisterValueToMemory (const lldb_private::RegisterInfo *reg_info, lldb::addr_t dst_addr, uint32_t dst_len, const RegisterValue ®_value)
255 UpdateRegisterContext ();
257 return m_reg_ctx_sp->WriteRegisterValueToMemory (reg_info, dst_addr, dst_len, reg_value);
259 error.SetErrorString("invalid register context");