1 //===-- RegisterContext.cpp -------------------------------------*- 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 #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"
23
24 using namespace lldb;
25 using namespace lldb_private;
26
RegisterContext(Thread & thread,uint32_t concrete_frame_idx)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()) {}
30
31 RegisterContext::~RegisterContext() = default;
32
InvalidateIfNeeded(bool force)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;
37
38 if (process_sp)
39 process_stop_id = process_sp->GetStopID();
40 else
41 invalidate = true;
42
43 if (!invalidate)
44 invalidate = process_stop_id != GetStopID();
45
46 if (invalidate) {
47 InvalidateAllRegisters();
48 SetStopID(process_stop_id);
49 }
50 }
51
52 const RegisterInfo *
GetRegisterInfoByName(llvm::StringRef reg_name,uint32_t start_idx)53 RegisterContext::GetRegisterInfoByName(llvm::StringRef reg_name,
54 uint32_t start_idx) {
55 if (reg_name.empty())
56 return nullptr;
57
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);
61
62 if (reg_name.equals_lower(reg_info->name) ||
63 reg_name.equals_lower(reg_info->alt_name))
64 return reg_info;
65 }
66 return nullptr;
67 }
68
69 uint32_t
UpdateDynamicRegisterSize(const lldb_private::ArchSpec & arch,RegisterInfo * reg_info)70 RegisterContext::UpdateDynamicRegisterSize(const lldb_private::ArchSpec &arch,
71 RegisterInfo *reg_info) {
72 ExecutionContext exe_ctx(CalculateThread());
73
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.
77
78 int expr_result;
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;
82
83 DataExtractor dwarf_data(dwarf_opcode_ptr, dwarf_opcode_len,
84 arch.GetByteOrder(), addr_size);
85 ModuleSP opcode_ctx;
86 DWARFExpression dwarf_expr(opcode_ctx, dwarf_data, nullptr, 0,
87 dwarf_opcode_len);
88 Value result;
89 Status error;
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) {
96 case 0:
97 return 4;
98 case 1:
99 return 8;
100 default:
101 return reg_info->byte_size;
102 }
103 } else {
104 printf("Error executing DwarfExpression::Evaluate %s\n", error.AsCString());
105 return reg_info->byte_size;
106 }
107 }
108
GetRegisterInfo(lldb::RegisterKind kind,uint32_t num)109 const RegisterInfo *RegisterContext::GetRegisterInfo(lldb::RegisterKind kind,
110 uint32_t num) {
111 const uint32_t reg_num = ConvertRegisterKindToRegisterNumber(kind, num);
112 if (reg_num == LLDB_INVALID_REGNUM)
113 return nullptr;
114 return GetRegisterInfoAtIndex(reg_num);
115 }
116
GetRegisterName(uint32_t reg)117 const char *RegisterContext::GetRegisterName(uint32_t reg) {
118 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
119 if (reg_info)
120 return reg_info->name;
121 return nullptr;
122 }
123
GetPC(uint64_t fail_value)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);
128
129 if (pc != fail_value) {
130 TargetSP target_sp = m_thread.CalculateTarget();
131 if (target_sp) {
132 Target *target = target_sp.get();
133 if (target)
134 pc = target->GetOpcodeLoadAddress(pc, AddressClass::eCode);
135 }
136 }
137
138 return pc;
139 }
140
SetPC(uint64_t pc)141 bool RegisterContext::SetPC(uint64_t pc) {
142 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
143 LLDB_REGNUM_GENERIC_PC);
144 bool success = WriteRegisterFromUnsigned(reg, pc);
145 if (success) {
146 StackFrameSP frame_sp(
147 m_thread.GetFrameWithConcreteFrameIndex(m_concrete_frame_idx));
148 if (frame_sp)
149 frame_sp->ChangePC(pc);
150 else
151 m_thread.ClearStackFrames();
152 }
153 return success;
154 }
155
SetPC(Address addr)156 bool RegisterContext::SetPC(Address addr) {
157 TargetSP target_sp = m_thread.CalculateTarget();
158 Target *target = target_sp.get();
159
160 lldb::addr_t callAddr = addr.GetCallableLoadAddress(target);
161 if (callAddr == LLDB_INVALID_ADDRESS)
162 return false;
163
164 return SetPC(callAddr);
165 }
166
GetSP(uint64_t fail_value)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);
171 }
172
SetSP(uint64_t sp)173 bool RegisterContext::SetSP(uint64_t sp) {
174 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
175 LLDB_REGNUM_GENERIC_SP);
176 return WriteRegisterFromUnsigned(reg, sp);
177 }
178
GetFP(uint64_t fail_value)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);
183 }
184
SetFP(uint64_t fp)185 bool RegisterContext::SetFP(uint64_t fp) {
186 uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
187 LLDB_REGNUM_GENERIC_FP);
188 return WriteRegisterFromUnsigned(reg, fp);
189 }
190
GetReturnAddress(uint64_t fail_value)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);
195 }
196
GetFlags(uint64_t 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);
201 }
202
ReadRegisterAsUnsigned(uint32_t reg,uint64_t 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);
207 return fail_value;
208 }
209
ReadRegisterAsUnsigned(const RegisterInfo * reg_info,uint64_t fail_value)210 uint64_t RegisterContext::ReadRegisterAsUnsigned(const RegisterInfo *reg_info,
211 uint64_t fail_value) {
212 if (reg_info) {
213 RegisterValue value;
214 if (ReadRegister(reg_info, value))
215 return value.GetAsUInt64();
216 }
217 return fail_value;
218 }
219
WriteRegisterFromUnsigned(uint32_t reg,uint64_t uval)220 bool RegisterContext::WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval) {
221 if (reg == LLDB_INVALID_REGNUM)
222 return false;
223 return WriteRegisterFromUnsigned(GetRegisterInfoAtIndex(reg), uval);
224 }
225
WriteRegisterFromUnsigned(const RegisterInfo * reg_info,uint64_t uval)226 bool RegisterContext::WriteRegisterFromUnsigned(const RegisterInfo *reg_info,
227 uint64_t uval) {
228 if (reg_info) {
229 RegisterValue value;
230 if (value.SetUInt(uval, reg_info->byte_size))
231 return WriteRegister(reg_info, value);
232 }
233 return false;
234 }
235
CopyFromRegisterContext(lldb::RegisterContextSP context)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())
241 return false;
242
243 if (num_register_sets != GetRegisterSetCount())
244 return false;
245
246 RegisterContextSP frame_zero_context = m_thread.GetRegisterContext();
247
248 for (uint32_t set_idx = 0; set_idx < num_register_sets; ++set_idx) {
249 const RegisterSet *const reg_set = GetRegisterSet(set_idx);
250
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)
256 continue;
257 RegisterValue reg_value;
258
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);
265 }
266 }
267 }
268 return true;
269 }
270
GetThreadID() const271 lldb::tid_t RegisterContext::GetThreadID() const { return m_thread.GetID(); }
272
NumSupportedHardwareBreakpoints()273 uint32_t RegisterContext::NumSupportedHardwareBreakpoints() { return 0; }
274
SetHardwareBreakpoint(lldb::addr_t addr,size_t size)275 uint32_t RegisterContext::SetHardwareBreakpoint(lldb::addr_t addr,
276 size_t size) {
277 return LLDB_INVALID_INDEX32;
278 }
279
ClearHardwareBreakpoint(uint32_t hw_idx)280 bool RegisterContext::ClearHardwareBreakpoint(uint32_t hw_idx) { return false; }
281
NumSupportedHardwareWatchpoints()282 uint32_t RegisterContext::NumSupportedHardwareWatchpoints() { return 0; }
283
SetHardwareWatchpoint(lldb::addr_t addr,size_t size,bool read,bool write)284 uint32_t RegisterContext::SetHardwareWatchpoint(lldb::addr_t addr, size_t size,
285 bool read, bool write) {
286 return LLDB_INVALID_INDEX32;
287 }
288
ClearHardwareWatchpoint(uint32_t hw_index)289 bool RegisterContext::ClearHardwareWatchpoint(uint32_t hw_index) {
290 return false;
291 }
292
HardwareSingleStep(bool enable)293 bool RegisterContext::HardwareSingleStep(bool enable) { return false; }
294
ReadRegisterValueFromMemory(const RegisterInfo * reg_info,lldb::addr_t src_addr,uint32_t src_len,RegisterValue & reg_value)295 Status RegisterContext::ReadRegisterValueFromMemory(
296 const RegisterInfo *reg_info, lldb::addr_t src_addr, uint32_t src_len,
297 RegisterValue ®_value) {
298 Status error;
299 if (reg_info == nullptr) {
300 error.SetErrorString("invalid register info argument.");
301 return error;
302 }
303
304 // Moving from addr into a register
305 //
306 // Case 1: src_len == dst_len
307 //
308 // |AABBCCDD| Address contents
309 // |AABBCCDD| Register contents
310 //
311 // Case 2: src_len > dst_len
312 //
313 // Status! (The register should always be big enough to hold the data)
314 //
315 // Case 3: src_len < dst_len
316 //
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");
322 return error;
323 }
324
325 const uint32_t dst_len = reg_info->byte_size;
326
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);
331 return error;
332 }
333
334 ProcessSP process_sp(m_thread.GetProcess());
335 if (process_sp) {
336 uint8_t src[RegisterValue::kMaxRegisterByteSize];
337
338 // Read the memory
339 const uint32_t bytes_read =
340 process_sp->ReadMemory(src_addr, src, src_len, error);
341
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,
347 src_len);
348 }
349 return error;
350 }
351
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);
359 } else
360 error.SetErrorString("invalid process");
361
362 return error;
363 }
364
WriteRegisterValueToMemory(const RegisterInfo * reg_info,lldb::addr_t dst_addr,uint32_t dst_len,const RegisterValue & reg_value)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];
369
370 Status error;
371
372 ProcessSP process_sp(m_thread.GetProcess());
373 if (process_sp) {
374
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.
378
379 const uint32_t bytes_copied = reg_value.GetAsMemoryData(
380 reg_info, dst, dst_len, process_sp->GetByteOrder(), error);
381
382 if (error.Success()) {
383 if (bytes_copied == 0) {
384 error.SetErrorString("byte copy failed.");
385 } else {
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);
393 }
394 }
395 }
396 }
397 } else
398 error.SetErrorString("invalid process");
399
400 return error;
401 }
402
ReadAllRegisterValues(lldb_private::RegisterCheckpoint & reg_checkpoint)403 bool RegisterContext::ReadAllRegisterValues(
404 lldb_private::RegisterCheckpoint ®_checkpoint) {
405 return ReadAllRegisterValues(reg_checkpoint.GetData());
406 }
407
WriteAllRegisterValues(const lldb_private::RegisterCheckpoint & reg_checkpoint)408 bool RegisterContext::WriteAllRegisterValues(
409 const lldb_private::RegisterCheckpoint ®_checkpoint) {
410 return WriteAllRegisterValues(reg_checkpoint.GetData());
411 }
412
CalculateTarget()413 TargetSP RegisterContext::CalculateTarget() {
414 return m_thread.CalculateTarget();
415 }
416
CalculateProcess()417 ProcessSP RegisterContext::CalculateProcess() {
418 return m_thread.CalculateProcess();
419 }
420
CalculateThread()421 ThreadSP RegisterContext::CalculateThread() {
422 return m_thread.shared_from_this();
423 }
424
CalculateStackFrame()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();
430 }
431
CalculateExecutionContext(ExecutionContext & exe_ctx)432 void RegisterContext::CalculateExecutionContext(ExecutionContext &exe_ctx) {
433 m_thread.CalculateExecutionContext(exe_ctx);
434 }
435
ConvertBetweenRegisterKinds(lldb::RegisterKind source_rk,uint32_t source_regnum,lldb::RegisterKind target_rk,uint32_t & target_regnum)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);
443
444 if (reg_info->kinds[source_rk] == source_regnum) {
445 target_regnum = reg_info->kinds[target_rk];
446 return (target_regnum != LLDB_INVALID_REGNUM);
447 }
448 }
449 return false;
450 }
451