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