]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[Morello] Generate target descriptions based on runtime capability feature checks
authorLuis Machado <luis.machado@arm.com>
Thu, 26 Mar 2020 14:58:01 +0000 (11:58 -0300)
committerJohn Baldwin <jhb@FreeBSD.org>
Thu, 1 Sep 2022 22:53:22 +0000 (15:53 -0700)
This patch adds code to do runtime checks for Morello, so GDB can pick the
correct target description and register set.

gdb/ChangeLog:

2020-10-20  Luis Machado  <luis.machado@arm.com>

* aarch64-linux-nat.c (aarch64_linux_nat_target::read_description):
Check for HWCAP2_MORELLO.
* aarch64-linux-tdep.c (aarch64_linux_core_read_description): Likewise.
* aarch64-tdep.c (tdesc_aarch64_list): Add one more dimension.
(aarch64_read_description): New parameter capability_p, use it to
generate the proper target description.
(aarch64_gdbarch_init): Update invocation of aarch64_read_description.
* aarch64-tdep.h (aarch64_read_description): New parameter capability_p.
* arch/aarch64.c (aarch64_create_target_description): New parameter
capability_p. Use it.
* arch/aarch64.h (aarch64_create_target_description): New parameter
capability_p.

gdbserver/ChangeLog:

2020-10-20  Luis Machado  <luis.machado@arm.com>

* linux-aarch64-ipa.cc (get_ipa_tdesc): Update.
* linux-aarch64-low.cc (aarch64_target::low_arch_setup): Check for
HWCAP2_MORELLO and use it.
* linux-aarch64-tdesc.cc (tdesc_aarch64_list): Add one more dimension.
(aarch64_linux_read_description): New parameter capability_p. Use it.
* linux-aarch64-tdesc.h (aarch64_linux_read_description): New parameter
capability_p.

gdb/aarch64-linux-nat.c
gdb/aarch64-linux-tdep.c
gdb/aarch64-tdep.c
gdb/arch/aarch64.c
gdb/arch/aarch64.h
gdbserver/linux-aarch64-low.cc

index 9cde72b247b1e97339ca7c227a0cb20ffcf9455c..b429fa31a03b3b1484b9b5b8692ca8676cdc5f3e 100644 (file)
@@ -714,6 +714,7 @@ aarch64_linux_nat_target::read_description ()
   features.pauth = hwcap & AARCH64_HWCAP_PACA;
   features.mte = hwcap2 & HWCAP2_MTE;
   features.tls = true;
+  features.capacity = hwcap2 & HWCAP2_MORELLO;
 
   return aarch64_read_description (features);
 }
index f626d499215156b79359deff763936b515bf7572..f63759f98c6011e92fc0f80df650df3c22acba7d 100644 (file)
@@ -787,6 +787,7 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch,
   features.pauth = hwcap & AARCH64_HWCAP_PACA;
   features.mte = hwcap2 & HWCAP2_MTE;
   features.tls = tls != nullptr;
+  features.capability = hwcap2 & HWCAP2_MORELLO;
 
   return aarch64_read_description (features);
 }
index 5f7ec0356c82c551c7a26b99a643d8dcfafcccaf..14974230f0ed04bfc1c45677754d4a4893299d05 100644 (file)
@@ -3476,6 +3476,10 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
        return best_arch->gdbarch;
     }
 
+  /* FIXME-Morello: Put a check in place so we can determine, from ELF, if
+     we are dealing with a capability-enabled binary or not.  */
+  bool have_capability = false;
+
   /* Ensure we always have a target descriptor, and that it is for the given VQ
      value.  */
   const struct target_desc *tdesc = info.target_desc;
@@ -3483,6 +3487,7 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
     {
       aarch64_features features;
       features.vq = vq;
+      features.capability = have_capability;
       tdesc = aarch64_read_description (features);
     }
   gdb_assert (tdesc);
index e74dcfa4ae68aa31ff103a85855e617a78478819..edfd8f5710fbdba36895696a6b878ce5e6771593 100644 (file)
@@ -61,7 +61,8 @@ aarch64_create_target_description (const aarch64_features &features)
      the existing target description.  Figure out how to do that.
      Maybe replace the general purpose register description with
      the capability registers.  */
-  regnum = create_feature_aarch64_capability (tdesc.get (), regnum);
+  if (features.capability)
+    regnum = create_feature_aarch64_capability (tdesc.get (), regnum);
 
   return tdesc.release ();
 }
index 8e3fd36726a8b30c52cf4405f4e86ff3dfb3f463..19f418478cc6d67b3983ac95c4bae47bb44c9cf0 100644 (file)
@@ -34,6 +34,7 @@ struct aarch64_features
   bool pauth = false;
   bool mte = false;
   bool tls = false;
+  bool capability = false;
 };
 
 inline bool operator==(const aarch64_features &lhs, const aarch64_features &rhs)
@@ -41,7 +42,8 @@ inline bool operator==(const aarch64_features &lhs, const aarch64_features &rhs)
   return lhs.vq == rhs.vq
     && lhs.pauth == rhs.pauth
     && lhs.mte == rhs.mte
-    && lhs.tls == rhs.tls;
+    && lhs.tls == rhs.tls
+    && lhs.capability == rhs.capability;
 }
 
 namespace std
@@ -57,6 +59,7 @@ namespace std
       h = h << 1 | features.pauth;
       h = h << 1 | features.mte;
       h = h << 1 | features.tls;
+      h = h << 1 | features.capability;
       return h;
     }
   };
index 1b9a1cdabbad36db52f4817044a20e8edef6327c..9f7a636fc425c2e942425311185a21ffe38fb979 100644 (file)
@@ -830,6 +830,8 @@ aarch64_target::low_arch_setup ()
       /* A-profile MTE is 64-bit only.  */
       features.mte = linux_get_hwcap2 (8) & HWCAP2_MTE;
       features.tls = true;
+      /* Morello is 64-bit only.  */
+      features.capability = linux_get_hwcap2 (8) & HWCAP2_MORELLO;
 
       current_process ()->tdesc = aarch64_linux_read_description (features);