LLDB mainline
NativeRegisterContext.h
Go to the documentation of this file.
1//===-- NativeRegisterContext.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_HOST_COMMON_NATIVEREGISTERCONTEXT_H
10#define LLDB_HOST_COMMON_NATIVEREGISTERCONTEXT_H
11
14#include "lldb/lldb-private.h"
15
16namespace lldb_private {
17
19
20enum class ExpeditedRegs { Minimal, Full };
21
23 : public std::enable_shared_from_this<NativeRegisterContext> {
24public:
25 // Constructors and Destructors
27
29
30 // void
31 // InvalidateIfNeeded (bool force);
32
33 // Subclasses must override these functions
34 // virtual void
35 // InvalidateAllRegisters () = 0;
36
37 virtual uint32_t GetRegisterCount() const = 0;
38
39 virtual uint32_t GetUserRegisterCount() const = 0;
40
41 virtual const RegisterInfo *GetRegisterInfoAtIndex(uint32_t reg) const = 0;
42
43 const char *GetRegisterSetNameForRegisterAtIndex(uint32_t reg_index) const;
44
45 virtual uint32_t GetRegisterSetCount() const = 0;
46
47 virtual const RegisterSet *GetRegisterSet(uint32_t set_index) const = 0;
48
49 virtual Status ReadRegister(const RegisterInfo *reg_info,
50 RegisterValue &reg_value) = 0;
51
52 virtual Status WriteRegister(const RegisterInfo *reg_info,
53 const RegisterValue &reg_value) = 0;
54
56
58
59 uint32_t ConvertRegisterKindToRegisterNumber(uint32_t kind,
60 uint32_t num) const;
61
62 // Subclasses can override these functions if desired
63 virtual uint32_t NumSupportedHardwareBreakpoints();
64
65 virtual uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size);
66
67 virtual bool ClearHardwareBreakpoint(uint32_t hw_idx);
68
70
71 virtual Status GetHardwareBreakHitIndex(uint32_t &bp_index,
72 lldb::addr_t trap_addr);
73
74 virtual uint32_t NumSupportedHardwareWatchpoints();
75
76 virtual uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size,
77 uint32_t watch_flags);
78
79 virtual bool ClearHardwareWatchpoint(uint32_t hw_index);
80
81 virtual Status ClearWatchpointHit(uint32_t hw_index);
82
84
85 virtual Status IsWatchpointHit(uint32_t wp_index, bool &is_hit);
86
87 virtual Status GetWatchpointHitIndex(uint32_t &wp_index,
88 lldb::addr_t trap_addr);
89
90 virtual Status IsWatchpointVacant(uint32_t wp_index, bool &is_vacant);
91
92 virtual lldb::addr_t GetWatchpointAddress(uint32_t wp_index);
93
94 // MIPS Linux kernel returns a masked address (last 3bits are masked)
95 // when a HW watchpoint is hit. However user may not have set a watchpoint on
96 // this address. This function emulates the instruction at PC and finds the
97 // base address used in the load/store instruction. This gives the exact
98 // address used to read/write the variable being watched. For example: 'n' is
99 // at 0x120010d00 and 'm' is 0x120010d04. When a watchpoint is set at 'm',
100 // then watch exception is generated even when 'n' is read/written. This
101 // function returns address of 'n' so that client can check whether a
102 // watchpoint is set on this address or not.
103 virtual lldb::addr_t GetWatchpointHitAddress(uint32_t wp_index);
104
105 virtual bool HardwareSingleStep(bool enable);
106
107 virtual Status
109 lldb::addr_t src_addr, size_t src_len,
110 RegisterValue &reg_value);
111
112 virtual Status
114 lldb::addr_t dst_addr, size_t dst_len,
115 const RegisterValue &reg_value);
116
117 // Subclasses should not override these
118 virtual lldb::tid_t GetThreadID() const;
119
121
122 virtual std::vector<uint32_t>
124
125 virtual bool RegisterOffsetIsDynamic() const { return false; }
126
127 const RegisterInfo *GetRegisterInfoByName(llvm::StringRef reg_name,
128 uint32_t start_idx = 0);
129
130 const RegisterInfo *GetRegisterInfo(uint32_t reg_kind, uint32_t reg_num);
131
133
134 virtual lldb::addr_t
136
138
140
142
144
146
147 const char *GetRegisterName(uint32_t reg);
148
150
151 lldb::addr_t GetFlags(lldb::addr_t fail_value = 0);
152
153 lldb::addr_t ReadRegisterAsUnsigned(uint32_t reg, lldb::addr_t fail_value);
154
156 lldb::addr_t fail_value);
157
158 Status WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval);
159
160 Status WriteRegisterFromUnsigned(const RegisterInfo *reg_info, uint64_t uval);
161
162 // uint32_t
163 // GetStopID () const
164 // {
165 // return m_stop_id;
166 // }
167
168 // void
169 // SetStopID (uint32_t stop_id)
170 // {
171 // m_stop_id = stop_id;
172 // }
173
174protected:
175 // Classes that inherit from RegisterContext can see and modify these
177 &m_thread; // The thread that this register context belongs to.
178 // uint32_t m_stop_id; // The stop ID that any data in this
179 // context is valid for
180
181private:
182 // For RegisterContext only
186};
187
188} // namespace lldb_private
189
190#endif // LLDB_HOST_COMMON_NATIVEREGISTERCONTEXT_H
virtual const RegisterSet * GetRegisterSet(uint32_t set_index) const =0
virtual bool ClearHardwareBreakpoint(uint32_t hw_idx)
virtual bool ClearHardwareWatchpoint(uint32_t hw_index)
uint32_t ConvertRegisterKindToRegisterNumber(uint32_t kind, uint32_t num) const
lldb::addr_t GetSP(lldb::addr_t fail_value=LLDB_INVALID_ADDRESS)
virtual Status ClearWatchpointHit(uint32_t hw_index)
lldb::addr_t GetFlags(lldb::addr_t fail_value=0)
virtual Status IsWatchpointHit(uint32_t wp_index, bool &is_hit)
virtual uint32_t GetUserRegisterCount() const =0
virtual NativeThreadProtocol & GetThread()
lldb::addr_t GetFP(lldb::addr_t fail_value=LLDB_INVALID_ADDRESS)
lldb::addr_t ReadRegisterAsUnsigned(uint32_t reg, lldb::addr_t fail_value)
const RegisterInfo * GetRegisterInfo(uint32_t reg_kind, uint32_t reg_num)
virtual Status GetWatchpointHitIndex(uint32_t &wp_index, lldb::addr_t trap_addr)
Status WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval)
virtual const RegisterInfo * GetRegisterInfoAtIndex(uint32_t reg) const =0
const char * GetRegisterSetNameForRegisterAtIndex(uint32_t reg_index) const
const RegisterInfo * GetRegisterInfoByName(llvm::StringRef reg_name, uint32_t start_idx=0)
virtual uint32_t GetRegisterCount() const =0
virtual Status ReadRegisterValueFromMemory(const lldb_private::RegisterInfo *reg_info, lldb::addr_t src_addr, size_t src_len, RegisterValue &reg_value)
virtual Status WriteAllRegisterValues(const lldb::DataBufferSP &data_sp)=0
virtual Status ReadRegister(const RegisterInfo *reg_info, RegisterValue &reg_value)=0
virtual lldb::addr_t GetWatchpointAddress(uint32_t wp_index)
lldb::addr_t GetPC(lldb::addr_t fail_value=LLDB_INVALID_ADDRESS)
virtual lldb::addr_t GetWatchpointHitAddress(uint32_t wp_index)
NativeRegisterContext(NativeThreadProtocol &thread)
virtual Status ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp)=0
virtual std::vector< uint32_t > GetExpeditedRegisters(ExpeditedRegs expType) const
const NativeRegisterContext & operator=(const NativeRegisterContext &)=delete
virtual Status IsWatchpointVacant(uint32_t wp_index, bool &is_vacant)
NativeRegisterContext(const NativeRegisterContext &)=delete
virtual lldb::addr_t GetPCfromBreakpointLocation(lldb::addr_t fail_value=LLDB_INVALID_ADDRESS)
virtual uint32_t SetHardwareWatchpoint(lldb::addr_t addr, size_t size, uint32_t watch_flags)
virtual Status WriteRegisterValueToMemory(const lldb_private::RegisterInfo *reg_info, lldb::addr_t dst_addr, size_t dst_len, const RegisterValue &reg_value)
lldb::addr_t GetReturnAddress(lldb::addr_t fail_value=LLDB_INVALID_ADDRESS)
virtual uint32_t GetRegisterSetCount() const =0
virtual Status GetHardwareBreakHitIndex(uint32_t &bp_index, lldb::addr_t trap_addr)
virtual uint32_t SetHardwareBreakpoint(lldb::addr_t addr, size_t size)
virtual Status WriteRegister(const RegisterInfo *reg_info, const RegisterValue &reg_value)=0
An error handling class.
Definition Status.h:118
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
uint64_t addr_t
Definition lldb-types.h:80
uint64_t tid_t
Definition lldb-types.h:84
Every register is described in detail including its name, alternate name (optional),...
Registers are grouped into register sets.