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