1 //===-- RegisterContext.cpp -------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Target/RegisterContext.h"
11 #include "lldb/Core/Module.h"
12 #include "lldb/Core/Value.h"
13 #include "lldb/Expression/DWARFExpression.h"
14 #include "lldb/Target/ExecutionContext.h"
15 #include "lldb/Target/Process.h"
16 #include "lldb/Target/StackFrame.h"
17 #include "lldb/Target/Target.h"
18 #include "lldb/Target/Thread.h"
19 #include "lldb/Utility/DataExtractor.h"
20 #include "lldb/Utility/Endian.h"
21 #include "lldb/Utility/RegisterValue.h"
22 #include "lldb/Utility/Scalar.h"
25 using namespace lldb_private;
27 RegisterContext::RegisterContext(Thread &thread, uint32_t concrete_frame_idx)
28 : m_thread(thread), m_concrete_frame_idx(concrete_frame_idx),
29 m_stop_id(thread.GetProcess()->GetStopID()) {}
31 RegisterContext::~RegisterContext() = default;
33 void RegisterContext::InvalidateIfNeeded(bool force) {
34 ProcessSP process_sp(m_thread.GetProcess());
35 bool invalidate = force;
36 uint32_t process_stop_id = UINT32_MAX;
39 process_stop_id = process_sp->GetStopID();
44 invalidate = process_stop_id != GetStopID();
47 InvalidateAllRegisters();
48 SetStopID(process_stop_id);
53 RegisterContext::GetRegisterInfoByName(llvm::StringRef reg_name,
58 const uint32_t num_registers = GetRegisterCount();
59 for (uint32_t reg = start_idx; reg < num_registers; ++reg) {
60 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
62 if (reg_name.equals_lower(reg_info->name) ||
63 reg_name.equals_lower(reg_info->alt_name))
70 RegisterContext::UpdateDynamicRegisterSize(const lldb_private::ArchSpec &arch,
71 RegisterInfo *reg_info) {
72 ExecutionContext exe_ctx(CalculateThread());
74 // In MIPS, the floating point registers size is depends on FR bit of SR
75 // register. if SR.FR == 1 then all floating point registers are 64 bits.
76 // else they are all 32 bits.
79 uint32_t addr_size = arch.GetAddressByteSize();
80 const uint8_t *dwarf_opcode_ptr = reg_info->dynamic_size_dwarf_expr_bytes;
81 const size_t dwarf_opcode_len = reg_info->dynamic_size_dwarf_len;
83 DataExtractor dwarf_data(dwarf_opcode_ptr, dwarf_opcode_len,
84 arch.GetByteOrder(), addr_size);
86 DWARFExpression dwarf_expr(opcode_ctx, dwarf_data, nullptr, 0,
90 const lldb::offset_t offset = 0;
91 if (dwarf_expr.Evaluate(&exe_ctx, this, opcode_ctx, dwarf_data, nullptr,
92 offset, dwarf_opcode_len, eRegisterKindDWARF, nullptr,
93 nullptr, result, &error)) {
94 expr_result = result.GetScalar().SInt(-1);
95 switch (expr_result) {
101 return reg_info->byte_size;
104 printf("Error executing DwarfExpression::Evaluate %s\n", error.AsCString());
105 return reg_info->byte_size;
109 const RegisterInfo *RegisterContext::GetRegisterInfo(lldb::RegisterKind kind,
111 const uint32_t reg_num = ConvertRegisterKindToRegisterNumber(kind, num);
112 if (reg_num == LLDB_INVALID_REGNUM)
114 return GetRegisterInfoAtIndex(reg_num);
117 const char *RegisterContext::GetRegisterName(uint32_t reg) {
118 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
120 return reg_info->name;
124 uint64_t RegisterContext::GetPC(uint64_t fail_value) {
125 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
126 LLDB_REGNUM_GENERIC_PC);
127 uint64_t pc = ReadRegisterAsUnsigned(reg, fail_value);
129 if (pc != fail_value) {
130 TargetSP target_sp = m_thread.CalculateTarget();
132 Target *target = target_sp.get();
134 pc = target->GetOpcodeLoadAddress(pc, AddressClass::eCode);
141 bool RegisterContext::SetPC(uint64_t pc) {
142 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
143 LLDB_REGNUM_GENERIC_PC);
144 bool success = WriteRegisterFromUnsigned(reg, pc);
146 StackFrameSP frame_sp(
147 m_thread.GetFrameWithConcreteFrameIndex(m_concrete_frame_idx));
149 frame_sp->ChangePC(pc);
151 m_thread.ClearStackFrames();
156 bool RegisterContext::SetPC(Address addr) {
157 TargetSP target_sp = m_thread.CalculateTarget();
158 Target *target = target_sp.get();
160 lldb::addr_t callAddr = addr.GetCallableLoadAddress(target);
161 if (callAddr == LLDB_INVALID_ADDRESS)
164 return SetPC(callAddr);
167 uint64_t RegisterContext::GetSP(uint64_t fail_value) {
168 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
169 LLDB_REGNUM_GENERIC_SP);
170 return ReadRegisterAsUnsigned(reg, fail_value);
173 bool RegisterContext::SetSP(uint64_t sp) {
174 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
175 LLDB_REGNUM_GENERIC_SP);
176 return WriteRegisterFromUnsigned(reg, sp);
179 uint64_t RegisterContext::GetFP(uint64_t fail_value) {
180 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
181 LLDB_REGNUM_GENERIC_FP);
182 return ReadRegisterAsUnsigned(reg, fail_value);
185 bool RegisterContext::SetFP(uint64_t fp) {
186 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
187 LLDB_REGNUM_GENERIC_FP);
188 return WriteRegisterFromUnsigned(reg, fp);
191 uint64_t RegisterContext::GetReturnAddress(uint64_t fail_value) {
192 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
193 LLDB_REGNUM_GENERIC_RA);
194 return ReadRegisterAsUnsigned(reg, fail_value);
197 uint64_t RegisterContext::GetFlags(uint64_t fail_value) {
198 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
199 LLDB_REGNUM_GENERIC_FLAGS);
200 return ReadRegisterAsUnsigned(reg, fail_value);
203 uint64_t RegisterContext::ReadRegisterAsUnsigned(uint32_t reg,
204 uint64_t fail_value) {
205 if (reg != LLDB_INVALID_REGNUM)
206 return ReadRegisterAsUnsigned(GetRegisterInfoAtIndex(reg), fail_value);
210 uint64_t RegisterContext::ReadRegisterAsUnsigned(const RegisterInfo *reg_info,
211 uint64_t fail_value) {
214 if (ReadRegister(reg_info, value))
215 return value.GetAsUInt64();
220 bool RegisterContext::WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval) {
221 if (reg == LLDB_INVALID_REGNUM)
223 return WriteRegisterFromUnsigned(GetRegisterInfoAtIndex(reg), uval);
226 bool RegisterContext::WriteRegisterFromUnsigned(const RegisterInfo *reg_info,
230 if (value.SetUInt(uval, reg_info->byte_size))
231 return WriteRegister(reg_info, value);
236 bool RegisterContext::CopyFromRegisterContext(lldb::RegisterContextSP context) {
237 uint32_t num_register_sets = context->GetRegisterSetCount();
238 // We don't know that two threads have the same register context, so require
239 // the threads to be the same.
240 if (context->GetThreadID() != GetThreadID())
243 if (num_register_sets != GetRegisterSetCount())
246 RegisterContextSP frame_zero_context = m_thread.GetRegisterContext();
248 for (uint32_t set_idx = 0; set_idx < num_register_sets; ++set_idx) {
249 const RegisterSet *const reg_set = GetRegisterSet(set_idx);
251 const uint32_t num_registers = reg_set->num_registers;
252 for (uint32_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
253 const uint32_t reg = reg_set->registers[reg_idx];
254 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
255 if (!reg_info || reg_info->value_regs)
257 RegisterValue reg_value;
259 // If we can reconstruct the register from the frame we are copying from,
260 // then do so, otherwise use the value from frame 0.
261 if (context->ReadRegister(reg_info, reg_value)) {
262 WriteRegister(reg_info, reg_value);
263 } else if (frame_zero_context->ReadRegister(reg_info, reg_value)) {
264 WriteRegister(reg_info, reg_value);
271 lldb::tid_t RegisterContext::GetThreadID() const { return m_thread.GetID(); }
273 uint32_t RegisterContext::NumSupportedHardwareBreakpoints() { return 0; }
275 uint32_t RegisterContext::SetHardwareBreakpoint(lldb::addr_t addr,
277 return LLDB_INVALID_INDEX32;
280 bool RegisterContext::ClearHardwareBreakpoint(uint32_t hw_idx) { return false; }
282 uint32_t RegisterContext::NumSupportedHardwareWatchpoints() { return 0; }
284 uint32_t RegisterContext::SetHardwareWatchpoint(lldb::addr_t addr, size_t size,
285 bool read, bool write) {
286 return LLDB_INVALID_INDEX32;
289 bool RegisterContext::ClearHardwareWatchpoint(uint32_t hw_index) {
293 bool RegisterContext::HardwareSingleStep(bool enable) { return false; }
295 Status RegisterContext::ReadRegisterValueFromMemory(
296 const RegisterInfo *reg_info, lldb::addr_t src_addr, uint32_t src_len,
297 RegisterValue ®_value) {
299 if (reg_info == nullptr) {
300 error.SetErrorString("invalid register info argument.");
304 // Moving from addr into a register
306 // Case 1: src_len == dst_len
308 // |AABBCCDD| Address contents
309 // |AABBCCDD| Register contents
311 // Case 2: src_len > dst_len
313 // Status! (The register should always be big enough to hold the data)
315 // Case 3: src_len < dst_len
317 // |AABB| Address contents
318 // |AABB0000| Register contents [on little-endian hardware]
319 // |0000AABB| Register contents [on big-endian hardware]
320 if (src_len > RegisterValue::kMaxRegisterByteSize) {
321 error.SetErrorString("register too small to receive memory data");
325 const uint32_t dst_len = reg_info->byte_size;
327 if (src_len > dst_len) {
328 error.SetErrorStringWithFormat(
329 "%u bytes is too big to store in register %s (%u bytes)", src_len,
330 reg_info->name, dst_len);
334 ProcessSP process_sp(m_thread.GetProcess());
336 uint8_t src[RegisterValue::kMaxRegisterByteSize];
339 const uint32_t bytes_read =
340 process_sp->ReadMemory(src_addr, src, src_len, error);
342 // Make sure the memory read succeeded...
343 if (bytes_read != src_len) {
344 if (error.Success()) {
345 // This might happen if we read _some_ bytes but not all
346 error.SetErrorStringWithFormat("read %u of %u bytes", bytes_read,
352 // We now have a memory buffer that contains the part or all of the
353 // register value. Set the register value using this memory data.
354 // TODO: we might need to add a parameter to this function in case the byte
355 // order of the memory data doesn't match the process. For now we are
356 // assuming they are the same.
357 reg_value.SetFromMemoryData(reg_info, src, src_len,
358 process_sp->GetByteOrder(), error);
360 error.SetErrorString("invalid process");
365 Status RegisterContext::WriteRegisterValueToMemory(
366 const RegisterInfo *reg_info, lldb::addr_t dst_addr, uint32_t dst_len,
367 const RegisterValue ®_value) {
368 uint8_t dst[RegisterValue::kMaxRegisterByteSize];
372 ProcessSP process_sp(m_thread.GetProcess());
375 // TODO: we might need to add a parameter to this function in case the byte
376 // order of the memory data doesn't match the process. For now we are
377 // assuming they are the same.
379 const uint32_t bytes_copied = reg_value.GetAsMemoryData(
380 reg_info, dst, dst_len, process_sp->GetByteOrder(), error);
382 if (error.Success()) {
383 if (bytes_copied == 0) {
384 error.SetErrorString("byte copy failed.");
386 const uint32_t bytes_written =
387 process_sp->WriteMemory(dst_addr, dst, bytes_copied, error);
388 if (bytes_written != bytes_copied) {
389 if (error.Success()) {
390 // This might happen if we read _some_ bytes but not all
391 error.SetErrorStringWithFormat("only wrote %u of %u bytes",
392 bytes_written, bytes_copied);
398 error.SetErrorString("invalid process");
403 bool RegisterContext::ReadAllRegisterValues(
404 lldb_private::RegisterCheckpoint ®_checkpoint) {
405 return ReadAllRegisterValues(reg_checkpoint.GetData());
408 bool RegisterContext::WriteAllRegisterValues(
409 const lldb_private::RegisterCheckpoint ®_checkpoint) {
410 return WriteAllRegisterValues(reg_checkpoint.GetData());
413 TargetSP RegisterContext::CalculateTarget() {
414 return m_thread.CalculateTarget();
417 ProcessSP RegisterContext::CalculateProcess() {
418 return m_thread.CalculateProcess();
421 ThreadSP RegisterContext::CalculateThread() {
422 return m_thread.shared_from_this();
425 StackFrameSP RegisterContext::CalculateStackFrame() {
426 // Register contexts might belong to many frames if we have inlined functions
427 // inside a frame since all inlined functions share the same registers, so we
428 // can't definitively say which frame we come from...
429 return StackFrameSP();
432 void RegisterContext::CalculateExecutionContext(ExecutionContext &exe_ctx) {
433 m_thread.CalculateExecutionContext(exe_ctx);
436 bool RegisterContext::ConvertBetweenRegisterKinds(lldb::RegisterKind source_rk,
437 uint32_t source_regnum,
438 lldb::RegisterKind target_rk,
439 uint32_t &target_regnum) {
440 const uint32_t num_registers = GetRegisterCount();
441 for (uint32_t reg = 0; reg < num_registers; ++reg) {
442 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
444 if (reg_info->kinds[source_rk] == source_regnum) {
445 target_regnum = reg_info->kinds[target_rk];
446 return (target_regnum != LLDB_INVALID_REGNUM);