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=cc9102de0c4f919520e9e43c968cb47913df86be;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/aarch64-tdep.c b/gdb/aarch64-tdep.c index ddf012c80d7..5f7ec0356c8 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -113,6 +113,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[] = { @@ -3578,6 +3591,24 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) num_regs += i; } + /* 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; @@ -3598,6 +3629,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->mte_reg_base = first_mte_regnum; tdep->tls_regnum = tls_regnum; + 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 97146054d91..06b2b674f6a 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -126,6 +126,14 @@ struct aarch64_gdbarch_tdep : gdbarch_tdep { return tls_regnum != -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 (const aarch64_features &features); diff --git a/gdb/arch/aarch64.c b/gdb/arch/aarch64.c index 0f73286f145..e74dcfa4ae6 100644 --- a/gdb/arch/aarch64.c +++ b/gdb/arch/aarch64.c @@ -25,6 +25,7 @@ #include "../features/aarch64-pauth.c" #include "../features/aarch64-mte.c" #include "../features/aarch64-tls.c" +#include "../features/aarch64-capability.c" /* See arch/aarch64.h. */ @@ -56,5 +57,11 @@ aarch64_create_target_description (const aarch64_features &features) if (features.tls) regnum = create_feature_aarch64_tls (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 946ec983df5..c18f257cc62 100644 --- a/gdb/features/Makefile +++ b/gdb/features/Makefile @@ -195,6 +195,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 \ aarch64-mte.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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +