Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH 1/1] package/gdb: backport fix for gdbserver 11.1 on aarch64
@ 2022-01-28  8:42 Joachim Wiberg
  2022-02-03 20:58 ` Yann E. MORIN
  2022-02-16 20:40 ` Peter Korsgaard
  0 siblings, 2 replies; 3+ messages in thread
From: Joachim Wiberg @ 2022-01-28  8:42 UTC (permalink / raw)
  To: buildroot; +Cc: Joachim Wiberg, Thomas Petazzoni

Backported from upstream GDB geb79b23, with ChangeLogs stripped so the
patch applies properly on Buildroot.

    https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eb79b23

Fixes the following issue:

    # gdbserver /dev/hvc1 inadyn -n -l debug
    Process inadyn created; pid = 675
    Remote debugging using /dev/hvc1
    ../../gdbserver/regcache.cc:257: A problem internal to GDBserver has been detected.
    Unknown register tag_ctl requested

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
---
 .../11.1/0010-gdbserver-aarch64-support.patch | 317 ++++++++++++++++++
 1 file changed, 317 insertions(+)
 create mode 100644 package/gdb/11.1/0010-gdbserver-aarch64-support.patch

diff --git a/package/gdb/11.1/0010-gdbserver-aarch64-support.patch b/package/gdb/11.1/0010-gdbserver-aarch64-support.patch
new file mode 100644
index 0000000000..c915b8fe6f
--- /dev/null
+++ b/package/gdb/11.1/0010-gdbserver-aarch64-support.patch
@@ -0,0 +1,317 @@
+From eb79b2318066cafb75ffdce310e3bbd44f7c79e3 Mon Sep 17 00:00:00 2001
+From: Luis Machado <luis.machado@linaro.org>
+Date: Fri, 29 Oct 2021 14:54:36 -0300
+Subject: [PATCH] [AArch64] Make gdbserver register set selection dynamic
+
+The current register set selection mechanism for AArch64 is static, based
+on a pre-populated array of register sets.
+
+This means that we might potentially probe register sets that are not
+available. This is OK if the kernel errors out during ptrace, but probing the
+tag_ctl register, for example, does not result in a ptrace error if the kernel
+supports the tagged address ABI but not MTE (PR 28355).
+
+Making the register set selection dynamic, based on feature checks, solves
+this and simplifies the code a bit. It allows us to list all of the register
+sets only once, and pick and choose based on HWCAP/HWCAP2 or other properties.
+
+gdb/ChangeLog:
+
+2021-11-03  Luis Machado  <luis.machado@linaro.org>
+
+	PR gdb/28355
+
+	* arch/aarch64.h (struct aarch64_features): New struct.
+
+gdbserver/ChangeLog:
+
+2021-11-03  Luis Machado  <luis.machado@linaro.org>
+
+	PR gdb/28355
+
+	* linux-aarch64-low.cc (is_sve_tdesc): Remove.
+	(aarch64_target::low_arch_setup): Rework to adjust the register sets.
+	(aarch64_regsets): Update to list all register sets.
+	(aarch64_regsets_info, regs_info_aarch64): Replace NULL with nullptr.
+	(aarch64_sve_regsets, aarch64_sve_regsets_info)
+	(regs_info_aarch64_sve): Remove.
+	(aarch64_adjust_register_sets): New.
+	(aarch64_target::get_regs_info): Remove references to removed structs.
+	(initialize_low_arch): Likewise.
+---
+ gdb/arch/aarch64.h             |   9 ++
+ gdbserver/linux-aarch64-low.cc | 186 ++++++++++++++++++---------------
+ 4 files changed, 130 insertions(+), 85 deletions(-)
+
+diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h
+index 0eb702c5b5e..95edb664b55 100644
+--- a/gdb/arch/aarch64.h
++++ b/gdb/arch/aarch64.h
+@@ -22,6 +22,15 @@
+ 
+ #include "gdbsupport/tdesc.h"
+ 
++/* Holds information on what architectural features are available.  This is
++   used to select register sets.  */
++struct aarch64_features
++{
++  bool sve = false;
++  bool pauth = false;
++  bool mte = false;
++};
++
+ /* Create the aarch64 target description.  A non zero VQ value indicates both
+    the presence of SVE and the Vector Quotient - the number of 128bit chunks in
+    an SVE Z register.  HAS_PAUTH_P indicates the presence of the PAUTH
+diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc
+index daccfef746e..9a8cb4169a7 100644
+--- a/gdbserver/linux-aarch64-low.cc
++++ b/gdbserver/linux-aarch64-low.cc
+@@ -196,16 +196,6 @@ is_64bit_tdesc (void)
+   return register_size (regcache->tdesc, 0) == 8;
+ }
+ 
+-/* Return true if the regcache contains the number of SVE registers.  */
+-
+-static bool
+-is_sve_tdesc (void)
+-{
+-  struct regcache *regcache = get_thread_regcache (current_thread, 0);
+-
+-  return tdesc_contains_feature (regcache->tdesc, "org.gnu.gdb.aarch64.sve");
+-}
+-
+ static void
+ aarch64_fill_gregset (struct regcache *regcache, void *buf)
+ {
+@@ -680,40 +670,6 @@ aarch64_target::low_new_fork (process_info *parent,
+   *child->priv->arch_private = *parent->priv->arch_private;
+ }
+ 
+-/* Matches HWCAP_PACA in kernel header arch/arm64/include/uapi/asm/hwcap.h.  */
+-#define AARCH64_HWCAP_PACA (1 << 30)
+-
+-/* Implementation of linux target ops method "low_arch_setup".  */
+-
+-void
+-aarch64_target::low_arch_setup ()
+-{
+-  unsigned int machine;
+-  int is_elf64;
+-  int tid;
+-
+-  tid = lwpid_of (current_thread);
+-
+-  is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
+-
+-  if (is_elf64)
+-    {
+-      uint64_t vq = aarch64_sve_get_vq (tid);
+-      unsigned long hwcap = linux_get_hwcap (8);
+-      unsigned long hwcap2 = linux_get_hwcap2 (8);
+-      bool pauth_p = hwcap & AARCH64_HWCAP_PACA;
+-      /* MTE is AArch64-only.  */
+-      bool mte_p = hwcap2 & HWCAP2_MTE;
+-
+-      current_process ()->tdesc
+-	= aarch64_linux_read_description (vq, pauth_p, mte_p);
+-    }
+-  else
+-    current_process ()->tdesc = aarch32_linux_read_description ();
+-
+-  aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
+-}
+-
+ /* Wrapper for aarch64_sve_regs_copy_to_reg_buf.  */
+ 
+ static void
+@@ -730,21 +686,36 @@ aarch64_sve_regs_copy_from_regcache (struct regcache *regcache, void *buf)
+   return aarch64_sve_regs_copy_from_reg_buf (regcache, buf);
+ }
+ 
++/* Array containing all the possible register sets for AArch64/Linux.  During
++   architecture setup, these will be checked against the HWCAP/HWCAP2 bits for
++   validity and enabled/disabled accordingly.
++
++   Their sizes are set to 0 here, but they will be adjusted later depending
++   on whether each register set is available or not.  */
+ static struct regset_info aarch64_regsets[] =
+ {
++  /* GPR registers.  */
+   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
+-    sizeof (struct user_pt_regs), GENERAL_REGS,
++    0, GENERAL_REGS,
+     aarch64_fill_gregset, aarch64_store_gregset },
++  /* Floating Point (FPU) registers.  */
+   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_FPREGSET,
+-    sizeof (struct user_fpsimd_state), FP_REGS,
++    0, FP_REGS,
+     aarch64_fill_fpregset, aarch64_store_fpregset
+   },
++  /* Scalable Vector Extension (SVE) registers.  */
++  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_SVE,
++    0, EXTENDED_REGS,
++    aarch64_sve_regs_copy_from_regcache, aarch64_sve_regs_copy_to_regcache
++  },
++  /* PAC registers.  */
+   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_PAC_MASK,
+-    AARCH64_PAUTH_REGS_SIZE, OPTIONAL_REGS,
+-    NULL, aarch64_store_pauthregset },
++    0, OPTIONAL_REGS,
++    nullptr, aarch64_store_pauthregset },
++  /* Tagged address control / MTE registers.  */
+   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TAGGED_ADDR_CTRL,
+-    AARCH64_LINUX_SIZEOF_MTE, OPTIONAL_REGS, aarch64_fill_mteregset,
+-    aarch64_store_mteregset },
++    0, OPTIONAL_REGS,
++    aarch64_fill_mteregset, aarch64_store_mteregset },
+   NULL_REGSET
+ };
+ 
+@@ -752,47 +723,95 @@ static struct regsets_info aarch64_regsets_info =
+   {
+     aarch64_regsets, /* regsets */
+     0, /* num_regsets */
+-    NULL, /* disabled_regsets */
++    nullptr, /* disabled_regsets */
+   };
+ 
+ static struct regs_info regs_info_aarch64 =
+   {
+-    NULL, /* regset_bitmap */
+-    NULL, /* usrregs */
++    nullptr, /* regset_bitmap */
++    nullptr, /* usrregs */
+     &aarch64_regsets_info,
+   };
+ 
+-static struct regset_info aarch64_sve_regsets[] =
++/* Given FEATURES, adjust the available register sets by setting their
++   sizes.  A size of 0 means the register set is disabled and won't be
++   used.  */
++
++static void
++aarch64_adjust_register_sets (const struct aarch64_features &features)
+ {
+-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
+-    sizeof (struct user_pt_regs), GENERAL_REGS,
+-    aarch64_fill_gregset, aarch64_store_gregset },
+-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_SVE,
+-    SVE_PT_SIZE (AARCH64_MAX_SVE_VQ, SVE_PT_REGS_SVE), EXTENDED_REGS,
+-    aarch64_sve_regs_copy_from_regcache, aarch64_sve_regs_copy_to_regcache
+-  },
+-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_PAC_MASK,
+-    AARCH64_PAUTH_REGS_SIZE, OPTIONAL_REGS,
+-    NULL, aarch64_store_pauthregset },
+-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TAGGED_ADDR_CTRL,
+-    AARCH64_LINUX_SIZEOF_MTE, OPTIONAL_REGS, aarch64_fill_mteregset,
+-    aarch64_store_mteregset },
+-  NULL_REGSET
+-};
++  struct regset_info *regset;
+ 
+-static struct regsets_info aarch64_sve_regsets_info =
+-  {
+-    aarch64_sve_regsets, /* regsets.  */
+-    0, /* num_regsets.  */
+-    NULL, /* disabled_regsets.  */
+-  };
++  for (regset = aarch64_regsets; regset->size >= 0; regset++)
++    {
++      switch (regset->nt_type)
++	{
++	case NT_PRSTATUS:
++	  /* General purpose registers are always present.  */
++	  regset->size = sizeof (struct user_pt_regs);
++	  break;
++	case NT_FPREGSET:
++	  /* This is unavailable when SVE is present.  */
++	  if (!features.sve)
++	    regset->size = sizeof (struct user_fpsimd_state);
++	  break;
++	case NT_ARM_SVE:
++	  if (features.sve)
++	    regset->size = SVE_PT_SIZE (AARCH64_MAX_SVE_VQ, SVE_PT_REGS_SVE);
++	  break;
++	case NT_ARM_PAC_MASK:
++	  if (features.pauth)
++	    regset->size = AARCH64_PAUTH_REGS_SIZE;
++	  break;
++	case NT_ARM_TAGGED_ADDR_CTRL:
++	  if (features.mte)
++	    regset->size = AARCH64_LINUX_SIZEOF_MTE;
++	  break;
++	default:
++	  gdb_assert_not_reached ("Unknown register set found.");
++	}
++    }
++}
+ 
+-static struct regs_info regs_info_aarch64_sve =
+-  {
+-    NULL, /* regset_bitmap.  */
+-    NULL, /* usrregs.  */
+-    &aarch64_sve_regsets_info,
+-  };
++/* Matches HWCAP_PACA in kernel header arch/arm64/include/uapi/asm/hwcap.h.  */
++#define AARCH64_HWCAP_PACA (1 << 30)
++
++/* Implementation of linux target ops method "low_arch_setup".  */
++
++void
++aarch64_target::low_arch_setup ()
++{
++  unsigned int machine;
++  int is_elf64;
++  int tid;
++
++  tid = lwpid_of (current_thread);
++
++  is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
++
++  if (is_elf64)
++    {
++      struct aarch64_features features;
++
++      uint64_t vq = aarch64_sve_get_vq (tid);
++      features.sve = (vq > 0);
++      /* A-profile PAC is 64-bit only.  */
++      features.pauth = linux_get_hwcap (8) & AARCH64_HWCAP_PACA;
++      /* A-profile MTE is 64-bit only.  */
++      features.mte = linux_get_hwcap2 (8) & HWCAP2_MTE;
++
++      current_process ()->tdesc
++	= aarch64_linux_read_description (vq, features.pauth, features.mte);
++
++      /* Adjust the register sets we should use for this particular set of
++	 features.  */
++      aarch64_adjust_register_sets (features);
++    }
++  else
++    current_process ()->tdesc = aarch32_linux_read_description ();
++
++  aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
++}
+ 
+ /* Implementation of linux target ops method "get_regs_info".  */
+ 
+@@ -802,9 +821,7 @@ aarch64_target::get_regs_info ()
+   if (!is_64bit_tdesc ())
+     return &regs_info_aarch32;
+ 
+-  if (is_sve_tdesc ())
+-    return &regs_info_aarch64_sve;
+-
++  /* AArch64 64-bit registers.  */
+   return &regs_info_aarch64;
+ }
+ 
+@@ -3294,5 +3311,4 @@ initialize_low_arch (void)
+   initialize_low_arch_aarch32 ();
+ 
+   initialize_regsets_info (&aarch64_regsets_info);
+-  initialize_regsets_info (&aarch64_sve_regsets_info);
+ }
+-- 
+2.27.0
+
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [Buildroot] [PATCH 1/1] package/gdb: backport fix for gdbserver 11.1 on aarch64
  2022-01-28  8:42 [Buildroot] [PATCH 1/1] package/gdb: backport fix for gdbserver 11.1 on aarch64 Joachim Wiberg
@ 2022-02-03 20:58 ` Yann E. MORIN
  2022-02-16 20:40 ` Peter Korsgaard
  1 sibling, 0 replies; 3+ messages in thread
From: Yann E. MORIN @ 2022-02-03 20:58 UTC (permalink / raw)
  To: Joachim Wiberg; +Cc: Thomas Petazzoni, buildroot

Joachim, All,

On 2022-01-28 09:42 +0100, Joachim Wiberg spake thusly:
> Backported from upstream GDB geb79b23, with ChangeLogs stripped so the
> patch applies properly on Buildroot.
> 
>     https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eb79b23
> 
> Fixes the following issue:
> 
>     # gdbserver /dev/hvc1 inadyn -n -l debug
>     Process inadyn created; pid = 675
>     Remote debugging using /dev/hvc1
>     ../../gdbserver/regcache.cc:257: A problem internal to GDBserver has been detected.
>     Unknown register tag_ctl requested
> 
> Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
> ---
>  .../11.1/0010-gdbserver-aarch64-support.patch | 317 ++++++++++++++++++
>  1 file changed, 317 insertions(+)
>  create mode 100644 package/gdb/11.1/0010-gdbserver-aarch64-support.patch
> 
> diff --git a/package/gdb/11.1/0010-gdbserver-aarch64-support.patch b/package/gdb/11.1/0010-gdbserver-aarch64-support.patch
> new file mode 100644
> index 0000000000..c915b8fe6f
> --- /dev/null
> +++ b/package/gdb/11.1/0010-gdbserver-aarch64-support.patch
> @@ -0,0 +1,317 @@
> +From eb79b2318066cafb75ffdce310e3bbd44f7c79e3 Mon Sep 17 00:00:00 2001
> +From: Luis Machado <luis.machado@linaro.org>
> +Date: Fri, 29 Oct 2021 14:54:36 -0300
> +Subject: [PATCH] [AArch64] Make gdbserver register set selection dynamic
> +
> +The current register set selection mechanism for AArch64 is static, based
> +on a pre-populated array of register sets.
> +
> +This means that we might potentially probe register sets that are not
> +available. This is OK if the kernel errors out during ptrace, but probing the
> +tag_ctl register, for example, does not result in a ptrace error if the kernel
> +supports the tagged address ABI but not MTE (PR 28355).
> +
> +Making the register set selection dynamic, based on feature checks, solves
> +this and simplifies the code a bit. It allows us to list all of the register
> +sets only once, and pick and choose based on HWCAP/HWCAP2 or other properties.
> +
> +gdb/ChangeLog:
> +
> +2021-11-03  Luis Machado  <luis.machado@linaro.org>
> +
> +	PR gdb/28355
> +
> +	* arch/aarch64.h (struct aarch64_features): New struct.
> +
> +gdbserver/ChangeLog:
> +
> +2021-11-03  Luis Machado  <luis.machado@linaro.org>
> +
> +	PR gdb/28355
> +
> +	* linux-aarch64-low.cc (is_sve_tdesc): Remove.
> +	(aarch64_target::low_arch_setup): Rework to adjust the register sets.
> +	(aarch64_regsets): Update to list all register sets.
> +	(aarch64_regsets_info, regs_info_aarch64): Replace NULL with nullptr.
> +	(aarch64_sve_regsets, aarch64_sve_regsets_info)
> +	(regs_info_aarch64_sve): Remove.
> +	(aarch64_adjust_register_sets): New.
> +	(aarch64_target::get_regs_info): Remove references to removed structs.
> +	(initialize_low_arch): Likewise.

You forgot to add your SoB here, so I added what you provided on IRC:

    Backported from: eb79b2318066cafb75ffdce310e3bbd44f7c79e3
    Signed-off-by: Joachim Wiberg <troglobit@gmail.com>

Applied to master, thanks.

Regards,
Yann E. MORIN.

> +---
> + gdb/arch/aarch64.h             |   9 ++
> + gdbserver/linux-aarch64-low.cc | 186 ++++++++++++++++++---------------
> + 4 files changed, 130 insertions(+), 85 deletions(-)
> +
> +diff --git a/gdb/arch/aarch64.h b/gdb/arch/aarch64.h
> +index 0eb702c5b5e..95edb664b55 100644
> +--- a/gdb/arch/aarch64.h
> ++++ b/gdb/arch/aarch64.h
> +@@ -22,6 +22,15 @@
> + 
> + #include "gdbsupport/tdesc.h"
> + 
> ++/* Holds information on what architectural features are available.  This is
> ++   used to select register sets.  */
> ++struct aarch64_features
> ++{
> ++  bool sve = false;
> ++  bool pauth = false;
> ++  bool mte = false;
> ++};
> ++
> + /* Create the aarch64 target description.  A non zero VQ value indicates both
> +    the presence of SVE and the Vector Quotient - the number of 128bit chunks in
> +    an SVE Z register.  HAS_PAUTH_P indicates the presence of the PAUTH
> +diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc
> +index daccfef746e..9a8cb4169a7 100644
> +--- a/gdbserver/linux-aarch64-low.cc
> ++++ b/gdbserver/linux-aarch64-low.cc
> +@@ -196,16 +196,6 @@ is_64bit_tdesc (void)
> +   return register_size (regcache->tdesc, 0) == 8;
> + }
> + 
> +-/* Return true if the regcache contains the number of SVE registers.  */
> +-
> +-static bool
> +-is_sve_tdesc (void)
> +-{
> +-  struct regcache *regcache = get_thread_regcache (current_thread, 0);
> +-
> +-  return tdesc_contains_feature (regcache->tdesc, "org.gnu.gdb.aarch64.sve");
> +-}
> +-
> + static void
> + aarch64_fill_gregset (struct regcache *regcache, void *buf)
> + {
> +@@ -680,40 +670,6 @@ aarch64_target::low_new_fork (process_info *parent,
> +   *child->priv->arch_private = *parent->priv->arch_private;
> + }
> + 
> +-/* Matches HWCAP_PACA in kernel header arch/arm64/include/uapi/asm/hwcap.h.  */
> +-#define AARCH64_HWCAP_PACA (1 << 30)
> +-
> +-/* Implementation of linux target ops method "low_arch_setup".  */
> +-
> +-void
> +-aarch64_target::low_arch_setup ()
> +-{
> +-  unsigned int machine;
> +-  int is_elf64;
> +-  int tid;
> +-
> +-  tid = lwpid_of (current_thread);
> +-
> +-  is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
> +-
> +-  if (is_elf64)
> +-    {
> +-      uint64_t vq = aarch64_sve_get_vq (tid);
> +-      unsigned long hwcap = linux_get_hwcap (8);
> +-      unsigned long hwcap2 = linux_get_hwcap2 (8);
> +-      bool pauth_p = hwcap & AARCH64_HWCAP_PACA;
> +-      /* MTE is AArch64-only.  */
> +-      bool mte_p = hwcap2 & HWCAP2_MTE;
> +-
> +-      current_process ()->tdesc
> +-	= aarch64_linux_read_description (vq, pauth_p, mte_p);
> +-    }
> +-  else
> +-    current_process ()->tdesc = aarch32_linux_read_description ();
> +-
> +-  aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
> +-}
> +-
> + /* Wrapper for aarch64_sve_regs_copy_to_reg_buf.  */
> + 
> + static void
> +@@ -730,21 +686,36 @@ aarch64_sve_regs_copy_from_regcache (struct regcache *regcache, void *buf)
> +   return aarch64_sve_regs_copy_from_reg_buf (regcache, buf);
> + }
> + 
> ++/* Array containing all the possible register sets for AArch64/Linux.  During
> ++   architecture setup, these will be checked against the HWCAP/HWCAP2 bits for
> ++   validity and enabled/disabled accordingly.
> ++
> ++   Their sizes are set to 0 here, but they will be adjusted later depending
> ++   on whether each register set is available or not.  */
> + static struct regset_info aarch64_regsets[] =
> + {
> ++  /* GPR registers.  */
> +   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
> +-    sizeof (struct user_pt_regs), GENERAL_REGS,
> ++    0, GENERAL_REGS,
> +     aarch64_fill_gregset, aarch64_store_gregset },
> ++  /* Floating Point (FPU) registers.  */
> +   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_FPREGSET,
> +-    sizeof (struct user_fpsimd_state), FP_REGS,
> ++    0, FP_REGS,
> +     aarch64_fill_fpregset, aarch64_store_fpregset
> +   },
> ++  /* Scalable Vector Extension (SVE) registers.  */
> ++  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_SVE,
> ++    0, EXTENDED_REGS,
> ++    aarch64_sve_regs_copy_from_regcache, aarch64_sve_regs_copy_to_regcache
> ++  },
> ++  /* PAC registers.  */
> +   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_PAC_MASK,
> +-    AARCH64_PAUTH_REGS_SIZE, OPTIONAL_REGS,
> +-    NULL, aarch64_store_pauthregset },
> ++    0, OPTIONAL_REGS,
> ++    nullptr, aarch64_store_pauthregset },
> ++  /* Tagged address control / MTE registers.  */
> +   { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TAGGED_ADDR_CTRL,
> +-    AARCH64_LINUX_SIZEOF_MTE, OPTIONAL_REGS, aarch64_fill_mteregset,
> +-    aarch64_store_mteregset },
> ++    0, OPTIONAL_REGS,
> ++    aarch64_fill_mteregset, aarch64_store_mteregset },
> +   NULL_REGSET
> + };
> + 
> +@@ -752,47 +723,95 @@ static struct regsets_info aarch64_regsets_info =
> +   {
> +     aarch64_regsets, /* regsets */
> +     0, /* num_regsets */
> +-    NULL, /* disabled_regsets */
> ++    nullptr, /* disabled_regsets */
> +   };
> + 
> + static struct regs_info regs_info_aarch64 =
> +   {
> +-    NULL, /* regset_bitmap */
> +-    NULL, /* usrregs */
> ++    nullptr, /* regset_bitmap */
> ++    nullptr, /* usrregs */
> +     &aarch64_regsets_info,
> +   };
> + 
> +-static struct regset_info aarch64_sve_regsets[] =
> ++/* Given FEATURES, adjust the available register sets by setting their
> ++   sizes.  A size of 0 means the register set is disabled and won't be
> ++   used.  */
> ++
> ++static void
> ++aarch64_adjust_register_sets (const struct aarch64_features &features)
> + {
> +-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PRSTATUS,
> +-    sizeof (struct user_pt_regs), GENERAL_REGS,
> +-    aarch64_fill_gregset, aarch64_store_gregset },
> +-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_SVE,
> +-    SVE_PT_SIZE (AARCH64_MAX_SVE_VQ, SVE_PT_REGS_SVE), EXTENDED_REGS,
> +-    aarch64_sve_regs_copy_from_regcache, aarch64_sve_regs_copy_to_regcache
> +-  },
> +-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_PAC_MASK,
> +-    AARCH64_PAUTH_REGS_SIZE, OPTIONAL_REGS,
> +-    NULL, aarch64_store_pauthregset },
> +-  { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_ARM_TAGGED_ADDR_CTRL,
> +-    AARCH64_LINUX_SIZEOF_MTE, OPTIONAL_REGS, aarch64_fill_mteregset,
> +-    aarch64_store_mteregset },
> +-  NULL_REGSET
> +-};
> ++  struct regset_info *regset;
> + 
> +-static struct regsets_info aarch64_sve_regsets_info =
> +-  {
> +-    aarch64_sve_regsets, /* regsets.  */
> +-    0, /* num_regsets.  */
> +-    NULL, /* disabled_regsets.  */
> +-  };
> ++  for (regset = aarch64_regsets; regset->size >= 0; regset++)
> ++    {
> ++      switch (regset->nt_type)
> ++	{
> ++	case NT_PRSTATUS:
> ++	  /* General purpose registers are always present.  */
> ++	  regset->size = sizeof (struct user_pt_regs);
> ++	  break;
> ++	case NT_FPREGSET:
> ++	  /* This is unavailable when SVE is present.  */
> ++	  if (!features.sve)
> ++	    regset->size = sizeof (struct user_fpsimd_state);
> ++	  break;
> ++	case NT_ARM_SVE:
> ++	  if (features.sve)
> ++	    regset->size = SVE_PT_SIZE (AARCH64_MAX_SVE_VQ, SVE_PT_REGS_SVE);
> ++	  break;
> ++	case NT_ARM_PAC_MASK:
> ++	  if (features.pauth)
> ++	    regset->size = AARCH64_PAUTH_REGS_SIZE;
> ++	  break;
> ++	case NT_ARM_TAGGED_ADDR_CTRL:
> ++	  if (features.mte)
> ++	    regset->size = AARCH64_LINUX_SIZEOF_MTE;
> ++	  break;
> ++	default:
> ++	  gdb_assert_not_reached ("Unknown register set found.");
> ++	}
> ++    }
> ++}
> + 
> +-static struct regs_info regs_info_aarch64_sve =
> +-  {
> +-    NULL, /* regset_bitmap.  */
> +-    NULL, /* usrregs.  */
> +-    &aarch64_sve_regsets_info,
> +-  };
> ++/* Matches HWCAP_PACA in kernel header arch/arm64/include/uapi/asm/hwcap.h.  */
> ++#define AARCH64_HWCAP_PACA (1 << 30)
> ++
> ++/* Implementation of linux target ops method "low_arch_setup".  */
> ++
> ++void
> ++aarch64_target::low_arch_setup ()
> ++{
> ++  unsigned int machine;
> ++  int is_elf64;
> ++  int tid;
> ++
> ++  tid = lwpid_of (current_thread);
> ++
> ++  is_elf64 = linux_pid_exe_is_elf_64_file (tid, &machine);
> ++
> ++  if (is_elf64)
> ++    {
> ++      struct aarch64_features features;
> ++
> ++      uint64_t vq = aarch64_sve_get_vq (tid);
> ++      features.sve = (vq > 0);
> ++      /* A-profile PAC is 64-bit only.  */
> ++      features.pauth = linux_get_hwcap (8) & AARCH64_HWCAP_PACA;
> ++      /* A-profile MTE is 64-bit only.  */
> ++      features.mte = linux_get_hwcap2 (8) & HWCAP2_MTE;
> ++
> ++      current_process ()->tdesc
> ++	= aarch64_linux_read_description (vq, features.pauth, features.mte);
> ++
> ++      /* Adjust the register sets we should use for this particular set of
> ++	 features.  */
> ++      aarch64_adjust_register_sets (features);
> ++    }
> ++  else
> ++    current_process ()->tdesc = aarch32_linux_read_description ();
> ++
> ++  aarch64_linux_get_debug_reg_capacity (lwpid_of (current_thread));
> ++}
> + 
> + /* Implementation of linux target ops method "get_regs_info".  */
> + 
> +@@ -802,9 +821,7 @@ aarch64_target::get_regs_info ()
> +   if (!is_64bit_tdesc ())
> +     return &regs_info_aarch32;
> + 
> +-  if (is_sve_tdesc ())
> +-    return &regs_info_aarch64_sve;
> +-
> ++  /* AArch64 64-bit registers.  */
> +   return &regs_info_aarch64;
> + }
> + 
> +@@ -3294,5 +3311,4 @@ initialize_low_arch (void)
> +   initialize_low_arch_aarch32 ();
> + 
> +   initialize_regsets_info (&aarch64_regsets_info);
> +-  initialize_regsets_info (&aarch64_sve_regsets_info);
> + }
> +-- 
> +2.27.0
> +
> _______________________________________________
> buildroot mailing list
> buildroot@buildroot.org
> https://lists.buildroot.org/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [Buildroot] [PATCH 1/1] package/gdb: backport fix for gdbserver 11.1 on aarch64
  2022-01-28  8:42 [Buildroot] [PATCH 1/1] package/gdb: backport fix for gdbserver 11.1 on aarch64 Joachim Wiberg
  2022-02-03 20:58 ` Yann E. MORIN
@ 2022-02-16 20:40 ` Peter Korsgaard
  1 sibling, 0 replies; 3+ messages in thread
From: Peter Korsgaard @ 2022-02-16 20:40 UTC (permalink / raw)
  To: Joachim Wiberg; +Cc: Thomas Petazzoni, buildroot

>>>>> "Joachim" == Joachim Wiberg <troglobit@gmail.com> writes:

 > Backported from upstream GDB geb79b23, with ChangeLogs stripped so the
 > patch applies properly on Buildroot.

 >     https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=eb79b23

 > Fixes the following issue:

 >     # gdbserver /dev/hvc1 inadyn -n -l debug
 >     Process inadyn created; pid = 675
 >     Remote debugging using /dev/hvc1
 >     ../../gdbserver/regcache.cc:257: A problem internal to GDBserver has been detected.
 >     Unknown register tag_ctl requested

 > Signed-off-by: Joachim Wiberg <troglobit@gmail.com>

Committed to 2021.11.x, thanks.

-- 
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2022-02-16 20:40 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-01-28  8:42 [Buildroot] [PATCH 1/1] package/gdb: backport fix for gdbserver 11.1 on aarch64 Joachim Wiberg
2022-02-03 20:58 ` Yann E. MORIN
2022-02-16 20:40 ` Peter Korsgaard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox