Skip to content

Commit

Permalink
Merge pull request llvm#6773 from jasonmolenda/addressing_bits-in-sto…
Browse files Browse the repository at this point in the history
…p-reply-packet2-59

Recognize `addressing_bits` kv in stop reply packet
  • Loading branch information
jasonmolenda authored May 5, 2023
2 parents 713e745 + 0ea7e70 commit 4471e44
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 0 deletions.
18 changes: 18 additions & 0 deletions lldb/docs/lldb-gdb-remote.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1596,6 +1596,24 @@ for this region.
// Example:
// thread-pcs:dec14,2cf872b0,2cf8681c,2d02d68c,2cf716a8;
//
// "addressing_bits" unsigned optional Specifies how many bits in addresses
// are significant for addressing, base
// 10. If bits 38..0 in a 64-bit
// pointer are significant for
// addressing, then the value is 39.
// This is needed on e.g. AArch64
// v8.3 ABIs that use pointer
// authentication in the high bits.
// This value is normally sent in the
// qHostInfo packet response, and if the
// value cannot change during the process
// lifetime, it does not need to be
// duplicated here in the stop packet.
// For a firmware environment with early
// start code that may be changing the
// page table setup, a dynamically set
// value may be needed.
//
// BEST PRACTICES:
// Since register values can be supplied with this packet, it is often useful
// to return the PC, SP, FP, LR (if any), and FLAGS registers so that separate
Expand Down
7 changes: 7 additions & 0 deletions lldb/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2238,6 +2238,13 @@ StateType ProcessGDBRemote::SetThreadStopInfo(StringExtractor &stop_packet) {
StreamString ostr;
ostr.Printf("%" PRIu64 " %" PRIu64, pid_tid->first, pid_tid->second);
description = std::string(ostr.GetString());
} else if (key.compare("addressing_bits") == 0) {
uint64_t addressing_bits;
if (!value.getAsInteger(0, addressing_bits)) {
addr_t address_mask = ~((1ULL << addressing_bits) - 1);
SetCodeAddressMask(address_mask);
SetDataAddressMask(address_mask);
}
} else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1])) {
uint32_t reg = UINT32_MAX;
if (!key.getAsInteger(16, reg))
Expand Down

0 comments on commit 4471e44

Please sign in to comment.