Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi via Gdb-patches <gdb-patches@sourceware.org>
To: Luis Machado <luis.machado@linaro.org>, gdb-patches@sourceware.org
Cc: david.spickett@linaro.org
Subject: Re: [PATCH v3 19/24] New mtag commands
Date: Sat, 26 Dec 2020 22:32:48 -0500	[thread overview]
Message-ID: <58d052da-d1da-9e92-c9aa-0a12303a8663@polymtl.ca> (raw)
In-Reply-To: <20201109170435.15766-20-luis.machado@linaro.org>



On 2020-11-09 12:04 p.m., Luis Machado via Gdb-patches wrote:
> Add new commands under the "mtag" prefix to allow users to inspect, modify and
> check memory tags in different ways.
> 
> The available subcommands are the following:
> 
> - mtag showltag <expression>: Shows the logical tag for a particular address.
> 
> - mtag withltag <expression> <tag>: Prints the address tagged with the logical
>   tag <tag>.
> 
> - mtag showatag <expression>: Shows the allocation tag for a particular address.
> 
> - mtag setatag <expression> <length> <tags>: Sets one or more allocation tags to
>   the specified tags.
> 
> - mtag check <expression>: Check if the logical tag in <address> matches its
>   allocation tag.

The only thing that bugs me here is the command names.  I'm sure we could bikeshed
for ever about this, but here are my comments:

 - I don't really like the "everything glued together" style, that makes it harder
   to read the name.  For instance, I don't like the existing "set remoteaddresssize"
   command, that's just ugly.  We usually separate words with dashes.
 - I don't really like the use of abbreviations (especially one-letter abbreviations)
   in commands, as it's not good for discoverability.  I would prefer if we used full
   names, for clarity, and if you really want a short version, add an alias.  My
   opinion is that with tab-completion, long (but clear) command names are not really
   an issue.

So:

 - mtag show-logical-tag
 - mtag with-logical-tag
 - mtag show-allocation-tag
 - mtag set-allocation-tag

And the "mtag" prefix... maybe "memory-tag", or "mem-tag" at least?  It's not obvious
that the "m" stands for "memory", 

> 
> These commands make use of the memory tagging gdbarch methods, and are still
> available, but disabled, when memory tagging is not supported by the
> architecture.
> 
> I've pondered about a way to make these commands invisible when memory tagging
> is not available, but given the check is at runtime (and support may come and go
> based on a process' configuration), that is a bit too late in the process to
> either not include the commands or get rid of them.

I think it's fine if the commands are always there, because it just says "this
architecture does not support memory tagging" if you try to use them with an
architecture that does not support memory tagging.

FYI, I get this when trying to build this patch:

  CXX    printcmd.o
cc1plus: warning: command-line option ‘-Wmissing-prototypes’ is valid for C/ObjC but not for C++
/home/simark/src/binutils-gdb/gdb/printcmd.c: In function ‘void parse_withltag_input(const char*, value**, gdb::byte_vector&, value_print_options*)’:
/home/simark/src/binutils-gdb/gdb/printcmd.c:2918:10: error: ‘hex2bin’ was not declared in this scope
 2918 |   tags = hex2bin (s_tag.c_str ());
      |          ^~~~~~~
/home/simark/src/binutils-gdb/gdb/printcmd.c: In function ‘void parse_setatag_input(const char*, value**, size_t*, gdb::byte_vector&)’:
/home/simark/src/binutils-gdb/gdb/printcmd.c:2997:10: error: ‘hex2bin’ was not declared in this scope
 2997 |   tags = hex2bin (s_tags.c_str ());
      |          ^~~~~~~


> 
> Ideas are welcome.
> 
> gdb/ChangeLog:
> 
> YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>
> 
> 	* printcmd.c: Include gdbsupport/rsp-low.h.
> 	(mtaglist): New static global.
> 	(process_print_command_args): Factored out of
> 	print_command_1.
> 	(print_command_1): Use process_print_command_args.
> 	(show_addr_not_tagged, show_memtag_unsupported, mtag_command)
> 	(mtag_showtag_command, mtag_showltag_command, mtag_showatag_command)
> 	(parse_withltag_input, mtag_withltag_command, parse_setatag_input)
> 	(mtag_setatag_command, mtag_check_command): New functions.
> 	(_initialize_printcmd): Add "mtag" prefix and subcommands.
> 
> gdbsupport/ChangeLog:
> 
> YYYY-MM-DD  Luis Machado  <luis.machado@linaro.org>
> 
> 	* rsp-low.cc (fromhex): Change error message text to not be
> 	RSP-specific.

Then, this function should probably be moved out of rsp-low.cc, perhaps
to common-utils.cc.

> ---
>  gdb/printcmd.c        | 359 ++++++++++++++++++++++++++++++++++++++++--
>  gdbsupport/rsp-low.cc |   2 +-
>  2 files changed, 348 insertions(+), 13 deletions(-)
> 
> diff --git a/gdb/printcmd.c b/gdb/printcmd.c
> index 28451612ab..6949678235 100644
> --- a/gdb/printcmd.c
> +++ b/gdb/printcmd.c
> @@ -53,6 +53,11 @@
>  #include "source.h"
>  #include "gdbsupport/byte-vector.h"
>  #include "gdbsupport/gdb_optional.h"
> +#include "gdbsupport/rsp-low.h"
> +
> +/* Chain containing all defined mtag subcommands.  */
> +
> +struct cmd_list_element *mtaglist;

static?

>  
>  /* Last specified output format.  */
>  
> @@ -1219,31 +1224,38 @@ print_value (value *val, const value_print_options &opts)
>    annotate_value_history_end ();
>  }
>  
> -/* Implementation of the "print" and "call" commands.  */
> +/* Helper for parsing arguments for print_command_1.  */
>  
> -static void
> -print_command_1 (const char *args, int voidprint)
> +static struct value *
> +process_print_command_args (const char *args, value_print_options *print_opts)
>  {
> -  struct value *val;
> -  value_print_options print_opts;
> -
> -  get_user_print_options (&print_opts);
> +  get_user_print_options (print_opts);
>    /* Override global settings with explicit options, if any.  */
> -  auto group = make_value_print_options_def_group (&print_opts);
> +  auto group = make_value_print_options_def_group (print_opts);
>    gdb::option::process_options
>      (&args, gdb::option::PROCESS_OPTIONS_REQUIRE_DELIMITER, group);
>  
> -  print_command_parse_format (&args, "print", &print_opts);
> +  print_command_parse_format (&args, "print", print_opts);
>  
>    const char *exp = args;
>  
>    if (exp != nullptr && *exp)
>      {
>        expression_up expr = parse_expression (exp);
> -      val = evaluate_expression (expr.get ());
> +      return evaluate_expression (expr.get ());
>      }
> -  else
> -    val = access_value_history (0);
> +
> +  return access_value_history (0);
> +}
> +
> +/* Implementation of the "print" and "call" commands.  */
> +
> +static void
> +print_command_1 (const char *args, int voidprint)
> +{
> +  value_print_options print_opts;
> +
> +  struct value *val = process_print_command_args (args, &print_opts);
>  
>    if (voidprint || (val && value_type (val) &&
>  		    value_type (val)->code () != TYPE_CODE_VOID))
> @@ -2711,6 +2723,273 @@ eval_command (const char *arg, int from_tty)
>    execute_command (expanded.c_str (), from_tty);
>  }
>  
> +/* Convenience function for error checking in mtag commands.  */
> +
> +static void
> +show_addr_not_tagged (CORE_ADDR address)
> +{
> +  error (_("Address %s not in a region mapped with a memory tagging flag."),
> +	 paddress (target_gdbarch (), address));
> +}
> +
> +/* Convenience function for error checking in mtag commands.  */
> +
> +static void
> +show_memtag_unsupported (void)
> +{
> +  error (_("Memory tagging not supported or disabled by the current"
> +	   " architecture."));
> +}
> +
> +/* Implement the "mtag" prefix command.  */
> +
> +static void
> +mtag_command (const char *arg, int from_tty)
> +{
> +  help_list (mtaglist, "mtag ", all_commands, gdb_stdout);
> +}
> +
> +/* Helper for showltag and showatag.  */
> +
> +static void
> +mtag_showtag_command (const char *args, enum memtag_type tag_type)
> +{
> +  if (args == nullptr)
> +    error_no_arg (_("address or pointer"));
> +
> +  /* Parse args into a value.  If the value is a pointer or an address,
> +     then fetch the logical or allocation tag.  */
> +  value_print_options print_opts;
> +
> +  struct value *val = process_print_command_args (args, &print_opts);
> +
> +  /* If the address is not in a region memory mapped with a memory tagging
> +     flag, it is no use trying to access/manipulate its allocation tag.
> +
> +     It is OK to manipulate the logical tag though.  */
> +  if (tag_type == tag_allocation
> +      && !gdbarch_tagged_address_p (target_gdbarch (), val))
> +    show_addr_not_tagged (value_as_address (val));
> +
> +  std::string tag = gdbarch_memtag_to_string (target_gdbarch (),
> +					      val, tag_type);
> +  if (tag.empty ())
> +    printf_filtered (_("%s tag unavailable.\n"),
> +		     tag_type == tag_logical? "Logical" : "Allocation");
> +
> +  struct value *v_tag = process_print_command_args (tag.c_str (),
> +						    &print_opts);
> +  print_opts.output_format = 'x';
> +  print_value (v_tag, print_opts);

When I read the patch description, I almost mentioned that it might make
sense to name the commands "print-xyz" instead of "show-xyz".  "print" is
used to print values, while "show" is used to show parameter values.  The
new commands are more print-like IMO.  And the fact that they share print's
syntax, I think it would make even more sense.

To be clear, I'm proposing that we name the sub-commands "print-logical-tag"
and "print-allocation-tag".

> +}
> +
> +/* Implement the "mtag showltag" command.  */
> +
> +static void
> +mtag_showltag_command (const char *args, int from_tty)
> +{
> +  if (!memtag || !target_supports_memory_tagging ())
> +    show_memtag_unsupported ();
> +
> +  mtag_showtag_command (args, tag_logical);
> +}
> +
> +/* Implement the "mtag showatag" command.  */
> +
> +static void
> +mtag_showatag_command (const char *args, int from_tty)
> +{
> +  if (!memtag || !target_supports_memory_tagging ())
> +    show_memtag_unsupported ();
> +
> +  mtag_showtag_command (args, tag_allocation);
> +}
> +
> +/* Parse ARGS and extract ADDR and TAG.
> +   ARGS should have format <expression> <tag bytes>.  */
> +
> +static void
> +parse_withltag_input (const char *args, struct value **val,
> +		      gdb::byte_vector &tags, value_print_options *print_opts)
> +{
> +  /* Given <expression> can be reasonably complex, we parse things backwards
> +     so we can isolate the <tag bytes> portion.  */

This comment doesn't seem to agree with the implementation, or I'm missing
something.  I don't see any things being parsed backwards.

> +
> +  /* Fetch the address.  */
> +  std::string s_address = extract_string_maybe_quoted (&args);
> +
> +  /* Parse the address into a value.  */
> +  *val = process_print_command_args (s_address.c_str (), print_opts);
> +
> +  /* Fetch the tag bytes.  */
> +  std::string s_tag = extract_string_maybe_quoted (&args);
> +
> +  /* Validate the input.  */
> +  if (s_address.empty () || s_tag.empty ())
> +    error (_("Missing arguments."));
> +
> +  if (s_tag.length () % 2)
> +    error (_("Error parsing tags argument. The tag should be 2 digits."));

I think the error message is a bit confusing.  At least, it doesn't match the
check.  Should it be "the tag(s) should be an even number of digits"?

> +
> +  tags = hex2bin (s_tag.c_str ());
> +}
> +
> +/* Implement the "mtag withltag" command.  */
> +
> +static void
> +mtag_withltag_command (const char *args, int from_tty)
> +{
> +  if (!memtag || !target_supports_memory_tagging ())
> +    show_memtag_unsupported ();
> +
> +  if (args == nullptr)
> +    error_no_arg (_("<address> <tag>"));
> +
> +  gdb::byte_vector tags;
> +  struct value *val;
> +  value_print_options print_opts;
> +
> +  /* Parse the input.  */
> +  parse_withltag_input (args, &val, tags, &print_opts);
> +
> +  /* Setting the logical tag is just a local operation that does not touch
> +     any memory from the target.  Given an input value, we modify the value
> +     to include the appropriate tag.
> +
> +     For this reason we need to cast the argument value to a
> +     (void *) pointer.  This is so we have the right the for the gdbarch

This sentence looks broken.

> +     hook to manipulate the value and insert the tag.
> +
> +     Otherwise, this would fail if, for example, GDB parsed the argument value
> +     into an int-sized value and the pointer value has a type of greater
> +     length.  */
> +
> +  /* Cast to (void *).  */
> +  val = value_cast (builtin_type (target_gdbarch ())->builtin_data_ptr,
> +		    val);
> +
> +  if (gdbarch_set_memtags (target_gdbarch (), val, 0, tags,
> +			   tag_logical) != 0)
> +    printf_filtered (_("Could not update the logical tag data.\n"));
> +  else
> +    {
> +      /* Always print it in hex format.  */
> +      print_opts.output_format = 'x';
> +      print_value (val, print_opts);
> +    }
> +}
> +
> +/* Parse ARGS and extract ADDR, LENGTH and TAGS.  */
> +
> +static void
> +parse_setatag_input (const char *args, struct value **val, size_t *length,
> +		     gdb::byte_vector &tags)
> +{
> +  /* Fetch the address.  */
> +  std::string s_address = extract_string_maybe_quoted (&args);
> +
> +  /* Parse the address into a value.  */
> +  value_print_options print_opts;
> +  *val = process_print_command_args (s_address.c_str (), &print_opts);
> +
> +  /* Fetch the length.  */
> +  std::string s_length = extract_string_maybe_quoted (&args);
> +
> +  /* Fetch the tag bytes.  */
> +  std::string s_tags = extract_string_maybe_quoted (&args);
> +
> +  /* Validate the input.  */
> +  if (s_address.empty () || s_length.empty () || s_tags.empty ())
> +    error (_("Missing arguments."));
> +
> +  errno = 0;
> +  *length = strtoulst (s_length.c_str (), NULL, 10);
> +  if (errno != 0)
> +    error (_("Error parsing length argument."));
> +
> +  if (s_tags.length () % 2)
> +    error (_("Error parsing tags argument. Tags should be 2 digits per byte."));
> +
> +  tags = hex2bin (s_tags.c_str ());
> +
> +  /* If the address is not in a region memory mapped with a memory tagging
> +     flag, it is no use trying to access/manipulate its allocation tag.  */
> +  if (!gdbarch_tagged_address_p (target_gdbarch (), *val))
> +    show_addr_not_tagged (value_as_address (*val));
> +}
> +
> +/* Implement the "mtag setatag" command.
> +   ARGS should be in the format <address> <length> <tags>.  */
> +
> +static void
> +mtag_setatag_command (const char *args, int from_tty)
> +{
> +  if (!memtag || !target_supports_memory_tagging ())
> +    show_memtag_unsupported ();
> +
> +  if (args == nullptr)
> +    error_no_arg (_("<starting address> <length> <tag bytes>"));
> +
> +  gdb::byte_vector tags;
> +  size_t length = 0;
> +  struct value *val;
> +
> +  /* Parse the input.  */
> +  parse_setatag_input (args, &val, &length, tags);
> +
> +  if (gdbarch_set_memtags (target_gdbarch (), val, length, tags,
> +			   tag_allocation) != 0)
> +    printf_filtered (_("Could not update the allocation tag(s).\n"));
> +  else
> +    printf_filtered (_("Allocation tag(s) updated successfully.\n"));
> +}
> +
> +/* Implement the "mtag check" command.  */
> +
> +static void
> +mtag_check_command (const char *args, int from_tty)
> +{
> +  if (!memtag || !target_supports_memory_tagging ())
> +    show_memtag_unsupported ();
> +
> +  if (args == nullptr)
> +    error (_("Argument required (address or pointer)"));
> +
> +  /* Parse the expression into a value.  If the value is an address or
> +     pointer, then check its logical tag against the allocation tag.  */
> +  value_print_options print_opts;
> +
> +  struct value *val = process_print_command_args (args, &print_opts);
> +
> +  /* If the address is not in a region memory mapped with a memory tagging
> +     flag, it is no use trying to access/manipulate its allocation tag.  */
> +  if (!gdbarch_tagged_address_p (target_gdbarch (), val))
> +    show_addr_not_tagged (value_as_address (val));
> +
> +  CORE_ADDR addr = value_as_address (val);
> +
> +  /* If memory tagging validation is on, check if the tag is valid.  */

This comment doesn't seem in-line with the implementation, there is no
check here whether the mem tag validation is on or off.

Simon

  reply	other threads:[~2020-12-27  3:33 UTC|newest]

Thread overview: 96+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-09 17:04 [PATCH v3 00/24] Memory Tagging Support + AArch64 Linux implementation Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 01/24] New target methods for memory tagging support Luis Machado via Gdb-patches
2020-12-25  4:26   ` Simon Marchi via Gdb-patches
2020-12-28 15:05     ` Luis Machado via Gdb-patches
2020-12-25  5:08   ` Simon Marchi via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 02/24] New gdbarch memory tagging hooks Luis Machado via Gdb-patches
2020-12-25  4:40   ` Simon Marchi via Gdb-patches
2020-12-28 15:44     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 03/24] Add GDB-side remote target support for memory tagging Luis Machado via Gdb-patches
2020-12-25  5:08   ` Simon Marchi via Gdb-patches
2020-12-28 16:28     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 04/24] Unit testing for GDB-side remote memory tagging handling Luis Machado via Gdb-patches
2020-12-25  5:34   ` Simon Marchi via Gdb-patches
2020-12-28 17:17     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 05/24] GDBserver remote packet support for memory tagging Luis Machado via Gdb-patches
2020-12-25  5:50   ` Simon Marchi via Gdb-patches
2020-12-28 17:46     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 06/24] Unit tests for gdbserver memory tagging remote packets Luis Machado via Gdb-patches
2020-12-25 20:13   ` Simon Marchi via Gdb-patches
2020-12-28 18:12     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 07/24] Documentation for " Luis Machado via Gdb-patches
2020-11-09 17:08   ` Eli Zaretskii via Gdb-patches
2020-11-16 15:44     ` David Spickett via Gdb-patches
2020-11-16 16:04       ` David Spickett via Gdb-patches
2020-11-16 17:22         ` Luis Machado via Gdb-patches
2020-11-17 10:05           ` David Spickett via Gdb-patches
2020-11-17 12:01             ` Luis Machado via Gdb-patches
2020-11-17 12:29               ` David Spickett via Gdb-patches
2020-11-17 14:44                 ` Luis Machado via Gdb-patches
2020-11-17 15:16                   ` David Spickett via Gdb-patches
2020-11-17 17:29                     ` Luis Machado via Gdb-patches
2020-11-18 10:39                       ` David Spickett via Gdb-patches
2020-11-18 10:56                         ` Luis Machado via Gdb-patches
2020-11-18 11:22                           ` David Spickett via Gdb-patches
2020-11-16 16:49       ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 08/24] AArch64: Add MTE CPU feature check support Luis Machado via Gdb-patches
2020-12-26  0:04   ` Simon Marchi via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 09/24] AArch64: Add target description/feature for MTE registers Luis Machado via Gdb-patches
2020-12-26  0:10   ` Simon Marchi via Gdb-patches
2020-12-28 18:28     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 10/24] AArch64: Add MTE register set support for GDB and gdbserver Luis Machado via Gdb-patches
2020-12-26  0:17   ` Simon Marchi via Gdb-patches
2020-12-28 18:41     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 11/24] AArch64: Add MTE ptrace requests Luis Machado via Gdb-patches
2020-12-26  0:19   ` Simon Marchi via Gdb-patches
2020-12-28 19:12     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 12/24] AArch64: Implement memory tagging target methods for AArch64 Luis Machado via Gdb-patches
2020-12-26  0:33   ` Simon Marchi via Gdb-patches
2020-12-28 19:50     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 13/24] Refactor parsing of /proc/<pid>/smaps Luis Machado via Gdb-patches
2020-12-26  6:36   ` Simon Marchi via Gdb-patches
2020-12-29 10:57     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 14/24] AArch64: Implement the memory tagging gdbarch hooks Luis Machado via Gdb-patches
2020-12-26  6:52   ` Simon Marchi via Gdb-patches
2020-12-29 12:16     ` Luis Machado via Gdb-patches
2021-01-18 16:29       ` Simon Marchi via Gdb-patches
2021-01-20 20:01         ` Tom Tromey
2020-11-09 17:04 ` [PATCH v3 15/24] AArch64: Add unit testing for logical tag set/get operations Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 16/24] AArch64: Report tag violation error information Luis Machado via Gdb-patches
2020-11-16 15:43   ` David Spickett via Gdb-patches
2020-11-16 16:45     ` Luis Machado via Gdb-patches
2020-11-17  9:36       ` David Spickett via Gdb-patches
2020-12-26 22:23   ` Simon Marchi via Gdb-patches
2020-12-30  0:50     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 17/24] AArch64: Add gdbserver MTE support Luis Machado via Gdb-patches
2020-12-26 22:30   ` Simon Marchi via Gdb-patches
2020-12-29 14:32     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 18/24] AArch64: Add MTE register set support for core files Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 19/24] New mtag commands Luis Machado via Gdb-patches
2020-12-27  3:32   ` Simon Marchi via Gdb-patches [this message]
2020-12-29 17:21     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 20/24] Documentation for the new " Luis Machado via Gdb-patches
2020-11-09 17:11   ` Eli Zaretskii via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 21/24] Extend "x" and "print" commands to support memory tagging Luis Machado via Gdb-patches
2020-11-09 17:14   ` Eli Zaretskii via Gdb-patches
2020-11-09 17:20     ` Luis Machado via Gdb-patches
2020-12-27  4:18   ` Simon Marchi via Gdb-patches
2020-12-29 18:50     ` Luis Machado via Gdb-patches
2021-01-18 17:56       ` Simon Marchi via Gdb-patches
2021-01-18 20:20         ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 22/24] Document new "x" and "print" memory tagging extensions Luis Machado via Gdb-patches
2020-11-09 17:16   ` Eli Zaretskii via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 23/24] Add NEWS entry Luis Machado via Gdb-patches
2020-11-09 17:19   ` Eli Zaretskii via Gdb-patches
2020-11-09 17:22     ` Luis Machado via Gdb-patches
2020-11-09 17:04 ` [PATCH v3 24/24] Add memory tagging testcases Luis Machado via Gdb-patches
2020-11-16 15:47   ` David Spickett via Gdb-patches
2020-11-16 16:51     ` Luis Machado via Gdb-patches
2020-12-27  4:36   ` Simon Marchi via Gdb-patches
2020-12-29 19:32     ` Luis Machado via Gdb-patches
2020-11-16 13:48 ` [PATCH v3 00/24] Memory Tagging Support + AArch64 Linux implementation Luis Machado via Gdb-patches
2020-11-16 14:37   ` Alan Hayward via Gdb-patches
2020-11-23 16:08   ` Luis Machado via Gdb-patches
2020-11-30 13:38     ` Luis Machado via Gdb-patches
2020-12-07 13:17       ` Luis Machado via Gdb-patches
2020-12-07 14:17         ` Alan Hayward via Gdb-patches

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=58d052da-d1da-9e92-c9aa-0a12303a8663@polymtl.ca \
    --to=gdb-patches@sourceware.org \
    --cc=david.spickett@linaro.org \
    --cc=luis.machado@linaro.org \
    --cc=simon.marchi@polymtl.ca \
    /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