]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Make capability maintenance command available to cross GDB
authorLuis Machado <luis.machado@linaro.org>
Mon, 14 Jun 2021 17:32:26 +0000 (14:32 -0300)
committerJohn Baldwin <jhb@FreeBSD.org>
Thu, 1 Sep 2022 22:57:21 +0000 (15:57 -0700)
The capability maintenance commands were originally only available to
native Morello GDB builds.  Make those commands available to cross Morello
GDB builds as well, since they are useful.

gdb/ChangeLog:

2021-06-24  Luis Machado  <luis.machado@arm.com>

* aarch64-linux-nat.c (maint_print_cap_from_addr_cmd)
(maint_set_capability_in_memory_cmd): Move functions to...
* aarch64-linux-tdep.c: ... here.

gdb/aarch64-linux-nat.c
gdb/aarch64-linux-tdep.c

index 7f10ea2f090137c69cee68b6e55356dbfa5cae50..a2f2f82b370fc929248894134a5dddb2ccad6d7b 100644 (file)
@@ -1014,71 +1014,12 @@ aarch64_linux_nat_target::write_capability (CORE_ADDR addr,
   return true;
 }
 
-/* Implement the maintenance print capability tag command.  */
-
-static void
-maint_print_cap_from_addr_cmd (const char *args, int from_tty)
-{
-  gdb::byte_vector cap;
-  CORE_ADDR addr = parse_and_eval_address (args);
-  cap = target_read_capability (addr);
-
-  for (auto it : cap)
-    fprintf_unfiltered (gdb_stdlog, "%02x ", it);
-
-  fputs_unfiltered ("\n", gdb_stdlog);
-}
-
-/* Implement the maintenance set capability in memory command.  */
-
-static void
-maint_set_capability_in_memory_cmd (const char *args, int from_tty)
-{
-  std::string addr_str, tag_str, upper_str, lower_str;
-  const char *args_ptr = args;
-
-  addr_str = extract_string_maybe_quoted (&args_ptr);
-  tag_str = extract_string_maybe_quoted (&args_ptr);
-  upper_str = extract_string_maybe_quoted (&args_ptr);
-  lower_str = extract_string_maybe_quoted (&args_ptr);
-
-  CORE_ADDR addr = parse_and_eval_address (addr_str.c_str ());
-  CORE_ADDR tag_part = parse_and_eval_address (tag_str.c_str ());
-  CORE_ADDR half_a = parse_and_eval_address (upper_str.c_str ());
-  CORE_ADDR half_b = parse_and_eval_address (lower_str.c_str ());
-
-  unsigned __int128 a, b;
-
-  a = half_a;
-  b = half_b;
-
-  a = (a << 64) | b;
-  bool tag = (tag_part != 0)? true : false;
-
-  gdb::byte_vector cap;
-
-  cap.resize (17);
-  memcpy (cap.data (), &tag, 1);
-  memcpy (cap.data () + 1, &a, 16);
-
-  if (!target_write_capability (addr, {cap.data (), cap.size ()}))
-    perror_with_name (_("Failed to set capability in memory."));
-}
-
 void _initialize_aarch64_linux_nat ();
 void
 _initialize_aarch64_linux_nat ()
 {
   aarch64_initialize_hw_point ();
 
-  add_cmd ("cap_from_addr", class_maintenance, maint_print_cap_from_addr_cmd, _("\
-Print the capability from addr."),
-          &maintenanceprintlist);
-
-  add_cmd ("cap_in_memory", class_maintenance,
-          maint_set_capability_in_memory_cmd,
-          _("Print the capability from addr."), &maintenancelist);
-
   /* Register the target.  */
   linux_target = &the_aarch64_linux_nat_target;
   add_inf_child_target (&the_aarch64_linux_nat_target);
index 45d6f054fd215aab03355da42a971d216b89f290..080e8e15ea762db8227cfd6715f6d364a3dbbe39 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "defs.h"
 
+#include "gdbcmd.h"
 #include "gdbarch.h"
 #include "glibc-tdep.h"
 #include "linux-tdep.h"
@@ -2127,6 +2128,57 @@ aarch64_linux_get_cap_tag_from_address (struct gdbarch *gdbarch, CORE_ADDR addr)
   return cap[0] != 0;
 }
 
+/* Implement the maintenance print capability tag command.  */
+
+static void
+maint_print_cap_from_addr_cmd (const char *args, int from_tty)
+{
+  gdb::byte_vector cap;
+  CORE_ADDR addr = parse_and_eval_address (args);
+  cap = target_read_capability (addr);
+
+  for (auto it : cap)
+    fprintf_unfiltered (gdb_stdlog, "%02x ", it);
+
+  fputs_unfiltered ("\n", gdb_stdlog);
+}
+
+/* Implement the maintenance set capability in memory command.  */
+
+static void
+maint_set_capability_in_memory_cmd (const char *args, int from_tty)
+{
+  std::string addr_str, tag_str, upper_str, lower_str;
+  const char *args_ptr = args;
+
+  addr_str = extract_string_maybe_quoted (&args_ptr);
+  tag_str = extract_string_maybe_quoted (&args_ptr);
+  upper_str = extract_string_maybe_quoted (&args_ptr);
+  lower_str = extract_string_maybe_quoted (&args_ptr);
+
+  CORE_ADDR addr = parse_and_eval_address (addr_str.c_str ());
+  CORE_ADDR tag_part = parse_and_eval_address (tag_str.c_str ());
+  CORE_ADDR half_a = parse_and_eval_address (upper_str.c_str ());
+  CORE_ADDR half_b = parse_and_eval_address (lower_str.c_str ());
+
+  unsigned __int128 a, b;
+
+  a = half_a;
+  b = half_b;
+
+  a = (a << 64) | b;
+  bool tag = (tag_part != 0)? true : false;
+
+  gdb::byte_vector cap;
+
+  cap.resize (17);
+  memcpy (cap.data (), &tag, 1);
+  memcpy (cap.data () + 1, &a, 16);
+
+  if (!target_write_capability (addr, {cap.data (), cap.size ()}))
+    perror_with_name (_("Failed to set capability in memory."));
+}
+
 static void
 aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -2418,6 +2470,13 @@ aarch64_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
                                      aarch64_linux_report_signal_info);
       set_gdbarch_get_cap_tag_from_address (gdbarch,
                                            aarch64_linux_get_cap_tag_from_address);
+
+      add_cmd ("cap_from_addr", class_maintenance, maint_print_cap_from_addr_cmd,
+              _("Print the capability from addr."), &maintenanceprintlist);
+
+      add_cmd ("cap_in_memory", class_maintenance,
+              maint_set_capability_in_memory_cmd,
+              _("Print the capability from addr."), &maintenancelist);
     }
   else
     {