diff options
author | Peter Collingbourne <pcc@google.com> | 2020-09-14 20:27:36 -0700 |
---|---|---|
committer | Peter Collingbourne <pcc@google.com> | 2020-09-15 21:32:36 -0700 |
commit | 864f15dd6d05abe77670e2e20fe7aa1819600e7c (patch) | |
tree | dd37358a2568729acacd33b6d279eb9466207e74 | |
parent | 278f11b57425d3a14369049e866c597980677988 (diff) |
Dump the per-thread TAGGED_ADDR_CTRL value if available.
This value indicates whether memory tagging is enabled on a thread,
the mode (sync or async) and the set of excluded tags. This information
can sometimes be important for understanding an MTE related crash,
so include it in the per-thread tombstone output.
Bug: 135772972
Change-Id: I25a16e10ac7fbb2b1ab2a961a5279f787039000b
-rw-r--r-- | debuggerd/Android.bp | 6 | ||||
-rw-r--r-- | debuggerd/crash_dump.cpp | 12 | ||||
-rw-r--r-- | debuggerd/debuggerd_test.cpp | 5 | ||||
-rw-r--r-- | debuggerd/libdebuggerd/include/libdebuggerd/types.h | 1 | ||||
-rw-r--r-- | debuggerd/libdebuggerd/tombstone.cpp | 3 |
5 files changed, 27 insertions, 0 deletions
diff --git a/debuggerd/Android.bp b/debuggerd/Android.bp index ad10a1f37..99cabdd6f 100644 --- a/debuggerd/Android.bp +++ b/debuggerd/Android.bp @@ -343,6 +343,12 @@ cc_binary { apex_available: [ "com.android.runtime", ], + + product_variables: { + experimental_mte: { + cflags: ["-DANDROID_EXPERIMENTAL_MTE"], + }, + }, } cc_binary { diff --git a/debuggerd/crash_dump.cpp b/debuggerd/crash_dump.cpp index d7cb9725f..c52c6f741 100644 --- a/debuggerd/crash_dump.cpp +++ b/debuggerd/crash_dump.cpp @@ -40,6 +40,7 @@ #include <android-base/stringprintf.h> #include <android-base/strings.h> #include <android-base/unique_fd.h> +#include <bionic/mte_kernel.h> #include <bionic/reserved_signals.h> #include <cutils/sockets.h> #include <log/log.h> @@ -486,6 +487,17 @@ int main(int argc, char** argv) { continue; } +#ifdef ANDROID_EXPERIMENTAL_MTE + struct iovec iov = { + &info.tagged_addr_ctrl, + sizeof(info.tagged_addr_ctrl), + }; + if (ptrace(PTRACE_GETREGSET, thread, NT_ARM_TAGGED_ADDR_CTRL, + reinterpret_cast<void*>(&iov)) == -1) { + info.tagged_addr_ctrl = -1; + } +#endif + if (thread == g_target_thread) { // Read the thread's registers along with the rest of the crash info out of the pipe. ReadCrashInfo(input_pipe, &siginfo, &info.registers, &process_info); diff --git a/debuggerd/debuggerd_test.cpp b/debuggerd/debuggerd_test.cpp index 108787e4a..5ed9e57fa 100644 --- a/debuggerd/debuggerd_test.cpp +++ b/debuggerd/debuggerd_test.cpp @@ -309,6 +309,11 @@ TEST_F(CrasherTest, smoke) { std::string result; ConsumeFd(std::move(output_fd), &result); ASSERT_MATCH(result, R"(signal 11 \(SIGSEGV\), code 1 \(SEGV_MAPERR\), fault addr 0xdead)"); + + if (mte_supported()) { + // Test that the default TAGGED_ADDR_CTRL value is set. + ASSERT_MATCH(result, R"(tagged_addr_ctrl: 000000000007fff3)"); + } } TEST_F(CrasherTest, tagged_fault_addr) { diff --git a/debuggerd/libdebuggerd/include/libdebuggerd/types.h b/debuggerd/libdebuggerd/include/libdebuggerd/types.h index 04c4b5c58..30e75e11d 100644 --- a/debuggerd/libdebuggerd/include/libdebuggerd/types.h +++ b/debuggerd/libdebuggerd/include/libdebuggerd/types.h @@ -23,6 +23,7 @@ struct ThreadInfo { std::unique_ptr<unwindstack::Regs> registers; + long tagged_addr_ctrl = -1; pid_t uid; diff --git a/debuggerd/libdebuggerd/tombstone.cpp b/debuggerd/libdebuggerd/tombstone.cpp index 7af99c94c..e1fe82b6d 100644 --- a/debuggerd/libdebuggerd/tombstone.cpp +++ b/debuggerd/libdebuggerd/tombstone.cpp @@ -180,6 +180,9 @@ static void dump_thread_info(log_t* log, const ThreadInfo& thread_info) { _LOG(log, logtype::HEADER, "pid: %d, tid: %d, name: %s >>> %s <<<\n", thread_info.pid, thread_info.tid, thread_info.thread_name.c_str(), thread_info.process_name.c_str()); _LOG(log, logtype::HEADER, "uid: %d\n", thread_info.uid); + if (thread_info.tagged_addr_ctrl != -1) { + _LOG(log, logtype::HEADER, "tagged_addr_ctrl: %016lx\n", thread_info.tagged_addr_ctrl); + } } static std::string get_addr_string(uint64_t addr) { |