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 ®_value) override; 50 51 bool 52 WriteRegister(const RegisterInfo *reg_info, const RegisterValue ®_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 ®_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 ®_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