[lldb][AArch64] Add support for memory tags in core files
authorDavid Spickett <david.spickett@linaro.org>
Mon, 11 Jul 2022 12:26:55 +0000 (13:26 +0100)
committerDavid Spickett <david.spickett@linaro.org>
Tue, 26 Jul 2022 07:46:36 +0000 (08:46 +0100)
commit2f9fa9ef5387de3d87b0c866c678d93695c1c1f3
tree4890ade4d90ace163f613d285cb67b4d3c51c243
parent4075a811ad99b7e263b8b99954cef8c96b042e22
[lldb][AArch64] Add support for memory tags in core files

This teaches ProcessElfCore to recognise the MTE tag segments.

https://www.kernel.org/doc/html/latest/arm64/memory-tagging-extension.html#core-dump-support

These segments contain all the tags for a matching memory segment
which will have the same size in virtual address terms. In real terms
it's 2 tags per byte so the data in the segment is much smaller.

Since MTE is the only tag type supported I have hardcoded some
things to those values. We could and should support more formats
as they appear but doing so now would leave code untested until that
happens.

A few things to note:
* /proc/pid/smaps is not in the core file, only the details you have
  in "maps". Meaning we mark a region tagged only if it has a tag segment.
* A core file supports memory tagging if it has at least 1 memory
  tag segment, there is no other flag we can check to tell if memory
  tagging was enabled. (unlike a live process that can support memory
  tagging even if there are currently no tagged memory regions)

Tests have been added at the commands level for a core file with
mte and without.

There is a lot of overlap between the "memory tag read" tests here and the unit tests for
MemoryTagManagerAArch64MTE::UnpackTagsFromCoreFileSegment, but I think it's
worth keeping to check ProcessElfCore doesn't cause an assert.

Depends on D129487

Reviewed By: omjavaid

Differential Revision: https://reviews.llvm.org/D129489
lldb/include/lldb/Target/Process.h
lldb/source/Plugins/Process/elf-core/ProcessElfCore.cpp
lldb/source/Plugins/Process/elf-core/ProcessElfCore.h
lldb/test/API/linux/aarch64/mte_core_file/TestAArch64LinuxMTEMemoryTagCoreFile.py [new file with mode: 0644]
lldb/test/API/linux/aarch64/mte_core_file/core.mte [new file with mode: 0644]
lldb/test/API/linux/aarch64/mte_core_file/core.nomte [new file with mode: 0644]
lldb/test/API/linux/aarch64/mte_core_file/main.c [new file with mode: 0644]
llvm/docs/ReleaseNotes.rst
llvm/include/llvm/BinaryFormat/ELF.h