1 //===-- GDBRemoteRegisterContext.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 "GDBRemoteRegisterContext.h"
11 
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 #include "lldb/Core/DataBufferHeap.h"
16 #include "lldb/Core/DataExtractor.h"
17 #include "lldb/Core/RegisterValue.h"
18 #include "lldb/Core/Scalar.h"
19 #include "lldb/Core/StreamString.h"
20 #include "lldb/Target/ExecutionContext.h"
21 #include "lldb/Target/Target.h"
22 #include "lldb/Utility/Utils.h"
23 // Project includes
24 #include "Utility/StringExtractorGDBRemote.h"
25 #include "ProcessGDBRemote.h"
26 #include "ProcessGDBRemoteLog.h"
27 #include "ThreadGDBRemote.h"
28 #include "Utility/ARM_DWARF_Registers.h"
29 #include "Utility/ARM_ehframe_Registers.h"
30 
31 using namespace lldb;
32 using namespace lldb_private;
33 using namespace lldb_private::process_gdb_remote;
34 
35 //----------------------------------------------------------------------
36 // GDBRemoteRegisterContext constructor
37 //----------------------------------------------------------------------
38 GDBRemoteRegisterContext::GDBRemoteRegisterContext
39 (
40     ThreadGDBRemote &thread,
41     uint32_t concrete_frame_idx,
42     GDBRemoteDynamicRegisterInfo &reg_info,
43     bool read_all_at_once
44 ) :
45     RegisterContext (thread, concrete_frame_idx),
46     m_reg_info (reg_info),
47     m_reg_valid (),
48     m_reg_data (),
49     m_read_all_at_once (read_all_at_once)
50 {
51     // Resize our vector of bools to contain one bool for every register.
52     // We will use these boolean values to know when a register value
53     // is valid in m_reg_data.
54     m_reg_valid.resize (reg_info.GetNumRegisters());
55 
56     // Make a heap based buffer that is big enough to store all registers
57     DataBufferSP reg_data_sp(new DataBufferHeap (reg_info.GetRegisterDataByteSize(), 0));
58     m_reg_data.SetData (reg_data_sp);
59     m_reg_data.SetByteOrder(thread.GetProcess()->GetByteOrder());
60 }
61 
62 //----------------------------------------------------------------------
63 // Destructor
64 //----------------------------------------------------------------------
65 GDBRemoteRegisterContext::~GDBRemoteRegisterContext()
66 {
67 }
68 
69 void
70 GDBRemoteRegisterContext::InvalidateAllRegisters ()
71 {
72     SetAllRegisterValid (false);
73 }
74 
75 void
76 GDBRemoteRegisterContext::SetAllRegisterValid (bool b)
77 {
78     std::vector<bool>::iterator pos, end = m_reg_valid.end();
79     for (pos = m_reg_valid.begin(); pos != end; ++pos)
80         *pos = b;
81 }
82 
83 size_t
84 GDBRemoteRegisterContext::GetRegisterCount ()
85 {
86     return m_reg_info.GetNumRegisters ();
87 }
88 
89 const RegisterInfo *
90 GDBRemoteRegisterContext::GetRegisterInfoAtIndex (size_t reg)
91 {
92     return m_reg_info.GetRegisterInfoAtIndex (reg);
93 }
94 
95 size_t
96 GDBRemoteRegisterContext::GetRegisterSetCount ()
97 {
98     return m_reg_info.GetNumRegisterSets ();
99 }
100 
101 
102 
103 const RegisterSet *
104 GDBRemoteRegisterContext::GetRegisterSet (size_t reg_set)
105 {
106     return m_reg_info.GetRegisterSet (reg_set);
107 }
108 
109 
110 
111 bool
112 GDBRemoteRegisterContext::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value)
113 {
114     // Read the register
115     if (ReadRegisterBytes (reg_info, m_reg_data))
116     {
117         const bool partial_data_ok = false;
118         Error error (value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok));
119         return error.Success();
120     }
121     return false;
122 }
123 
124 bool
125 GDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response)
126 {
127     const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg);
128     if (reg_info == NULL)
129         return false;
130 
131     // Invalidate if needed
132     InvalidateIfNeeded(false);
133 
134     const uint32_t reg_byte_size = reg_info->byte_size;
135     const size_t bytes_copied = response.GetHexBytes (const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_byte_size)), reg_byte_size, '\xcc');
136     bool success = bytes_copied == reg_byte_size;
137     if (success)
138     {
139         SetRegisterIsValid(reg, true);
140     }
141     else if (bytes_copied > 0)
142     {
143         // Only set register is valid to false if we copied some bytes, else
144         // leave it as it was.
145         SetRegisterIsValid(reg, false);
146     }
147     return success;
148 }
149 
150 bool
151 GDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, uint64_t new_reg_val)
152 {
153     const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg);
154     if (reg_info == NULL)
155         return false;
156 
157     // Early in process startup, we can get a thread that has an invalid byte order
158     // because the process hasn't been completely set up yet (see the ctor where the
159     // byte order is setfrom the process).  If that's the case, we can't set the
160     // value here.
161     if (m_reg_data.GetByteOrder() == eByteOrderInvalid)
162     {
163         return false;
164     }
165 
166     // Invalidate if needed
167     InvalidateIfNeeded (false);
168 
169     DataBufferSP buffer_sp (new DataBufferHeap (&new_reg_val, sizeof (new_reg_val)));
170     DataExtractor data (buffer_sp, endian::InlHostByteOrder(), sizeof (void*));
171 
172     // If our register context and our register info disagree, which should never happen, don't
173     // overwrite past the end of the buffer.
174     if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
175         return false;
176 
177     // Grab a pointer to where we are going to put this register
178     uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size));
179 
180     if (dst == NULL)
181         return false;
182 
183 
184     if (data.CopyByteOrderedData (0,                            // src offset
185                                   reg_info->byte_size,          // src length
186                                   dst,                          // dst
187                                   reg_info->byte_size,          // dst length
188                                   m_reg_data.GetByteOrder()))   // dst byte order
189     {
190         SetRegisterIsValid (reg, true);
191         return true;
192     }
193     return false;
194 }
195 
196 // Helper function for GDBRemoteRegisterContext::ReadRegisterBytes().
197 bool
198 GDBRemoteRegisterContext::GetPrimordialRegister(const RegisterInfo *reg_info,
199                                                 GDBRemoteCommunicationClient &gdb_comm)
200 {
201     const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
202     StringExtractorGDBRemote response;
203     if (gdb_comm.ReadRegister(m_thread.GetProtocolID(), reg, response))
204         return PrivateSetRegisterValue (reg, response);
205     return false;
206 }
207 
208 bool
209 GDBRemoteRegisterContext::ReadRegisterBytes (const RegisterInfo *reg_info, DataExtractor &data)
210 {
211     ExecutionContext exe_ctx (CalculateThread());
212 
213     Process *process = exe_ctx.GetProcessPtr();
214     Thread *thread = exe_ctx.GetThreadPtr();
215     if (process == NULL || thread == NULL)
216         return false;
217 
218     GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote());
219 
220     InvalidateIfNeeded(false);
221 
222     const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
223 
224     if (!GetRegisterIsValid(reg))
225     {
226         if (m_read_all_at_once)
227         {
228             StringExtractorGDBRemote response;
229             if (!gdb_comm.ReadAllRegisters(m_thread.GetProtocolID(), response))
230                 return false;
231             if (response.IsNormalResponse())
232                 if (response.GetHexBytes(const_cast<void *>(reinterpret_cast<const void *>(m_reg_data.GetDataStart())),
233                                          m_reg_data.GetByteSize(), '\xcc') == m_reg_data.GetByteSize())
234                     SetAllRegisterValid (true);
235         }
236         else if (reg_info->value_regs)
237         {
238             // Process this composite register request by delegating to the constituent
239             // primordial registers.
240 
241             // Index of the primordial register.
242             bool success = true;
243             for (uint32_t idx = 0; success; ++idx)
244             {
245                 const uint32_t prim_reg = reg_info->value_regs[idx];
246                 if (prim_reg == LLDB_INVALID_REGNUM)
247                     break;
248                 // We have a valid primordial register as our constituent.
249                 // Grab the corresponding register info.
250                 const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg);
251                 if (prim_reg_info == NULL)
252                     success = false;
253                 else
254                 {
255                     // Read the containing register if it hasn't already been read
256                     if (!GetRegisterIsValid(prim_reg))
257                         success = GetPrimordialRegister(prim_reg_info, gdb_comm);
258                 }
259             }
260 
261             if (success)
262             {
263                 // If we reach this point, all primordial register requests have succeeded.
264                 // Validate this composite register.
265                 SetRegisterIsValid (reg_info, true);
266             }
267         }
268         else
269         {
270             // Get each register individually
271             GetPrimordialRegister(reg_info, gdb_comm);
272         }
273 
274         // Make sure we got a valid register value after reading it
275         if (!GetRegisterIsValid(reg))
276             return false;
277     }
278 
279     if (&data != &m_reg_data)
280     {
281 #if defined (LLDB_CONFIGURATION_DEBUG)
282         assert (m_reg_data.GetByteSize() >= reg_info->byte_offset + reg_info->byte_size);
283 #endif
284         // If our register context and our register info disagree, which should never happen, don't
285         // read past the end of the buffer.
286         if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
287             return false;
288 
289         // If we aren't extracting into our own buffer (which
290         // only happens when this function is called from
291         // ReadRegisterValue(uint32_t, Scalar&)) then
292         // we transfer bytes from our buffer into the data
293         // buffer that was passed in
294 
295         data.SetByteOrder (m_reg_data.GetByteOrder());
296         data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size);
297     }
298     return true;
299 }
300 
301 bool
302 GDBRemoteRegisterContext::WriteRegister (const RegisterInfo *reg_info,
303                                          const RegisterValue &value)
304 {
305     DataExtractor data;
306     if (value.GetData (data))
307         return WriteRegisterBytes (reg_info, data, 0);
308     return false;
309 }
310 
311 // Helper function for GDBRemoteRegisterContext::WriteRegisterBytes().
312 bool
313 GDBRemoteRegisterContext::SetPrimordialRegister(const RegisterInfo *reg_info,
314                                                 GDBRemoteCommunicationClient &gdb_comm)
315 {
316     StreamString packet;
317     StringExtractorGDBRemote response;
318     const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
319     packet.Printf ("P%x=", reg);
320     packet.PutBytesAsRawHex8 (m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size),
321                               reg_info->byte_size,
322                               endian::InlHostByteOrder(),
323                               endian::InlHostByteOrder());
324 
325     if (gdb_comm.GetThreadSuffixSupported())
326         packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID());
327 
328     // Invalidate just this register
329     SetRegisterIsValid(reg, false);
330     if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
331                                               packet.GetString().size(),
332                                               response,
333                                               false) == GDBRemoteCommunication::PacketResult::Success)
334     {
335         if (response.IsOKResponse())
336             return true;
337     }
338     return false;
339 }
340 
341 void
342 GDBRemoteRegisterContext::SyncThreadState(Process *process)
343 {
344     // NB.  We assume our caller has locked the sequence mutex.
345 
346     GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *) process)->GetGDBRemote());
347     if (!gdb_comm.GetSyncThreadStateSupported())
348         return;
349 
350     StreamString packet;
351     StringExtractorGDBRemote response;
352     packet.Printf ("QSyncThreadState:%4.4" PRIx64 ";", m_thread.GetProtocolID());
353     if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
354                                               packet.GetString().size(),
355                                               response,
356                                               false) == GDBRemoteCommunication::PacketResult::Success)
357     {
358         if (response.IsOKResponse())
359             InvalidateAllRegisters();
360     }
361 }
362 
363 bool
364 GDBRemoteRegisterContext::WriteRegisterBytes (const RegisterInfo *reg_info, DataExtractor &data, uint32_t data_offset)
365 {
366     ExecutionContext exe_ctx (CalculateThread());
367 
368     Process *process = exe_ctx.GetProcessPtr();
369     Thread *thread = exe_ctx.GetThreadPtr();
370     if (process == NULL || thread == NULL)
371         return false;
372 
373     GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote());
374 // FIXME: This check isn't right because IsRunning checks the Public state, but this
375 // is work you need to do - for instance in ShouldStop & friends - before the public
376 // state has been changed.
377 //    if (gdb_comm.IsRunning())
378 //        return false;
379 
380 
381 #if defined (LLDB_CONFIGURATION_DEBUG)
382     assert (m_reg_data.GetByteSize() >= reg_info->byte_offset + reg_info->byte_size);
383 #endif
384 
385     // If our register context and our register info disagree, which should never happen, don't
386     // overwrite past the end of the buffer.
387     if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
388         return false;
389 
390     // Grab a pointer to where we are going to put this register
391     uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size));
392 
393     if (dst == NULL)
394         return false;
395 
396 
397     if (data.CopyByteOrderedData (data_offset,                  // src offset
398                                   reg_info->byte_size,          // src length
399                                   dst,                          // dst
400                                   reg_info->byte_size,          // dst length
401                                   m_reg_data.GetByteOrder()))   // dst byte order
402     {
403         Mutex::Locker locker;
404         if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for write register."))
405         {
406             const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
407             ProcessSP process_sp (m_thread.GetProcess());
408             if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID()))
409             {
410                 StreamString packet;
411                 StringExtractorGDBRemote response;
412 
413                 if (m_read_all_at_once)
414                 {
415                     // Set all registers in one packet
416                     packet.PutChar ('G');
417                     packet.PutBytesAsRawHex8 (m_reg_data.GetDataStart(),
418                                               m_reg_data.GetByteSize(),
419                                               endian::InlHostByteOrder(),
420                                               endian::InlHostByteOrder());
421 
422                     if (thread_suffix_supported)
423                         packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID());
424 
425                     // Invalidate all register values
426                     InvalidateIfNeeded (true);
427 
428                     if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
429                                                               packet.GetString().size(),
430                                                               response,
431                                                               false) == GDBRemoteCommunication::PacketResult::Success)
432                     {
433                         SetAllRegisterValid (false);
434                         if (response.IsOKResponse())
435                         {
436                             return true;
437                         }
438                     }
439                 }
440                 else
441                 {
442                     bool success = true;
443 
444                     if (reg_info->value_regs)
445                     {
446                         // This register is part of another register. In this case we read the actual
447                         // register data for any "value_regs", and once all that data is read, we will
448                         // have enough data in our register context bytes for the value of this register
449 
450                         // Invalidate this composite register first.
451 
452                         for (uint32_t idx = 0; success; ++idx)
453                         {
454                             const uint32_t reg = reg_info->value_regs[idx];
455                             if (reg == LLDB_INVALID_REGNUM)
456                                 break;
457                             // We have a valid primordial register as our constituent.
458                             // Grab the corresponding register info.
459                             const RegisterInfo *value_reg_info = GetRegisterInfoAtIndex(reg);
460                             if (value_reg_info == NULL)
461                                 success = false;
462                             else
463                                 success = SetPrimordialRegister(value_reg_info, gdb_comm);
464                         }
465                     }
466                     else
467                     {
468                         // This is an actual register, write it
469                         success = SetPrimordialRegister(reg_info, gdb_comm);
470                     }
471 
472                     // Check if writing this register will invalidate any other register values?
473                     // If so, invalidate them
474                     if (reg_info->invalidate_regs)
475                     {
476                         for (uint32_t idx = 0, reg = reg_info->invalidate_regs[0];
477                              reg != LLDB_INVALID_REGNUM;
478                              reg = reg_info->invalidate_regs[++idx])
479                         {
480                             SetRegisterIsValid(reg, false);
481                         }
482                     }
483 
484                     return success;
485                 }
486             }
487         }
488         else
489         {
490             Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS));
491             if (log)
492             {
493                 if (log->GetVerbose())
494                 {
495                     StreamString strm;
496                     gdb_comm.DumpHistory(strm);
497                     log->Printf("error: failed to get packet sequence mutex, not sending write register for \"%s\":\n%s", reg_info->name, strm.GetData());
498                 }
499                 else
500                     log->Printf("error: failed to get packet sequence mutex, not sending write register for \"%s\"", reg_info->name);
501             }
502         }
503     }
504     return false;
505 }
506 
507 bool
508 GDBRemoteRegisterContext::ReadAllRegisterValues (RegisterCheckpoint &reg_checkpoint)
509 {
510     ExecutionContext exe_ctx (CalculateThread());
511 
512     Process *process = exe_ctx.GetProcessPtr();
513     Thread *thread = exe_ctx.GetThreadPtr();
514     if (process == NULL || thread == NULL)
515         return false;
516 
517     GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote());
518 
519     uint32_t save_id = 0;
520     if (gdb_comm.SaveRegisterState(thread->GetProtocolID(), save_id))
521     {
522         reg_checkpoint.SetID(save_id);
523         reg_checkpoint.GetData().reset();
524         return true;
525     }
526     else
527     {
528         reg_checkpoint.SetID(0); // Invalid save ID is zero
529         return ReadAllRegisterValues(reg_checkpoint.GetData());
530     }
531 }
532 
533 bool
534 GDBRemoteRegisterContext::WriteAllRegisterValues (const RegisterCheckpoint &reg_checkpoint)
535 {
536     uint32_t save_id = reg_checkpoint.GetID();
537     if (save_id != 0)
538     {
539         ExecutionContext exe_ctx (CalculateThread());
540 
541         Process *process = exe_ctx.GetProcessPtr();
542         Thread *thread = exe_ctx.GetThreadPtr();
543         if (process == NULL || thread == NULL)
544             return false;
545 
546         GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote());
547 
548         return gdb_comm.RestoreRegisterState(m_thread.GetProtocolID(), save_id);
549     }
550     else
551     {
552         return WriteAllRegisterValues(reg_checkpoint.GetData());
553     }
554 }
555 
556 bool
557 GDBRemoteRegisterContext::ReadAllRegisterValues (lldb::DataBufferSP &data_sp)
558 {
559     ExecutionContext exe_ctx (CalculateThread());
560 
561     Process *process = exe_ctx.GetProcessPtr();
562     Thread *thread = exe_ctx.GetThreadPtr();
563     if (process == NULL || thread == NULL)
564         return false;
565 
566     GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote());
567 
568     StringExtractorGDBRemote response;
569 
570     const bool use_g_packet = gdb_comm.AvoidGPackets ((ProcessGDBRemote *)process) == false;
571 
572     Mutex::Locker locker;
573     if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for read all registers."))
574     {
575         SyncThreadState(process);
576 
577         char packet[32];
578         const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
579         ProcessSP process_sp (m_thread.GetProcess());
580         if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID()))
581         {
582             int packet_len = 0;
583             if (thread_suffix_supported)
584                 packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4" PRIx64, m_thread.GetProtocolID());
585             else
586                 packet_len = ::snprintf (packet, sizeof(packet), "g");
587             assert (packet_len < ((int)sizeof(packet) - 1));
588 
589             if (use_g_packet && gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false) == GDBRemoteCommunication::PacketResult::Success)
590             {
591                 int packet_len = 0;
592                 if (thread_suffix_supported)
593                     packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4" PRIx64, m_thread.GetProtocolID());
594                 else
595                     packet_len = ::snprintf (packet, sizeof(packet), "g");
596                 assert (packet_len < ((int)sizeof(packet) - 1));
597 
598                 if (gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false) == GDBRemoteCommunication::PacketResult::Success)
599                 {
600                     if (response.IsErrorResponse())
601                         return false;
602 
603                     std::string &response_str = response.GetStringRef();
604                     if (isxdigit(response_str[0]))
605                     {
606                         response_str.insert(0, 1, 'G');
607                         if (thread_suffix_supported)
608                         {
609                             char thread_id_cstr[64];
610                             ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID());
611                             response_str.append (thread_id_cstr);
612                         }
613                         data_sp.reset (new DataBufferHeap (response_str.c_str(), response_str.size()));
614                         return true;
615                     }
616                 }
617             }
618             else
619             {
620                 // For the use_g_packet == false case, we're going to read each register
621                 // individually and store them as binary data in a buffer instead of as ascii
622                 // characters.
623                 const RegisterInfo *reg_info;
624 
625                 // data_sp will take ownership of this DataBufferHeap pointer soon.
626                 DataBufferSP reg_ctx(new DataBufferHeap(m_reg_info.GetRegisterDataByteSize(), 0));
627 
628                 for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex (i)) != NULL; i++)
629                 {
630                     if (reg_info->value_regs) // skip registers that are slices of real registers
631                         continue;
632                     ReadRegisterBytes (reg_info, m_reg_data);
633                     // ReadRegisterBytes saves the contents of the register in to the m_reg_data buffer
634                 }
635                 memcpy (reg_ctx->GetBytes(), m_reg_data.GetDataStart(), m_reg_info.GetRegisterDataByteSize());
636 
637                 data_sp = reg_ctx;
638                 return true;
639             }
640         }
641     }
642     else
643     {
644 
645         Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS));
646         if (log)
647         {
648             if (log->GetVerbose())
649             {
650                 StreamString strm;
651                 gdb_comm.DumpHistory(strm);
652                 log->Printf("error: failed to get packet sequence mutex, not sending read all registers:\n%s", strm.GetData());
653             }
654             else
655                 log->Printf("error: failed to get packet sequence mutex, not sending read all registers");
656         }
657     }
658 
659     data_sp.reset();
660     return false;
661 }
662 
663 bool
664 GDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp)
665 {
666     if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0)
667         return false;
668 
669     ExecutionContext exe_ctx (CalculateThread());
670 
671     Process *process = exe_ctx.GetProcessPtr();
672     Thread *thread = exe_ctx.GetThreadPtr();
673     if (process == NULL || thread == NULL)
674         return false;
675 
676     GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote());
677 
678     const bool use_g_packet = gdb_comm.AvoidGPackets ((ProcessGDBRemote *)process) == false;
679 
680     StringExtractorGDBRemote response;
681     Mutex::Locker locker;
682     if (gdb_comm.GetSequenceMutex (locker, "Didn't get sequence mutex for write all registers."))
683     {
684         const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported();
685         ProcessSP process_sp (m_thread.GetProcess());
686         if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetProtocolID()))
687         {
688             // The data_sp contains the entire G response packet including the
689             // G, and if the thread suffix is supported, it has the thread suffix
690             // as well.
691             const char *G_packet = (const char *)data_sp->GetBytes();
692             size_t G_packet_len = data_sp->GetByteSize();
693             if (use_g_packet
694                 && gdb_comm.SendPacketAndWaitForResponse (G_packet,
695                                                           G_packet_len,
696                                                           response,
697                                                           false) == GDBRemoteCommunication::PacketResult::Success)
698             {
699                 // The data_sp contains the entire G response packet including the
700                 // G, and if the thread suffix is supported, it has the thread suffix
701                 // as well.
702                 const char *G_packet = (const char *)data_sp->GetBytes();
703                 size_t G_packet_len = data_sp->GetByteSize();
704                 if (gdb_comm.SendPacketAndWaitForResponse (G_packet,
705                                                            G_packet_len,
706                                                            response,
707                                                            false) == GDBRemoteCommunication::PacketResult::Success)
708                 {
709                     if (response.IsOKResponse())
710                         return true;
711                     else if (response.IsErrorResponse())
712                     {
713                         uint32_t num_restored = 0;
714                         // We need to manually go through all of the registers and
715                         // restore them manually
716 
717                         response.GetStringRef().assign (G_packet, G_packet_len);
718                         response.SetFilePos(1); // Skip the leading 'G'
719 
720                         // G_packet_len is hex-ascii characters plus prefix 'G' plus suffix thread specifier.
721                         // This means buffer will be a little more than 2x larger than necessary but we resize
722                         // it down once we've extracted all hex ascii chars from the packet.
723                         DataBufferHeap buffer (G_packet_len, 0);
724 
725                         const uint32_t bytes_extracted = response.GetHexBytes (buffer.GetBytes(),
726                                                                                buffer.GetByteSize(),
727                                                                                '\xcc');
728 
729                         DataExtractor restore_data (buffer.GetBytes(),
730                                                     buffer.GetByteSize(),
731                                                     m_reg_data.GetByteOrder(),
732                                                     m_reg_data.GetAddressByteSize());
733 
734                         if (bytes_extracted < restore_data.GetByteSize())
735                             restore_data.SetData(restore_data.GetDataStart(), bytes_extracted, m_reg_data.GetByteOrder());
736 
737                         const RegisterInfo *reg_info;
738 
739                         // The g packet contents may either include the slice registers (registers defined in
740                         // terms of other registers, e.g. eax is a subset of rax) or not.  The slice registers
741                         // should NOT be in the g packet, but some implementations may incorrectly include them.
742                         //
743                         // If the slice registers are included in the packet, we must step over the slice registers
744                         // when parsing the packet -- relying on the RegisterInfo byte_offset field would be incorrect.
745                         // If the slice registers are not included, then using the byte_offset values into the
746                         // data buffer is the best way to find individual register values.
747 
748                         uint64_t size_including_slice_registers = 0;
749                         uint64_t size_not_including_slice_registers = 0;
750                         uint64_t size_by_highest_offset = 0;
751 
752                         for (uint32_t reg_idx=0; (reg_info = GetRegisterInfoAtIndex (reg_idx)) != NULL; ++reg_idx)
753                         {
754                             size_including_slice_registers += reg_info->byte_size;
755                             if (reg_info->value_regs == NULL)
756                                 size_not_including_slice_registers += reg_info->byte_size;
757                             if (reg_info->byte_offset >= size_by_highest_offset)
758                                 size_by_highest_offset = reg_info->byte_offset + reg_info->byte_size;
759                         }
760 
761                         bool use_byte_offset_into_buffer;
762                         if (size_by_highest_offset == restore_data.GetByteSize())
763                         {
764                             // The size of the packet agrees with the highest offset: + size in the register file
765                             use_byte_offset_into_buffer = true;
766                         }
767                         else if (size_not_including_slice_registers == restore_data.GetByteSize())
768                         {
769                             // The size of the packet is the same as concatenating all of the registers sequentially,
770                             // skipping the slice registers
771                             use_byte_offset_into_buffer = true;
772                         }
773                         else if (size_including_slice_registers == restore_data.GetByteSize())
774                         {
775                             // The slice registers are present in the packet (when they shouldn't be).
776                             // Don't try to use the RegisterInfo byte_offset into the restore_data, it will
777                             // point to the wrong place.
778                             use_byte_offset_into_buffer = false;
779                         }
780                         else {
781                             // None of our expected sizes match the actual g packet data we're looking at.
782                             // The most conservative approach here is to use the running total byte offset.
783                             use_byte_offset_into_buffer = false;
784                         }
785 
786                         // In case our register definitions don't include the correct offsets,
787                         // keep track of the size of each reg & compute offset based on that.
788                         uint32_t running_byte_offset = 0;
789                         for (uint32_t reg_idx=0; (reg_info = GetRegisterInfoAtIndex (reg_idx)) != NULL; ++reg_idx, running_byte_offset += reg_info->byte_size)
790                         {
791                             // Skip composite aka slice registers (e.g. eax is a slice of rax).
792                             if (reg_info->value_regs)
793                                 continue;
794 
795                             const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
796 
797                             uint32_t register_offset;
798                             if (use_byte_offset_into_buffer)
799                             {
800                                 register_offset = reg_info->byte_offset;
801                             }
802                             else
803                             {
804                                 register_offset = running_byte_offset;
805                             }
806 
807                             // Only write down the registers that need to be written
808                             // if we are going to be doing registers individually.
809                             bool write_reg = true;
810                             const uint32_t reg_byte_size = reg_info->byte_size;
811 
812                             const char *restore_src = (const char *)restore_data.PeekData(register_offset, reg_byte_size);
813                             if (restore_src)
814                             {
815                                 StreamString packet;
816                                 packet.Printf ("P%x=", reg);
817                                 packet.PutBytesAsRawHex8 (restore_src,
818                                                           reg_byte_size,
819                                                           endian::InlHostByteOrder(),
820                                                           endian::InlHostByteOrder());
821 
822                                 if (thread_suffix_supported)
823                                     packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID());
824 
825                                 SetRegisterIsValid(reg, false);
826                                 if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
827                                                                           packet.GetString().size(),
828                                                                           response,
829                                                                           false) == GDBRemoteCommunication::PacketResult::Success)
830                                 {
831                                     const char *current_src = (const char *)m_reg_data.PeekData(register_offset, reg_byte_size);
832                                     if (current_src)
833                                         write_reg = memcmp (current_src, restore_src, reg_byte_size) != 0;
834                                 }
835 
836                                 if (write_reg)
837                                 {
838                                     StreamString packet;
839                                     packet.Printf ("P%x=", reg);
840                                     packet.PutBytesAsRawHex8 (restore_src,
841                                                               reg_byte_size,
842                                                               endian::InlHostByteOrder(),
843                                                               endian::InlHostByteOrder());
844 
845                                     if (thread_suffix_supported)
846                                         packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID());
847 
848                                     SetRegisterIsValid(reg, false);
849                                     if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
850                                                                               packet.GetString().size(),
851                                                                               response,
852                                                                               false) == GDBRemoteCommunication::PacketResult::Success)
853                                     {
854                                         if (response.IsOKResponse())
855                                             ++num_restored;
856                                     }
857                                 }
858                             }
859                         }
860                         return num_restored > 0;
861                     }
862                 }
863             }
864             else
865             {
866                 // For the use_g_packet == false case, we're going to write each register
867                 // individually.  The data buffer is binary data in this case, instead of
868                 // ascii characters.
869 
870                 bool arm64_debugserver = false;
871                 if (m_thread.GetProcess().get())
872                 {
873                     const ArchSpec &arch = m_thread.GetProcess()->GetTarget().GetArchitecture();
874                     if (arch.IsValid()
875                         && arch.GetMachine() == llvm::Triple::aarch64
876                         && arch.GetTriple().getVendor() == llvm::Triple::Apple
877                         && arch.GetTriple().getOS() == llvm::Triple::IOS)
878                     {
879                         arm64_debugserver = true;
880                     }
881                 }
882                 uint32_t num_restored = 0;
883                 const RegisterInfo *reg_info;
884                 for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex (i)) != NULL; i++)
885                 {
886                     if (reg_info->value_regs) // skip registers that are slices of real registers
887                         continue;
888                     // Skip the fpsr and fpcr floating point status/control register writing to
889                     // work around a bug in an older version of debugserver that would lead to
890                     // register context corruption when writing fpsr/fpcr.
891                     if (arm64_debugserver &&
892                         (strcmp (reg_info->name, "fpsr") == 0 || strcmp (reg_info->name, "fpcr") == 0))
893                     {
894                         continue;
895                     }
896                     StreamString packet;
897                     packet.Printf ("P%x=", reg_info->kinds[eRegisterKindLLDB]);
898                     packet.PutBytesAsRawHex8 (data_sp->GetBytes() + reg_info->byte_offset, reg_info->byte_size, endian::InlHostByteOrder(), endian::InlHostByteOrder());
899                     if (thread_suffix_supported)
900                         packet.Printf (";thread:%4.4" PRIx64 ";", m_thread.GetProtocolID());
901 
902                     SetRegisterIsValid(reg_info, false);
903                     if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(),
904                                                               packet.GetString().size(),
905                                                               response,
906                                                               false) == GDBRemoteCommunication::PacketResult::Success)
907                     {
908                         if (response.IsOKResponse())
909                             ++num_restored;
910                     }
911                 }
912                 return num_restored > 0;
913             }
914         }
915     }
916     else
917     {
918         Log *log (ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet (GDBR_LOG_THREAD | GDBR_LOG_PACKETS));
919         if (log)
920         {
921             if (log->GetVerbose())
922             {
923                 StreamString strm;
924                 gdb_comm.DumpHistory(strm);
925                 log->Printf("error: failed to get packet sequence mutex, not sending write all registers:\n%s", strm.GetData());
926             }
927             else
928                 log->Printf("error: failed to get packet sequence mutex, not sending write all registers");
929         }
930     }
931     return false;
932 }
933 
934 
935 uint32_t
936 GDBRemoteRegisterContext::ConvertRegisterKindToRegisterNumber (lldb::RegisterKind kind, uint32_t num)
937 {
938     return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num);
939 }
940 
941 
942 void
943 GDBRemoteDynamicRegisterInfo::HardcodeARMRegisters(bool from_scratch)
944 {
945     // For Advanced SIMD and VFP register mapping.
946     static uint32_t g_d0_regs[] =  { 26, 27, LLDB_INVALID_REGNUM }; // (s0, s1)
947     static uint32_t g_d1_regs[] =  { 28, 29, LLDB_INVALID_REGNUM }; // (s2, s3)
948     static uint32_t g_d2_regs[] =  { 30, 31, LLDB_INVALID_REGNUM }; // (s4, s5)
949     static uint32_t g_d3_regs[] =  { 32, 33, LLDB_INVALID_REGNUM }; // (s6, s7)
950     static uint32_t g_d4_regs[] =  { 34, 35, LLDB_INVALID_REGNUM }; // (s8, s9)
951     static uint32_t g_d5_regs[] =  { 36, 37, LLDB_INVALID_REGNUM }; // (s10, s11)
952     static uint32_t g_d6_regs[] =  { 38, 39, LLDB_INVALID_REGNUM }; // (s12, s13)
953     static uint32_t g_d7_regs[] =  { 40, 41, LLDB_INVALID_REGNUM }; // (s14, s15)
954     static uint32_t g_d8_regs[] =  { 42, 43, LLDB_INVALID_REGNUM }; // (s16, s17)
955     static uint32_t g_d9_regs[] =  { 44, 45, LLDB_INVALID_REGNUM }; // (s18, s19)
956     static uint32_t g_d10_regs[] = { 46, 47, LLDB_INVALID_REGNUM }; // (s20, s21)
957     static uint32_t g_d11_regs[] = { 48, 49, LLDB_INVALID_REGNUM }; // (s22, s23)
958     static uint32_t g_d12_regs[] = { 50, 51, LLDB_INVALID_REGNUM }; // (s24, s25)
959     static uint32_t g_d13_regs[] = { 52, 53, LLDB_INVALID_REGNUM }; // (s26, s27)
960     static uint32_t g_d14_regs[] = { 54, 55, LLDB_INVALID_REGNUM }; // (s28, s29)
961     static uint32_t g_d15_regs[] = { 56, 57, LLDB_INVALID_REGNUM }; // (s30, s31)
962     static uint32_t g_q0_regs[] =  { 26, 27, 28, 29, LLDB_INVALID_REGNUM }; // (d0, d1) -> (s0, s1, s2, s3)
963     static uint32_t g_q1_regs[] =  { 30, 31, 32, 33, LLDB_INVALID_REGNUM }; // (d2, d3) -> (s4, s5, s6, s7)
964     static uint32_t g_q2_regs[] =  { 34, 35, 36, 37, LLDB_INVALID_REGNUM }; // (d4, d5) -> (s8, s9, s10, s11)
965     static uint32_t g_q3_regs[] =  { 38, 39, 40, 41, LLDB_INVALID_REGNUM }; // (d6, d7) -> (s12, s13, s14, s15)
966     static uint32_t g_q4_regs[] =  { 42, 43, 44, 45, LLDB_INVALID_REGNUM }; // (d8, d9) -> (s16, s17, s18, s19)
967     static uint32_t g_q5_regs[] =  { 46, 47, 48, 49, LLDB_INVALID_REGNUM }; // (d10, d11) -> (s20, s21, s22, s23)
968     static uint32_t g_q6_regs[] =  { 50, 51, 52, 53, LLDB_INVALID_REGNUM }; // (d12, d13) -> (s24, s25, s26, s27)
969     static uint32_t g_q7_regs[] =  { 54, 55, 56, 57, LLDB_INVALID_REGNUM }; // (d14, d15) -> (s28, s29, s30, s31)
970     static uint32_t g_q8_regs[] =  { 59, 60, LLDB_INVALID_REGNUM }; // (d16, d17)
971     static uint32_t g_q9_regs[] =  { 61, 62, LLDB_INVALID_REGNUM }; // (d18, d19)
972     static uint32_t g_q10_regs[] = { 63, 64, LLDB_INVALID_REGNUM }; // (d20, d21)
973     static uint32_t g_q11_regs[] = { 65, 66, LLDB_INVALID_REGNUM }; // (d22, d23)
974     static uint32_t g_q12_regs[] = { 67, 68, LLDB_INVALID_REGNUM }; // (d24, d25)
975     static uint32_t g_q13_regs[] = { 69, 70, LLDB_INVALID_REGNUM }; // (d26, d27)
976     static uint32_t g_q14_regs[] = { 71, 72, LLDB_INVALID_REGNUM }; // (d28, d29)
977     static uint32_t g_q15_regs[] = { 73, 74, LLDB_INVALID_REGNUM }; // (d30, d31)
978 
979     // This is our array of composite registers, with each element coming from the above register mappings.
980     static uint32_t *g_composites[] = {
981         g_d0_regs, g_d1_regs,  g_d2_regs,  g_d3_regs,  g_d4_regs,  g_d5_regs,  g_d6_regs,  g_d7_regs,
982         g_d8_regs, g_d9_regs, g_d10_regs, g_d11_regs, g_d12_regs, g_d13_regs, g_d14_regs, g_d15_regs,
983         g_q0_regs, g_q1_regs,  g_q2_regs,  g_q3_regs,  g_q4_regs,  g_q5_regs,  g_q6_regs,  g_q7_regs,
984         g_q8_regs, g_q9_regs, g_q10_regs, g_q11_regs, g_q12_regs, g_q13_regs, g_q14_regs, g_q15_regs
985     };
986 
987     static RegisterInfo g_register_infos[] = {
988 //   NAME    ALT    SZ  OFF  ENCODING          FORMAT          EH_FRAME             DWARF                GENERIC                 PROCESS PLUGIN  LLDB      VALUE REGS    INVALIDATE REGS
989 //   ======  ====== === ===  =============     ============    ===================  ===================  ======================  =============   ====      ==========    ===============
990     { "r0", "arg1",   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r0,          dwarf_r0,            LLDB_REGNUM_GENERIC_ARG1,0,               0 },        NULL,              NULL},
991     { "r1", "arg2",   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r1,          dwarf_r1,            LLDB_REGNUM_GENERIC_ARG2,1,               1 },        NULL,              NULL},
992     { "r2", "arg3",   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r2,          dwarf_r2,            LLDB_REGNUM_GENERIC_ARG3,2,               2 },        NULL,              NULL},
993     { "r3", "arg4",   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r3,          dwarf_r3,            LLDB_REGNUM_GENERIC_ARG4,3,               3 },        NULL,              NULL},
994     { "r4",   NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r4,          dwarf_r4,            LLDB_INVALID_REGNUM,     4,               4 },        NULL,              NULL},
995     { "r5",   NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r5,          dwarf_r5,            LLDB_INVALID_REGNUM,     5,               5 },        NULL,              NULL},
996     { "r6",   NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r6,          dwarf_r6,            LLDB_INVALID_REGNUM,     6,               6 },        NULL,              NULL},
997     { "r7",   "fp",   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r7,          dwarf_r7,            LLDB_REGNUM_GENERIC_FP,  7,               7 },        NULL,              NULL},
998     { "r8",   NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r8,          dwarf_r8,            LLDB_INVALID_REGNUM,     8,               8 },        NULL,              NULL},
999     { "r9",   NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r9,          dwarf_r9,            LLDB_INVALID_REGNUM,     9,               9 },        NULL,              NULL},
1000     { "r10",  NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r10,         dwarf_r10,           LLDB_INVALID_REGNUM,    10,              10 },        NULL,              NULL},
1001     { "r11",  NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r11,         dwarf_r11,           LLDB_INVALID_REGNUM,    11,              11 },        NULL,              NULL},
1002     { "r12",  NULL,   4,   0, eEncodingUint,    eFormatHex,   { ehframe_r12,         dwarf_r12,           LLDB_INVALID_REGNUM,    12,              12 },        NULL,              NULL},
1003     { "sp",   "r13",  4,   0, eEncodingUint,    eFormatHex,   { ehframe_sp,          dwarf_sp,            LLDB_REGNUM_GENERIC_SP, 13,              13 },        NULL,              NULL},
1004     { "lr",   "r14",  4,   0, eEncodingUint,    eFormatHex,   { ehframe_lr,          dwarf_lr,            LLDB_REGNUM_GENERIC_RA, 14,              14 },        NULL,              NULL},
1005     { "pc",   "r15",  4,   0, eEncodingUint,    eFormatHex,   { ehframe_pc,          dwarf_pc,            LLDB_REGNUM_GENERIC_PC, 15,              15 },        NULL,              NULL},
1006     { "f0",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    16,              16 },        NULL,              NULL},
1007     { "f1",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    17,              17 },        NULL,              NULL},
1008     { "f2",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    18,              18 },        NULL,              NULL},
1009     { "f3",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    19,              19 },        NULL,              NULL},
1010     { "f4",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    20,              20 },        NULL,              NULL},
1011     { "f5",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    21,              21 },        NULL,              NULL},
1012     { "f6",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    22,              22 },        NULL,              NULL},
1013     { "f7",   NULL,  12,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    23,              23 },        NULL,              NULL},
1014     { "fps",  NULL,   4,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    24,              24 },        NULL,              NULL},
1015     { "cpsr","flags", 4,   0, eEncodingUint,    eFormatHex,   { ehframe_cpsr,        dwarf_cpsr,          LLDB_INVALID_REGNUM,    25,              25 },        NULL,              NULL},
1016     { "s0",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s0,            LLDB_INVALID_REGNUM,    26,              26 },        NULL,              NULL},
1017     { "s1",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s1,            LLDB_INVALID_REGNUM,    27,              27 },        NULL,              NULL},
1018     { "s2",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s2,            LLDB_INVALID_REGNUM,    28,              28 },        NULL,              NULL},
1019     { "s3",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s3,            LLDB_INVALID_REGNUM,    29,              29 },        NULL,              NULL},
1020     { "s4",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s4,            LLDB_INVALID_REGNUM,    30,              30 },        NULL,              NULL},
1021     { "s5",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s5,            LLDB_INVALID_REGNUM,    31,              31 },        NULL,              NULL},
1022     { "s6",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s6,            LLDB_INVALID_REGNUM,    32,              32 },        NULL,              NULL},
1023     { "s7",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s7,            LLDB_INVALID_REGNUM,    33,              33 },        NULL,              NULL},
1024     { "s8",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s8,            LLDB_INVALID_REGNUM,    34,              34 },        NULL,              NULL},
1025     { "s9",   NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s9,            LLDB_INVALID_REGNUM,    35,              35 },        NULL,              NULL},
1026     { "s10",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s10,           LLDB_INVALID_REGNUM,    36,              36 },        NULL,              NULL},
1027     { "s11",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s11,           LLDB_INVALID_REGNUM,    37,              37 },        NULL,              NULL},
1028     { "s12",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s12,           LLDB_INVALID_REGNUM,    38,              38 },        NULL,              NULL},
1029     { "s13",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s13,           LLDB_INVALID_REGNUM,    39,              39 },        NULL,              NULL},
1030     { "s14",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s14,           LLDB_INVALID_REGNUM,    40,              40 },        NULL,              NULL},
1031     { "s15",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s15,           LLDB_INVALID_REGNUM,    41,              41 },        NULL,              NULL},
1032     { "s16",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s16,           LLDB_INVALID_REGNUM,    42,              42 },        NULL,              NULL},
1033     { "s17",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s17,           LLDB_INVALID_REGNUM,    43,              43 },        NULL,              NULL},
1034     { "s18",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s18,           LLDB_INVALID_REGNUM,    44,              44 },        NULL,              NULL},
1035     { "s19",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s19,           LLDB_INVALID_REGNUM,    45,              45 },        NULL,              NULL},
1036     { "s20",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s20,           LLDB_INVALID_REGNUM,    46,              46 },        NULL,              NULL},
1037     { "s21",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s21,           LLDB_INVALID_REGNUM,    47,              47 },        NULL,              NULL},
1038     { "s22",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s22,           LLDB_INVALID_REGNUM,    48,              48 },        NULL,              NULL},
1039     { "s23",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s23,           LLDB_INVALID_REGNUM,    49,              49 },        NULL,              NULL},
1040     { "s24",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s24,           LLDB_INVALID_REGNUM,    50,              50 },        NULL,              NULL},
1041     { "s25",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s25,           LLDB_INVALID_REGNUM,    51,              51 },        NULL,              NULL},
1042     { "s26",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s26,           LLDB_INVALID_REGNUM,    52,              52 },        NULL,              NULL},
1043     { "s27",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s27,           LLDB_INVALID_REGNUM,    53,              53 },        NULL,              NULL},
1044     { "s28",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s28,           LLDB_INVALID_REGNUM,    54,              54 },        NULL,              NULL},
1045     { "s29",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s29,           LLDB_INVALID_REGNUM,    55,              55 },        NULL,              NULL},
1046     { "s30",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s30,           LLDB_INVALID_REGNUM,    56,              56 },        NULL,              NULL},
1047     { "s31",  NULL,   4,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s31,           LLDB_INVALID_REGNUM,    57,              57 },        NULL,              NULL},
1048     { "fpscr",NULL,   4,   0, eEncodingUint,    eFormatHex,   { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM,    58,              58 },        NULL,              NULL},
1049     { "d16",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d16,           LLDB_INVALID_REGNUM,    59,              59 },        NULL,              NULL},
1050     { "d17",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d17,           LLDB_INVALID_REGNUM,    60,              60 },        NULL,              NULL},
1051     { "d18",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d18,           LLDB_INVALID_REGNUM,    61,              61 },        NULL,              NULL},
1052     { "d19",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d19,           LLDB_INVALID_REGNUM,    62,              62 },        NULL,              NULL},
1053     { "d20",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d20,           LLDB_INVALID_REGNUM,    63,              63 },        NULL,              NULL},
1054     { "d21",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d21,           LLDB_INVALID_REGNUM,    64,              64 },        NULL,              NULL},
1055     { "d22",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d22,           LLDB_INVALID_REGNUM,    65,              65 },        NULL,              NULL},
1056     { "d23",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d23,           LLDB_INVALID_REGNUM,    66,              66 },        NULL,              NULL},
1057     { "d24",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d24,           LLDB_INVALID_REGNUM,    67,              67 },        NULL,              NULL},
1058     { "d25",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d25,           LLDB_INVALID_REGNUM,    68,              68 },        NULL,              NULL},
1059     { "d26",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d26,           LLDB_INVALID_REGNUM,    69,              69 },        NULL,              NULL},
1060     { "d27",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d27,           LLDB_INVALID_REGNUM,    70,              70 },        NULL,              NULL},
1061     { "d28",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d28,           LLDB_INVALID_REGNUM,    71,              71 },        NULL,              NULL},
1062     { "d29",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d29,           LLDB_INVALID_REGNUM,    72,              72 },        NULL,              NULL},
1063     { "d30",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d30,           LLDB_INVALID_REGNUM,    73,              73 },        NULL,              NULL},
1064     { "d31",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d31,           LLDB_INVALID_REGNUM,    74,              74 },        NULL,              NULL},
1065     { "d0",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d0,            LLDB_INVALID_REGNUM,    75,              75 },   g_d0_regs,              NULL},
1066     { "d1",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d1,            LLDB_INVALID_REGNUM,    76,              76 },   g_d1_regs,              NULL},
1067     { "d2",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d2,            LLDB_INVALID_REGNUM,    77,              77 },   g_d2_regs,              NULL},
1068     { "d3",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d3,            LLDB_INVALID_REGNUM,    78,              78 },   g_d3_regs,              NULL},
1069     { "d4",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d4,            LLDB_INVALID_REGNUM,    79,              79 },   g_d4_regs,              NULL},
1070     { "d5",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d5,            LLDB_INVALID_REGNUM,    80,              80 },   g_d5_regs,              NULL},
1071     { "d6",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d6,            LLDB_INVALID_REGNUM,    81,              81 },   g_d6_regs,              NULL},
1072     { "d7",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d7,            LLDB_INVALID_REGNUM,    82,              82 },   g_d7_regs,              NULL},
1073     { "d8",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d8,            LLDB_INVALID_REGNUM,    83,              83 },   g_d8_regs,              NULL},
1074     { "d9",   NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d9,            LLDB_INVALID_REGNUM,    84,              84 },   g_d9_regs,              NULL},
1075     { "d10",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d10,           LLDB_INVALID_REGNUM,    85,              85 },  g_d10_regs,              NULL},
1076     { "d11",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d11,           LLDB_INVALID_REGNUM,    86,              86 },  g_d11_regs,              NULL},
1077     { "d12",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d12,           LLDB_INVALID_REGNUM,    87,              87 },  g_d12_regs,              NULL},
1078     { "d13",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d13,           LLDB_INVALID_REGNUM,    88,              88 },  g_d13_regs,              NULL},
1079     { "d14",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d14,           LLDB_INVALID_REGNUM,    89,              89 },  g_d14_regs,              NULL},
1080     { "d15",  NULL,   8,   0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d15,           LLDB_INVALID_REGNUM,    90,              90 },  g_d15_regs,              NULL},
1081     { "q0",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q0,    LLDB_INVALID_REGNUM,    91,              91 },   g_q0_regs,              NULL},
1082     { "q1",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q1,    LLDB_INVALID_REGNUM,    92,              92 },   g_q1_regs,              NULL},
1083     { "q2",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q2,    LLDB_INVALID_REGNUM,    93,              93 },   g_q2_regs,              NULL},
1084     { "q3",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q3,    LLDB_INVALID_REGNUM,    94,              94 },   g_q3_regs,              NULL},
1085     { "q4",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q4,    LLDB_INVALID_REGNUM,    95,              95 },   g_q4_regs,              NULL},
1086     { "q5",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q5,    LLDB_INVALID_REGNUM,    96,              96 },   g_q5_regs,              NULL},
1087     { "q6",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q6,    LLDB_INVALID_REGNUM,    97,              97 },   g_q6_regs,              NULL},
1088     { "q7",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q7,    LLDB_INVALID_REGNUM,    98,              98 },   g_q7_regs,              NULL},
1089     { "q8",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q8,    LLDB_INVALID_REGNUM,    99,              99 },   g_q8_regs,              NULL},
1090     { "q9",   NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q9,    LLDB_INVALID_REGNUM,   100,             100 },   g_q9_regs,              NULL},
1091     { "q10",  NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q10,   LLDB_INVALID_REGNUM,   101,             101 },  g_q10_regs,              NULL},
1092     { "q11",  NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q11,   LLDB_INVALID_REGNUM,   102,             102 },  g_q11_regs,              NULL},
1093     { "q12",  NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q12,   LLDB_INVALID_REGNUM,   103,             103 },  g_q12_regs,              NULL},
1094     { "q13",  NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q13,   LLDB_INVALID_REGNUM,   104,             104 },  g_q13_regs,              NULL},
1095     { "q14",  NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q14,   LLDB_INVALID_REGNUM,   105,             105 },  g_q14_regs,              NULL},
1096     { "q15",  NULL,   16,  0, eEncodingVector,  eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q15,   LLDB_INVALID_REGNUM,   106,             106 },  g_q15_regs,              NULL}
1097     };
1098 
1099     static const uint32_t num_registers = llvm::array_lengthof(g_register_infos);
1100     static ConstString gpr_reg_set ("General Purpose Registers");
1101     static ConstString sfp_reg_set ("Software Floating Point Registers");
1102     static ConstString vfp_reg_set ("Floating Point Registers");
1103     size_t i;
1104     if (from_scratch)
1105     {
1106         // Calculate the offsets of the registers
1107         // Note that the layout of the "composite" registers (d0-d15 and q0-q15) which comes after the
1108         // "primordial" registers is important.  This enables us to calculate the offset of the composite
1109         // register by using the offset of its first primordial register.  For example, to calculate the
1110         // offset of q0, use s0's offset.
1111         if (g_register_infos[2].byte_offset == 0)
1112         {
1113             uint32_t byte_offset = 0;
1114             for (i=0; i<num_registers; ++i)
1115             {
1116                 // For primordial registers, increment the byte_offset by the byte_size to arrive at the
1117                 // byte_offset for the next register.  Otherwise, we have a composite register whose
1118                 // offset can be calculated by consulting the offset of its first primordial register.
1119                 if (!g_register_infos[i].value_regs)
1120                 {
1121                     g_register_infos[i].byte_offset = byte_offset;
1122                     byte_offset += g_register_infos[i].byte_size;
1123                 }
1124                 else
1125                 {
1126                     const uint32_t first_primordial_reg = g_register_infos[i].value_regs[0];
1127                     g_register_infos[i].byte_offset = g_register_infos[first_primordial_reg].byte_offset;
1128                 }
1129             }
1130         }
1131         for (i=0; i<num_registers; ++i)
1132         {
1133             ConstString name;
1134             ConstString alt_name;
1135             if (g_register_infos[i].name && g_register_infos[i].name[0])
1136                 name.SetCString(g_register_infos[i].name);
1137             if (g_register_infos[i].alt_name && g_register_infos[i].alt_name[0])
1138                 alt_name.SetCString(g_register_infos[i].alt_name);
1139 
1140             if (i <= 15 || i == 25)
1141                 AddRegister (g_register_infos[i], name, alt_name, gpr_reg_set);
1142             else if (i <= 24)
1143                 AddRegister (g_register_infos[i], name, alt_name, sfp_reg_set);
1144             else
1145                 AddRegister (g_register_infos[i], name, alt_name, vfp_reg_set);
1146         }
1147     }
1148     else
1149     {
1150         // Add composite registers to our primordial registers, then.
1151         const size_t num_composites = llvm::array_lengthof(g_composites);
1152         const size_t num_dynamic_regs = GetNumRegisters();
1153         const size_t num_common_regs = num_registers - num_composites;
1154         RegisterInfo *g_comp_register_infos = g_register_infos + num_common_regs;
1155 
1156         // First we need to validate that all registers that we already have match the non composite regs.
1157         // If so, then we can add the registers, else we need to bail
1158         bool match = true;
1159         if (num_dynamic_regs == num_common_regs)
1160         {
1161             for (i=0; match && i<num_dynamic_regs; ++i)
1162             {
1163                 // Make sure all register names match
1164                 if (m_regs[i].name && g_register_infos[i].name)
1165                 {
1166                     if (strcmp(m_regs[i].name, g_register_infos[i].name))
1167                     {
1168                         match = false;
1169                         break;
1170                     }
1171                 }
1172 
1173                 // Make sure all register byte sizes match
1174                 if (m_regs[i].byte_size != g_register_infos[i].byte_size)
1175                 {
1176                     match = false;
1177                     break;
1178                 }
1179             }
1180         }
1181         else
1182         {
1183             // Wrong number of registers.
1184             match = false;
1185         }
1186         // If "match" is true, then we can add extra registers.
1187         if (match)
1188         {
1189             for (i=0; i<num_composites; ++i)
1190             {
1191                 ConstString name;
1192                 ConstString alt_name;
1193                 const uint32_t first_primordial_reg = g_comp_register_infos[i].value_regs[0];
1194                 const char *reg_name = g_register_infos[first_primordial_reg].name;
1195                 if (reg_name && reg_name[0])
1196                 {
1197                     for (uint32_t j = 0; j < num_dynamic_regs; ++j)
1198                     {
1199                         const RegisterInfo *reg_info = GetRegisterInfoAtIndex(j);
1200                         // Find a matching primordial register info entry.
1201                         if (reg_info && reg_info->name && ::strcasecmp(reg_info->name, reg_name) == 0)
1202                         {
1203                             // The name matches the existing primordial entry.
1204                             // Find and assign the offset, and then add this composite register entry.
1205                             g_comp_register_infos[i].byte_offset = reg_info->byte_offset;
1206                             name.SetCString(g_comp_register_infos[i].name);
1207                             AddRegister(g_comp_register_infos[i], name, alt_name, vfp_reg_set);
1208                         }
1209                     }
1210                 }
1211             }
1212         }
1213     }
1214 }
1215