From: Luis Machado Date: Thu, 12 Mar 2020 19:37:28 +0000 (-0300) Subject: [Morello] Add Morello target description XML and registers X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ea4625bb20fd40eb3c0990c60b95819fd21f25c;p=thirdparty%2Fbinutils-gdb.git [Morello] Add Morello target description XML and registers This patch adds a Morello register description XML and code to detect and use said registers. gdb/ChangeLog 2020-10-20 Luis Machado * 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) : New field. : 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 04dd74519e9..5f9e9faca81 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2020-10-20 Luis Machado + + * 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) : New field. + : 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 * Makefile.in (HFILES_NO_SRCDIR): Add arch/aarch64-cap-linux.h. diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 366c67c2ff1..5b424f17d34 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -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); diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index 3260a5e15b8..d9b13512c1f 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -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); diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c index f89d5e014df..e27b667644a 100644 --- a/gdb/arch/aarch64.c +++ b/gdb/arch/aarch64.c @@ -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 (); } diff --git a/gdb/features/Makefile b/gdb/features/Makefile index 689603847a0..4b91378de17 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -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 index 00000000000..dfd78615ac0 --- /dev/null +++ b/gdb/features/aarch64-capability.c @@ -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 index 00000000000..33110cdbd89 --- /dev/null +++ b/gdb/features/aarch64-capability.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +