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