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