AArch64: Add gdbserver MTE support
authorLuis Machado <luis.machado@linaro.org>
Mon, 15 Jun 2020 18:38:43 +0000 (15:38 -0300)
committerLuis Machado <luis.machado@linaro.org>
Wed, 24 Mar 2021 17:56:33 +0000 (14:56 -0300)
Adds the AArch64-specific memory tagging support (MTE) by implementing the
required hooks and checks for GDBserver.

gdbserver/ChangeLog:

2021-03-24  Luis Machado  <luis.machado@linaro.org>

* Makefile.in (SFILES): Add /../gdb/nat/aarch64-mte-linux-ptrace.c.
* configure.srv (aarch64*-*-linux*): Add arch/aarch64-mte-linux.o and
nat/aarch64-mte-linux-ptrace.o.
* linux-aarch64-low.cc: Include nat/aarch64-mte-linux-ptrace.h.
(class aarch64_target) <supports_memory_tagging>
<fetch_memtags, store_memtags>: New method overrides.
(aarch64_target::supports_memory_tagging)
(aarch64_target::fetch_memtags)
(aarch64_target::store_memtags): New methods.

gdbserver/ChangeLog
gdbserver/Makefile.in
gdbserver/configure.srv
gdbserver/linux-aarch64-low.cc

index d4b8d80d393489c31b9d6f0b812f51322dd3b867..edce56b0eb9d2c1cce33ca5ed659eb860a176184 100644 (file)
@@ -1,3 +1,15 @@
+2021-03-24  Luis Machado  <luis.machado@linaro.org>
+
+       * Makefile.in (SFILES): Add /../gdb/nat/aarch64-mte-linux-ptrace.c.
+       * configure.srv (aarch64*-*-linux*): Add arch/aarch64-mte-linux.o and
+       nat/aarch64-mte-linux-ptrace.o.
+       * linux-aarch64-low.cc: Include nat/aarch64-mte-linux-ptrace.h.
+       (class aarch64_target) <supports_memory_tagging>
+       <fetch_memtags, store_memtags>: New method overrides.
+       (aarch64_target::supports_memory_tagging)
+       (aarch64_target::fetch_memtags)
+       (aarch64_target::store_memtags): New methods.
+
 2021-03-24  Luis Machado  <luis.machado@linaro.org>
 
        * linux-aarch64-low.cc (aarch64_fill_mteregset): New function.
index 8e174da8dcf5550742df77a1c6088c9d058950ee..a05cd1a57ade5d32dcc01e20fca2bdfa3a58feb3 100644 (file)
@@ -229,6 +229,7 @@ SFILES = \
        $(srcdir)/../gdb/arch/arm-linux.c \
        $(srcdir)/../gdb/arch/ppc-linux-common.c \
        $(srcdir)/../gdb/arch/riscv.c \
+       $(srcdir)/../gdb/nat/aarch64-mte-linux-ptrace.c \
        $(srcdir)/../gdb/nat/aarch64-sve-linux-ptrace.c \
        $(srcdir)/../gdb/nat/linux-btrace.c \
        $(srcdir)/../gdb/nat/linux-namespaces.c \
index 833ad27c4c4d17e0346060a53cdbf935f892aa87..2dd8f75a4e064cc20bd4bbc0d12edd6d5ad45fe6 100644 (file)
@@ -52,7 +52,9 @@ case "${gdbserver_host}" in
                        srv_tgtobj="$srv_tgtobj nat/aarch64-linux.o"
                        srv_tgtobj="$srv_tgtobj arch/aarch64-insn.o"
                        srv_tgtobj="$srv_tgtobj arch/aarch64.o"
+                       srv_tgtobj="$srv_tgtobj arch/aarch64-mte-linux.o"
                        srv_tgtobj="$srv_tgtobj linux-aarch64-tdesc.o"
+                       srv_tgtobj="$srv_tgtobj nat/aarch64-mte-linux-ptrace.o"
                        srv_tgtobj="$srv_tgtobj nat/aarch64-sve-linux-ptrace.o"
                        srv_tgtobj="${srv_tgtobj} $srv_linux_obj"
                        srv_linux_regsets=yes
index a066d963a5f03e57d2d44cd49fe620fad297dcb0..daccfef746e3174b4e75eb7d725655e2aa824ed7 100644 (file)
@@ -43,6 +43,7 @@
 #include "arch/aarch64-mte-linux.h"
 #include "linux-aarch32-tdesc.h"
 #include "linux-aarch64-tdesc.h"
+#include "nat/aarch64-mte-linux-ptrace.h"
 #include "nat/aarch64-sve-linux-ptrace.h"
 #include "tdesc.h"
 
 #include <sys/reg.h>
 #endif
 
+#ifdef HAVE_GETAUXVAL
+#include <sys/auxv.h>
+#endif
+
 /* Linux target op definitions for the AArch64 architecture.  */
 
 class aarch64_target : public linux_process_target
@@ -82,6 +87,14 @@ public:
 
   struct emit_ops *emit_ops () override;
 
+  bool supports_memory_tagging () override;
+
+  bool fetch_memtags (CORE_ADDR address, size_t len,
+                     gdb::byte_vector &tags, int type) override;
+
+  bool store_memtags (CORE_ADDR address, size_t len,
+                     const gdb::byte_vector &tags, int type) override;
+
 protected:
 
   void low_arch_setup () override;
@@ -3223,6 +3236,54 @@ aarch64_target::breakpoint_kind_from_current_state (CORE_ADDR *pcptr)
     return arm_breakpoint_kind_from_current_state (pcptr);
 }
 
+/* Returns true if memory tagging is supported.  */
+bool
+aarch64_target::supports_memory_tagging ()
+{
+  if (current_thread == NULL)
+    {
+      /* We don't have any processes running, so don't attempt to
+        use linux_get_hwcap2 as it will try to fetch the current
+        thread id.  Instead, just fetch the auxv from the self
+        PID.  */
+#ifdef HAVE_GETAUXVAL
+      return (getauxval (AT_HWCAP2) & HWCAP2_MTE) != 0;
+#else
+      return true;
+#endif
+    }
+
+  return (linux_get_hwcap2 (8) & HWCAP2_MTE) != 0;
+}
+
+bool
+aarch64_target::fetch_memtags (CORE_ADDR address, size_t len,
+                              gdb::byte_vector &tags, int type)
+{
+  /* Allocation tags are per-process, so any tid is fine.  */
+  int tid = lwpid_of (current_thread);
+
+  /* Allocation tag?  */
+  if (type == static_cast <int> (aarch64_memtag_type::mte_allocation))
+    return aarch64_mte_fetch_memtags (tid, address, len, tags);
+
+  return false;
+}
+
+bool
+aarch64_target::store_memtags (CORE_ADDR address, size_t len,
+                              const gdb::byte_vector &tags, int type)
+{
+  /* Allocation tags are per-process, so any tid is fine.  */
+  int tid = lwpid_of (current_thread);
+
+  /* Allocation tag?  */
+  if (type == static_cast <int> (aarch64_memtag_type::mte_allocation))
+    return aarch64_mte_store_memtags (tid, address, len, tags);
+
+  return false;
+}
+
 /* The linux target ops object.  */
 
 linux_process_target *the_linux_target = &the_aarch64_target;