diff options
| author | Elliott Hughes <enh@google.com> | 2022-01-13 09:20:26 -0800 |
|---|---|---|
| committer | Peter Collingbourne <pcc@google.com> | 2022-01-13 15:03:19 -0800 |
| commit | 809be9d159a4611b3b354d8d55e3328a30176bb0 (patch) | |
| tree | 08a03c7530a9f736536455ea7eb2010779fce956 /debuggerd/libdebuggerd/utility.cpp | |
| parent | 5a2c110b281f03d222c9519f07175bd80123affd (diff) | |
debuggerd: add the PAC keys to the tombstones.
Hard to get otherwise if you're trying to debug PAC issues.
Bug: http://b/214314197
Test: treehugger
Change-Id: I2e5502809f84579bf287364e59d6e7ff67770919
Diffstat (limited to 'debuggerd/libdebuggerd/utility.cpp')
| -rw-r--r-- | debuggerd/libdebuggerd/utility.cpp | 53 |
1 files changed, 31 insertions, 22 deletions
diff --git a/debuggerd/libdebuggerd/utility.cpp b/debuggerd/libdebuggerd/utility.cpp index 71f0c09274..543a67c94f 100644 --- a/debuggerd/libdebuggerd/utility.cpp +++ b/debuggerd/libdebuggerd/utility.cpp @@ -446,31 +446,40 @@ const char* get_sigcode(const siginfo_t* si) { return "?"; } -std::string describe_tagged_addr_ctrl(long ctrl) { - std::string desc; - if (ctrl & PR_TAGGED_ADDR_ENABLE) { - desc += ", PR_TAGGED_ADDR_ENABLE"; - ctrl &= ~PR_TAGGED_ADDR_ENABLE; - } - if (ctrl & PR_MTE_TCF_SYNC) { - desc += ", PR_MTE_TCF_SYNC"; - ctrl &= ~PR_MTE_TCF_SYNC; - } - if (ctrl & PR_MTE_TCF_ASYNC) { - desc += ", PR_MTE_TCF_ASYNC"; - ctrl &= ~PR_MTE_TCF_ASYNC; +#define DESCRIBE_FLAG(flag) \ + if (value & flag) { \ + desc += ", "; \ + desc += #flag; \ + value &= ~flag; \ } - if (ctrl & PR_MTE_TAG_MASK) { - desc += StringPrintf(", mask 0x%04lx", (ctrl & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT); - ctrl &= ~PR_MTE_TAG_MASK; - } - if (ctrl) { - desc += StringPrintf(", unknown 0x%lx", ctrl); + +static std::string describe_end(long value, std::string& desc) { + if (value) { + desc += StringPrintf(", unknown 0x%lx", value); } - if (desc.empty()) { - return ""; + return desc.empty() ? "" : " (" + desc.substr(2) + ")"; +} + +std::string describe_tagged_addr_ctrl(long value) { + std::string desc; + DESCRIBE_FLAG(PR_TAGGED_ADDR_ENABLE); + DESCRIBE_FLAG(PR_MTE_TCF_SYNC); + DESCRIBE_FLAG(PR_MTE_TCF_ASYNC); + if (value & PR_MTE_TAG_MASK) { + desc += StringPrintf(", mask 0x%04lx", (value & PR_MTE_TAG_MASK) >> PR_MTE_TAG_SHIFT); + value &= ~PR_MTE_TAG_MASK; } - return " (" + desc.substr(2) + ")"; + return describe_end(value, desc); +} + +std::string describe_pac_enabled_keys(long value) { + std::string desc; + DESCRIBE_FLAG(PR_PAC_APIAKEY); + DESCRIBE_FLAG(PR_PAC_APIBKEY); + DESCRIBE_FLAG(PR_PAC_APDAKEY); + DESCRIBE_FLAG(PR_PAC_APDBKEY); + DESCRIBE_FLAG(PR_PAC_APGAKEY); + return describe_end(value, desc); } void log_backtrace(log_t* log, unwindstack::Unwinder* unwinder, const char* prefix) { |
