36 bool write_all_at_once)
51 m_reg_data.SetByteOrder(thread.GetProcess()->GetByteOrder());
110 std::vector<char> combined_data;
117 combined_data.resize(offset + parent_reg->
byte_size);
119 combined_data.data() + offset) !=
127 *reg_info, combined_data.data(), combined_data.size(),
130 const bool partial_data_ok =
false;
133 return error.Success();
140 uint32_t reg, llvm::ArrayRef<uint8_t> data) {
142 if (reg_info ==
nullptr)
148 const size_t reg_byte_size = reg_info->
byte_size;
149 memcpy(
const_cast<uint8_t *
>(
151 data.data(), std::min(data.size(), reg_byte_size));
152 bool success = data.size() >= reg_byte_size;
155 }
else if (data.size() > 0) {
164 uint64_t new_reg_val) {
166 if (reg_info ==
nullptr)
182 extractor.
SetData(buffer_sp, 0, buffer_sp->GetByteSize());
190 uint8_t *dst =
const_cast<uint8_t *
>(
218 lldb_reg, llvm::ArrayRef<uint8_t>(buffer_sp->GetBytes(),
219 buffer_sp->GetByteSize()));
228 if (process ==
nullptr || thread ==
nullptr)
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()) {
248 }
else if (buffer_sp->GetByteSize() > 0) {
249 for (
auto x : llvm::enumerate(
254 buffer_sp->GetByteSize())
267 "error: GDBRemoteRegisterContext::ReadRegisterBytes tried "
269 "entire register context at once, expected at least %" PRId64
271 "but only got %" PRId64
" bytes.",
272 m_reg_data.GetByteSize(), buffer_sp->GetByteSize());
283 for (uint32_t idx = 0; success; ++idx) {
284 const uint32_t prim_reg = reg_info->
value_regs[idx];
293 if (prim_reg_info ==
nullptr)
335 uint32_t combined_size = 0;
358 assert(offset == combined_size);
377 {m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size),
378 reg_info->byte_size});
383 uint32_t data_offset) {
388 if (process ==
nullptr || thread ==
nullptr)
403 uint8_t *dst =
const_cast<uint8_t *
>(
409 const bool should_reconfigure_registers =
427 {m_reg_data.GetDataStart(), size_t(m_reg_data.GetByteSize())}))
430 if (should_reconfigure_registers)
448 for (uint32_t idx = 0; success; ++idx) {
449 const uint32_t reg = reg_info->
value_regs[idx];
456 if (value_reg_info ==
nullptr)
476 if (success && should_reconfigure_registers &&
489 "error: failed to get packet sequence mutex, not sending "
490 "write register for \"%s\":\n%s",
494 "error: failed to get packet sequence mutex, not sending "
495 "write register for \"%s\"",
509 if (process ==
nullptr || thread ==
nullptr)
515 uint32_t save_id = 0;
517 reg_checkpoint.
SetID(save_id);
518 reg_checkpoint.
GetData().reset();
521 reg_checkpoint.
SetID(0);
528 uint32_t save_id = reg_checkpoint.
GetID();
534 if (process ==
nullptr || thread ==
nullptr)
552 if (process ==
nullptr || thread ==
nullptr)
558 const bool use_g_packet =
569 data_sp = std::make_shared<DataBufferHeap>(*data_buffer);
587 data_sp = std::make_shared<DataBufferHeap>(
598 "error: failed to get packet sequence mutex, not sending "
599 "read all registers:\n%s",
603 "error: failed to get packet sequence mutex, not sending "
604 "read all registers");
614 if (!data_sp || data_sp->GetBytes() ==
nullptr || data_sp->GetByteSize() == 0)
621 if (process ==
nullptr || thread ==
nullptr)
627 const bool use_g_packet =
636 {data_sp->GetBytes(), size_t(data_sp->GetByteSize())}))
639 uint32_t num_restored = 0;
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;
662 for (uint32_t reg_idx = 0;
664 size_including_slice_registers += reg_info->
byte_size;
666 size_not_including_slice_registers += reg_info->
byte_size;
667 if (reg_info->
byte_offset >= size_by_highest_offset)
671 bool use_byte_offset_into_buffer;
672 if (size_by_highest_offset == restore_data.
GetByteSize()) {
675 use_byte_offset_into_buffer =
true;
676 }
else if (size_not_including_slice_registers ==
680 use_byte_offset_into_buffer =
true;
681 }
else if (size_including_slice_registers == restore_data.
GetByteSize()) {
685 use_byte_offset_into_buffer =
false;
690 use_byte_offset_into_buffer =
false;
695 uint32_t running_byte_offset = 0;
696 for (uint32_t reg_idx = 0;
698 ++reg_idx, running_byte_offset += reg_info->
byte_size) {
705 uint32_t register_offset;
706 if (use_byte_offset_into_buffer) {
709 register_offset = running_byte_offset;
712 const uint32_t reg_byte_size = reg_info->
byte_size;
714 const uint8_t *restore_src =
715 restore_data.
PeekData(register_offset, reg_byte_size);
721 {restore_src, reg_byte_size}))
725 return num_restored > 0;
731 bool arm64_debugserver =
false;
734 m_thread.GetProcess()->GetTarget().GetArchitecture();
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;
742 uint32_t num_restored = 0;
752 if (arm64_debugserver && (strcmp(reg_info->
name,
"fpsr") == 0 ||
753 strcmp(reg_info->
name,
"fpcr") == 0)) {
760 {data_sp->GetBytes() + reg_info->byte_offset,
761 reg_info->byte_size}))
764 return num_restored > 0;
773 "error: failed to get packet sequence mutex, not sending "
774 "write all registers:\n%s",
778 "error: failed to get packet sequence mutex, not sending "
779 "write all registers");
787 return m_reg_info_sp->ConvertRegisterKindToRegisterNumber(kind, num);
791 const llvm::StringRef name) {
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.
virtual bool ReconfigureRegisterInfo(DynamicRegisterInfo ®_info, DataExtractor ®_data, RegisterContext ®_context) const
virtual bool RegisterWriteCausesReconfigure(const llvm::StringRef name) const
A subclass of DataBuffer that stores a data buffer on the heap.
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.
virtual void DumpPluginHistory(Stream &s)
The underlying plugin might store the low-level communication history for this session.
Target & GetTarget()
Get the target object pointer for this module.
lldb::WritableDataBufferSP & GetData()
void InvalidateIfNeeded(bool force)
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 ®_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
Architecture * GetArchitecturePlugin() 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)
friend class ThreadGDBRemote
LazyBool GetRegisterValidState(uint32_t reg) const
bool GetRegisterIsUnavailable(uint32_t reg) const
const RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
const RegisterSet * GetRegisterSet(size_t reg_set) override
bool GetRegisterIsUnfetched(uint32_t reg) const
bool ReadRegisterBytes(const RegisterInfo *reg_info)
~GDBRemoteRegisterContext() override
void SetRegisterIsValid(const RegisterInfo *reg_info)
bool GetRegisterIsValid(uint32_t reg) const
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)
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 SetAllRegistersValid()
void SetAllRegistersValidState(LazyBool valid)
bool WriteRegister(const RegisterInfo *reg_info, const RegisterValue &value) override
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
size_t GetRegisterSetCount() override
void SetRegisterIsValidState(const RegisterInfo *reg_info, LazyBool valid)
bool SetPrimordialRegister(const RegisterInfo *reg_info, GDBRemoteCommunicationClient &gdb_comm)
void SetRegisterIsUnfetched(const RegisterInfo *reg_info)
uint32_t ConvertRegisterKindToRegisterNumber(lldb::RegisterKind kind, uint32_t num) override
Convert from a given register numbering scheme to the lldb register numbering scheme.
bool ReconfigureRegisterInfo() override
void InvalidateAllRegisters() override
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.
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.
void SetID(lldb::user_id_t uid)
Set accessor for the user ID.