Include memory tags in memory dump output.

Tags appear in the addresses printed in the memory dump, which seems
like a reasonable place to put them because tagged addresses will
also appear in other places in the tombstone, such as registers and
the fault address.

Bug: 135772972
Change-Id: I52da338347ff6b7503cf5ac80763c540695dc061
This commit is contained in:
Peter Collingbourne 2020-07-20 15:08:52 -07:00
parent b1fcedb928
commit fe8997aff8
3 changed files with 125 additions and 67 deletions

View File

@ -18,6 +18,7 @@
#include <fcntl.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include <sys/ptrace.h>
#include <sys/resource.h>
@ -556,6 +557,55 @@ TEST_F(CrasherTest, mte_multiple_causes) {
#endif
}
#if defined(__aarch64__) && defined(ANDROID_EXPERIMENTAL_MTE)
static uintptr_t CreateTagMapping() {
uintptr_t mapping =
reinterpret_cast<uintptr_t>(mmap(nullptr, getpagesize(), PROT_READ | PROT_WRITE | PROT_MTE,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
if (reinterpret_cast<void*>(mapping) == MAP_FAILED) {
return 0;
}
__asm__ __volatile__(".arch_extension mte; stg %0, [%0]"
:
: "r"(mapping + (1ULL << 56))
: "memory");
return mapping;
}
#endif
TEST_F(CrasherTest, mte_tag_dump) {
#if defined(__aarch64__) && defined(ANDROID_EXPERIMENTAL_MTE)
if (!mte_supported()) {
GTEST_SKIP() << "Requires MTE";
}
int intercept_result;
unique_fd output_fd;
StartProcess([&]() {
SetTagCheckingLevelSync();
Trap(reinterpret_cast<void *>(CreateTagMapping()));
});
StartIntercept(&output_fd);
FinishCrasher();
AssertDeath(SIGTRAP);
FinishIntercept(&intercept_result);
ASSERT_EQ(1, intercept_result) << "tombstoned reported failure";
std::string result;
ConsumeFd(std::move(output_fd), &result);
ASSERT_MATCH(result, R"(memory near x0:
.*
.*
01.............0 0000000000000000 0000000000000000 ................
00.............0)");
#else
GTEST_SKIP() << "Requires aarch64 + ANDROID_EXPERIMENTAL_MTE";
#endif
}
TEST_F(CrasherTest, LD_PRELOAD) {
int intercept_result;
unique_fd output_fd;

View File

@ -30,39 +30,39 @@
const char g_expected_full_dump[] =
"\nmemory near r1:\n"
#if defined(__LP64__)
" 0000000012345658 0706050403020100 0f0e0d0c0b0a0908 ................\n"
" 0000000012345668 1716151413121110 1f1e1d1c1b1a1918 ................\n"
" 0000000012345678 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n"
" 0000000012345688 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n"
" 0000000012345698 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n"
" 00000000123456a8 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n"
" 00000000123456b8 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n"
" 00000000123456c8 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n"
" 00000000123456d8 8786858483828180 8f8e8d8c8b8a8988 ................\n"
" 00000000123456e8 9796959493929190 9f9e9d9c9b9a9998 ................\n"
" 00000000123456f8 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n"
" 0000000012345708 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n"
" 0000000012345718 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n"
" 0000000012345728 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n"
" 0000000012345738 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n"
" 0000000012345748 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n";
" 0000000012345650 0706050403020100 0f0e0d0c0b0a0908 ................\n"
" 0000000012345660 1716151413121110 1f1e1d1c1b1a1918 ................\n"
" 0000000012345670 2726252423222120 2f2e2d2c2b2a2928 !\"#$%&'()*+,-./\n"
" 0000000012345680 3736353433323130 3f3e3d3c3b3a3938 0123456789:;<=>?\n"
" 0000000012345690 4746454443424140 4f4e4d4c4b4a4948 @ABCDEFGHIJKLMNO\n"
" 00000000123456a0 5756555453525150 5f5e5d5c5b5a5958 PQRSTUVWXYZ[\\]^_\n"
" 00000000123456b0 6766656463626160 6f6e6d6c6b6a6968 `abcdefghijklmno\n"
" 00000000123456c0 7776757473727170 7f7e7d7c7b7a7978 pqrstuvwxyz{|}~.\n"
" 00000000123456d0 8786858483828180 8f8e8d8c8b8a8988 ................\n"
" 00000000123456e0 9796959493929190 9f9e9d9c9b9a9998 ................\n"
" 00000000123456f0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n"
" 0000000012345700 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n"
" 0000000012345710 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n"
" 0000000012345720 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n"
" 0000000012345730 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n"
" 0000000012345740 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n";
#else
" 12345658 03020100 07060504 0b0a0908 0f0e0d0c ................\n"
" 12345668 13121110 17161514 1b1a1918 1f1e1d1c ................\n"
" 12345678 23222120 27262524 2b2a2928 2f2e2d2c !\"#$%&'()*+,-./\n"
" 12345688 33323130 37363534 3b3a3938 3f3e3d3c 0123456789:;<=>?\n"
" 12345698 43424140 47464544 4b4a4948 4f4e4d4c @ABCDEFGHIJKLMNO\n"
" 123456a8 53525150 57565554 5b5a5958 5f5e5d5c PQRSTUVWXYZ[\\]^_\n"
" 123456b8 63626160 67666564 6b6a6968 6f6e6d6c `abcdefghijklmno\n"
" 123456c8 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~.\n"
" 123456d8 83828180 87868584 8b8a8988 8f8e8d8c ................\n"
" 123456e8 93929190 97969594 9b9a9998 9f9e9d9c ................\n"
" 123456f8 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n"
" 12345708 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n"
" 12345718 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n"
" 12345728 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n"
" 12345738 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n"
" 12345748 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n";
" 12345650 03020100 07060504 0b0a0908 0f0e0d0c ................\n"
" 12345660 13121110 17161514 1b1a1918 1f1e1d1c ................\n"
" 12345670 23222120 27262524 2b2a2928 2f2e2d2c !\"#$%&'()*+,-./\n"
" 12345680 33323130 37363534 3b3a3938 3f3e3d3c 0123456789:;<=>?\n"
" 12345690 43424140 47464544 4b4a4948 4f4e4d4c @ABCDEFGHIJKLMNO\n"
" 123456a0 53525150 57565554 5b5a5958 5f5e5d5c PQRSTUVWXYZ[\\]^_\n"
" 123456b0 63626160 67666564 6b6a6968 6f6e6d6c `abcdefghijklmno\n"
" 123456c0 73727170 77767574 7b7a7978 7f7e7d7c pqrstuvwxyz{|}~.\n"
" 123456d0 83828180 87868584 8b8a8988 8f8e8d8c ................\n"
" 123456e0 93929190 97969594 9b9a9998 9f9e9d9c ................\n"
" 123456f0 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n"
" 12345700 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n"
" 12345710 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n"
" 12345720 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n"
" 12345730 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n"
" 12345740 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n";
#endif
const char g_expected_partial_dump[] = \
@ -513,39 +513,41 @@ TEST_F(DumpMemoryTest, first_read_empty) {
const char* expected_dump = \
"\nmemory near r4:\n"
#if defined(__LP64__)
" 0000000010000f88 ---------------- ---------------- ................\n"
" 0000000010000f98 ---------------- ---------------- ................\n"
" 0000000010000fa8 ---------------- ---------------- ................\n"
" 0000000010000fb8 ---------------- ---------------- ................\n"
" 0000000010000fc8 ---------------- ---------------- ................\n"
" 0000000010000fd8 ---------------- ---------------- ................\n"
" 0000000010000fe8 ---------------- ---------------- ................\n"
" 0000000010000ff8 ---------------- 7f7e7d7c7b7a7978 ........xyz{|}~.\n"
" 0000000010001008 8786858483828180 8f8e8d8c8b8a8988 ................\n"
" 0000000010001018 9796959493929190 9f9e9d9c9b9a9998 ................\n"
" 0000000010001028 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................\n"
" 0000000010001038 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................\n"
" 0000000010001048 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................\n"
" 0000000010001058 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................\n"
" 0000000010001068 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................\n"
" 0000000010001078 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................\n";
R"( 0000000010000f80 ---------------- ---------------- ................
0000000010000f90 ---------------- ---------------- ................
0000000010000fa0 ---------------- ---------------- ................
0000000010000fb0 ---------------- ---------------- ................
0000000010000fc0 ---------------- ---------------- ................
0000000010000fd0 ---------------- ---------------- ................
0000000010000fe0 ---------------- ---------------- ................
0000000010000ff0 ---------------- ---------------- ................
0000000010001000 8786858483828180 8f8e8d8c8b8a8988 ................
0000000010001010 9796959493929190 9f9e9d9c9b9a9998 ................
0000000010001020 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8 ................
0000000010001030 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8 ................
0000000010001040 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8 ................
0000000010001050 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8 ................
0000000010001060 e7e6e5e4e3e2e1e0 efeeedecebeae9e8 ................
0000000010001070 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8 ................
)";
#else
" 10000f88 -------- -------- -------- -------- ................\n"
" 10000f98 -------- -------- -------- -------- ................\n"
" 10000fa8 -------- -------- -------- -------- ................\n"
" 10000fb8 -------- -------- -------- -------- ................\n"
" 10000fc8 -------- -------- -------- -------- ................\n"
" 10000fd8 -------- -------- -------- -------- ................\n"
" 10000fe8 -------- -------- -------- -------- ................\n"
" 10000ff8 -------- -------- 7b7a7978 7f7e7d7c ........xyz{|}~.\n"
" 10001008 83828180 87868584 8b8a8988 8f8e8d8c ................\n"
" 10001018 93929190 97969594 9b9a9998 9f9e9d9c ................\n"
" 10001028 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................\n"
" 10001038 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................\n"
" 10001048 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................\n"
" 10001058 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................\n"
" 10001068 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................\n"
" 10001078 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................\n";
R"( 10000f80 -------- -------- -------- -------- ................
10000f90 -------- -------- -------- -------- ................
10000fa0 -------- -------- -------- -------- ................
10000fb0 -------- -------- -------- -------- ................
10000fc0 -------- -------- -------- -------- ................
10000fd0 -------- -------- -------- -------- ................
10000fe0 -------- -------- -------- -------- ................
10000ff0 -------- -------- -------- -------- ................
10001000 83828180 87868584 8b8a8988 8f8e8d8c ................
10001010 93929190 97969594 9b9a9998 9f9e9d9c ................
10001020 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac ................
10001030 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc ................
10001040 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc ................
10001050 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc ................
10001060 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec ................
10001070 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc ................
)";
#endif
ASSERT_STREQ(expected_dump, tombstone_contents.c_str());

View File

@ -129,8 +129,9 @@ void _VLOG(log_t* log, enum logtype ltype, const char* fmt, va_list ap) {
#define MEMORY_BYTES_PER_LINE 16
void dump_memory(log_t* log, unwindstack::Memory* memory, uint64_t addr, const std::string& label) {
// Align the address to sizeof(long) and start 32 bytes before the address.
addr &= ~(sizeof(long) - 1);
// Align the address to the number of bytes per line to avoid confusing memory tag output if
// memory is tagged and we start from a misaligned address. Start 32 bytes before the address.
addr &= ~(MEMORY_BYTES_PER_LINE - 1);
if (addr >= 4128) {
addr -= 32;
}
@ -204,8 +205,13 @@ void dump_memory(log_t* log, unwindstack::Memory* memory, uint64_t addr, const s
size_t current = 0;
size_t total_bytes = start + bytes;
for (size_t line = 0; line < MEMORY_BYTES_TO_DUMP / MEMORY_BYTES_PER_LINE; line++) {
uint64_t tagged_addr = addr;
long tag = memory->ReadTag(addr);
if (tag >= 0) {
tagged_addr |= static_cast<uint64_t>(tag) << 56;
}
std::string logline;
android::base::StringAppendF(&logline, " %" PRIPTR, addr);
android::base::StringAppendF(&logline, " %" PRIPTR, tagged_addr);
addr += MEMORY_BYTES_PER_LINE;
std::string ascii;