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 // C Includes
11 // C++ Includes
12 // Other libraries and framework includes
13 // Project includes
14 #include "lldb/Target/RegisterContext.h"
15 #include "lldb/Core/DataExtractor.h"
16 #include "lldb/Core/RegisterValue.h"
17 #include "lldb/Core/Scalar.h"
18 #include "lldb/Host/Endian.h"
19 #include "lldb/Target/ExecutionContext.h"
20 #include "lldb/Target/StackFrame.h"
21 #include "lldb/Target/Process.h"
22 #include "lldb/Target/Thread.h"
23 
24 using namespace lldb;
25 using namespace lldb_private;
26 
27 RegisterContext::RegisterContext (Thread &thread, uint32_t concrete_frame_idx) :
28     m_thread (thread),
29     m_concrete_frame_idx (concrete_frame_idx),
30     m_stop_id (thread.GetProcess()->GetStopID())
31 {
32 }
33 
34 //----------------------------------------------------------------------
35 // Destructor
36 //----------------------------------------------------------------------
37 RegisterContext::~RegisterContext()
38 {
39 }
40 
41 void
42 RegisterContext::InvalidateIfNeeded (bool force)
43 {
44     ProcessSP process_sp (m_thread.GetProcess());
45     bool invalidate = force;
46     uint32_t process_stop_id = UINT32_MAX;
47 
48     if (process_sp)
49         process_stop_id = process_sp->GetStopID();
50     else
51         invalidate = true;
52 
53     if (!invalidate)
54         invalidate = process_stop_id != GetStopID();
55 
56     if (invalidate)
57     {
58         InvalidateAllRegisters ();
59         SetStopID (process_stop_id);
60     }
61 }
62 
63 
64 const RegisterInfo *
65 RegisterContext::GetRegisterInfoByName (const char *reg_name, uint32_t start_idx)
66 {
67     if (reg_name && reg_name[0])
68     {
69         const uint32_t num_registers = GetRegisterCount();
70         for (uint32_t reg = start_idx; reg < num_registers; ++reg)
71         {
72             const RegisterInfo * reg_info = GetRegisterInfoAtIndex(reg);
73 
74             if ((reg_info->name != NULL && ::strcasecmp (reg_info->name, reg_name) == 0) ||
75                 (reg_info->alt_name != NULL && ::strcasecmp (reg_info->alt_name, reg_name) == 0))
76             {
77                 return reg_info;
78             }
79         }
80     }
81     return NULL;
82 }
83 
84 const char *
85 RegisterContext::GetRegisterName (uint32_t reg)
86 {
87     const RegisterInfo * reg_info = GetRegisterInfoAtIndex(reg);
88     if (reg_info)
89         return reg_info->name;
90     return NULL;
91 }
92 
93 uint64_t
94 RegisterContext::GetPC(uint64_t fail_value)
95 {
96     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
97     return ReadRegisterAsUnsigned (reg, fail_value);
98 }
99 
100 bool
101 RegisterContext::SetPC(uint64_t pc)
102 {
103     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
104     bool success = WriteRegisterFromUnsigned (reg, pc);
105     if (success)
106     {
107         StackFrameSP frame_sp(m_thread.GetFrameWithConcreteFrameIndex (m_concrete_frame_idx));
108         if (frame_sp)
109             frame_sp->ChangePC(pc);
110         else
111             m_thread.ClearStackFrames ();
112     }
113     return success;
114 }
115 
116 bool
117 RegisterContext::SetPC(Address addr)
118 {
119     TargetSP target_sp = m_thread.CalculateTarget();
120     Target *target = target_sp.get();
121 
122     lldb::addr_t callAddr = addr.GetCallableLoadAddress (target);
123     if (callAddr == LLDB_INVALID_ADDRESS)
124         return false;
125 
126     return SetPC (callAddr);
127 }
128 
129 uint64_t
130 RegisterContext::GetSP(uint64_t fail_value)
131 {
132     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
133     return ReadRegisterAsUnsigned (reg, fail_value);
134 }
135 
136 bool
137 RegisterContext::SetSP(uint64_t sp)
138 {
139     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
140     return WriteRegisterFromUnsigned (reg, sp);
141 }
142 
143 uint64_t
144 RegisterContext::GetFP(uint64_t fail_value)
145 {
146     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP);
147     return ReadRegisterAsUnsigned (reg, fail_value);
148 }
149 
150 bool
151 RegisterContext::SetFP(uint64_t fp)
152 {
153     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP);
154     return WriteRegisterFromUnsigned (reg, fp);
155 }
156 
157 uint64_t
158 RegisterContext::GetReturnAddress (uint64_t fail_value)
159 {
160     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);
161     return ReadRegisterAsUnsigned (reg, fail_value);
162 }
163 
164 uint64_t
165 RegisterContext::GetFlags (uint64_t fail_value)
166 {
167     uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
168     return ReadRegisterAsUnsigned (reg, fail_value);
169 }
170 
171 
172 uint64_t
173 RegisterContext::ReadRegisterAsUnsigned (uint32_t reg, uint64_t fail_value)
174 {
175     if (reg != LLDB_INVALID_REGNUM)
176         return ReadRegisterAsUnsigned (GetRegisterInfoAtIndex (reg), fail_value);
177     return fail_value;
178 }
179 
180 uint64_t
181 RegisterContext::ReadRegisterAsUnsigned (const RegisterInfo *reg_info, uint64_t fail_value)
182 {
183     if (reg_info)
184     {
185         RegisterValue value;
186         if (ReadRegister (reg_info, value))
187             return value.GetAsUInt64();
188     }
189     return fail_value;
190 }
191 
192 bool
193 RegisterContext::WriteRegisterFromUnsigned (uint32_t reg, uint64_t uval)
194 {
195     if (reg == LLDB_INVALID_REGNUM)
196         return false;
197     return WriteRegisterFromUnsigned (GetRegisterInfoAtIndex (reg), uval);
198 }
199 
200 bool
201 RegisterContext::WriteRegisterFromUnsigned (const RegisterInfo *reg_info, uint64_t uval)
202 {
203     if (reg_info)
204     {
205         RegisterValue value;
206         if (value.SetUInt(uval, reg_info->byte_size))
207             return WriteRegister (reg_info, value);
208     }
209     return false;
210 }
211 
212 bool
213 RegisterContext::CopyFromRegisterContext (lldb::RegisterContextSP context)
214 {
215     uint32_t num_register_sets = context->GetRegisterSetCount();
216     // We don't know that two threads have the same register context, so require the threads to be the same.
217     if (context->GetThreadID() != GetThreadID())
218         return false;
219 
220     if (num_register_sets != GetRegisterSetCount())
221         return false;
222 
223     RegisterContextSP frame_zero_context = m_thread.GetRegisterContext();
224 
225     for (uint32_t set_idx = 0; set_idx < num_register_sets; ++set_idx)
226     {
227         const RegisterSet * const reg_set = GetRegisterSet(set_idx);
228 
229         const uint32_t num_registers = reg_set->num_registers;
230         for (uint32_t reg_idx = 0; reg_idx < num_registers; ++reg_idx)
231         {
232             const uint32_t reg = reg_set->registers[reg_idx];
233             const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
234             if (!reg_info || reg_info->value_regs)
235                 continue;
236             RegisterValue reg_value;
237 
238             // If we can reconstruct the register from the frame we are copying from, then do so, otherwise
239             // use the value from frame 0.
240             if (context->ReadRegister(reg_info, reg_value))
241             {
242                 WriteRegister(reg_info, reg_value);
243             }
244             else if (frame_zero_context->ReadRegister(reg_info, reg_value))
245             {
246                 WriteRegister(reg_info, reg_value);
247             }
248         }
249     }
250     return true;
251 }
252 
253 lldb::tid_t
254 RegisterContext::GetThreadID() const
255 {
256     return m_thread.GetID();
257 }
258 
259 uint32_t
260 RegisterContext::NumSupportedHardwareBreakpoints ()
261 {
262     return 0;
263 }
264 
265 uint32_t
266 RegisterContext::SetHardwareBreakpoint (lldb::addr_t addr, size_t size)
267 {
268     return LLDB_INVALID_INDEX32;
269 }
270 
271 bool
272 RegisterContext::ClearHardwareBreakpoint (uint32_t hw_idx)
273 {
274     return false;
275 }
276 
277 
278 uint32_t
279 RegisterContext::NumSupportedHardwareWatchpoints ()
280 {
281     return 0;
282 }
283 
284 uint32_t
285 RegisterContext::SetHardwareWatchpoint (lldb::addr_t addr, size_t size, bool read, bool write)
286 {
287     return LLDB_INVALID_INDEX32;
288 }
289 
290 bool
291 RegisterContext::ClearHardwareWatchpoint (uint32_t hw_index)
292 {
293     return false;
294 }
295 
296 bool
297 RegisterContext::HardwareSingleStep (bool enable)
298 {
299     return false;
300 }
301 
302 Error
303 RegisterContext::ReadRegisterValueFromMemory (const RegisterInfo *reg_info,
304                                               lldb::addr_t src_addr,
305                                               uint32_t src_len,
306                                               RegisterValue &reg_value)
307 {
308     Error error;
309     if (reg_info == NULL)
310     {
311         error.SetErrorString ("invalid register info argument.");
312         return error;
313     }
314 
315 
316     // Moving from addr into a register
317     //
318     // Case 1: src_len == dst_len
319     //
320     //   |AABBCCDD| Address contents
321     //   |AABBCCDD| Register contents
322     //
323     // Case 2: src_len > dst_len
324     //
325     //   Error!  (The register should always be big enough to hold the data)
326     //
327     // Case 3: src_len < dst_len
328     //
329     //   |AABB| Address contents
330     //   |AABB0000| Register contents [on little-endian hardware]
331     //   |0000AABB| Register contents [on big-endian hardware]
332     if (src_len > RegisterValue::kMaxRegisterByteSize)
333     {
334         error.SetErrorString ("register too small to receive memory data");
335         return error;
336     }
337 
338     const uint32_t dst_len = reg_info->byte_size;
339 
340     if (src_len > dst_len)
341     {
342         error.SetErrorStringWithFormat("%u bytes is too big to store in register %s (%u bytes)", src_len, reg_info->name, dst_len);
343         return error;
344     }
345 
346     ProcessSP process_sp (m_thread.GetProcess());
347     if (process_sp)
348     {
349         uint8_t src[RegisterValue::kMaxRegisterByteSize];
350 
351         // Read the memory
352         const uint32_t bytes_read = process_sp->ReadMemory (src_addr, src, src_len, error);
353 
354         // Make sure the memory read succeeded...
355         if (bytes_read != src_len)
356         {
357             if (error.Success())
358             {
359                 // This might happen if we read _some_ bytes but not all
360                 error.SetErrorStringWithFormat("read %u of %u bytes", bytes_read, src_len);
361             }
362             return error;
363         }
364 
365         // We now have a memory buffer that contains the part or all of the register
366         // value. Set the register value using this memory data.
367         // TODO: we might need to add a parameter to this function in case the byte
368         // order of the memory data doesn't match the process. For now we are assuming
369         // they are the same.
370         reg_value.SetFromMemoryData (reg_info,
371                                      src,
372                                      src_len,
373                                      process_sp->GetByteOrder(),
374                                      error);
375     }
376     else
377         error.SetErrorString("invalid process");
378 
379     return error;
380 }
381 
382 Error
383 RegisterContext::WriteRegisterValueToMemory (const RegisterInfo *reg_info,
384                                              lldb::addr_t dst_addr,
385                                              uint32_t dst_len,
386                                              const RegisterValue &reg_value)
387 {
388 
389     uint8_t dst[RegisterValue::kMaxRegisterByteSize];
390 
391     Error error;
392 
393     ProcessSP process_sp (m_thread.GetProcess());
394     if (process_sp)
395     {
396 
397         // TODO: we might need to add a parameter to this function in case the byte
398         // order of the memory data doesn't match the process. For now we are assuming
399         // they are the same.
400 
401         const uint32_t bytes_copied = reg_value.GetAsMemoryData (reg_info,
402                                                                  dst,
403                                                                  dst_len,
404                                                                  process_sp->GetByteOrder(),
405                                                                  error);
406 
407         if (error.Success())
408         {
409             if (bytes_copied == 0)
410             {
411                 error.SetErrorString("byte copy failed.");
412             }
413             else
414             {
415                 const uint32_t bytes_written = process_sp->WriteMemory (dst_addr, dst, bytes_copied, error);
416                 if (bytes_written != bytes_copied)
417                 {
418                     if (error.Success())
419                     {
420                         // This might happen if we read _some_ bytes but not all
421                         error.SetErrorStringWithFormat("only wrote %u of %u bytes", bytes_written, bytes_copied);
422                     }
423                 }
424             }
425         }
426     }
427     else
428         error.SetErrorString("invalid process");
429 
430     return error;
431 
432 }
433 
434 TargetSP
435 RegisterContext::CalculateTarget ()
436 {
437     return m_thread.CalculateTarget();
438 }
439 
440 
441 ProcessSP
442 RegisterContext::CalculateProcess ()
443 {
444     return m_thread.CalculateProcess ();
445 }
446 
447 ThreadSP
448 RegisterContext::CalculateThread ()
449 {
450     return m_thread.shared_from_this();
451 }
452 
453 StackFrameSP
454 RegisterContext::CalculateStackFrame ()
455 {
456     // Register contexts might belong to many frames if we have inlined
457     // functions inside a frame since all inlined functions share the
458     // same registers, so we can't definitively say which frame we come from...
459     return StackFrameSP();
460 }
461 
462 void
463 RegisterContext::CalculateExecutionContext (ExecutionContext &exe_ctx)
464 {
465     m_thread.CalculateExecutionContext (exe_ctx);
466 }
467 
468 
469 bool
470 RegisterContext::ConvertBetweenRegisterKinds (int source_rk, uint32_t source_regnum, int target_rk, uint32_t& target_regnum)
471 {
472     const uint32_t num_registers = GetRegisterCount();
473     for (uint32_t reg = 0; reg < num_registers; ++reg)
474     {
475         const RegisterInfo * reg_info = GetRegisterInfoAtIndex (reg);
476 
477         if (reg_info->kinds[source_rk] == source_regnum)
478         {
479             target_regnum = reg_info->kinds[target_rk];
480             if (target_regnum == LLDB_INVALID_REGNUM)
481             {
482                 return false;
483             }
484             else
485             {
486                 return true;
487             }
488         }
489     }
490     return false;
491 }
492 
493 //bool
494 //RegisterContext::ReadRegisterValue (uint32_t reg, Scalar &value)
495 //{
496 //    DataExtractor data;
497 //    if (!ReadRegisterBytes (reg, data))
498 //        return false;
499 //
500 //    const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg);
501 //    uint32_t offset = 0;
502 //    switch (reg_info->encoding)
503 //    {
504 //    case eEncodingInvalid:
505 //    case eEncodingVector:
506 //        break;
507 //
508 //    case eEncodingUint:
509 //        switch (reg_info->byte_size)
510 //        {
511 //        case 1:
512 //            {
513 //                value = data.GetU8 (&offset);
514 //                return true;
515 //            }
516 //        case 2:
517 //            {
518 //                value = data.GetU16 (&offset);
519 //                return true;
520 //            }
521 //        case 4:
522 //            {
523 //                value = data.GetU32 (&offset);
524 //                return true;
525 //            }
526 //        case 8:
527 //            {
528 //                value = data.GetU64 (&offset);
529 //                return true;
530 //            }
531 //        }
532 //        break;
533 //    case eEncodingSint:
534 //        switch (reg_info->byte_size)
535 //        {
536 //        case 1:
537 //            {
538 //                int8_t v;
539 //                if (data.ExtractBytes (0, sizeof (int8_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int8_t))
540 //                    return false;
541 //                value = v;
542 //                return true;
543 //            }
544 //        case 2:
545 //            {
546 //                int16_t v;
547 //                if (data.ExtractBytes (0, sizeof (int16_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int16_t))
548 //                    return false;
549 //                value = v;
550 //                return true;
551 //            }
552 //        case 4:
553 //            {
554 //                int32_t v;
555 //                if (data.ExtractBytes (0, sizeof (int32_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int32_t))
556 //                    return false;
557 //                value = v;
558 //                return true;
559 //            }
560 //        case 8:
561 //            {
562 //                int64_t v;
563 //                if (data.ExtractBytes (0, sizeof (int64_t), lldb::endian::InlHostByteOrder(), &v) != sizeof (int64_t))
564 //                    return false;
565 //                value = v;
566 //                return true;
567 //            }
568 //        }
569 //        break;
570 //    case eEncodingIEEE754:
571 //        switch (reg_info->byte_size)
572 //        {
573 //        case sizeof (float):
574 //            {
575 //                float v;
576 //                if (data.ExtractBytes (0, sizeof (float), lldb::endian::InlHostByteOrder(), &v) != sizeof (float))
577 //                    return false;
578 //                value = v;
579 //                return true;
580 //            }
581 //        case sizeof (double):
582 //            {
583 //                double v;
584 //                if (data.ExtractBytes (0, sizeof (double), lldb::endian::InlHostByteOrder(), &v) != sizeof (double))
585 //                    return false;
586 //                value = v;
587 //                return true;
588 //            }
589 //        case sizeof (long double):
590 //            {
591 //                double v;
592 //                if (data.ExtractBytes (0, sizeof (long double), lldb::endian::InlHostByteOrder(), &v) != sizeof (long double))
593 //                    return false;
594 //                value = v;
595 //                return true;
596 //            }
597 //        }
598 //        break;
599 //    }
600 //    return false;
601 //}
602 //
603 //bool
604 //RegisterContext::WriteRegisterValue (uint32_t reg, const Scalar &value)
605 //{
606 //    DataExtractor data;
607 //    if (!value.IsValid())
608 //        return false;
609 //    if (!value.GetData (data))
610 //        return false;
611 //
612 //    return WriteRegisterBytes (reg, data);
613 //}
614