public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: Luis Machado <luis.machado@linaro.org>
To: gdb-patches@sourceware.org
Subject: [PATCH v6 17/25] AArch64: Report tag violation error information
Date: Mon, 22 Mar 2021 10:21:11 -0300	[thread overview]
Message-ID: <20210322132120.1202230-18-luis.machado@linaro.org> (raw)
In-Reply-To: <20210322132120.1202230-1-luis.machado@linaro.org>

Updates on v6:

- Output logical tag when reporting a tag fault.

Updates on v4:

- Print exception error.
- Update function names.

--

Whenever a memory tag violation occurs, we get a SIGSEGV. Additional
information can be obtained through the siginfo data structure.

For AArch64 the Linux kernel may expose the fault address and tag
information, if we have a synchronous event. Otherwise there is
no fault address available.

The synchronous event looks like this:

--
(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault
Memory tag violation while accessing address 0x0500fffff7ff8000
Allocation tag 0x1.
Logical tag 0x5
--

The asynchronous event looks like this:

--
(gdb) continue
Continuing.

Program received signal SIGSEGV, Segmentation fault
Memory tag violation
Fault address unavailable.
--

gdb/ChangeLog:

YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>

	* aarch64-linux-tdep.c
	(aarch64_linux_report_signal_info): New function.
	(aarch64_linux_init_abi): Register
	aarch64_linux_report_signal_info as the report_signal_info hook.
	* arch/aarch64-linux.h (SEGV_MTEAERR): Define.
	(SEGV_MTESERR): Define.
---
 gdb/aarch64-linux-tdep.c     | 70 ++++++++++++++++++++++++++++++++++++
 gdb/arch/aarch64-mte-linux.h |  6 ++++
 2 files changed, 76 insertions(+)

diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
index 9434f90e8f6..55f49e555a1 100644
--- a/gdb/aarch64-linux-tdep.c
+++ b/gdb/aarch64-linux-tdep.c
@@ -1687,6 +1687,73 @@ aarch64_linux_memtag_to_string (struct gdbarch *gdbarch, struct value *tag_value
   return string_printf ("0x%s", phex_nz (tag, sizeof (tag)));
 }
 
+/* AArch64 Linux implementation of the report_signal_info gdbarch
+   hook.  Displays information about possible memory tag violations.  */
+
+static void
+aarch64_linux_report_signal_info (struct gdbarch *gdbarch,
+				  struct ui_out *uiout,
+				  enum gdb_signal siggnal)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  if (!tdep->has_mte () || siggnal != GDB_SIGNAL_SEGV)
+    return;
+
+  CORE_ADDR fault_addr = 0;
+  long si_code = 0;
+
+  try
+    {
+      /* Sigcode tells us if the segfault is actually a memory tag
+	 violation.  */
+      si_code = parse_and_eval_long ("$_siginfo.si_code");
+
+      fault_addr
+	= parse_and_eval_long ("$_siginfo._sifields._sigfault.si_addr");
+    }
+  catch (const gdb_exception_error &exception)
+    {
+      exception_print (gdb_stderr, exception);
+      return;
+    }
+
+  /* If this is not a memory tag violation, just return.  */
+  if (si_code != SEGV_MTEAERR && si_code != SEGV_MTESERR)
+    return;
+
+  uiout->text ("\n");
+
+  uiout->field_string ("sigcode-meaning", _("Memory tag violation"));
+
+  /* For synchronous faults, show additional information.  */
+  if (si_code == SEGV_MTESERR)
+    {
+      uiout->text (_(" while accessing address "));
+      uiout->field_core_addr ("fault-addr", gdbarch, fault_addr);
+      uiout->text ("\n");
+
+      gdb::optional<CORE_ADDR> atag = aarch64_mte_get_atag (fault_addr);
+      gdb_byte ltag = aarch64_mte_get_ltag (fault_addr);
+
+      if (!atag.has_value ())
+	uiout->text (_("Allocation tag unavailable"));
+      else
+	{
+	  uiout->text (_("Allocation tag "));
+	  uiout->field_string ("allocation-tag", hex_string (*atag));
+	  uiout->text ("\n");
+	  uiout->text (_("Logical tag "));
+	  uiout->field_string ("logical-tag", hex_string (ltag));
+	}
+    }
+  else
+    {
+      uiout->text ("\n");
+      uiout->text (_("Fault address unavailable"));
+    }
+}
+
 static void
 aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -1767,6 +1834,9 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 
       /* Register a hook for converting a memory tag to a string.  */
       set_gdbarch_memtag_to_string (gdbarch, aarch64_linux_memtag_to_string);
+
+      set_gdbarch_report_signal_info (gdbarch,
+				      aarch64_linux_report_signal_info);
     }
 
   /* Initialize the aarch64_linux_record_tdep.  */
diff --git a/gdb/arch/aarch64-mte-linux.h b/gdb/arch/aarch64-mte-linux.h
index f517638831c..2aa97eb861a 100644
--- a/gdb/arch/aarch64-mte-linux.h
+++ b/gdb/arch/aarch64-mte-linux.h
@@ -35,6 +35,12 @@
 #define AARCH64_MTE_LOGICAL_TAG_START_BIT 56
 #define AARCH64_MTE_LOGICAL_MAX_VALUE 0xf
 
+/* Memory tagging definitions.  */
+#ifndef SEGV_MTEAERR
+# define SEGV_MTEAERR 8
+# define SEGV_MTESERR 9
+#endif
+
 /* Memory tag types for AArch64.  */
 enum class aarch64_memtag_type
 {
-- 
2.25.1


  parent reply	other threads:[~2021-03-22 13:21 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-22 13:20 [PATCH v6 00/25] Memory Tagging Support + AArch64 Linux implementation Luis Machado
2021-03-22 13:20 ` [PATCH v6 01/25] New target methods for memory tagging support Luis Machado
2021-03-23 21:22   ` Simon Marchi
2021-03-22 13:20 ` [PATCH v6 02/25] New gdbarch memory tagging hooks Luis Machado
2021-03-22 13:20 ` [PATCH v6 03/25] Add GDB-side remote target support for memory tagging Luis Machado
2021-03-22 13:20 ` [PATCH v6 04/25] Unit testing for GDB-side remote memory tagging handling Luis Machado
2021-03-22 13:20 ` [PATCH v6 05/25] GDBserver remote packet support for memory tagging Luis Machado
2021-03-22 13:21 ` [PATCH v6 06/25] Unit tests for gdbserver memory tagging remote packets Luis Machado
2021-03-22 13:21 ` [PATCH v6 07/25] Documentation for " Luis Machado
2021-03-22 17:47   ` Eli Zaretskii
2021-03-22 13:21 ` [PATCH v6 08/25] AArch64: Add MTE CPU feature check support Luis Machado
2021-03-22 13:21 ` [PATCH v6 09/25] AArch64: Add target description/feature for MTE registers Luis Machado
2021-03-22 13:21 ` [PATCH v6 10/25] AArch64: Add MTE register set support for GDB and gdbserver Luis Machado
2021-03-22 13:21 ` [PATCH v6 11/25] AArch64: Add MTE ptrace requests Luis Machado
2021-03-22 13:21 ` [PATCH v6 12/25] AArch64: Implement memory tagging target methods for AArch64 Luis Machado
2021-03-22 13:21 ` [PATCH v6 13/25] Convert char array to std::string in linux_find_memory_regions_full Luis Machado
2021-03-22 13:21 ` [PATCH v6 14/25] Refactor parsing of /proc/<pid>/smaps Luis Machado
2021-03-23 21:28   ` Simon Marchi
2021-03-22 13:21 ` [PATCH v6 15/25] AArch64: Implement the memory tagging gdbarch hooks Luis Machado
2021-03-23 21:32   ` Simon Marchi
2021-03-22 13:21 ` [PATCH v6 16/25] AArch64: Add unit testing for logical tag set/get operations Luis Machado
2022-01-31 14:34   ` Simon Marchi
2021-03-22 13:21 ` Luis Machado [this message]
2021-03-22 13:21 ` [PATCH v6 18/25] AArch64: Add gdbserver MTE support Luis Machado
2021-03-22 13:21 ` [PATCH v6 19/25] AArch64: Add MTE register set support for core files Luis Machado
2021-03-22 13:21 ` [PATCH v6 20/25] New memory-tag commands Luis Machado
2021-03-22 13:21 ` [PATCH v6 21/25] Documentation for the new mtag commands Luis Machado
2021-03-22 17:49   ` Eli Zaretskii
2021-03-22 13:21 ` [PATCH v6 22/25] Extend "x" and "print" commands to support memory tagging Luis Machado
2021-03-22 13:21 ` [PATCH v6 23/25] Document new "x" and "print" memory tagging extensions Luis Machado
2021-03-22 17:51   ` Eli Zaretskii
2021-03-22 13:21 ` [PATCH v6 24/25] Add NEWS entry Luis Machado
2021-03-22 17:51   ` Eli Zaretskii
2021-03-22 17:52     ` Luis Machado
2021-03-22 13:21 ` [PATCH v6 25/25] Add memory tagging testcases Luis Machado
2021-03-23 22:50 ` [PATCH v6 00/25] Memory Tagging Support + AArch64 Linux implementation Simon Marchi
2021-03-24 18:18   ` Luis Machado

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210322132120.1202230-18-luis.machado@linaro.org \
    --to=luis.machado@linaro.org \
    --cc=gdb-patches@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).