[PATCH v3 00/24] Memory Tagging Support + AArch64 Linux implementation

Luis Machado via Gdb-patches
2020-11-09T17:05:00Z

Here's v3 of this patch series.

Memory tagging improves memory safety by tagging various parts of memory and
raising exceptions when the allocation tag (the one associated with a range of
memory addresses) does not match the logical tag contained in a pointer that is
used to access the memory area.

We already have an implementation of such a mechanism for sparc64 (ADI), but
it is target-specific and not exposed to the rest of GDB. This series aims to
make the infrastructure available to other targets that may wish to support
their specific memory tagging approaches. For AArch64 Linux this is called
MTE (Memory Tagging Extensions).

The series is split into a set that deals with generic changes to GDB's
infrastructure (target methods, gdbarch hooks and remote packets), a set that
implements support for AArch64 Linux and one last set that implements new
commands, updates the documentation and adds tests.

The goal is to make it so the architecture independent parts of GDB don't
need to interpret tag formats, given the formats are likely different
for each architecture. For this reason, GDB will handle tags as a sequence of
bytes and will not assume a particular format.

The architecture-specific code can handle the sequence of bytes appropriately.

Luis Machado (24):
New target methods for memory tagging support
New gdbarch memory tagging hooks
Add GDB-side remote target support for memory tagging
Unit testing for GDB-side remote memory tagging handling
GDBserver remote packet support for memory tagging
Unit tests for gdbserver memory tagging remote packets
Documentation for memory tagging remote packets
AArch64: Add MTE CPU feature check support
AArch64: Add target description/feature for MTE registers
AArch64: Add MTE register set support for GDB and gdbserver
AArch64: Add MTE ptrace requests
AArch64: Implement memory tagging target methods for AArch64
Refactor parsing of /proc/<pid>/smaps
AArch64: Implement the memory tagging gdbarch hooks
AArch64: Add unit testing for logical tag set/get operations
AArch64: Report tag violation error information
AArch64: Add gdbserver MTE support
AArch64: Add MTE register set support for core files
New mtag commands
Documentation for the new mtag commands
Extend "x" and "print" commands to support memory tagging
Document new "x" and "print" memory tagging extensions
Add NEWS entry.
Add memory tagging testcases

gdb/Makefile.in | 3 +
gdb/NEWS | 32 ++
gdb/aarch64-linux-nat.c | 129 ++++++-
gdb/aarch64-linux-tdep.c | 334 +++++++++++++++++-
gdb/aarch64-linux-tdep.h | 3 +
gdb/aarch64-tdep.c | 40 ++-
gdb/aarch64-tdep.h | 12 +-
gdb/arch-utils.c | 50 +++
gdb/arch-utils.h | 23 ++
gdb/arch/aarch64-mte-linux.c | 70 ++++
gdb/arch/aarch64-mte-linux.h | 66 ++++
gdb/arch/aarch64.c | 7 +-
gdb/arch/aarch64.h | 7 +-
gdb/configure.nat | 3 +-
gdb/configure.tgt | 1 +
gdb/doc/gdb.texinfo | 215 +++++++++++-
gdb/features/Makefile | 1 +
gdb/features/aarch64-mte.c | 14 +
gdb/features/aarch64-mte.xml | 11 +
gdb/gdbarch.c | 137 ++++++++
gdb/gdbarch.h | 53 +++
gdb/gdbarch.sh | 36 ++
gdb/linux-tdep.c | 358 ++++++++++++-------
gdb/linux-tdep.h | 4 +
gdb/nat/aarch64-mte-linux-ptrace.c | 200 +++++++++++
gdb/nat/aarch64-mte-linux-ptrace.h | 50 +++
gdb/printcmd.c | 468 ++++++++++++++++++++++++-
gdb/remote.c | 232 ++++++++++++
gdb/target-delegates.c | 84 +++++
gdb/target.h | 37 ++
gdb/testsuite/gdb.arch/aarch64-mte.c | 107 ++++++
gdb/testsuite/gdb.arch/aarch64-mte.exp | 371 ++++++++++++++++++++
gdb/testsuite/gdb.base/memtag.c | 22 ++
gdb/testsuite/gdb.base/memtag.exp | 64 ++++
gdb/testsuite/lib/gdb.exp | 16 +
gdb/valprint.h | 1 +
gdbserver/Makefile.in | 1 +
gdbserver/configure.srv | 2 +
gdbserver/linux-aarch64-ipa.cc | 8 +-
gdbserver/linux-aarch64-low.cc | 97 ++++-
gdbserver/linux-aarch64-tdesc.cc | 10 +-
gdbserver/linux-aarch64-tdesc.h | 3 +-
gdbserver/remote-utils.cc | 43 ++-
gdbserver/remote-utils.h | 7 +-
gdbserver/server.cc | 245 +++++++++++++
gdbserver/server.h | 3 +
gdbserver/target.cc | 20 ++
gdbserver/target.h | 17 +
gdbsupport/rsp-low.cc | 2 +-
include/elf/common.h | 3 +
50 files changed, 3536 insertions(+), 186 deletions(-)
create mode 100644 gdb/arch/aarch64-mte-linux.c
create mode 100644 gdb/arch/aarch64-mte-linux.h
create mode 100644 gdb/features/aarch64-mte.c
create mode 100644 gdb/features/aarch64-mte.xml
create mode 100644 gdb/nat/aarch64-mte-linux-ptrace.c
create mode 100644 gdb/nat/aarch64-mte-linux-ptrace.h
create mode 100644 gdb/testsuite/gdb.arch/aarch64-mte.c
create mode 100644 gdb/testsuite/gdb.arch/aarch64-mte.exp
create mode 100644 gdb/testsuite/gdb.base/memtag.c
create mode 100644 gdb/testsuite/gdb.base/memtag.exp

--
2.17.1