1 //===-- RegisterContextThreadMemory.h ---------------------------*- 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 #ifndef lldb_RegisterContextThreadMemory_h_
11 #define lldb_RegisterContextThreadMemory_h_
17 // Other libraries and framework includes
19 #include "lldb/Symbol/SymbolContext.h"
20 #include "lldb/Target/RegisterContext.h"
21 #include "lldb/lldb-private.h"
23 namespace lldb_private {
25 class RegisterContextThreadMemory : public lldb_private::RegisterContext {
27 RegisterContextThreadMemory(Thread &thread, lldb::addr_t register_data_addr);
29 ~RegisterContextThreadMemory() override;
31 void InvalidateAllRegisters() override;
33 size_t GetRegisterCount() override;
35 const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
37 size_t GetRegisterSetCount() override;
39 const RegisterSet *GetRegisterSet(size_t reg_set) override;
41 bool ReadRegister(const RegisterInfo *reg_info,
42 RegisterValue ®_value) override;
44 bool WriteRegister(const RegisterInfo *reg_info,
45 const RegisterValue ®_value) override;
47 // These two functions are used to implement "push" and "pop" of register
48 // states. They are used primarily
49 // for expression evaluation, where we need to push a new state (storing the
50 // old one in data_sp) and then
51 // restoring the original state by passing the data_sp we got from
52 // ReadAllRegisters to WriteAllRegisterValues.
53 // ReadAllRegisters will do what is necessary to return a coherent set of
54 // register values for this thread, which
55 // may mean e.g. interrupting a thread that is sitting in a kernel trap. That
56 // is a somewhat disruptive operation,
57 // so these API's should only be used when this behavior is needed.
59 bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
61 bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
63 bool CopyFromRegisterContext(lldb::RegisterContextSP context);
65 uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
66 uint32_t num) override;
68 uint32_t NumSupportedHardwareBreakpoints() override;
70 uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;
72 bool ClearHardwareBreakpoint(uint32_t hw_idx) override;
74 uint32_t NumSupportedHardwareWatchpoints() override;
76 uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read,
79 bool ClearHardwareWatchpoint(uint32_t hw_index) override;
81 bool HardwareSingleStep(bool enable) override;
83 Status ReadRegisterValueFromMemory(const lldb_private::RegisterInfo *reg_info,
84 lldb::addr_t src_addr, uint32_t src_len,
85 RegisterValue ®_value) override;
87 Status WriteRegisterValueToMemory(const lldb_private::RegisterInfo *reg_info,
88 lldb::addr_t dst_addr, uint32_t dst_len,
89 const RegisterValue ®_value) override;
92 void UpdateRegisterContext();
94 lldb::ThreadWP m_thread_wp;
95 lldb::RegisterContextSP m_reg_ctx_sp;
96 lldb::addr_t m_register_data_addr;
100 DISALLOW_COPY_AND_ASSIGN(RegisterContextThreadMemory);
103 } // namespace lldb_private
105 #endif // lldb_RegisterContextThreadMemory_h_