LLDB mainline
GDBRemoteRegisterContext.cpp
Go to the documentation of this file.
1//===-- GDBRemoteRegisterContext.cpp --------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "ProcessGDBRemote.h"
12#include "ProcessGDBRemoteLog.h"
13#include "ThreadGDBRemote.h"
18#include "lldb/Target/Target.h"
22#include "lldb/Utility/Scalar.h"
25
26#include <memory>
27
28using namespace lldb;
29using namespace lldb_private;
31
32// GDBRemoteRegisterContext constructor
34 ThreadGDBRemote &thread, uint32_t concrete_frame_idx,
35 GDBRemoteDynamicRegisterInfoSP reg_info_sp, bool read_all_at_once,
36 bool write_all_at_once)
37 : RegisterContext(thread, concrete_frame_idx),
38 m_reg_info_sp(std::move(reg_info_sp)), m_reg_valid(), m_reg_data(),
39 m_read_all_at_once(read_all_at_once),
40 m_write_all_at_once(write_all_at_once), m_gpacket_cached(false) {
41 // Resize our vector of bools to contain one bool for every register. We will
42 // use these boolean values to know when a register value is valid in
43 // m_reg_data.
44 m_reg_valid.resize(m_reg_info_sp->GetNumRegisters());
46
47 // Make a heap based buffer that is big enough to store all registers
48 DataBufferSP reg_data_sp(
49 new DataBufferHeap(m_reg_info_sp->GetRegisterDataByteSize(), 0));
50 m_reg_data.SetData(reg_data_sp);
51 m_reg_data.SetByteOrder(thread.GetProcess()->GetByteOrder());
52}
53
54// Destructor
56
58 m_gpacket_cached = (valid == eLazyBoolYes);
59 for (auto &reg : m_reg_valid)
60 reg = valid;
61}
62
64 assert(reg < m_reg_valid.size());
65 if (reg < m_reg_valid.size())
66 return m_reg_valid[reg];
67 return eLazyBoolNo;
68}
69
71 const RegisterInfo *reg_info, LazyBool valid) {
72 if (reg_info)
74}
75
77 LazyBool valid) {
78 assert(reg < m_reg_valid.size());
79 if (reg < m_reg_valid.size())
80 m_reg_valid[reg] = valid;
81}
82
84 return m_reg_info_sp->GetNumRegisters();
85}
86
87const RegisterInfo *
89 return m_reg_info_sp->GetRegisterInfoAtIndex(reg);
90}
91
93 return m_reg_info_sp->GetNumRegisterSets();
94}
95
97 return m_reg_info_sp->GetRegisterSet(reg_set);
98}
99
101 RegisterValue &value) {
102 // Read the register
103 if (ReadRegisterBytes(reg_info)) {
104 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
106 return false;
107 if (reg_info->value_regs &&
108 reg_info->value_regs[0] != LLDB_INVALID_REGNUM &&
109 reg_info->value_regs[1] != LLDB_INVALID_REGNUM) {
110 std::vector<char> combined_data;
111 uint32_t offset = 0;
112 for (int i = 0; reg_info->value_regs[i] != LLDB_INVALID_REGNUM; i++) {
113 const RegisterInfo *parent_reg = GetRegisterInfo(
114 eRegisterKindLLDB, reg_info->value_regs[i]);
115 if (!parent_reg)
116 return false;
117 combined_data.resize(offset + parent_reg->byte_size);
118 if (m_reg_data.CopyData(parent_reg->byte_offset, parent_reg->byte_size,
119 combined_data.data() + offset) !=
120 parent_reg->byte_size)
121 return false;
122 offset += parent_reg->byte_size;
123 }
124
126 return value.SetFromMemoryData(
127 *reg_info, combined_data.data(), combined_data.size(),
128 m_reg_data.GetByteOrder(), error) == combined_data.size();
129 } else {
130 const bool partial_data_ok = false;
132 *reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok));
133 return error.Success();
134 }
135 }
136 return false;
137}
138
140 uint32_t reg, llvm::ArrayRef<uint8_t> data) {
141 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
142 if (reg_info == nullptr)
143 return false;
144
145 // Invalidate if needed
146 InvalidateIfNeeded(false);
147
148 const size_t reg_byte_size = reg_info->byte_size;
149 memcpy(const_cast<uint8_t *>(
150 m_reg_data.PeekData(reg_info->byte_offset, reg_byte_size)),
151 data.data(), std::min(data.size(), reg_byte_size));
152 bool success = data.size() >= reg_byte_size;
153 if (success) {
155 } else if (data.size() > 0) {
156 // Only set register to Unfetched if we copied some bytes, else leave
157 // it as it was.
159 }
160 return success;
161}
162
164 uint64_t new_reg_val) {
165 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
166 if (reg_info == nullptr)
167 return false;
168
169 // Early in process startup, we can get a thread that has an invalid byte
170 // order because the process hasn't been completely set up yet (see the ctor
171 // where the byte order is setfrom the process). If that's the case, we
172 // can't set the value here.
173 if (m_reg_data.GetByteOrder() == eByteOrderInvalid) {
174 return false;
175 }
176
177 // Invalidate if needed
178 InvalidateIfNeeded(false);
179
180 DataBufferSP buffer_sp(new DataBufferHeap(&new_reg_val, sizeof(new_reg_val)));
181 DataExtractor extractor;
182 extractor.SetData(buffer_sp, 0, buffer_sp->GetByteSize());
183
184 // If our register context and our register info disagree, which should never
185 // happen, don't overwrite past the end of the buffer.
186 if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
187 return false;
188
189 // Grab a pointer to where we are going to put this register
190 uint8_t *dst = const_cast<uint8_t *>(
191 m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size));
192
193 if (dst == nullptr)
194 return false;
195
196 if (extractor.CopyByteOrderedData(
197 0, // src offset
198 reg_info->byte_size, // src length
199 dst, // dst
200 reg_info->byte_size, // dst length
201 m_reg_data.GetByteOrder())) // dst byte order
202 {
204 return true;
205 }
206 return false;
207}
208
209// Helper function for GDBRemoteRegisterContext::ReadRegisterBytes().
211 const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm) {
212 const uint32_t lldb_reg = reg_info->kinds[eRegisterKindLLDB];
213 const uint32_t remote_reg = reg_info->kinds[eRegisterKindProcessPlugin];
214
215 if (DataBufferSP buffer_sp =
216 gdb_comm.ReadRegister(m_thread.GetProtocolID(), remote_reg))
218 lldb_reg, llvm::ArrayRef<uint8_t>(buffer_sp->GetBytes(),
219 buffer_sp->GetByteSize()));
220 return false;
221}
222
225
226 Process *process = exe_ctx.GetProcessPtr();
227 Thread *thread = exe_ctx.GetThreadPtr();
228 if (process == nullptr || thread == nullptr)
229 return false;
230
232 ((ProcessGDBRemote *)process)->GetGDBRemote());
233
234 InvalidateIfNeeded(false);
235
236 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
237
238 if (GetRegisterIsUnfetched(reg)) {
240 if (DataBufferSP buffer_sp =
241 gdb_comm.ReadAllRegisters(m_thread.GetProtocolID())) {
242 memcpy(const_cast<uint8_t *>(m_reg_data.GetDataStart()),
243 buffer_sp->GetBytes(),
244 std::min(buffer_sp->GetByteSize(), m_reg_data.GetByteSize()));
245 if (buffer_sp->GetByteSize() >= m_reg_data.GetByteSize()) {
247 return true;
248 } else if (buffer_sp->GetByteSize() > 0) {
249 for (auto x : llvm::enumerate(
250 m_reg_info_sp->registers<
252 const struct RegisterInfo &reginfo = x.value();
253 if (reginfo.byte_offset + reginfo.byte_size <=
254 buffer_sp->GetByteSize())
255 SetRegisterIsValid(x.index());
256 else
257 SetRegisterIsUnfetched(x.index());
258 }
259
260 m_gpacket_cached = true;
261 if (GetRegisterIsValid(reg))
262 return true;
263 } else {
265 LLDB_LOGF(
266 log,
267 "error: GDBRemoteRegisterContext::ReadRegisterBytes tried "
268 "to read the "
269 "entire register context at once, expected at least %" PRId64
270 " bytes "
271 "but only got %" PRId64 " bytes.",
272 m_reg_data.GetByteSize(), buffer_sp->GetByteSize());
273 return false;
274 }
275 }
276 }
277 if (reg_info->value_regs) {
278 // Process this composite register request by delegating to the
279 // constituent primordial registers.
280
281 // Index of the primordial register.
282 bool success = true;
283 for (uint32_t idx = 0; success; ++idx) {
284 const uint32_t prim_reg = reg_info->value_regs[idx];
285 // We've fetched all primordial registers that provide
286 // data for this reg.
287 if (prim_reg == LLDB_INVALID_REGNUM)
288 break;
289 // We have a valid primordial register as our constituent. Grab the
290 // corresponding register info.
291 const RegisterInfo *prim_reg_info =
293 if (prim_reg_info == nullptr)
294 success = false;
295 else {
296 // Read the containing register if it hasn't already been read
297 if (GetRegisterIsUnfetched(prim_reg))
298 success = GetPrimordialRegister(prim_reg_info, gdb_comm);
299 // Containing register cannot be read
300 else if (GetRegisterIsUnavailable(prim_reg))
301 success = false;
302 }
303 }
304
305 if (success) {
306 // If we reach this point, all primordial register requests have
307 // succeeded. Validate this composite register.
308 SetRegisterIsValid(reg_info);
309 } else {
310 SetRegisterIsUnfetched(reg_info);
311 }
312 } else {
313 // Get each register individually
314 if (GetPrimordialRegister(reg_info, gdb_comm))
315 SetRegisterIsValid(reg_info);
316 else
317 SetRegisterIsUnfetched(reg_info);
318 }
319
320 // Make sure we got a valid register value after reading it
322 return false;
323 }
324
325 return true;
326}
327
329 const RegisterValue &value) {
330 DataExtractor data;
331 if (value.GetData(data)) {
332 if (reg_info->value_regs &&
333 reg_info->value_regs[0] != LLDB_INVALID_REGNUM &&
334 reg_info->value_regs[1] != LLDB_INVALID_REGNUM) {
335 uint32_t combined_size = 0;
336 for (int i = 0; reg_info->value_regs[i] != LLDB_INVALID_REGNUM; i++) {
337 const RegisterInfo *parent_reg = GetRegisterInfo(
338 eRegisterKindLLDB, reg_info->value_regs[i]);
339 if (!parent_reg)
340 return false;
341 combined_size += parent_reg->byte_size;
342 }
343
344 if (data.GetByteSize() < combined_size)
345 return false;
346
347 uint32_t offset = 0;
348 for (int i = 0; reg_info->value_regs[i] != LLDB_INVALID_REGNUM; i++) {
349 const RegisterInfo *parent_reg = GetRegisterInfo(
350 eRegisterKindLLDB, reg_info->value_regs[i]);
351 assert(parent_reg);
352
353 DataExtractor parent_data{data, offset, parent_reg->byte_size};
354 if (!WriteRegisterBytes(parent_reg, parent_data, 0))
355 return false;
356 offset += parent_reg->byte_size;
357 }
358 assert(offset == combined_size);
359 return true;
360 } else
361 return WriteRegisterBytes(reg_info, data, 0);
362 }
363 return false;
364}
365
366// Helper function for GDBRemoteRegisterContext::WriteRegisterBytes().
368 const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm) {
369 StreamString packet;
371 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
372 // Invalidate just this register
374
375 return gdb_comm.WriteRegister(
376 m_thread.GetProtocolID(), reg_info->kinds[eRegisterKindProcessPlugin],
377 {m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size),
378 reg_info->byte_size});
379}
380
382 DataExtractor &data,
383 uint32_t data_offset) {
385
386 Process *process = exe_ctx.GetProcessPtr();
387 Thread *thread = exe_ctx.GetThreadPtr();
388 if (process == nullptr || thread == nullptr)
389 return false;
390
392 ((ProcessGDBRemote *)process)->GetGDBRemote());
393
394 assert(m_reg_data.GetByteSize() >=
395 reg_info->byte_offset + reg_info->byte_size);
396
397 // If our register context and our register info disagree, which should never
398 // happen, don't overwrite past the end of the buffer.
399 if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
400 return false;
401
402 // Grab a pointer to where we are going to put this register
403 uint8_t *dst = const_cast<uint8_t *>(
404 m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size));
405
406 if (dst == nullptr)
407 return false;
408
409 const bool should_reconfigure_registers =
411
412 if (data.CopyByteOrderedData(data_offset, // src offset
413 reg_info->byte_size, // src length
414 dst, // dst
415 reg_info->byte_size, // dst length
416 m_reg_data.GetByteOrder())) // dst byte order
417 {
418 GDBRemoteClientBase::Lock lock(gdb_comm);
419 if (lock) {
421 // Invalidate all register values
422 InvalidateIfNeeded(true);
423
424 // Set all registers in one packet
425 if (gdb_comm.WriteAllRegisters(
426 m_thread.GetProtocolID(),
427 {m_reg_data.GetDataStart(), size_t(m_reg_data.GetByteSize())}))
428
429 {
430 if (should_reconfigure_registers)
432
434
435 return true;
436 }
437 } else {
438 bool success = true;
439
440 if (reg_info->value_regs) {
441 // This register is part of another register. In this case we read
442 // the actual register data for any "value_regs", and once all that
443 // data is read, we will have enough data in our register context
444 // bytes for the value of this register
445
446 // Invalidate this composite register first.
447
448 for (uint32_t idx = 0; success; ++idx) {
449 const uint32_t reg = reg_info->value_regs[idx];
450 if (reg == LLDB_INVALID_REGNUM)
451 break;
452 // We have a valid primordial register as our constituent. Grab the
453 // corresponding register info.
454 const RegisterInfo *value_reg_info =
456 if (value_reg_info == nullptr)
457 success = false;
458 else
459 success = SetPrimordialRegister(value_reg_info, gdb_comm);
460 }
461 } else {
462 // This is an actual register, write it
463 success = SetPrimordialRegister(reg_info, gdb_comm);
464 }
465
466 // Check if writing this register will invalidate any other register
467 // values? If so, invalidate them
468 if (reg_info->invalidate_regs) {
469 for (uint32_t idx = 0, reg = reg_info->invalidate_regs[0];
470 reg != LLDB_INVALID_REGNUM;
471 reg = reg_info->invalidate_regs[++idx])
474 }
475
476 if (success && should_reconfigure_registers &&
479
480 return success;
481 }
482 } else {
484 if (log) {
485 if (log->GetVerbose()) {
486 StreamString strm;
487 process->DumpPluginHistory(strm);
488 LLDB_LOGF(log,
489 "error: failed to get packet sequence mutex, not sending "
490 "write register for \"%s\":\n%s",
491 reg_info->name, strm.GetData());
492 } else
493 LLDB_LOGF(log,
494 "error: failed to get packet sequence mutex, not sending "
495 "write register for \"%s\"",
496 reg_info->name);
497 }
498 }
499 }
500 return false;
501}
502
504 RegisterCheckpoint &reg_checkpoint) {
506
507 Process *process = exe_ctx.GetProcessPtr();
508 Thread *thread = exe_ctx.GetThreadPtr();
509 if (process == nullptr || thread == nullptr)
510 return false;
511
513 ((ProcessGDBRemote *)process)->GetGDBRemote());
514
515 uint32_t save_id = 0;
516 if (gdb_comm.SaveRegisterState(thread->GetProtocolID(), save_id)) {
517 reg_checkpoint.SetID(save_id);
518 reg_checkpoint.GetData().reset();
519 return true;
520 } else {
521 reg_checkpoint.SetID(0); // Invalid save ID is zero
522 return ReadAllRegisterValues(reg_checkpoint.GetData());
523 }
524}
525
527 const RegisterCheckpoint &reg_checkpoint) {
528 uint32_t save_id = reg_checkpoint.GetID();
529 if (save_id != 0) {
531
532 Process *process = exe_ctx.GetProcessPtr();
533 Thread *thread = exe_ctx.GetThreadPtr();
534 if (process == nullptr || thread == nullptr)
535 return false;
536
538 ((ProcessGDBRemote *)process)->GetGDBRemote());
539
540 return gdb_comm.RestoreRegisterState(m_thread.GetProtocolID(), save_id);
541 } else {
542 return WriteAllRegisterValues(reg_checkpoint.GetData());
543 }
544}
545
549
550 Process *process = exe_ctx.GetProcessPtr();
551 Thread *thread = exe_ctx.GetThreadPtr();
552 if (process == nullptr || thread == nullptr)
553 return false;
554
556 ((ProcessGDBRemote *)process)->GetGDBRemote());
557
558 const bool use_g_packet =
559 !gdb_comm.AvoidGPackets((ProcessGDBRemote *)process);
560
561 GDBRemoteClientBase::Lock lock(gdb_comm);
562 if (lock) {
563 if (gdb_comm.SyncThreadState(m_thread.GetProtocolID()))
565
566 if (use_g_packet) {
567 if (DataBufferSP data_buffer =
568 gdb_comm.ReadAllRegisters(m_thread.GetProtocolID())) {
569 data_sp = std::make_shared<DataBufferHeap>(*data_buffer);
570 return true;
571 }
572 }
573
574 // We're going to read each register
575 // individually and store them as binary data in a buffer.
576 const RegisterInfo *reg_info;
577
578 for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != nullptr;
579 i++) {
580 if (reg_info
581 ->value_regs) // skip registers that are slices of real registers
582 continue;
583 ReadRegisterBytes(reg_info);
584 // ReadRegisterBytes saves the contents of the register in to the
585 // m_reg_data buffer
586 }
587 data_sp = std::make_shared<DataBufferHeap>(
588 m_reg_data.GetDataStart(), m_reg_info_sp->GetRegisterDataByteSize());
589 return true;
590 } else {
591
593 if (log) {
594 if (log->GetVerbose()) {
595 StreamString strm;
596 process->DumpPluginHistory(strm);
597 LLDB_LOGF(log,
598 "error: failed to get packet sequence mutex, not sending "
599 "read all registers:\n%s",
600 strm.GetData());
601 } else
602 LLDB_LOGF(log,
603 "error: failed to get packet sequence mutex, not sending "
604 "read all registers");
605 }
606 }
607
608 data_sp.reset();
609 return false;
610}
611
613 const lldb::DataBufferSP &data_sp) {
614 if (!data_sp || data_sp->GetBytes() == nullptr || data_sp->GetByteSize() == 0)
615 return false;
616
618
619 Process *process = exe_ctx.GetProcessPtr();
620 Thread *thread = exe_ctx.GetThreadPtr();
621 if (process == nullptr || thread == nullptr)
622 return false;
623
625 ((ProcessGDBRemote *)process)->GetGDBRemote());
626
627 const bool use_g_packet =
628 !gdb_comm.AvoidGPackets((ProcessGDBRemote *)process);
629
630 GDBRemoteClientBase::Lock lock(gdb_comm);
631 if (lock) {
632 // The data_sp contains the G response packet.
633 if (use_g_packet) {
634 if (gdb_comm.WriteAllRegisters(
635 m_thread.GetProtocolID(),
636 {data_sp->GetBytes(), size_t(data_sp->GetByteSize())}))
637 return true;
638
639 uint32_t num_restored = 0;
640 // We need to manually go through all of the registers and restore them
641 // manually
642 DataExtractor restore_data(data_sp, m_reg_data.GetByteOrder(),
643 m_reg_data.GetAddressByteSize());
644
645 const RegisterInfo *reg_info;
646
647 // The g packet contents may either include the slice registers
648 // (registers defined in terms of other registers, e.g. eax is a subset
649 // of rax) or not. The slice registers should NOT be in the g packet,
650 // but some implementations may incorrectly include them.
651 //
652 // If the slice registers are included in the packet, we must step over
653 // the slice registers when parsing the packet -- relying on the
654 // RegisterInfo byte_offset field would be incorrect. If the slice
655 // registers are not included, then using the byte_offset values into the
656 // data buffer is the best way to find individual register values.
657
658 uint64_t size_including_slice_registers = 0;
659 uint64_t size_not_including_slice_registers = 0;
660 uint64_t size_by_highest_offset = 0;
661
662 for (uint32_t reg_idx = 0;
663 (reg_info = GetRegisterInfoAtIndex(reg_idx)) != nullptr; ++reg_idx) {
664 size_including_slice_registers += reg_info->byte_size;
665 if (reg_info->value_regs == nullptr)
666 size_not_including_slice_registers += reg_info->byte_size;
667 if (reg_info->byte_offset >= size_by_highest_offset)
668 size_by_highest_offset = reg_info->byte_offset + reg_info->byte_size;
669 }
670
671 bool use_byte_offset_into_buffer;
672 if (size_by_highest_offset == restore_data.GetByteSize()) {
673 // The size of the packet agrees with the highest offset: + size in the
674 // register file
675 use_byte_offset_into_buffer = true;
676 } else if (size_not_including_slice_registers ==
677 restore_data.GetByteSize()) {
678 // The size of the packet is the same as concatenating all of the
679 // registers sequentially, skipping the slice registers
680 use_byte_offset_into_buffer = true;
681 } else if (size_including_slice_registers == restore_data.GetByteSize()) {
682 // The slice registers are present in the packet (when they shouldn't
683 // be). Don't try to use the RegisterInfo byte_offset into the
684 // restore_data, it will point to the wrong place.
685 use_byte_offset_into_buffer = false;
686 } else {
687 // None of our expected sizes match the actual g packet data we're
688 // looking at. The most conservative approach here is to use the
689 // running total byte offset.
690 use_byte_offset_into_buffer = false;
691 }
692
693 // In case our register definitions don't include the correct offsets,
694 // keep track of the size of each reg & compute offset based on that.
695 uint32_t running_byte_offset = 0;
696 for (uint32_t reg_idx = 0;
697 (reg_info = GetRegisterInfoAtIndex(reg_idx)) != nullptr;
698 ++reg_idx, running_byte_offset += reg_info->byte_size) {
699 // Skip composite aka slice registers (e.g. eax is a slice of rax).
700 if (reg_info->value_regs)
701 continue;
702
703 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
704
705 uint32_t register_offset;
706 if (use_byte_offset_into_buffer) {
707 register_offset = reg_info->byte_offset;
708 } else {
709 register_offset = running_byte_offset;
710 }
711
712 const uint32_t reg_byte_size = reg_info->byte_size;
713
714 const uint8_t *restore_src =
715 restore_data.PeekData(register_offset, reg_byte_size);
716 if (restore_src) {
718 if (gdb_comm.WriteRegister(
719 m_thread.GetProtocolID(),
721 {restore_src, reg_byte_size}))
722 ++num_restored;
723 }
724 }
725 return num_restored > 0;
726 } else {
727 // For the use_g_packet == false case, we're going to write each register
728 // individually. The data buffer is binary data in this case, instead of
729 // ascii characters.
730
731 bool arm64_debugserver = false;
732 if (m_thread.GetProcess().get()) {
733 const ArchSpec &arch =
734 m_thread.GetProcess()->GetTarget().GetArchitecture();
735 if (arch.IsValid() && (arch.GetMachine() == llvm::Triple::aarch64 ||
736 arch.GetMachine() == llvm::Triple::aarch64_32) &&
737 arch.GetTriple().getVendor() == llvm::Triple::Apple &&
738 arch.GetTriple().getOS() == llvm::Triple::IOS) {
739 arm64_debugserver = true;
740 }
741 }
742 uint32_t num_restored = 0;
743 const RegisterInfo *reg_info;
744 for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != nullptr;
745 i++) {
746 if (reg_info->value_regs) // skip registers that are slices of real
747 // registers
748 continue;
749 // Skip the fpsr and fpcr floating point status/control register
750 // writing to work around a bug in an older version of debugserver that
751 // would lead to register context corruption when writing fpsr/fpcr.
752 if (arm64_debugserver && (strcmp(reg_info->name, "fpsr") == 0 ||
753 strcmp(reg_info->name, "fpcr") == 0)) {
754 continue;
755 }
756
757 SetRegisterIsUnfetched(reg_info);
758 if (gdb_comm.WriteRegister(m_thread.GetProtocolID(),
760 {data_sp->GetBytes() + reg_info->byte_offset,
761 reg_info->byte_size}))
762 ++num_restored;
763 }
764 return num_restored > 0;
765 }
766 } else {
768 if (log) {
769 if (log->GetVerbose()) {
770 StreamString strm;
771 process->DumpPluginHistory(strm);
772 LLDB_LOGF(log,
773 "error: failed to get packet sequence mutex, not sending "
774 "write all registers:\n%s",
775 strm.GetData());
776 } else
777 LLDB_LOGF(log,
778 "error: failed to get packet sequence mutex, not sending "
779 "write all registers");
780 }
781 }
782 return false;
783}
784
786 lldb::RegisterKind kind, uint32_t num) {
787 return m_reg_info_sp->ConvertRegisterKindToRegisterNumber(kind, num);
788}
789
791 const llvm::StringRef name) {
793 const Architecture *architecture =
795 return architecture && architecture->RegisterWriteCausesReconfigure(name);
796}
797
800 const Architecture *architecture =
802 if (architecture)
803 return architecture->ReconfigureRegisterInfo(*(m_reg_info_sp.get()),
804 m_reg_data, *this);
805 return false;
806}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
Definition Log.h:378
An architecture specification class.
Definition ArchSpec.h:32
bool IsValid() const
Tests if this ArchSpec is valid.
Definition ArchSpec.h:370
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition ArchSpec.h:460
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
Definition ArchSpec.cpp:682
virtual bool ReconfigureRegisterInfo(DynamicRegisterInfo &reg_info, DataExtractor &reg_data, RegisterContext &reg_context) const
virtual bool RegisterWriteCausesReconfigure(const llvm::StringRef name) const
A subclass of DataBuffer that stores a data buffer on the heap.
An data extractor class.
virtual const uint8_t * PeekData(lldb::offset_t offset, lldb::offset_t length) const
Peek at a bytes at offset.
virtual uint64_t GetByteSize() const
Get the number of bytes contained in this object.
virtual lldb::offset_t SetData(const void *bytes, lldb::offset_t length, lldb::ByteOrder byte_order)
Set data with a buffer that is caller owned.
lldb::offset_t CopyByteOrderedData(lldb::offset_t src_offset, lldb::offset_t src_len, void *dst, lldb::offset_t dst_len, lldb::ByteOrder dst_byte_order) const
Copy dst_len bytes from *offset_ptr and ensure the copied data is treated as a value that can be swap...
llvm::iterator_range< reg_collection::const_iterator > reg_collection_const_range
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
Process & GetProcessRef() const
Returns a reference to the process object.
Process * GetProcessPtr() const
Returns a pointer to the process object.
Thread * GetThreadPtr() const
Returns a pointer to the thread object.
bool GetVerbose() const
Definition Log.cpp:300
virtual void DumpPluginHistory(Stream &s)
The underlying plugin might store the low-level communication history for this session.
Definition Process.h:593
Target & GetTarget()
Get the target object pointer for this module.
Definition Process.h:1255
lldb::WritableDataBufferSP & GetData()
RegisterContext(Thread &thread, uint32_t concrete_frame_idx)
const RegisterInfo * GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num)
lldb::ThreadSP CalculateThread() override
uint32_t SetFromMemoryData(const RegisterInfo &reg_info, const void *src, uint32_t src_len, lldb::ByteOrder src_byte_order, Status &error)
bool GetData(DataExtractor &data) const
Status SetValueFromData(const RegisterInfo &reg_info, DataExtractor &data, lldb::offset_t offset, bool partial_data_ok)
An error handling class.
Definition Status.h:118
const char * GetData() const
Architecture * GetArchitecturePlugin() const
Definition Target.h:1322
lldb::DataBufferSP ReadRegister(lldb::tid_t tid, uint32_t reg_num)
bool WriteAllRegisters(lldb::tid_t tid, llvm::ArrayRef< uint8_t > data)
bool WriteRegister(lldb::tid_t tid, uint32_t reg_num, llvm::ArrayRef< uint8_t > data)
const RegisterSet * GetRegisterSet(size_t reg_set) override
bool RegisterWriteCausesReconfigure(const llvm::StringRef name) override
GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, GDBRemoteDynamicRegisterInfoSP reg_info_sp, bool read_all_at_once, bool write_all_at_once)
bool WriteRegisterBytes(const RegisterInfo *reg_info, DataExtractor &data, uint32_t data_offset)
bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef< uint8_t > data)
bool ReadRegister(const RegisterInfo *reg_info, RegisterValue &value) override
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) override
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
void SetRegisterIsValidState(const RegisterInfo *reg_info, LazyBool valid)
bool SetPrimordialRegister(const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm)
uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override
Convert from a given register numbering scheme to the lldb register numbering scheme.
bool GetPrimordialRegister(const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm)
std::vector< LazyBool > m_reg_valid
eLazyBoolYes - we have the bytes for this register locally.
#define LLDB_INVALID_REGNUM
std::shared_ptr< GDBRemoteDynamicRegisterInfo > GDBRemoteDynamicRegisterInfoSP
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
Definition Log.h:327
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
RegisterKind
Register numbering types.
@ eRegisterKindLLDB
lldb's internal register numbers
@ eRegisterKindProcessPlugin
num used by the process plugin - e.g.
Every register is described in detail including its name, alternate name (optional),...
uint32_t * value_regs
List of registers (terminated with LLDB_INVALID_REGNUM).
uint32_t byte_offset
The byte offset in the register context data where this register's value is found.
uint32_t byte_size
Size in bytes of the register.
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.
const char * name
Name of this register, can't be NULL.
uint32_t * invalidate_regs
List of registers (terminated with LLDB_INVALID_REGNUM).
Registers are grouped into register sets.
lldb::user_id_t GetID() const
Get accessor for the user ID.
Definition UserID.h:47
void SetID(lldb::user_id_t uid)
Set accessor for the user ID.
Definition UserID.h:53