1 //===-- RegisterContextThreadMemory.h ---------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef lldb_RegisterContextThreadMemory_h_
11 #define lldb_RegisterContextThreadMemory_h_
12 
13 #include <vector>
14 
15 #include "lldb/Symbol/SymbolContext.h"
16 #include "lldb/Target/RegisterContext.h"
17 #include "lldb/lldb-private.h"
18 
19 namespace lldb_private {
20 
21 class RegisterContextThreadMemory : public lldb_private::RegisterContext {
22 public:
23   RegisterContextThreadMemory(Thread &thread, lldb::addr_t register_data_addr);
24 
25   ~RegisterContextThreadMemory() override;
26 
27   void InvalidateAllRegisters() override;
28 
29   size_t GetRegisterCount() override;
30 
31   const RegisterInfo *GetRegisterInfoAtIndex(size_t reg) override;
32 
33   size_t GetRegisterSetCount() override;
34 
35   const RegisterSet *GetRegisterSet(size_t reg_set) override;
36 
37   bool ReadRegister(const RegisterInfo *reg_info,
38                     RegisterValue &reg_value) override;
39 
40   bool WriteRegister(const RegisterInfo *reg_info,
41                      const RegisterValue &reg_value) override;
42 
43   // These two functions are used to implement "push" and "pop" of register
44   // states.  They are used primarily
45   // for expression evaluation, where we need to push a new state (storing the
46   // old one in data_sp) and then
47   // restoring the original state by passing the data_sp we got from
48   // ReadAllRegisters to WriteAllRegisterValues.
49   // ReadAllRegisters will do what is necessary to return a coherent set of
50   // register values for this thread, which
51   // may mean e.g. interrupting a thread that is sitting in a kernel trap.  That
52   // is a somewhat disruptive operation,
53   // so these API's should only be used when this behavior is needed.
54 
55   bool ReadAllRegisterValues(lldb::DataBufferSP &data_sp) override;
56 
57   bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override;
58 
59   bool CopyFromRegisterContext(lldb::RegisterContextSP context);
60 
61   uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
62                                                uint32_t num) override;
63 
64   uint32_t NumSupportedHardwareBreakpoints() override;
65 
66   uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size) override;
67 
68   bool ClearHardwareBreakpoint(uint32_t hw_idx) override;
69 
70   uint32_t NumSupportedHardwareWatchpoints() override;
71 
72   uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, bool read,
73                                  bool write) override;
74 
75   bool ClearHardwareWatchpoint(uint32_t hw_index) override;
76 
77   bool HardwareSingleStep(bool enable) override;
78 
79   Status ReadRegisterValueFromMemory(const lldb_private::RegisterInfo *reg_info,
80                                      lldb::addr_t src_addr, uint32_t src_len,
81                                      RegisterValue &reg_value) override;
82 
83   Status WriteRegisterValueToMemory(const lldb_private::RegisterInfo *reg_info,
84                                     lldb::addr_t dst_addr, uint32_t dst_len,
85                                     const RegisterValue &reg_value) override;
86 
87 protected:
88   void UpdateRegisterContext();
89 
90   lldb::ThreadWP m_thread_wp;
91   lldb::RegisterContextSP m_reg_ctx_sp;
92   lldb::addr_t m_register_data_addr;
93   uint32_t m_stop_id;
94 
95 private:
96   DISALLOW_COPY_AND_ASSIGN(RegisterContextThreadMemory);
97 };
98 
99 } // namespace lldb_private
100 
101 #endif // lldb_RegisterContextThreadMemory_h_
102