]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[Morello] Add Morello target description XML and registers
authorLuis Machado <luis.machado@arm.com>
Thu, 12 Mar 2020 19:37:28 +0000 (16:37 -0300)
committerLuis Machado <luis.machado@linaro.org>
Tue, 20 Oct 2020 18:05:15 +0000 (15:05 -0300)
This patch adds a Morello register description XML and code to detect and use
said registers.

gdb/ChangeLog

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

* aarch64-tdep.c (aarch64_c_register_names): New static array.
(aarch64_gdbarch_init): Check for capability
XML feature and add registers to the target.
* aarch64-tdep.h (struct gdbarch_tdep) <cap_reg_base>: New field.
<has_capability>: New method.
* arch/aarch64.c: Include features/aarch64-capability.c.
(aarch64_create_target_description): Invoke
create_feature_aarch64_capability.
* features/Makefile (FEATURE_XMLFILES): Add aarch64-capability.xml
* features/aarch64-capability.xml: New file.
* features/aarch64-capability.c: Generate.

gdb/ChangeLog
gdb/aarch64-tdep.c
gdb/aarch64-tdep.h
gdb/arch/aarch64.c
gdb/features/Makefile
gdb/features/aarch64-capability.c [new file with mode: 0644]
gdb/features/aarch64-capability.xml [new file with mode: 0644]

index 04dd74519e99543d91209f27c57e3daab681ed02..5f9e9faca81b86ab9af5a9fc97a3d3755ac8df14 100644 (file)
@@ -1,3 +1,17 @@
+2020-10-20  Luis Machado  <luis.machado@arm.com>
+
+       * aarch64-tdep.c (aarch64_c_register_names): New static array.
+       (aarch64_gdbarch_init): Check for capability
+       XML feature and add registers to the target.
+       * aarch64-tdep.h (struct gdbarch_tdep) <cap_reg_base>: New field.
+       <has_capability>: New method.
+       * arch/aarch64.c: Include features/aarch64-capability.c.
+       (aarch64_create_target_description): Invoke
+       create_feature_aarch64_capability.
+       * features/Makefile (FEATURE_XMLFILES): Add aarch64-capability.xml
+       * features/aarch64-capability.xml: New file.
+       * features/aarch64-capability.c: Generate.
+
 2020-10-20  Luis Machado  <luis.machado@arm.com>
 
        * Makefile.in (HFILES_NO_SRCDIR): Add arch/aarch64-cap-linux.h.
index 366c67c2ff1770e08472290b2ffa14967d2cf9b3..5b424f17d34bbb94fcb871ce726b68b21b0da157 100644 (file)
@@ -116,6 +116,19 @@ static const struct
   {"ip1", AARCH64_X0_REGNUM + 17}
 };
 
+/* The required capability 'C' registers.  */
+static const char *const aarch64_c_register_names[] =
+{
+  /* These registers must appear in consecutive RAW register number
+     order and they must begin with AARCH64_C0_REGNUM! */
+  "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7",
+  "c8", "c9", "c10", "c11", "c12", "c13", "c14", "c15",
+  "c16", "c17", "c18", "c19", "c20", "c21", "c22", "c23",
+  "c24", "c25", "c26", "c27", "c28", "c29", "c30", "pcc",
+  "csp", "ddc", "ctpidr", "rcsp", "rddc", "rctpidr", "cid",
+  "tag_map", "cctlr"
+};
+
 /* The required core 'R' registers.  */
 static const char *const aarch64_r_register_names[] =
 {
@@ -3471,6 +3484,24 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
       num_pseudo_regs += 1;    /* Count RA_STATE pseudo register.  */
     }
 
+  /* Add the capability registers.  */
+  const struct tdesc_feature *feature_capability
+      = tdesc_find_feature (tdesc,"org.gnu.gdb.aarch64.capability");
+  int first_cap_regnum = -1;
+
+  if (feature_capability != nullptr)
+    {
+      first_cap_regnum = num_regs;
+
+      for (i = 0; i < ARRAY_SIZE (aarch64_c_register_names); i++)
+       valid_p &= tdesc_numbered_register (feature_capability,
+                                           tdesc_data.get (),
+                                           AARCH64_C0_REGNUM + i,
+                                           aarch64_c_register_names[i]);
+
+      num_regs = AARCH64_C0_REGNUM + i;
+    }
+
   if (!valid_p)
     return nullptr;
 
@@ -3489,6 +3520,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   tdep->pauth_ra_state_regnum = (feature_pauth == NULL) ? -1
                                : pauth_ra_state_offset + num_regs;
 
+  tdep->cap_reg_base = first_cap_regnum;
+
   set_gdbarch_push_dummy_call (gdbarch, aarch64_push_dummy_call);
   set_gdbarch_frame_align (gdbarch, aarch64_frame_align);
 
index 3260a5e15b870fccaef6d7219928124a071cf56e..d9b13512c1fa22fa297b4a6e0be7ab3881a4e885 100644 (file)
@@ -107,6 +107,14 @@ struct gdbarch_tdep
   {
     return pauth_reg_base != -1;
   }
+
+  int cap_reg_base;
+
+  /* Returns true if the target supports capabilities.  */
+  bool has_capability () const
+  {
+    return cap_reg_base != -1;
+  }
 };
 
 const target_desc *aarch64_read_description (uint64_t vq, bool pauth_p);
index f89d5e014df55020f63af9794957da85c3914b7d..e27b667644a2694b20d5b373e5e442895e0024c2 100644 (file)
@@ -23,6 +23,7 @@
 #include "../features/aarch64-fpu.c"
 #include "../features/aarch64-sve.c"
 #include "../features/aarch64-pauth.c"
+#include "../features/aarch64-capability.c"
 
 /* See arch/aarch64.h.  */
 
@@ -47,5 +48,11 @@ aarch64_create_target_description (uint64_t vq, bool pauth_p)
   if (pauth_p)
     regnum = create_feature_aarch64_pauth (tdesc.get (), regnum);
 
+  /* FIXME-Morello: We need to append the capability registers to
+     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);
+
   return tdesc.release ();
 }
index 689603847a001ae0297558cd1fde1242b1c9800c..4b91378de17e6c5b6f682958275549cc3f5894f7 100644 (file)
@@ -199,6 +199,7 @@ $(outdir)/%.dat: %.xml number-regs.xsl sort-regs.xsl gdbserver-regs.xsl
 # For targets with feature based target descriptions,
 # the set of xml files we'll generate .c files for GDB from.
 FEATURE_XMLFILES = aarch64-core.xml \
+       aarch64-capability.xml \
        aarch64-fpu.xml \
        aarch64-pauth.xml \
        arc/v1-core.xml \
diff --git a/gdb/features/aarch64-capability.c b/gdb/features/aarch64-capability.c
new file mode 100644 (file)
index 0000000..dfd7861
--- /dev/null
@@ -0,0 +1,55 @@
+/* THIS FILE IS GENERATED.  -*- buffer-read-only: t -*- vi:set ro:
+  Original: aarch64-capability.xml */
+
+#include "gdbsupport/tdesc.h"
+
+static int
+create_feature_aarch64_capability (struct target_desc *result, long regnum)
+{
+  struct tdesc_feature *feature;
+
+  feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.capability");
+
+  tdesc_create_reg (feature, "c0", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c1", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c2", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c3", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c4", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c5", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c6", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c7", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c8", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c9", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c10", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c11", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c12", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c13", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c14", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c15", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c16", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c17", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c18", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c19", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c20", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c21", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c22", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c23", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c24", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c25", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c26", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c27", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c28", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c29", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "c30", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "pcc", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "csp", regnum++, 1, "general", 128, "uintcap");
+  tdesc_create_reg (feature, "ddc", regnum++, 1, "system", 128, "uintcap");
+  tdesc_create_reg (feature, "ctpidr", regnum++, 1, "system", 128, "uintcap");
+  tdesc_create_reg (feature, "rcsp", regnum++, 1, "system", 128, "uintcap");
+  tdesc_create_reg (feature, "rddc", regnum++, 1, "system", 128, "uintcap");
+  tdesc_create_reg (feature, "rctpidr", regnum++, 1, "system", 128, "uintcap");
+  tdesc_create_reg (feature, "cid", regnum++, 1, "system", 128, "uintcap");
+  tdesc_create_reg (feature, "tag_map", regnum++, 1, "system", 64, "uint64");
+  tdesc_create_reg (feature, "cctlr", regnum++, 1, "system", 64, "uint64");
+  return regnum;
+}
diff --git a/gdb/features/aarch64-capability.xml b/gdb/features/aarch64-capability.xml
new file mode 100644 (file)
index 0000000..33110cd
--- /dev/null
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!-- Copyright (C) 2020 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.aarch64.capability">
+  <reg name="c0" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c1" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c2" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c3" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c4" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c5" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c6" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c7" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c8" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c9" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c10" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c11" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c12" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c13" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c14" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c15" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c16" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c17" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c18" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c19" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c20" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c21" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c22" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c23" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c24" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c25" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c26" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c27" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c28" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c29" bitsize="128" type="uintcap" group="general"/>
+  <reg name="c30" bitsize="128" type="uintcap" group="general"/>
+  <reg name="pcc" bitsize="128" type="uintcap" group="general"/>
+  <reg name="csp" bitsize="128" type="uintcap" group="general"/>
+  <reg name="ddc" bitsize="128" type="uintcap" group="system"/>
+  <reg name="ctpidr" bitsize="128" type="uintcap" group="system"/>
+  <reg name="rcsp" bitsize="128" type="uintcap" group="general"/>
+  <reg name="rddc" bitsize="128" type="uintcap" group="general"/>
+  <reg name="rctpidr" bitsize="128" type="uintcap" group="system"/>
+  <reg name="cid" bitsize="128" type="uintcap" group="system"/>
+  <reg name="tag_map" bitsize="64" type="uint64" group="system"/>
+  <reg name="cctlr" bitsize="64" type="uint64" group="system"/>
+</feature>