public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
From: "Willgerodt, Felix" <felix.willgerodt@intel.com>
To: Andrew Burgess <aburgess@redhat.com>,
	"gdb-patches@sourceware.org" <gdb-patches@sourceware.org>
Cc: John Baldwin <jhb@FreeBSD.org>
Subject: RE: [PATCHv5 11/11] gdb/gdbserver: share x86/linux tdesc caching
Date: Mon, 29 Apr 2024 14:35:17 +0000	[thread overview]
Message-ID: <MN2PR11MB4566AA01CC6D66EC59B407228E1B2@MN2PR11MB4566.namprd11.prod.outlook.com> (raw)
In-Reply-To: <c81a23c9483614d0ebe479cd1a76c5bf5aaf2e90.1714143669.git.aburgess@redhat.com>

> -----Original Message-----
> From: Andrew Burgess <aburgess@redhat.com>
> Sent: Freitag, 26. April 2024 17:02
> To: gdb-patches@sourceware.org
> Cc: Andrew Burgess <aburgess@redhat.com>; Willgerodt, Felix
> <felix.willgerodt@intel.com>; John Baldwin <jhb@FreeBSD.org>
> Subject: [PATCHv5 11/11] gdb/gdbserver: share x86/linux tdesc caching
> 
> This commit builds on the previous series of commits to share the
> target description caching code between GDB and gdbserver for
> x86/Linux targets.
> 
> The objective of this commit is to move the four functions (2 each of)
> i386_linux_read_description and amd64_linux_read_description into the
> gdb/arch/ directory and combine them so we have just a single copy of
> each.  Then GDB, gdbserver, and the in-process-agent (IPA) will link
> against these shared functions.
> 
> It is worth reading the description of the previous commit(s) to see
> why this merging is not as simple as it seems, but in summary,
> gdbserver used to generate a different set of possible target
> descriptions than GDB.  The previous commit(s) fixed this, so now it
> should be simpler to share the functions.
> 
> One curiosity with this patch is the function
> x86_linux_post_init_tdesc.  On the gdbserver side the two functions
> amd64_linux_read_description and i386_linux_read_description have some
> functionality that is not present on the GDB side, that is some
> additional configuration that is performed as each target description
> is created to setup the expedited registers.
> 
> To support this I've added the function x86_linux_post_init_tdesc.
> This function is called from the two *_linux_read_description
> functions, but is implemented separately for GDB and gdbserver.
> 
> An alternative approach that avoids adding x86_linux_post_init_tdesc
> would be to have x86_linux_tdesc_for_tid return a non-const target
> description, in x86_target::low_arch_setup we could then inspect the
> target description to figure out if it is 64-bit or not, and modify
> the target description as needed.  In the end I figured that adding
> the x86_linux_post_init_tdesc function was good enough, so went with
> that solution.
> 
> The contents of gdbserver/linux-x86-low.cc have moved to
> gdb/arch/x86-linux-tdesc-features.c, and gdbserver/linux-x86-tdesc.h
> has moved to gdb/arch/x86-linux-tdesc-features.h, this change leads to
> some updates in the #includes in the gdbserver/ directory.
> 
> For testing I've done the following:
> 
>   - Built on x86-64 GNU/Linux for all targets, and just for the native
>     target,
> 
>   - Build on i386 GNU/Linux for all targets, and just for the native
>     target,
> 
>   - Build on a 64-bit, non-x86 GNU/Linux for all targets, just for the
>     native target, and for targets x86_64-*-linux and i386-*-linux.
> 
> This did flush out a bunch of build issues where I'd failed to add a
> required file in a configure.* file, but I think everything should now
> be good.
> ---
>  gdb/Makefile.in                               |   5 +
>  gdb/amd64-linux-tdep.c                        |  31 --
>  gdb/arch/amd64-linux-tdesc.c                  |  61 ++++
>  gdb/arch/i386-linux-tdesc.c                   |  51 +++
>  gdb/arch/x86-linux-tdesc-features.c           | 247 +++++++++++++++
>  .../arch/x86-linux-tdesc-features.h           |  50 +--
>  gdb/arch/x86-linux-tdesc.h                    |  37 +++
>  gdb/configure.nat                             |   6 +-
>  gdb/configure.tgt                             |  11 +-
>  gdb/i386-linux-tdep.c                         |  26 +-
>  gdbserver/configure.srv                       |   9 +
>  gdbserver/linux-amd64-ipa.cc                  |   2 +-
>  gdbserver/linux-i386-ipa.cc                   |   2 +-
>  gdbserver/linux-x86-low.cc                    |   2 +-
>  gdbserver/linux-x86-tdesc.cc                  | 292 +-----------------
>  15 files changed, 469 insertions(+), 363 deletions(-)
>  create mode 100644 gdb/arch/amd64-linux-tdesc.c
>  create mode 100644 gdb/arch/i386-linux-tdesc.c
>  create mode 100644 gdb/arch/x86-linux-tdesc-features.c
>  rename gdbserver/linux-x86-tdesc.h => gdb/arch/x86-linux-tdesc-features.h
> (52%)
>  create mode 100644 gdb/arch/x86-linux-tdesc.h
> 
> diff --git a/gdb/Makefile.in b/gdb/Makefile.in
> index a24b2232daa..1e49ae396f4 100644
> --- a/gdb/Makefile.in
> +++ b/gdb/Makefile.in
> @@ -748,6 +748,7 @@ ALL_64_TARGET_OBS = \
>  	arch/aarch64-insn.o \
>  	arch/aarch64-mte-linux.o \
>  	arch/aarch64-scalable-linux.o \
> +	arch/amd64-linux-tdesc.o \
>  	arch/amd64.o \
>  	arch/riscv.o \
>  	bpf-tdep.o \
> @@ -788,9 +789,11 @@ ALL_TARGET_OBS = \
>  	arch/arm.o \
>  	arch/arm-get-next-pcs.o \
>  	arch/arm-linux.o \
> +	arch/i386-linux-tdesc.o \
>  	arch/i386.o \
>  	arch/loongarch.o \
>  	arch/ppc-linux-common.o \
> +	arch/x86-linux-tdesc-features.o \
>  	arm-bsd-tdep.o \
>  	arm-fbsd-tdep.o \
>  	arm-linux-tdep.o \
> @@ -1558,6 +1561,8 @@ HFILES_NO_SRCDIR = \
>  	arch/ppc-linux-common.h \
>  	arch/ppc-linux-tdesc.h \
>  	arch/riscv.h \
> +	arch/x86-linux-tdesc-features.h \
> +	arch/x86-linux-tdesc.h \
>  	cli/cli-cmds.h \
>  	cli/cli-decode.h \
>  	cli/cli-script.h \
> diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c
> index bcb9868e79e..c707745cd9a 100644
> --- a/gdb/amd64-linux-tdep.c
> +++ b/gdb/amd64-linux-tdep.c
> @@ -1577,37 +1577,6 @@ amd64_linux_record_signal (struct gdbarch *gdbarch,
>    return 0;
>  }
> 
> -const target_desc *
> -amd64_linux_read_description (uint64_t xcr0_features_bit, bool is_x32)
> -{
> -  static target_desc *amd64_linux_tdescs \
> -    [2/*AVX*/][2/*MPX*/][2/*AVX512*/][2/*PKRU*/] = {};
> -  static target_desc *x32_linux_tdescs \
> -    [2/*AVX*/][2/*AVX512*/][2/*PKRU*/] = {};
> -
> -  target_desc **tdesc;
> -
> -  if (is_x32)
> -    {
> -      tdesc = &x32_linux_tdescs[(xcr0_features_bit & X86_XSTATE_AVX) ? 1 : 0 ]
> -	[(xcr0_features_bit & X86_XSTATE_AVX512) ? 1 : 0]
> -	[(xcr0_features_bit & X86_XSTATE_PKRU) ? 1 : 0];
> -    }
> -  else
> -    {
> -      tdesc = &amd64_linux_tdescs[(xcr0_features_bit & X86_XSTATE_AVX) ? 1 : 0]
> -	[(xcr0_features_bit & X86_XSTATE_MPX) ? 1 : 0]
> -	[(xcr0_features_bit & X86_XSTATE_AVX512) ? 1 : 0]
> -	[(xcr0_features_bit & X86_XSTATE_PKRU) ? 1 : 0];
> -    }
> -
> -  if (*tdesc == NULL)
> -    *tdesc = amd64_create_target_description (xcr0_features_bit, is_x32,
> -					      true, true);
> -
> -  return *tdesc;
> -}
> -
>  /* Get Linux/x86 target description from core dump.  */
> 
>  static const struct target_desc *
> diff --git a/gdb/arch/amd64-linux-tdesc.c b/gdb/arch/amd64-linux-tdesc.c
> new file mode 100644
> index 00000000000..63b5ddfcece
> --- /dev/null
> +++ b/gdb/arch/amd64-linux-tdesc.c
> @@ -0,0 +1,61 @@
> +/* Target description related code for GNU/Linux x86-64.
> +
> +   Copyright (C) 2024 Free Software Foundation, Inc.
> +
> +   This file is part of GDB.
> +
> +   This program is free software; you can redistribute it and/or modify
> +   it under the terms of the GNU General Public License as published by
> +   the Free Software Foundation; either version 3 of the License, or
> +   (at your option) any later version.
> +
> +   This program is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> +   GNU General Public License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
> +
> +#include "arch/x86-linux-tdesc.h"
> +#include "arch/amd64-linux-tdesc.h"
> +#include "arch/amd64.h"
> +#include "arch/x86-linux-tdesc-features.h"
> +
> +
> +/* See arch/amd64-linux-tdesc.h.  */
> +
> +const struct target_desc *
> +amd64_linux_read_description (uint64_t xcr0, bool is_x32)
> +{
> +  /* The type used for the amd64 and x32 target description caches.  */
> +  using tdesc_cache_type = std::unordered_map<uint64_t, const
> target_desc_up>;
> +
> +  /* Caches for the previously seen amd64 and x32 target descriptions,
> +     indexed by the xcr0 value that created the target description.  These
> +     need to be static within this function to ensure they are initialised
> +     before first use.  */
> +  static tdesc_cache_type amd64_tdesc_cache, x32_tdesc_cache;
> +

Sorry for this long comment, it isn't strictly related to your series, as you don't
change the status quo. But since you are changing the cache, I find it relevant.

I wonder if caching of target descriptions based on xcr0 alone is really
good enough. It isn't always the only thing used for determining registers.
I realize you don't change that fact, though with the map we would need to
hash xcr0 with the other factors for the key. Arguably that could still be
viewed as better than the current way.

Right now there is already the segments and "orig_rax" register for amd64.
Though I don't know if IPA really supports them and I am not super familiar with
their details. It seems like we just add them unconditionally or based on whether
or not we are on Linux. I am not really sure that means we don't care about them
for our cache (especially the Linux part), but it seems that is the current state.

But in the near future there will be the shadow stack pointer register for CET,
which we can only read with a separate ptrace call.
See this patch, which we want to post soon:
https://github.com/intel/gdb/commit/afff428f38a1f03ac0127797deda524d81ec156e

I must admit I never really fully understood why this caching is done.
Is it for a single GDB session connecting to different gdbserver sessions one
after the other? Or for inferior re-starts?
Or for runtime target description updates similar to SVE on aarch64?
(Which we will also add at some point for AMX on x86.)
Or a mix of all?

Thanks,
Felix
Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://www.intel.de>
Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva  
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

  reply	other threads:[~2024-04-29 14:35 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-01 15:28 [PATCH 0/7] x86/Linux Target Description Changes Andrew Burgess
2024-02-01 15:28 ` [PATCH 1/7] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-02-01 15:28 ` [PATCH 2/7] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-02-01 15:28 ` [PATCH 3/7] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-02-01 15:28 ` [PATCH 4/7] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-02-01 15:28 ` [PATCH 5/7] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-02-01 15:28 ` [PATCH 6/7] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-02-01 15:28 ` [PATCH 7/7] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-03-05 17:00 ` [PATCHv2 0/7] x86/Linux Target Description Changes Andrew Burgess
2024-03-05 17:00   ` [PATCHv2 1/7] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-03-05 17:00   ` [PATCHv2 2/7] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-03-05 17:00   ` [PATCHv2 3/7] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-03-05 17:00   ` [PATCHv2 4/7] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-03-05 17:00   ` [PATCHv2 5/7] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-03-05 17:00   ` [PATCHv2 6/7] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-03-19 16:01     ` John Baldwin
2024-03-19 18:34       ` Andrew Burgess
2024-03-21 17:28         ` John Baldwin
2024-03-26 10:01           ` Luis Machado
2024-03-26 15:31             ` Tom Tromey
2024-03-05 17:00   ` [PATCHv2 7/7] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-03-19 16:05   ` [PATCHv2 0/7] x86/Linux Target Description Changes John Baldwin
2024-03-23 16:35   ` [PATCHv3 0/8] " Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 1/8] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 2/8] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 3/8] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 4/8] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 5/8] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 6/8] gdb/arch: assert that X86_XSTATE_MPX is not set for x32 Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 7/8] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-03-23 16:35     ` [PATCHv3 8/8] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-03-26 12:17       ` Andrew Burgess
2024-03-25 17:20     ` [PATCHv3 0/8] x86/Linux Target Description Changes Andrew Burgess
2024-03-25 18:26       ` Simon Marchi
2024-03-26 12:15         ` Andrew Burgess
2024-03-26 13:51           ` H.J. Lu
2024-03-26 14:16             ` H.J. Lu
2024-03-26 16:36       ` Andrew Burgess
2024-03-26 19:03         ` Andrew Burgess
2024-04-05 12:33     ` [PATCHv4 00/10] " Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 01/10] gdbserver/ipa/x86: remove unneeded declarations Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 02/10] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 03/10] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 04/10] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 05/10] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 06/10] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 07/10] gdb/arch: assert that X86_XSTATE_MPX is not set for x32 Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 08/10] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 09/10] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-04-05 12:33       ` [PATCHv4 10/10] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-04-09 18:37       ` [PATCHv4 00/10] x86/Linux Target Description Changes John Baldwin
2024-04-25 13:35       ` Willgerodt, Felix
2024-04-25 16:06         ` Andrew Burgess
2024-04-26 15:01       ` [PATCHv5 00/11] " Andrew Burgess
2024-04-26 15:01         ` [PATCHv5 01/11] gdbserver/ipa/x86: remove unneeded declarations Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-05-07 15:05             ` Andrew Burgess
2024-05-08  7:49               ` Willgerodt, Felix
2024-04-26 15:01         ` [PATCHv5 02/11] gdbserver: convert have_ptrace_getregset to a tribool Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-05-07 15:28             ` Andrew Burgess
2024-04-26 15:01         ` [PATCHv5 03/11] gdb/x86: move reading of cs and ds state into gdb/nat directory Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-04-26 15:01         ` [PATCHv5 04/11] gdb/x86: move have_ptrace_getfpxregs global " Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-04-26 15:01         ` [PATCHv5 05/11] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-05-07 11:55             ` Luis Machado
2024-05-07 15:43               ` Andrew Burgess
2024-05-07 15:56                 ` Luis Machado
2024-05-08  7:49                 ` Willgerodt, Felix
2024-05-08 13:18                   ` Andrew Burgess
2024-04-26 15:01         ` [PATCHv5 06/11] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-04-26 15:01         ` [PATCHv5 07/11] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-05-07 11:40             ` Andrew Burgess
2024-04-26 15:01         ` [PATCHv5 08/11] gdb/arch: assert that X86_XSTATE_MPX is not set for x32 Andrew Burgess
2024-04-29 14:34           ` Willgerodt, Felix
2024-05-07 16:08             ` Andrew Burgess
2024-04-26 15:01         ` [PATCHv5 09/11] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-04-29 14:35           ` Willgerodt, Felix
2024-05-07 14:24             ` Andrew Burgess
2024-05-08  7:47               ` Willgerodt, Felix
2024-05-08 13:28                 ` Andrew Burgess
2024-04-26 15:01         ` [PATCHv5 10/11] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-04-29 14:35           ` Willgerodt, Felix
2024-04-26 15:01         ` [PATCHv5 11/11] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-04-29 14:35           ` Willgerodt, Felix [this message]
2024-05-07 14:50             ` Andrew Burgess
2024-05-08  7:49               ` Willgerodt, Felix
2024-05-08 16:09                 ` Andrew Burgess
2024-05-08 16:46         ` [PATCHv6 0/9] x86/Linux Target Description Changes Andrew Burgess
2024-05-08 16:46           ` [PATCHv6 1/9] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-05-08 16:46           ` [PATCHv6 2/9] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-05-08 16:46           ` [PATCHv6 3/9] gdb/x86: move have_ptrace_getfpxregs global into gdb/nat directory Andrew Burgess
2024-05-08 22:52             ` John Baldwin
2024-05-08 16:46           ` [PATCHv6 4/9] gdb/x86: move have_ptrace_getregset " Andrew Burgess
2024-05-08 22:53             ` John Baldwin
2024-05-08 16:46           ` [PATCHv6 5/9] gdb/x86: move reading of cs and ds state " Andrew Burgess
2024-05-08 16:46           ` [PATCHv6 6/9] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-05-08 22:54             ` John Baldwin
2024-05-08 16:46           ` [PATCHv6 7/9] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-05-08 22:58             ` John Baldwin
2024-05-08 16:46           ` [PATCHv6 8/9] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-05-08 16:46           ` [PATCHv6 9/9] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-05-11 10:08           ` [PATCHv7 0/9] x86/Linux Target Description Changes Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 1/9] gdb/gdbserver: share I386_LINUX_XSAVE_XCR0_OFFSET definition Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 2/9] gdbserver/x86: move no-xml code earlier in x86_linux_read_description Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 3/9] gdb/x86: move have_ptrace_getfpxregs global into gdb/nat directory Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 4/9] gdb: move have_ptrace_getregset declaration " Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 5/9] gdb/x86: move reading of cs and ds state " Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 6/9] gdb: move xcr0 == 0 check into i386_linux_core_read_description Andrew Burgess
2024-05-11 10:08             ` [PATCHv7 7/9] gdb/gdbserver: share some code relating to target description creation Andrew Burgess
2024-05-17 11:59               ` Willgerodt, Felix
2024-05-11 10:08             ` [PATCHv7 8/9] gdbserver: update target description creation for x86/linux Andrew Burgess
2024-05-17 12:00               ` Willgerodt, Felix
2024-05-11 10:08             ` [PATCHv7 9/9] gdb/gdbserver: share x86/linux tdesc caching Andrew Burgess
2024-05-17 12:00               ` Willgerodt, Felix

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=MN2PR11MB4566AA01CC6D66EC59B407228E1B2@MN2PR11MB4566.namprd11.prod.outlook.com \
    --to=felix.willgerodt@intel.com \
    --cc=aburgess@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=jhb@FreeBSD.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).