Add Aarch64 SVE target description
No code uses the new descriptions yet. gdb/ * aarch64-linux-nat.c (aarch64_linux_read_description): Add parmeter zero. * aarch64-linux-tdep.c (aarch64_linux_core_read_description): Likewise. * aarch64-tdep.c (tdesc_aarch64_list): Add. (aarch64_read_description): Use VQ to index tdesc_aarch64_list. (aarch64_gdbarch_init): Add parmeter zero. * aarch64-tdep.h (aarch64_read_description): Add VQ parmeter. * arch/aarch64.c (aarch64_create_target_description): Check VQ. * arch/aarch64.h (aarch64_create_target_description): Add VQ. parmeter. * doc/gdb.texinfo: Describe SVE feature * features/aarch64-sve.c: New file. gdbserver/ * linux-aarch64-tdesc.c (aarch64_linux_read_description): Add null VQ.
This commit is contained in:
parent
22467434fd
commit
95228a0d79
|
@ -1,3 +1,19 @@
|
|||
2018-05-31 Alan Hayward <alan.hayward@arm.com>
|
||||
|
||||
* aarch64-linux-nat.c (aarch64_linux_read_description):
|
||||
Add parmeter zero.
|
||||
* aarch64-linux-tdep.c (aarch64_linux_core_read_description):
|
||||
Likewise.
|
||||
* aarch64-tdep.c (tdesc_aarch64_list): Add.
|
||||
(aarch64_read_description): Use VQ to index tdesc_aarch64_list.
|
||||
(aarch64_gdbarch_init): Add parmeter zero.
|
||||
* aarch64-tdep.h (aarch64_read_description): Add VQ parmeter.
|
||||
* arch/aarch64.c (aarch64_create_target_description): Check VQ.
|
||||
* arch/aarch64.h (aarch64_create_target_description): Add VQ.
|
||||
parmeter.
|
||||
* doc/gdb.texinfo: Describe SVE feature
|
||||
* features/aarch64-sve.c: New file.
|
||||
|
||||
2018-05-31 Omair Javaid <omair.javaid@linaro.org>
|
||||
|
||||
PR gdb/23210
|
||||
|
|
|
@ -537,7 +537,8 @@ aarch64_linux_nat_target::read_description ()
|
|||
if (ret == 0)
|
||||
return tdesc_arm_with_neon;
|
||||
else
|
||||
return aarch64_read_description ();
|
||||
/* SVE not yet supported. */
|
||||
return aarch64_read_description (0);
|
||||
}
|
||||
|
||||
/* Convert a native/host siginfo object, into/from the siginfo in the
|
||||
|
|
|
@ -233,7 +233,8 @@ aarch64_linux_iterate_over_regset_sections (struct gdbarch *gdbarch,
|
|||
NULL, cb_data);
|
||||
}
|
||||
|
||||
/* Implement the "core_read_description" gdbarch method. */
|
||||
/* Implement the "core_read_description" gdbarch method. SVE not yet
|
||||
supported. */
|
||||
|
||||
static const struct target_desc *
|
||||
aarch64_linux_core_read_description (struct gdbarch *gdbarch,
|
||||
|
@ -244,7 +245,7 @@ aarch64_linux_core_read_description (struct gdbarch *gdbarch,
|
|||
if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
|
||||
return NULL;
|
||||
|
||||
return aarch64_read_description ();
|
||||
return aarch64_read_description (0);
|
||||
}
|
||||
|
||||
/* Implementation of `gdbarch_stap_is_single_operand', as defined in
|
||||
|
|
|
@ -70,6 +70,9 @@
|
|||
#define AARCH64_H0_REGNUM (AARCH64_S0_REGNUM + 32)
|
||||
#define AARCH64_B0_REGNUM (AARCH64_H0_REGNUM + 32)
|
||||
|
||||
/* All possible aarch64 target descriptors. */
|
||||
struct target_desc *tdesc_aarch64_list[AARCH64_MAX_SVE_VQ + 1];
|
||||
|
||||
/* The standard register names, and all the valid aliases for them. */
|
||||
static const struct
|
||||
{
|
||||
|
@ -2827,18 +2830,26 @@ aarch64_displaced_step_hw_singlestep (struct gdbarch *gdbarch,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Get the correct target description. */
|
||||
/* Get the correct target description for the given VQ value.
|
||||
If VQ is zero then it is assumed SVE is not supported.
|
||||
(It is not possible to set VQ to zero on an SVE system). */
|
||||
|
||||
const target_desc *
|
||||
aarch64_read_description ()
|
||||
aarch64_read_description (long vq)
|
||||
{
|
||||
static target_desc *aarch64_tdesc = NULL;
|
||||
target_desc **tdesc = &aarch64_tdesc;
|
||||
if (vq > AARCH64_MAX_SVE_VQ)
|
||||
error (_("VQ is %ld, maximum supported value is %d"), vq,
|
||||
AARCH64_MAX_SVE_VQ);
|
||||
|
||||
if (*tdesc == NULL)
|
||||
*tdesc = aarch64_create_target_description ();
|
||||
struct target_desc *tdesc = tdesc_aarch64_list[vq];
|
||||
|
||||
return *tdesc;
|
||||
if (tdesc == NULL)
|
||||
{
|
||||
tdesc = aarch64_create_target_description (vq);
|
||||
tdesc_aarch64_list[vq] = tdesc;
|
||||
}
|
||||
|
||||
return tdesc;
|
||||
}
|
||||
|
||||
/* Initialize the current architecture based on INFO. If possible,
|
||||
|
@ -2864,7 +2875,10 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
|
|||
|
||||
/* Ensure we always have a target descriptor. */
|
||||
if (!tdesc_has_registers (tdesc))
|
||||
tdesc = aarch64_read_description ();
|
||||
{
|
||||
/* SVE is not yet supported. */
|
||||
tdesc = aarch64_read_description (0);
|
||||
}
|
||||
|
||||
gdb_assert (tdesc);
|
||||
|
||||
|
@ -3072,7 +3086,7 @@ When on, AArch64 specific debugging is enabled."),
|
|||
selftests::register_test ("aarch64-process-record",
|
||||
selftests::aarch64_process_record_test);
|
||||
selftests::record_xml_tdesc ("aarch64.xml",
|
||||
aarch64_create_target_description ());
|
||||
aarch64_create_target_description (0));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ struct gdbarch_tdep
|
|||
int (*aarch64_syscall_record) (struct regcache *regcache, unsigned long svc_number);
|
||||
};
|
||||
|
||||
const target_desc *aarch64_read_description ();
|
||||
const target_desc *aarch64_read_description (long vq);
|
||||
|
||||
extern int aarch64_process_record (struct gdbarch *gdbarch,
|
||||
struct regcache *regcache, CORE_ADDR addr);
|
||||
|
|
|
@ -21,11 +21,12 @@
|
|||
|
||||
#include "../features/aarch64-core.c"
|
||||
#include "../features/aarch64-fpu.c"
|
||||
#include "../features/aarch64-sve.c"
|
||||
|
||||
/* Create the aarch64 target description. */
|
||||
/* See arch/aarch64.h. */
|
||||
|
||||
target_desc *
|
||||
aarch64_create_target_description ()
|
||||
aarch64_create_target_description (long vq)
|
||||
{
|
||||
target_desc *tdesc = allocate_target_description ();
|
||||
|
||||
|
@ -36,7 +37,11 @@ aarch64_create_target_description ()
|
|||
long regnum = 0;
|
||||
|
||||
regnum = create_feature_aarch64_core (tdesc, regnum);
|
||||
regnum = create_feature_aarch64_fpu (tdesc, regnum);
|
||||
|
||||
if (vq == 0)
|
||||
regnum = create_feature_aarch64_fpu (tdesc, regnum);
|
||||
else
|
||||
regnum = create_feature_aarch64_sve (tdesc, regnum, vq);
|
||||
|
||||
return tdesc;
|
||||
}
|
||||
|
|
|
@ -22,7 +22,11 @@
|
|||
|
||||
#include "common/tdesc.h"
|
||||
|
||||
target_desc *aarch64_create_target_description ();
|
||||
/* Create the aarch64 target description. A non zero VQ value indicates both
|
||||
the presence of SVE and the Vector Quotient - the number of 128bit chunks in
|
||||
an SVE Z register. */
|
||||
|
||||
target_desc *aarch64_create_target_description (long vq);
|
||||
|
||||
/* Register numbers of various important registers. */
|
||||
enum aarch64_regnum
|
||||
|
@ -48,4 +52,7 @@ enum aarch64_regnum
|
|||
#define AARCH64_V_REGS_NUM 32
|
||||
#define AARCH64_NUM_REGS AARCH64_FPCR_REGNUM + 1
|
||||
|
||||
/* Maximum supported VQ value. Increase if required. */
|
||||
#define AARCH64_MAX_SVE_VQ 16
|
||||
|
||||
#endif /* ARCH_AARCH64_H */
|
||||
|
|
|
@ -42137,6 +42137,10 @@ The @samp{org.gnu.gdb.aarch64.fpu} feature is optional. If present,
|
|||
it should contain registers @samp{v0} through @samp{v31}, @samp{fpsr},
|
||||
and @samp{fpcr}.
|
||||
|
||||
The @samp{org.gnu.gdb.aarch64.sve} feature is optional. If present,
|
||||
it should contain registers @samp{z0} through @samp{z31}, @samp{p0}
|
||||
through @samp{p15}, @samp{ffr} and @samp{vg}.
|
||||
|
||||
@node ARC Features
|
||||
@subsection ARC Features
|
||||
@cindex target descriptions, ARC Features
|
||||
|
|
|
@ -0,0 +1,158 @@
|
|||
/* Copyright (C) 2018 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GDB.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
#include "common/tdesc.h"
|
||||
|
||||
/* This function is NOT auto generated from xml. Create the aarch64 with SVE
|
||||
feature into RESULT, where SCALE is the number of 128 bit chunks in a Z
|
||||
register. */
|
||||
|
||||
static int
|
||||
create_feature_aarch64_sve (struct target_desc *result, long regnum,
|
||||
int scale)
|
||||
{
|
||||
struct tdesc_feature *feature;
|
||||
tdesc_type *element_type, *field_type;
|
||||
tdesc_type_with_fields *type_with_fields;
|
||||
|
||||
feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.sve");
|
||||
|
||||
element_type = tdesc_named_type (feature, "ieee_double");
|
||||
tdesc_create_vector (feature, "svevdf", element_type, 2 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "uint64");
|
||||
tdesc_create_vector (feature, "svevdu", element_type, 2 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "int64");
|
||||
tdesc_create_vector (feature, "svevds", element_type, 2 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "ieee_single");
|
||||
tdesc_create_vector (feature, "svevsf", element_type, 4 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "uint32");
|
||||
tdesc_create_vector (feature, "svevsu", element_type, 4 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "int32");
|
||||
tdesc_create_vector (feature, "svevss", element_type, 4 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "uint16");
|
||||
tdesc_create_vector (feature, "svevhu", element_type, 8 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "int16");
|
||||
tdesc_create_vector (feature, "svevhs", element_type, 8 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "uint8");
|
||||
tdesc_create_vector (feature, "svevbu", element_type, 16 * scale);
|
||||
|
||||
element_type = tdesc_named_type (feature, "int8");
|
||||
tdesc_create_vector (feature, "svevbs", element_type, 16 * scale);
|
||||
|
||||
type_with_fields = tdesc_create_union (feature, "svevnd");
|
||||
field_type = tdesc_named_type (feature, "svevdf");
|
||||
tdesc_add_field (type_with_fields, "f", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevdu");
|
||||
tdesc_add_field (type_with_fields, "u", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevds");
|
||||
tdesc_add_field (type_with_fields, "s", field_type);
|
||||
|
||||
type_with_fields = tdesc_create_union (feature, "svevns");
|
||||
field_type = tdesc_named_type (feature, "svevsf");
|
||||
tdesc_add_field (type_with_fields, "f", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevsu");
|
||||
tdesc_add_field (type_with_fields, "u", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevss");
|
||||
tdesc_add_field (type_with_fields, "s", field_type);
|
||||
|
||||
type_with_fields = tdesc_create_union (feature, "svevnh");
|
||||
field_type = tdesc_named_type (feature, "svevhu");
|
||||
tdesc_add_field (type_with_fields, "u", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevhs");
|
||||
tdesc_add_field (type_with_fields, "s", field_type);
|
||||
|
||||
type_with_fields = tdesc_create_union (feature, "svevnb");
|
||||
field_type = tdesc_named_type (feature, "svevbu");
|
||||
tdesc_add_field (type_with_fields, "u", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevbs");
|
||||
tdesc_add_field (type_with_fields, "s", field_type);
|
||||
|
||||
type_with_fields = tdesc_create_union (feature, "svev");
|
||||
field_type = tdesc_named_type (feature, "svevnd");
|
||||
tdesc_add_field (type_with_fields, "d", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevns");
|
||||
tdesc_add_field (type_with_fields, "s", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevnh");
|
||||
tdesc_add_field (type_with_fields, "h", field_type);
|
||||
field_type = tdesc_named_type (feature, "svevnb");
|
||||
tdesc_add_field (type_with_fields, "b", field_type);
|
||||
|
||||
field_type = tdesc_named_type (feature, "uint8");
|
||||
tdesc_create_vector (feature, "svep", field_type, 2 * scale);
|
||||
|
||||
tdesc_create_reg (feature, "z0", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z1", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z2", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z3", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z4", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z5", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z6", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z7", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z8", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z9", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z10", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z11", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z12", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z13", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z14", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z15", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z16", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z17", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z18", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z19", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z20", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z21", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z22", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z23", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z24", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z25", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z26", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z27", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z28", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z29", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z30", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "z31", regnum++, 1, NULL, 128 * scale, "svev");
|
||||
tdesc_create_reg (feature, "fpsr", regnum++, 1, NULL, 32, "int");
|
||||
tdesc_create_reg (feature, "fpcr", regnum++, 1, NULL, 32, "int");
|
||||
tdesc_create_reg (feature, "p0", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p1", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p2", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p3", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p4", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p5", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p6", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p7", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p8", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p9", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p10", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p11", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p12", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p13", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p14", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "p15", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "ffr", regnum++, 1, NULL, 16 * scale, "svep");
|
||||
tdesc_create_reg (feature, "vg", regnum++, 1, NULL, 64, "int");
|
||||
return regnum;
|
||||
}
|
|
@ -1,3 +1,8 @@
|
|||
2018-05-31 Alan Hayward <alan.hayward@arm.com>
|
||||
|
||||
* linux-aarch64-tdesc.c (aarch64_linux_read_description): Add
|
||||
null VQ.
|
||||
|
||||
2018-05-25 Maciej W. Rozycki <macro@mips.com>
|
||||
|
||||
* gdb.arch/mips-fpregset-core.exp: New test.
|
||||
|
|
|
@ -32,7 +32,8 @@ aarch64_linux_read_description ()
|
|||
|
||||
if (*tdesc == NULL)
|
||||
{
|
||||
*tdesc = aarch64_create_target_description ();
|
||||
/* SVE not yet supported. */
|
||||
*tdesc = aarch64_create_target_description (0);
|
||||
|
||||
static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL };
|
||||
init_target_desc (*tdesc, expedite_regs_aarch64);
|
||||
|
|
Loading…
Reference in New Issue