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());
45
46 // Make a heap based buffer that is big enough to store all registers
47 DataBufferSP reg_data_sp(
48 new DataBufferHeap(m_reg_info_sp->GetRegisterDataByteSize(), 0));
49 m_reg_data.SetData(reg_data_sp);
50 m_reg_data.SetByteOrder(thread.GetProcess()->GetByteOrder());
51}
52
53// Destructor
55
59
62 std::vector<bool>::iterator pos, end = m_reg_valid.end();
63 for (pos = m_reg_valid.begin(); pos != end; ++pos)
64 *pos = b;
65}
66
68 return m_reg_info_sp->GetNumRegisters();
69}
70
71const RegisterInfo *
73 return m_reg_info_sp->GetRegisterInfoAtIndex(reg);
74}
75
77 return m_reg_info_sp->GetNumRegisterSets();
78}
79
81 return m_reg_info_sp->GetRegisterSet(reg_set);
82}
83
85 RegisterValue &value) {
86 // Read the register
87 if (ReadRegisterBytes(reg_info)) {
88 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
89 if (m_reg_valid[reg] == false)
90 return false;
91 if (reg_info->value_regs &&
92 reg_info->value_regs[0] != LLDB_INVALID_REGNUM &&
93 reg_info->value_regs[1] != LLDB_INVALID_REGNUM) {
94 std::vector<char> combined_data;
95 uint32_t offset = 0;
96 for (int i = 0; reg_info->value_regs[i] != LLDB_INVALID_REGNUM; i++) {
97 const RegisterInfo *parent_reg = GetRegisterInfo(
98 eRegisterKindLLDB, reg_info->value_regs[i]);
99 if (!parent_reg)
100 return false;
101 combined_data.resize(offset + parent_reg->byte_size);
102 if (m_reg_data.CopyData(parent_reg->byte_offset, parent_reg->byte_size,
103 combined_data.data() + offset) !=
104 parent_reg->byte_size)
105 return false;
106 offset += parent_reg->byte_size;
107 }
108
110 return value.SetFromMemoryData(
111 *reg_info, combined_data.data(), combined_data.size(),
112 m_reg_data.GetByteOrder(), error) == combined_data.size();
113 } else {
114 const bool partial_data_ok = false;
116 *reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok));
117 return error.Success();
118 }
119 }
120 return false;
121}
122
124 uint32_t reg, llvm::ArrayRef<uint8_t> data) {
125 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
126 if (reg_info == nullptr)
127 return false;
128
129 // Invalidate if needed
130 InvalidateIfNeeded(false);
131
132 const size_t reg_byte_size = reg_info->byte_size;
133 memcpy(const_cast<uint8_t *>(
134 m_reg_data.PeekData(reg_info->byte_offset, reg_byte_size)),
135 data.data(), std::min(data.size(), reg_byte_size));
136 bool success = data.size() >= reg_byte_size;
137 if (success) {
138 SetRegisterIsValid(reg, true);
139 } else if (data.size() > 0) {
140 // Only set register is valid to false if we copied some bytes, else leave
141 // it as it was.
142 SetRegisterIsValid(reg, false);
143 }
144 return success;
145}
146
148 uint64_t new_reg_val) {
149 const RegisterInfo *reg_info = GetRegisterInfoAtIndex(reg);
150 if (reg_info == nullptr)
151 return false;
152
153 // Early in process startup, we can get a thread that has an invalid byte
154 // order because the process hasn't been completely set up yet (see the ctor
155 // where the byte order is setfrom the process). If that's the case, we
156 // can't set the value here.
157 if (m_reg_data.GetByteOrder() == eByteOrderInvalid) {
158 return false;
159 }
160
161 // Invalidate if needed
162 InvalidateIfNeeded(false);
163
164 DataBufferSP buffer_sp(new DataBufferHeap(&new_reg_val, sizeof(new_reg_val)));
165 DataExtractor extractor;
166 extractor.SetData(buffer_sp, 0, buffer_sp->GetByteSize());
167
168 // If our register context and our register info disagree, which should never
169 // happen, don't overwrite past the end of the buffer.
170 if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
171 return false;
172
173 // Grab a pointer to where we are going to put this register
174 uint8_t *dst = const_cast<uint8_t *>(
175 m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size));
176
177 if (dst == nullptr)
178 return false;
179
180 if (extractor.CopyByteOrderedData(
181 0, // src offset
182 reg_info->byte_size, // src length
183 dst, // dst
184 reg_info->byte_size, // dst length
185 m_reg_data.GetByteOrder())) // dst byte order
186 {
187 SetRegisterIsValid(reg, true);
188 return true;
189 }
190 return false;
191}
192
193// Helper function for GDBRemoteRegisterContext::ReadRegisterBytes().
195 const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm) {
196 const uint32_t lldb_reg = reg_info->kinds[eRegisterKindLLDB];
197 const uint32_t remote_reg = reg_info->kinds[eRegisterKindProcessPlugin];
198
199 if (DataBufferSP buffer_sp =
200 gdb_comm.ReadRegister(m_thread.GetProtocolID(), remote_reg))
202 lldb_reg, llvm::ArrayRef<uint8_t>(buffer_sp->GetBytes(),
203 buffer_sp->GetByteSize()));
204 return false;
205}
206
209
210 Process *process = exe_ctx.GetProcessPtr();
211 Thread *thread = exe_ctx.GetThreadPtr();
212 if (process == nullptr || thread == nullptr)
213 return false;
214
216 ((ProcessGDBRemote *)process)->GetGDBRemote());
217
218 InvalidateIfNeeded(false);
219
220 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
221
222 if (!GetRegisterIsValid(reg)) {
224 if (DataBufferSP buffer_sp =
225 gdb_comm.ReadAllRegisters(m_thread.GetProtocolID())) {
226 memcpy(const_cast<uint8_t *>(m_reg_data.GetDataStart()),
227 buffer_sp->GetBytes(),
228 std::min(buffer_sp->GetByteSize(), m_reg_data.GetByteSize()));
229 if (buffer_sp->GetByteSize() >= m_reg_data.GetByteSize()) {
231 return true;
232 } else if (buffer_sp->GetByteSize() > 0) {
233 for (auto x : llvm::enumerate(
234 m_reg_info_sp->registers<
236 const struct RegisterInfo &reginfo = x.value();
237 m_reg_valid[x.index()] =
238 (reginfo.byte_offset + reginfo.byte_size <=
239 buffer_sp->GetByteSize());
240 }
241
242 m_gpacket_cached = true;
243 if (GetRegisterIsValid(reg))
244 return true;
245 } else {
247 LLDB_LOGF(
248 log,
249 "error: GDBRemoteRegisterContext::ReadRegisterBytes tried "
250 "to read the "
251 "entire register context at once, expected at least %" PRId64
252 " bytes "
253 "but only got %" PRId64 " bytes.",
254 m_reg_data.GetByteSize(), buffer_sp->GetByteSize());
255 return false;
256 }
257 }
258 }
259 if (reg_info->value_regs) {
260 // Process this composite register request by delegating to the
261 // constituent primordial registers.
262
263 // Index of the primordial register.
264 bool success = true;
265 for (uint32_t idx = 0; success; ++idx) {
266 const uint32_t prim_reg = reg_info->value_regs[idx];
267 if (prim_reg == LLDB_INVALID_REGNUM)
268 break;
269 // We have a valid primordial register as our constituent. Grab the
270 // corresponding register info.
271 const RegisterInfo *prim_reg_info =
273 if (prim_reg_info == nullptr)
274 success = false;
275 else {
276 // Read the containing register if it hasn't already been read
277 if (!GetRegisterIsValid(prim_reg))
278 success = GetPrimordialRegister(prim_reg_info, gdb_comm);
279 }
280 }
281
282 if (success) {
283 // If we reach this point, all primordial register requests have
284 // succeeded. Validate this composite register.
285 SetRegisterIsValid(reg_info, true);
286 }
287 } else {
288 // Get each register individually
289 GetPrimordialRegister(reg_info, gdb_comm);
290 }
291
292 // Make sure we got a valid register value after reading it
293 if (!GetRegisterIsValid(reg))
294 return false;
295 }
296
297 return true;
298}
299
301 const RegisterValue &value) {
302 DataExtractor data;
303 if (value.GetData(data)) {
304 if (reg_info->value_regs &&
305 reg_info->value_regs[0] != LLDB_INVALID_REGNUM &&
306 reg_info->value_regs[1] != LLDB_INVALID_REGNUM) {
307 uint32_t combined_size = 0;
308 for (int i = 0; reg_info->value_regs[i] != LLDB_INVALID_REGNUM; i++) {
309 const RegisterInfo *parent_reg = GetRegisterInfo(
310 eRegisterKindLLDB, reg_info->value_regs[i]);
311 if (!parent_reg)
312 return false;
313 combined_size += parent_reg->byte_size;
314 }
315
316 if (data.GetByteSize() < combined_size)
317 return false;
318
319 uint32_t offset = 0;
320 for (int i = 0; reg_info->value_regs[i] != LLDB_INVALID_REGNUM; i++) {
321 const RegisterInfo *parent_reg = GetRegisterInfo(
322 eRegisterKindLLDB, reg_info->value_regs[i]);
323 assert(parent_reg);
324
325 DataExtractor parent_data{data, offset, parent_reg->byte_size};
326 if (!WriteRegisterBytes(parent_reg, parent_data, 0))
327 return false;
328 offset += parent_reg->byte_size;
329 }
330 assert(offset == combined_size);
331 return true;
332 } else
333 return WriteRegisterBytes(reg_info, data, 0);
334 }
335 return false;
336}
337
338// Helper function for GDBRemoteRegisterContext::WriteRegisterBytes().
340 const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm) {
341 StreamString packet;
343 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
344 // Invalidate just this register
345 SetRegisterIsValid(reg, false);
346
347 return gdb_comm.WriteRegister(
348 m_thread.GetProtocolID(), reg_info->kinds[eRegisterKindProcessPlugin],
349 {m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size),
350 reg_info->byte_size});
351}
352
354 DataExtractor &data,
355 uint32_t data_offset) {
357
358 Process *process = exe_ctx.GetProcessPtr();
359 Thread *thread = exe_ctx.GetThreadPtr();
360 if (process == nullptr || thread == nullptr)
361 return false;
362
364 ((ProcessGDBRemote *)process)->GetGDBRemote());
365
366 assert(m_reg_data.GetByteSize() >=
367 reg_info->byte_offset + reg_info->byte_size);
368
369 // If our register context and our register info disagree, which should never
370 // happen, don't overwrite past the end of the buffer.
371 if (m_reg_data.GetByteSize() < reg_info->byte_offset + reg_info->byte_size)
372 return false;
373
374 // Grab a pointer to where we are going to put this register
375 uint8_t *dst = const_cast<uint8_t *>(
376 m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size));
377
378 if (dst == nullptr)
379 return false;
380
381 const bool should_reconfigure_registers =
383
384 if (data.CopyByteOrderedData(data_offset, // src offset
385 reg_info->byte_size, // src length
386 dst, // dst
387 reg_info->byte_size, // dst length
388 m_reg_data.GetByteOrder())) // dst byte order
389 {
390 GDBRemoteClientBase::Lock lock(gdb_comm);
391 if (lock) {
393 // Invalidate all register values
394 InvalidateIfNeeded(true);
395
396 // Set all registers in one packet
397 if (gdb_comm.WriteAllRegisters(
398 m_thread.GetProtocolID(),
399 {m_reg_data.GetDataStart(), size_t(m_reg_data.GetByteSize())}))
400
401 {
402 if (should_reconfigure_registers)
404
406
407 return true;
408 }
409 } else {
410 bool success = true;
411
412 if (reg_info->value_regs) {
413 // This register is part of another register. In this case we read
414 // the actual register data for any "value_regs", and once all that
415 // data is read, we will have enough data in our register context
416 // bytes for the value of this register
417
418 // Invalidate this composite register first.
419
420 for (uint32_t idx = 0; success; ++idx) {
421 const uint32_t reg = reg_info->value_regs[idx];
422 if (reg == LLDB_INVALID_REGNUM)
423 break;
424 // We have a valid primordial register as our constituent. Grab the
425 // corresponding register info.
426 const RegisterInfo *value_reg_info =
428 if (value_reg_info == nullptr)
429 success = false;
430 else
431 success = SetPrimordialRegister(value_reg_info, gdb_comm);
432 }
433 } else {
434 // This is an actual register, write it
435 success = SetPrimordialRegister(reg_info, gdb_comm);
436 }
437
438 // Check if writing this register will invalidate any other register
439 // values? If so, invalidate them
440 if (reg_info->invalidate_regs) {
441 for (uint32_t idx = 0, reg = reg_info->invalidate_regs[0];
442 reg != LLDB_INVALID_REGNUM;
443 reg = reg_info->invalidate_regs[++idx])
445 eRegisterKindLLDB, reg),
446 false);
447 }
448
449 if (success && should_reconfigure_registers &&
452
453 return success;
454 }
455 } else {
457 if (log) {
458 if (log->GetVerbose()) {
459 StreamString strm;
460 process->DumpPluginHistory(strm);
461 LLDB_LOGF(log,
462 "error: failed to get packet sequence mutex, not sending "
463 "write register for \"%s\":\n%s",
464 reg_info->name, strm.GetData());
465 } else
466 LLDB_LOGF(log,
467 "error: failed to get packet sequence mutex, not sending "
468 "write register for \"%s\"",
469 reg_info->name);
470 }
471 }
472 }
473 return false;
474}
475
477 RegisterCheckpoint &reg_checkpoint) {
479
480 Process *process = exe_ctx.GetProcessPtr();
481 Thread *thread = exe_ctx.GetThreadPtr();
482 if (process == nullptr || thread == nullptr)
483 return false;
484
486 ((ProcessGDBRemote *)process)->GetGDBRemote());
487
488 uint32_t save_id = 0;
489 if (gdb_comm.SaveRegisterState(thread->GetProtocolID(), save_id)) {
490 reg_checkpoint.SetID(save_id);
491 reg_checkpoint.GetData().reset();
492 return true;
493 } else {
494 reg_checkpoint.SetID(0); // Invalid save ID is zero
495 return ReadAllRegisterValues(reg_checkpoint.GetData());
496 }
497}
498
500 const RegisterCheckpoint &reg_checkpoint) {
501 uint32_t save_id = reg_checkpoint.GetID();
502 if (save_id != 0) {
504
505 Process *process = exe_ctx.GetProcessPtr();
506 Thread *thread = exe_ctx.GetThreadPtr();
507 if (process == nullptr || thread == nullptr)
508 return false;
509
511 ((ProcessGDBRemote *)process)->GetGDBRemote());
512
513 return gdb_comm.RestoreRegisterState(m_thread.GetProtocolID(), save_id);
514 } else {
515 return WriteAllRegisterValues(reg_checkpoint.GetData());
516 }
517}
518
522
523 Process *process = exe_ctx.GetProcessPtr();
524 Thread *thread = exe_ctx.GetThreadPtr();
525 if (process == nullptr || thread == nullptr)
526 return false;
527
529 ((ProcessGDBRemote *)process)->GetGDBRemote());
530
531 const bool use_g_packet =
532 !gdb_comm.AvoidGPackets((ProcessGDBRemote *)process);
533
534 GDBRemoteClientBase::Lock lock(gdb_comm);
535 if (lock) {
536 if (gdb_comm.SyncThreadState(m_thread.GetProtocolID()))
538
539 if (use_g_packet) {
540 if (DataBufferSP data_buffer =
541 gdb_comm.ReadAllRegisters(m_thread.GetProtocolID())) {
542 data_sp = std::make_shared<DataBufferHeap>(*data_buffer);
543 return true;
544 }
545 }
546
547 // We're going to read each register
548 // individually and store them as binary data in a buffer.
549 const RegisterInfo *reg_info;
550
551 for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != nullptr;
552 i++) {
553 if (reg_info
554 ->value_regs) // skip registers that are slices of real registers
555 continue;
556 ReadRegisterBytes(reg_info);
557 // ReadRegisterBytes saves the contents of the register in to the
558 // m_reg_data buffer
559 }
560 data_sp = std::make_shared<DataBufferHeap>(
561 m_reg_data.GetDataStart(), m_reg_info_sp->GetRegisterDataByteSize());
562 return true;
563 } else {
564
566 if (log) {
567 if (log->GetVerbose()) {
568 StreamString strm;
569 process->DumpPluginHistory(strm);
570 LLDB_LOGF(log,
571 "error: failed to get packet sequence mutex, not sending "
572 "read all registers:\n%s",
573 strm.GetData());
574 } else
575 LLDB_LOGF(log,
576 "error: failed to get packet sequence mutex, not sending "
577 "read all registers");
578 }
579 }
580
581 data_sp.reset();
582 return false;
583}
584
586 const lldb::DataBufferSP &data_sp) {
587 if (!data_sp || data_sp->GetBytes() == nullptr || data_sp->GetByteSize() == 0)
588 return false;
589
591
592 Process *process = exe_ctx.GetProcessPtr();
593 Thread *thread = exe_ctx.GetThreadPtr();
594 if (process == nullptr || thread == nullptr)
595 return false;
596
598 ((ProcessGDBRemote *)process)->GetGDBRemote());
599
600 const bool use_g_packet =
601 !gdb_comm.AvoidGPackets((ProcessGDBRemote *)process);
602
603 GDBRemoteClientBase::Lock lock(gdb_comm);
604 if (lock) {
605 // The data_sp contains the G response packet.
606 if (use_g_packet) {
607 if (gdb_comm.WriteAllRegisters(
608 m_thread.GetProtocolID(),
609 {data_sp->GetBytes(), size_t(data_sp->GetByteSize())}))
610 return true;
611
612 uint32_t num_restored = 0;
613 // We need to manually go through all of the registers and restore them
614 // manually
615 DataExtractor restore_data(data_sp, m_reg_data.GetByteOrder(),
616 m_reg_data.GetAddressByteSize());
617
618 const RegisterInfo *reg_info;
619
620 // The g packet contents may either include the slice registers
621 // (registers defined in terms of other registers, e.g. eax is a subset
622 // of rax) or not. The slice registers should NOT be in the g packet,
623 // but some implementations may incorrectly include them.
624 //
625 // If the slice registers are included in the packet, we must step over
626 // the slice registers when parsing the packet -- relying on the
627 // RegisterInfo byte_offset field would be incorrect. If the slice
628 // registers are not included, then using the byte_offset values into the
629 // data buffer is the best way to find individual register values.
630
631 uint64_t size_including_slice_registers = 0;
632 uint64_t size_not_including_slice_registers = 0;
633 uint64_t size_by_highest_offset = 0;
634
635 for (uint32_t reg_idx = 0;
636 (reg_info = GetRegisterInfoAtIndex(reg_idx)) != nullptr; ++reg_idx) {
637 size_including_slice_registers += reg_info->byte_size;
638 if (reg_info->value_regs == nullptr)
639 size_not_including_slice_registers += reg_info->byte_size;
640 if (reg_info->byte_offset >= size_by_highest_offset)
641 size_by_highest_offset = reg_info->byte_offset + reg_info->byte_size;
642 }
643
644 bool use_byte_offset_into_buffer;
645 if (size_by_highest_offset == restore_data.GetByteSize()) {
646 // The size of the packet agrees with the highest offset: + size in the
647 // register file
648 use_byte_offset_into_buffer = true;
649 } else if (size_not_including_slice_registers ==
650 restore_data.GetByteSize()) {
651 // The size of the packet is the same as concatenating all of the
652 // registers sequentially, skipping the slice registers
653 use_byte_offset_into_buffer = true;
654 } else if (size_including_slice_registers == restore_data.GetByteSize()) {
655 // The slice registers are present in the packet (when they shouldn't
656 // be). Don't try to use the RegisterInfo byte_offset into the
657 // restore_data, it will point to the wrong place.
658 use_byte_offset_into_buffer = false;
659 } else {
660 // None of our expected sizes match the actual g packet data we're
661 // looking at. The most conservative approach here is to use the
662 // running total byte offset.
663 use_byte_offset_into_buffer = false;
664 }
665
666 // In case our register definitions don't include the correct offsets,
667 // keep track of the size of each reg & compute offset based on that.
668 uint32_t running_byte_offset = 0;
669 for (uint32_t reg_idx = 0;
670 (reg_info = GetRegisterInfoAtIndex(reg_idx)) != nullptr;
671 ++reg_idx, running_byte_offset += reg_info->byte_size) {
672 // Skip composite aka slice registers (e.g. eax is a slice of rax).
673 if (reg_info->value_regs)
674 continue;
675
676 const uint32_t reg = reg_info->kinds[eRegisterKindLLDB];
677
678 uint32_t register_offset;
679 if (use_byte_offset_into_buffer) {
680 register_offset = reg_info->byte_offset;
681 } else {
682 register_offset = running_byte_offset;
683 }
684
685 const uint32_t reg_byte_size = reg_info->byte_size;
686
687 const uint8_t *restore_src =
688 restore_data.PeekData(register_offset, reg_byte_size);
689 if (restore_src) {
690 SetRegisterIsValid(reg, false);
691 if (gdb_comm.WriteRegister(
692 m_thread.GetProtocolID(),
694 {restore_src, reg_byte_size}))
695 ++num_restored;
696 }
697 }
698 return num_restored > 0;
699 } else {
700 // For the use_g_packet == false case, we're going to write each register
701 // individually. The data buffer is binary data in this case, instead of
702 // ascii characters.
703
704 bool arm64_debugserver = false;
705 if (m_thread.GetProcess().get()) {
706 const ArchSpec &arch =
707 m_thread.GetProcess()->GetTarget().GetArchitecture();
708 if (arch.IsValid() && (arch.GetMachine() == llvm::Triple::aarch64 ||
709 arch.GetMachine() == llvm::Triple::aarch64_32) &&
710 arch.GetTriple().getVendor() == llvm::Triple::Apple &&
711 arch.GetTriple().getOS() == llvm::Triple::IOS) {
712 arm64_debugserver = true;
713 }
714 }
715 uint32_t num_restored = 0;
716 const RegisterInfo *reg_info;
717 for (uint32_t i = 0; (reg_info = GetRegisterInfoAtIndex(i)) != nullptr;
718 i++) {
719 if (reg_info->value_regs) // skip registers that are slices of real
720 // registers
721 continue;
722 // Skip the fpsr and fpcr floating point status/control register
723 // writing to work around a bug in an older version of debugserver that
724 // would lead to register context corruption when writing fpsr/fpcr.
725 if (arm64_debugserver && (strcmp(reg_info->name, "fpsr") == 0 ||
726 strcmp(reg_info->name, "fpcr") == 0)) {
727 continue;
728 }
729
730 SetRegisterIsValid(reg_info, false);
731 if (gdb_comm.WriteRegister(m_thread.GetProtocolID(),
733 {data_sp->GetBytes() + reg_info->byte_offset,
734 reg_info->byte_size}))
735 ++num_restored;
736 }
737 return num_restored > 0;
738 }
739 } else {
741 if (log) {
742 if (log->GetVerbose()) {
743 StreamString strm;
744 process->DumpPluginHistory(strm);
745 LLDB_LOGF(log,
746 "error: failed to get packet sequence mutex, not sending "
747 "write all registers:\n%s",
748 strm.GetData());
749 } else
750 LLDB_LOGF(log,
751 "error: failed to get packet sequence mutex, not sending "
752 "write all registers");
753 }
754 }
755 return false;
756}
757
759 lldb::RegisterKind kind, uint32_t num) {
760 return m_reg_info_sp->ConvertRegisterKindToRegisterNumber(kind, num);
761}
762
764 const llvm::StringRef name) {
766 const Architecture *architecture =
768 return architecture && architecture->RegisterWriteCausesReconfigure(name);
769}
770
773 const Architecture *architecture =
775 if (architecture)
776 return architecture->ReconfigureRegisterInfo(*(m_reg_info_sp.get()),
777 m_reg_data, *this);
778 return false;
779}
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
Definition Log.h:376
An architecture specification class.
Definition ArchSpec.h:31
bool IsValid() const
Tests if this ArchSpec is valid.
Definition ArchSpec.h:366
llvm::Triple & GetTriple()
Architecture triple accessor.
Definition ArchSpec.h:468
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
Definition ArchSpec.cpp:677
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.
uint64_t GetByteSize() const
Get the number of bytes contained in this object.
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:326
virtual void DumpPluginHistory(Stream &s)
The underlying plugin might store the low-level communication history for this session.
Definition Process.h:606
Target & GetTarget()
Get the target object pointer for this module.
Definition Process.h:1267
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:1192
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 SetRegisterIsValid(const RegisterInfo *reg_info, bool 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)
#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:332
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