35 bool write_all_at_once)
37 m_reg_info_sp(std::move(reg_info_sp)), m_reg_valid(), m_reg_data(),
38 m_read_all_at_once(read_all_at_once),
39 m_write_all_at_once(write_all_at_once), m_gpacket_cached(false) {
46 DataBufferSP reg_data_sp(
61 std::vector<bool>::iterator pos, end =
m_reg_valid.end();
90 if (reg_info->value_regs &&
93 std::vector<char> combined_data;
100 combined_data.resize(offset + parent_reg->byte_size);
102 combined_data.data() + offset) !=
103 parent_reg->byte_size)
105 offset += parent_reg->byte_size;
110 *reg_info, combined_data.data(), combined_data.size(),
113 const bool partial_data_ok =
false;
115 *reg_info,
m_reg_data, reg_info->byte_offset, partial_data_ok));
116 return error.Success();
123 uint32_t reg, llvm::ArrayRef<uint8_t> data) {
125 if (reg_info ==
nullptr)
131 const size_t reg_byte_size = reg_info->byte_size;
132 memcpy(
const_cast<uint8_t *
>(
134 data.data(), std::min(data.size(), reg_byte_size));
135 bool success = data.size() >= reg_byte_size;
138 }
else if (data.size() > 0) {
147 uint64_t new_reg_val) {
149 if (reg_info ==
nullptr)
163 DataBufferSP buffer_sp(
new DataBufferHeap(&new_reg_val,
sizeof(new_reg_val)));
172 uint8_t *dst =
const_cast<uint8_t *
>(
196 if (DataBufferSP buffer_sp =
199 lldb_reg, llvm::ArrayRef<uint8_t>(buffer_sp->GetBytes(),
200 buffer_sp->GetByteSize()));
209 if (process ==
nullptr || thread ==
nullptr)
221 if (DataBufferSP buffer_sp =
224 buffer_sp->GetBytes(),
229 }
else if (buffer_sp->GetByteSize() > 0) {
231 const struct RegisterInfo ®info = x.value();
233 (reginfo.byte_offset + reginfo.byte_size <=
234 buffer_sp->GetByteSize());
244 "error: GDBRemoteRegisterContext::ReadRegisterBytes tried "
246 "entire register context at once, expected at least %" PRId64
248 "but only got %" PRId64
" bytes.",
254 if (reg_info->value_regs) {
260 for (
uint32_t idx = 0; success; ++idx) {
261 const uint32_t prim_reg = reg_info->value_regs[idx];
266 const RegisterInfo *prim_reg_info =
268 if (prim_reg_info ==
nullptr)
299 if (reg_info->value_regs &&
308 combined_size += parent_reg->byte_size;
320 DataExtractor parent_data{data, offset, parent_reg->byte_size};
323 offset += parent_reg->byte_size;
325 assert(offset == combined_size);
344 {m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size),
345 reg_info->byte_size});
355 if (process ==
nullptr || thread ==
nullptr)
362 reg_info->byte_offset + reg_info->byte_size);
370 uint8_t *dst =
const_cast<uint8_t *
>(
379 bool do_reconfigure_arm64_sve =
false;
382 if (strcmp(reg_info->name,
"vg") == 0)
383 do_reconfigure_arm64_sve =
true;
400 {m_reg_data.GetDataStart(), size_t(m_reg_data.GetByteSize())}))
405 if (do_reconfigure_arm64_sve)
413 if (reg_info->value_regs) {
421 for (
uint32_t idx = 0; success; ++idx) {
422 const uint32_t reg = reg_info->value_regs[idx];
427 const RegisterInfo *value_reg_info =
429 if (value_reg_info ==
nullptr)
438 if (success && do_reconfigure_arm64_sve)
444 if (reg_info->invalidate_regs) {
445 for (
uint32_t idx = 0, reg = reg_info->invalidate_regs[0];
447 reg = reg_info->invalidate_regs[++idx])
462 "error: failed to get packet sequence mutex, not sending "
463 "write register for \"%s\":\n%s",
464 reg_info->name, strm.
GetData());
467 "error: failed to get packet sequence mutex, not sending "
468 "write register for \"%s\"",
482 if (process ==
nullptr || thread ==
nullptr)
490 reg_checkpoint.
SetID(save_id);
491 reg_checkpoint.
GetData().reset();
494 reg_checkpoint.
SetID(0);
507 if (process ==
nullptr || thread ==
nullptr)
520 lldb::WritableDataBufferSP &data_sp) {
525 if (process ==
nullptr || thread ==
nullptr)
531 const bool use_g_packet =
540 if (DataBufferSP data_buffer =
542 data_sp = std::make_shared<DataBufferHeap>(*data_buffer);
549 const RegisterInfo *reg_info;
560 data_sp = std::make_shared<DataBufferHeap>(
571 "error: failed to get packet sequence mutex, not sending "
572 "read all registers:\n%s",
576 "error: failed to get packet sequence mutex, not sending "
577 "read all registers");
586 const lldb::DataBufferSP &data_sp) {
587 if (!data_sp || data_sp->GetBytes() ==
nullptr || data_sp->GetByteSize() == 0)
594 if (process ==
nullptr || thread ==
nullptr)
600 const bool use_g_packet =
609 {data_sp->GetBytes(), size_t(data_sp->GetByteSize())}))
618 const RegisterInfo *reg_info;
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;
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;
644 bool use_byte_offset_into_buffer;
645 if (size_by_highest_offset == restore_data.
GetByteSize()) {
648 use_byte_offset_into_buffer =
true;
649 }
else if (size_not_including_slice_registers ==
653 use_byte_offset_into_buffer =
true;
654 }
else if (size_including_slice_registers == restore_data.
GetByteSize()) {
658 use_byte_offset_into_buffer =
false;
663 use_byte_offset_into_buffer =
false;
671 ++reg_idx, running_byte_offset += reg_info->byte_size) {
673 if (reg_info->value_regs)
679 if (use_byte_offset_into_buffer) {
680 register_offset = reg_info->byte_offset;
682 register_offset = running_byte_offset;
685 const uint32_t reg_byte_size = reg_info->byte_size;
687 const uint8_t *restore_src =
688 restore_data.
PeekData(register_offset, reg_byte_size);
694 {restore_src, reg_byte_size}))
698 return num_restored > 0;
704 bool arm64_debugserver =
false;
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;
716 const RegisterInfo *reg_info;
719 if (reg_info->value_regs)
725 if (arm64_debugserver && (strcmp(reg_info->name,
"fpsr") == 0 ||
726 strcmp(reg_info->name,
"fpcr") == 0)) {
733 {data_sp->GetBytes() + reg_info->byte_offset,
734 reg_info->byte_size}))
737 return num_restored > 0;
746 "error: failed to get packet sequence mutex, not sending "
747 "write all registers:\n%s",
751 "error: failed to get packet sequence mutex, not sending "
752 "write all registers");
760 return m_reg_info_sp->ConvertRegisterKindToRegisterNumber(kind, num);
767 const RegisterInfo *reg_info =
m_reg_info_sp->GetRegisterInfo(
"vg");
775 if (vg_reg_value != fail_value && vg_reg_value <= 32) {
776 const RegisterInfo *reg_info =
m_reg_info_sp->GetRegisterInfo(
"p0");
777 if (!reg_info || vg_reg_value == reg_info->byte_size)
780 if (
m_reg_info_sp->UpdateARM64SVERegistersInfos(vg_reg_value)) {
802 for (
auto ® :
m_regs) {
803 if (reg.value_regs ==
nullptr) {
804 if (reg.name[0] ==
'z' && isdigit(reg.name[1]))
805 reg.byte_size = z_reg_byte_size;
806 else if (reg.name[0] ==
'p' && isdigit(reg.name[1]))
808 else if (strcmp(reg.name,
"ffr") == 0)
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
llvm::Triple & GetTriple()
Architecture triple accessor.
llvm::Triple::ArchType GetMachine() const
Returns a machine family for the current architecture.
A subclass of DataBuffer that stores a data buffer on the heap.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
Process * GetProcessPtr() const
Returns a pointer to the process object.
Thread * GetThreadPtr() const
Returns a pointer to the thread object.
A plug-in interface definition class for debugging a process.
Target & GetTarget()
Get the target object pointer for this module.
lldb::WritableDataBufferSP & GetData()
void InvalidateIfNeeded(bool force)
uint64_t ReadRegisterAsUnsigned(uint32_t reg, uint64_t fail_value)
const RegisterInfo * GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num)
lldb::ThreadSP CalculateThread() override
virtual lldb::ByteOrder GetByteOrder()
uint32_t SetFromMemoryData(const RegisterInfo ®_info, const void *src, uint32_t src_len, lldb::ByteOrder src_byte_order, Status &error)
bool GetData(DataExtractor &data) const
Status SetValueFromData(const RegisterInfo ®_info, DataExtractor &data, lldb::offset_t offset, bool partial_data_ok)
const char * GetData() const
const ArchSpec & GetArchitecture() const
virtual lldb::user_id_t GetProtocolID() const
lldb::ProcessSP GetProcess() const
lldb::DataBufferSP ReadRegister(lldb::tid_t tid, uint32_t reg_num)
bool RestoreRegisterState(lldb::tid_t tid, uint32_t save_id)
bool AvoidGPackets(ProcessGDBRemote *process)
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)
bool SyncThreadState(lldb::tid_t tid)
lldb::DataBufferSP ReadAllRegisters(lldb::tid_t tid)
bool SaveRegisterState(lldb::tid_t tid, uint32_t &save_id)
void DumpHistory(Stream &strm)
bool UpdateARM64SVERegistersInfos(uint64_t vg)
const RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
const RegisterSet * GetRegisterSet(size_t reg_set) override
bool ReadRegisterBytes(const RegisterInfo *reg_info)
~GDBRemoteRegisterContext() override
std::vector< bool > m_reg_valid
void SetAllRegisterValid(bool b)
bool GetRegisterIsValid(uint32_t reg) const
bool AArch64SVEReconfigure()
GDBRemoteRegisterContext(ThreadGDBRemote &thread, uint32_t concrete_frame_idx, GDBRemoteDynamicRegisterInfoSP reg_info_sp, bool read_all_at_once, bool write_all_at_once)
GDBRemoteDynamicRegisterInfoSP m_reg_info_sp
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
size_t GetRegisterCount() override
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
void InvalidateAllRegisters() override
bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) override
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
size_t GetRegisterSetCount() 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_INDEX32
#define LLDB_INVALID_ADDRESS
#define LLDB_INVALID_REGNUM
lldb::ByteOrder InlHostByteOrder()
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.
RegisterKind
Register numbering types.
@ eRegisterKindLLDB
lldb's internal register numbers
@ eRegisterKindProcessPlugin
num used by the process plugin - e.g.
lldb::user_id_t GetID() const
Get accessor for the user ID.
void SetID(lldb::user_id_t uid)
Set accessor for the user ID.