1 //===-- RegisterContext.cpp -----------------------------------------------===//
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 #include "lldb/Target/RegisterContext.h"
10 #include "lldb/Core/Module.h"
11 #include "lldb/Core/Value.h"
12 #include "lldb/Expression/DWARFExpression.h"
13 #include "lldb/Target/ExecutionContext.h"
14 #include "lldb/Target/Process.h"
15 #include "lldb/Target/StackFrame.h"
16 #include "lldb/Target/Target.h"
17 #include "lldb/Target/Thread.h"
18 #include "lldb/Utility/DataExtractor.h"
19 #include "lldb/Utility/Endian.h"
20 #include "lldb/Utility/RegisterValue.h"
21 #include "lldb/Utility/Scalar.h"
22 
23 using namespace lldb;
24 using namespace lldb_private;
25 
26 RegisterContext::RegisterContext(Thread &thread, uint32_t concrete_frame_idx)
27     : m_thread(thread), m_concrete_frame_idx(concrete_frame_idx),
28       m_stop_id(thread.GetProcess()->GetStopID()) {}
29 
30 RegisterContext::~RegisterContext() = default;
31 
32 void RegisterContext::InvalidateIfNeeded(bool force) {
33   ProcessSP process_sp(m_thread.GetProcess());
34   bool invalidate = force;
35   uint32_t process_stop_id = UINT32_MAX;
36 
37   if (process_sp)
38     process_stop_id = process_sp->GetStopID();
39   else
40     invalidate = true;
41 
42   if (!invalidate)
43     invalidate = process_stop_id != GetStopID();
44 
45   if (invalidate) {
46     InvalidateAllRegisters();
47     SetStopID(process_stop_id);
48   }
49 }
50 
51 const RegisterInfo *
52 RegisterContext::GetRegisterInfoByName(llvm::StringRef reg_name,
53                                        uint32_t start_idx) {
54   if (reg_name.empty())
55     return nullptr;
56 
57   // Generic register names take precedence over specific register names.
58   // For example, on x86 we want "sp" to refer to the complete RSP/ESP register
59   // rather than the 16-bit SP pseudo-register.
60   uint32_t generic_reg = Args::StringToGenericRegister(reg_name);
61   if (generic_reg != LLDB_INVALID_REGNUM) {
62     const RegisterInfo *reg_info =
63         GetRegisterInfo(eRegisterKindGeneric, generic_reg);
64     if (reg_info)
65       return reg_info;
66   }
67 
68   const uint32_t num_registers = GetRegisterCount();
69   for (uint32_t reg = start_idx; reg < num_registers; ++reg) {
70     const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
71 
72     if (reg_name.equals_insensitive(reg_info->name) ||
73         reg_name.equals_insensitive(reg_info->alt_name))
74       return reg_info;
75   }
76 
77   return nullptr;
78 }
79 
80 uint32_t
81 RegisterContext::UpdateDynamicRegisterSize(const lldb_private::ArchSpec &arch,
82                                            RegisterInfo *reg_info) {
83   ExecutionContext exe_ctx(CalculateThread());
84 
85   // In MIPS, the floating point registers size is depends on FR bit of SR
86   // register. if SR.FR  == 1 then all floating point registers are 64 bits.
87   // else they are all 32 bits.
88 
89   int expr_result;
90   uint32_t addr_size = arch.GetAddressByteSize();
91   const uint8_t *dwarf_opcode_ptr = reg_info->dynamic_size_dwarf_expr_bytes;
92   const size_t dwarf_opcode_len = reg_info->dynamic_size_dwarf_len;
93 
94   DataExtractor dwarf_data(dwarf_opcode_ptr, dwarf_opcode_len,
95                            arch.GetByteOrder(), addr_size);
96   ModuleSP opcode_ctx;
97   DWARFExpression dwarf_expr(opcode_ctx, dwarf_data, nullptr);
98   Value result;
99   Status error;
100   if (dwarf_expr.Evaluate(&exe_ctx, this, opcode_ctx, dwarf_data, nullptr,
101                           eRegisterKindDWARF, nullptr, nullptr, result,
102                           &error)) {
103     expr_result = result.GetScalar().SInt(-1);
104     switch (expr_result) {
105     case 0:
106       return 4;
107     case 1:
108       return 8;
109     default:
110       return reg_info->byte_size;
111     }
112   } else {
113     printf("Error executing DwarfExpression::Evaluate %s\n", error.AsCString());
114     return reg_info->byte_size;
115   }
116 }
117 
118 const RegisterInfo *RegisterContext::GetRegisterInfo(lldb::RegisterKind kind,
119                                                      uint32_t num) {
120   const uint32_t reg_num = ConvertRegisterKindToRegisterNumber(kind, num);
121   if (reg_num == LLDB_INVALID_REGNUM)
122     return nullptr;
123   return GetRegisterInfoAtIndex(reg_num);
124 }
125 
126 const char *RegisterContext::GetRegisterName(uint32_t reg) {
127   const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
128   if (reg_info)
129     return reg_info->name;
130   return nullptr;
131 }
132 
133 uint64_t RegisterContext::GetPC(uint64_t fail_value) {
134   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
135                                                      LLDB_REGNUM_GENERIC_PC);
136   uint64_t pc = ReadRegisterAsUnsigned(reg, fail_value);
137 
138   if (pc != fail_value) {
139     TargetSP target_sp = m_thread.CalculateTarget();
140     if (target_sp) {
141       Target *target = target_sp.get();
142       if (target)
143         pc = target->GetOpcodeLoadAddress(pc, AddressClass::eCode);
144     }
145   }
146 
147   return pc;
148 }
149 
150 bool RegisterContext::SetPC(uint64_t pc) {
151   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
152                                                      LLDB_REGNUM_GENERIC_PC);
153   bool success = WriteRegisterFromUnsigned(reg, pc);
154   if (success) {
155     StackFrameSP frame_sp(
156         m_thread.GetFrameWithConcreteFrameIndex(m_concrete_frame_idx));
157     if (frame_sp)
158       frame_sp->ChangePC(pc);
159     else
160       m_thread.ClearStackFrames();
161   }
162   return success;
163 }
164 
165 bool RegisterContext::GetPCForSymbolication(Address &address) {
166   addr_t pc = GetPC(LLDB_INVALID_ADDRESS);
167   if (pc == LLDB_INVALID_ADDRESS)
168     return false;
169   TargetSP target_sp = m_thread.CalculateTarget();
170   if (!target_sp.get())
171     return false;
172 
173   if (!BehavesLikeZerothFrame() && pc != 0)
174     pc--;
175   address.SetLoadAddress(pc, target_sp.get());
176   return true;
177 }
178 
179 bool RegisterContext::SetPC(Address addr) {
180   TargetSP target_sp = m_thread.CalculateTarget();
181   Target *target = target_sp.get();
182 
183   lldb::addr_t callAddr = addr.GetCallableLoadAddress(target);
184   if (callAddr == LLDB_INVALID_ADDRESS)
185     return false;
186 
187   return SetPC(callAddr);
188 }
189 
190 uint64_t RegisterContext::GetSP(uint64_t fail_value) {
191   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
192                                                      LLDB_REGNUM_GENERIC_SP);
193   return ReadRegisterAsUnsigned(reg, fail_value);
194 }
195 
196 bool RegisterContext::SetSP(uint64_t sp) {
197   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
198                                                      LLDB_REGNUM_GENERIC_SP);
199   return WriteRegisterFromUnsigned(reg, sp);
200 }
201 
202 uint64_t RegisterContext::GetFP(uint64_t fail_value) {
203   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
204                                                      LLDB_REGNUM_GENERIC_FP);
205   return ReadRegisterAsUnsigned(reg, fail_value);
206 }
207 
208 bool RegisterContext::SetFP(uint64_t fp) {
209   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
210                                                      LLDB_REGNUM_GENERIC_FP);
211   return WriteRegisterFromUnsigned(reg, fp);
212 }
213 
214 uint64_t RegisterContext::GetReturnAddress(uint64_t fail_value) {
215   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
216                                                      LLDB_REGNUM_GENERIC_RA);
217   return ReadRegisterAsUnsigned(reg, fail_value);
218 }
219 
220 uint64_t RegisterContext::GetFlags(uint64_t fail_value) {
221   uint32_t reg = ConvertRegisterKindToRegisterNumber(eRegisterKindGeneric,
222                                                      LLDB_REGNUM_GENERIC_FLAGS);
223   return ReadRegisterAsUnsigned(reg, fail_value);
224 }
225 
226 uint64_t RegisterContext::ReadRegisterAsUnsigned(uint32_t reg,
227                                                  uint64_t fail_value) {
228   if (reg != LLDB_INVALID_REGNUM)
229     return ReadRegisterAsUnsigned(GetRegisterInfoAtIndex(reg), fail_value);
230   return fail_value;
231 }
232 
233 uint64_t RegisterContext::ReadRegisterAsUnsigned(const RegisterInfo *reg_info,
234                                                  uint64_t fail_value) {
235   if (reg_info) {
236     RegisterValue value;
237     if (ReadRegister(reg_info, value))
238       return value.GetAsUInt64();
239   }
240   return fail_value;
241 }
242 
243 bool RegisterContext::WriteRegisterFromUnsigned(uint32_t reg, uint64_t uval) {
244   if (reg == LLDB_INVALID_REGNUM)
245     return false;
246   return WriteRegisterFromUnsigned(GetRegisterInfoAtIndex(reg), uval);
247 }
248 
249 bool RegisterContext::WriteRegisterFromUnsigned(const RegisterInfo *reg_info,
250                                                 uint64_t uval) {
251   if (reg_info) {
252     RegisterValue value;
253     if (value.SetUInt(uval, reg_info->byte_size))
254       return WriteRegister(reg_info, value);
255   }
256   return false;
257 }
258 
259 bool RegisterContext::CopyFromRegisterContext(lldb::RegisterContextSP context) {
260   uint32_t num_register_sets = context->GetRegisterSetCount();
261   // We don't know that two threads have the same register context, so require
262   // the threads to be the same.
263   if (context->GetThreadID() != GetThreadID())
264     return false;
265 
266   if (num_register_sets != GetRegisterSetCount())
267     return false;
268 
269   RegisterContextSP frame_zero_context = m_thread.GetRegisterContext();
270 
271   for (uint32_t set_idx = 0; set_idx < num_register_sets; ++set_idx) {
272     const RegisterSet *const reg_set = GetRegisterSet(set_idx);
273 
274     const uint32_t num_registers = reg_set->num_registers;
275     for (uint32_t reg_idx = 0; reg_idx < num_registers; ++reg_idx) {
276       const uint32_t reg = reg_set->registers[reg_idx];
277       const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
278       if (!reg_info || reg_info->value_regs)
279         continue;
280       RegisterValue reg_value;
281 
282       // If we can reconstruct the register from the frame we are copying from,
283       // then do so, otherwise use the value from frame 0.
284       if (context->ReadRegister(reg_info, reg_value)) {
285         WriteRegister(reg_info, reg_value);
286       } else if (frame_zero_context->ReadRegister(reg_info, reg_value)) {
287         WriteRegister(reg_info, reg_value);
288       }
289     }
290   }
291   return true;
292 }
293 
294 lldb::tid_t RegisterContext::GetThreadID() const { return m_thread.GetID(); }
295 
296 uint32_t RegisterContext::NumSupportedHardwareBreakpoints() { return 0; }
297 
298 uint32_t RegisterContext::SetHardwareBreakpoint(lldb::addr_t addr,
299                                                 size_t size) {
300   return LLDB_INVALID_INDEX32;
301 }
302 
303 // Used when parsing DWARF and EH frame information and any other object file
304 // sections that contain register numbers in them.
305 uint32_t
306 RegisterContext::ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind,
307                                                      uint32_t num) {
308   const uint32_t num_regs = GetRegisterCount();
309 
310   assert(kind < kNumRegisterKinds);
311   for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) {
312     const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg_idx);
313 
314     if (reg_info->kinds[kind] == num)
315       return reg_idx;
316   }
317 
318   return LLDB_INVALID_REGNUM;
319 }
320 
321 bool RegisterContext::ClearHardwareBreakpoint(uint32_t hw_idx) { return false; }
322 
323 uint32_t RegisterContext::NumSupportedHardwareWatchpoints() { return 0; }
324 
325 uint32_t RegisterContext::SetHardwareWatchpoint(lldb::addr_t addr, size_t size,
326                                                 bool read, bool write) {
327   return LLDB_INVALID_INDEX32;
328 }
329 
330 bool RegisterContext::ClearHardwareWatchpoint(uint32_t hw_index) {
331   return false;
332 }
333 
334 bool RegisterContext::HardwareSingleStep(bool enable) { return false; }
335 
336 Status RegisterContext::ReadRegisterValueFromMemory(
337     const RegisterInfo *reg_info, lldb::addr_t src_addr, uint32_t src_len,
338     RegisterValue &reg_value) {
339   Status error;
340   if (reg_info == nullptr) {
341     error.SetErrorString("invalid register info argument.");
342     return error;
343   }
344 
345   // Moving from addr into a register
346   //
347   // Case 1: src_len == dst_len
348   //
349   //   |AABBCCDD| Address contents
350   //   |AABBCCDD| Register contents
351   //
352   // Case 2: src_len > dst_len
353   //
354   //   Status!  (The register should always be big enough to hold the data)
355   //
356   // Case 3: src_len < dst_len
357   //
358   //   |AABB| Address contents
359   //   |AABB0000| Register contents [on little-endian hardware]
360   //   |0000AABB| Register contents [on big-endian hardware]
361   if (src_len > RegisterValue::kMaxRegisterByteSize) {
362     error.SetErrorString("register too small to receive memory data");
363     return error;
364   }
365 
366   const uint32_t dst_len = reg_info->byte_size;
367 
368   if (src_len > dst_len) {
369     error.SetErrorStringWithFormat(
370         "%u bytes is too big to store in register %s (%u bytes)", src_len,
371         reg_info->name, dst_len);
372     return error;
373   }
374 
375   ProcessSP process_sp(m_thread.GetProcess());
376   if (process_sp) {
377     uint8_t src[RegisterValue::kMaxRegisterByteSize];
378 
379     // Read the memory
380     const uint32_t bytes_read =
381         process_sp->ReadMemory(src_addr, src, src_len, error);
382 
383     // Make sure the memory read succeeded...
384     if (bytes_read != src_len) {
385       if (error.Success()) {
386         // This might happen if we read _some_ bytes but not all
387         error.SetErrorStringWithFormat("read %u of %u bytes", bytes_read,
388                                        src_len);
389       }
390       return error;
391     }
392 
393     // We now have a memory buffer that contains the part or all of the
394     // register value. Set the register value using this memory data.
395     // TODO: we might need to add a parameter to this function in case the byte
396     // order of the memory data doesn't match the process. For now we are
397     // assuming they are the same.
398     reg_value.SetFromMemoryData(reg_info, src, src_len,
399                                 process_sp->GetByteOrder(), error);
400   } else
401     error.SetErrorString("invalid process");
402 
403   return error;
404 }
405 
406 Status RegisterContext::WriteRegisterValueToMemory(
407     const RegisterInfo *reg_info, lldb::addr_t dst_addr, uint32_t dst_len,
408     const RegisterValue &reg_value) {
409   uint8_t dst[RegisterValue::kMaxRegisterByteSize];
410 
411   Status error;
412 
413   ProcessSP process_sp(m_thread.GetProcess());
414   if (process_sp) {
415 
416     // TODO: we might need to add a parameter to this function in case the byte
417     // order of the memory data doesn't match the process. For now we are
418     // assuming they are the same.
419 
420     const uint32_t bytes_copied = reg_value.GetAsMemoryData(
421         reg_info, dst, dst_len, process_sp->GetByteOrder(), error);
422 
423     if (error.Success()) {
424       if (bytes_copied == 0) {
425         error.SetErrorString("byte copy failed.");
426       } else {
427         const uint32_t bytes_written =
428             process_sp->WriteMemory(dst_addr, dst, bytes_copied, error);
429         if (bytes_written != bytes_copied) {
430           if (error.Success()) {
431             // This might happen if we read _some_ bytes but not all
432             error.SetErrorStringWithFormat("only wrote %u of %u bytes",
433                                            bytes_written, bytes_copied);
434           }
435         }
436       }
437     }
438   } else
439     error.SetErrorString("invalid process");
440 
441   return error;
442 }
443 
444 lldb::ByteOrder RegisterContext::GetByteOrder() {
445   // Get the target process whose privileged thread was used for the register
446   // read.
447   lldb::ByteOrder byte_order = lldb::eByteOrderInvalid;
448   lldb_private::Process *process = CalculateProcess().get();
449 
450   if (process)
451     byte_order = process->GetByteOrder();
452   return byte_order;
453 }
454 
455 bool RegisterContext::ReadAllRegisterValues(
456     lldb_private::RegisterCheckpoint &reg_checkpoint) {
457   return ReadAllRegisterValues(reg_checkpoint.GetData());
458 }
459 
460 bool RegisterContext::WriteAllRegisterValues(
461     const lldb_private::RegisterCheckpoint &reg_checkpoint) {
462   return WriteAllRegisterValues(reg_checkpoint.GetData());
463 }
464 
465 TargetSP RegisterContext::CalculateTarget() {
466   return m_thread.CalculateTarget();
467 }
468 
469 ProcessSP RegisterContext::CalculateProcess() {
470   return m_thread.CalculateProcess();
471 }
472 
473 ThreadSP RegisterContext::CalculateThread() {
474   return m_thread.shared_from_this();
475 }
476 
477 StackFrameSP RegisterContext::CalculateStackFrame() {
478   // Register contexts might belong to many frames if we have inlined functions
479   // inside a frame since all inlined functions share the same registers, so we
480   // can't definitively say which frame we come from...
481   return StackFrameSP();
482 }
483 
484 void RegisterContext::CalculateExecutionContext(ExecutionContext &exe_ctx) {
485   m_thread.CalculateExecutionContext(exe_ctx);
486 }
487 
488 bool RegisterContext::ConvertBetweenRegisterKinds(lldb::RegisterKind source_rk,
489                                                   uint32_t source_regnum,
490                                                   lldb::RegisterKind target_rk,
491                                                   uint32_t &target_regnum) {
492   const uint32_t num_registers = GetRegisterCount();
493   for (uint32_t reg = 0; reg < num_registers; ++reg) {
494     const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
495 
496     if (reg_info->kinds[source_rk] == source_regnum) {
497       target_regnum = reg_info->kinds[target_rk];
498       return (target_regnum != LLDB_INVALID_REGNUM);
499     }
500   }
501   return false;
502 }
503